|
- import bpy
- from bpy.props import CollectionProperty, EnumProperty, PointerProperty, StringProperty
- from bpy.types import PropertyGroup
- from . import attribution
- import importlib
-
- bl_info = {
- "name": "Microvision",
- "description": "Size comparison, now in 3D!",
- "version": (0, 1, 0),
- "blender": (2, 80, 0),
- "location": "View3D > Toolbar > Microvision",
- "author": "chemicalcrux",
- "category": "Development"
- }
-
- class MicrovisionPerson(PropertyGroup):
- id: StringProperty(name="Identifier")
-
- class MicrovisionSource(PropertyGroup):
- url: StringProperty(name="URL")
-
- class MicrovisionTool(PropertyGroup):
- id: StringProperty(name="identifier")
-
- class MicrovisionAttribution(PropertyGroup):
- authors: CollectionProperty(name="Authors", type=MicrovisionPerson)
- owners: CollectionProperty(name="Owners", type=MicrovisionPerson)
- sources: CollectionProperty(name="Owners", type=MicrovisionSource)
- citations: CollectionProperty(name="Owners", type=MicrovisionSource)
- tools: CollectionProperty(name="Owners", type=MicrovisionTool)
-
- class MicrovisionData(PropertyGroup):
- attribution: PointerProperty(type=MicrovisionAttribution)
-
- class MicrovisionProperties(PropertyGroup):
- def groups(self, context:bpy.types.Context):
- results = []
-
- if "Microvision Assets" in bpy.data.collections:
- assets = bpy.data.collections["Microvision Assets"]
-
- for index, child in enumerate(assets.children):
- results.append(
- (child.name, child.name, "", "", index)
- )
-
- return results
-
- def kinds(self, context:bpy.types.Context):
- results = []
-
- if context.scene.micro.group:
- assets = bpy.data.collections[context.scene.micro.group]
-
- for index, child in enumerate(assets.children):
- results.append(
- (child.name, child.name, "", "", index)
- )
-
- return results
-
- def objects(self, context:bpy.types.Context):
- results = []
-
-
- if context.scene.micro.kind:
- assets = bpy.data.collections[context.scene.micro.kind]
- for index, child in enumerate(assets.children):
- results.append(
- (child.name, child.name, "", "", index)
- )
-
- return results
-
- group: EnumProperty(
- name="Group",
- items=groups,
- description="What general kind of thing to browse",
- default=None
- )
-
- kind: EnumProperty(
- name="Kind",
- items=kinds,
- description="What specific kind of thing to browse",
- default=None
- )
-
- object: EnumProperty(
- name="Object",
- items=objects,
- description="The object to spawn",
- default=None
- )
-
-
- class LoadAssets(bpy.types.Operator):
- bl_idname = "microvision.load_assets"
- bl_label = "Load Assets"
-
- def execute(self, context: bpy.types.Context):
- link_data(context)
-
- return {'FINISHED'}
-
- class Spawn(bpy.types.Operator):
- bl_idname = "microvision.spawn"
- bl_label = "Spawn"
-
- def execute(self, context: bpy.types.Context):
- empty = bpy.data.objects.new(context.scene.micro.object, None)
-
- empty.instance_type = 'COLLECTION'
- empty.instance_collection = bpy.data.collections[context.scene.micro.object]
- empty.show_instancer_for_viewport = False
- empty.show_instancer_for_render = False
-
- context.view_layer.layer_collection.collection.children["Microvision Objects"].objects.link(empty)
-
- context.view_layer.objects.active = empty
- bpy.ops.object.select_all(action="DESELECT")
- empty.select_set(state=True)
-
-
- return {'FINISHED'}
-
- class AddListItem(bpy.types.Operator):
- bl_idname = "microvision.addlist"
- bl_label = "Add Entry"
-
- target: StringProperty()
- action: StringProperty()
-
- def execute(self, context: bpy.types.Context):
- if self.action == "add":
- context.collection.microvision.attribution.__getattribute__(self.target).add()
- if self.action == "remove":
- context.collection.microvision.attribution.__getattribute__(self.target).remove(len(context.collection.microvision.attribution.__getattribute__(self.target)) - 1)
-
- return {'FINISHED'}
-
- class MicrovisionAttributionEditPanel(bpy.types.Panel):
- bl_idname = "OBJECT_PT_microvision_attribution_edit_panel"
- bl_label = "Attribution Editor"
- bl_space_type = "VIEW_3D"
- bl_region_type = "UI"
- bl_category = "Microvision"
- bl_context = "objectmode"
-
- @classmethod
- def poll(self, context: bpy.types.Context):
- return context.view_layer.layer_collection.collection.children[0].name == "Assets"
-
- def add_buttons(self, layout, target):
- row = layout.row()
- op = row.operator('microvision.addlist', text="Add")
- op.target = target
- op.action = "add"
-
- op = row.operator('microvision.addlist', text="Remove")
- op.target = target
- op.action = "remove"
-
- def draw(self, context: bpy.types.Context):
- layout = self.layout
- scene = context.scene
-
- attribution_data = context.collection.microvision.attribution
-
- layout.label(text="Authors")
- for author in attribution_data.authors:
- layout.prop(author, "id")
-
- self.add_buttons(layout, "authors")
-
- layout.label(text="Owners")
- for owner in attribution_data.owners:
- layout.prop(owner, "id")
-
- self.add_buttons(layout, "owners")
-
- layout.label(text="Sources")
- for source in attribution_data.sources:
- layout.prop(source, "url")
-
- self.add_buttons(layout, "sources")
-
- layout.label(text="Citations")
- for citation in attribution_data.citations:
- layout.prop(citation, "url")
-
- self.add_buttons(layout, "citations")
-
- layout.label(text="Tools")
- for tool in attribution_data.tools:
- layout.prop(tool, "id")
-
- self.add_buttons(layout, "tools")
-
-
- class MicrovisionAttributionPanel(bpy.types.Panel):
- bl_idname = "OBJECT_PT_microvision_attribution_panel"
- bl_label = "Attribution"
- bl_space_type = "VIEW_3D"
- bl_region_type = "UI"
- bl_category = "Microvision"
- bl_context = "objectmode"
-
- @classmethod
- def poll(self, context):
- if context.active_object is not None:
- if context.active_object.instance_collection is not None:
- return True
- else:
- return False
-
- def draw(self, context: bpy.types.Context):
- layout = self.layout
- scene = context.scene
-
- attribution_data = context.active_object.instance_collection.microvision.attribution
-
- layout.label(text="Authors")
- for author in attribution_data.authors:
- id = author.id
- layout.operator('wm.url_open', text=attribution.people[id]["name"]).url=attribution.people[id]["url"]
-
- layout.label(text="Owners")
- for owner in attribution_data.owners:
- id = owner.id
- layout.operator('wm.url_open', text=attribution.people[id]["name"]).url=attribution.people[id]["url"]
-
- layout.label(text="Sources")
- for source in attribution_data.sources:
- url = source.url
- layout.operator('wm.url_open', text="Source").url=url
-
- layout.label(text="Citations")
- for citation in attribution_data.citations:
- url = citation.url
- layout.operator('wm.url_open', text="Citation").url=url
-
- layout.label(text="Tools")
- for tool in attribution_data.tools:
- id = tool.id
- layout.operator('wm.url_open', text=attribution.tools[id]["name"]).url=attribution.tools[id]["url"]
-
- class MicrovisionPanel(bpy.types.Panel):
- bl_idname = "OBJECT_PT_microvision_panel"
- bl_label = "Spawn"
- bl_space_type = "VIEW_3D"
- bl_region_type = "UI"
- bl_category = "Microvision"
- bl_context = "objectmode"
-
- @classmethod
- def poll(self, context: bpy.types.Context):
- return context.view_layer.layer_collection.collection.children[0].name != "Assets"
-
-
- def draw(self, context: bpy.types.Context):
- layout = self.layout
- scene = context.scene
-
- if "Microvision Assets" not in bpy.context.view_layer.layer_collection.children:
- layout.operator("microvision.load_assets")
- else:
- layout.prop(context.scene.micro, "group")
- layout.prop(context.scene.micro, "kind")
- layout.prop(context.scene.micro, "object")
-
- layout.operator("microvision.spawn")
-
- classes = [
- LoadAssets,
- Spawn,
- MicrovisionPerson,
- MicrovisionSource,
- MicrovisionTool,
- MicrovisionAttribution,
- MicrovisionData,
- AddListItem,
- MicrovisionPanel,
- MicrovisionAttributionEditPanel,
- MicrovisionAttributionPanel,
- MicrovisionProperties,
- ]
-
- def remove_recursive(collection: bpy.types.Collection):
- print(collection)
- for child in collection.children:
- remove_recursive(child)
- collection.children.unlink(child)
- bpy.data.collections.remove(child)
-
- def link_data(context: bpy.types.Context):
- top = bpy.data.collections.new(name="Microvision Assets")
- context.view_layer.layer_collection.collection.children.link(top)
- context.view_layer.layer_collection.collection.children["Microvision Assets"].hide_viewport = True
- for lib in ["Buildings", "Creatures", "Vehicles"]:
- path = f"C:/Users/hausss/AppData/Roaming/Blender Foundation/Blender/2.93/scripts/addons/microvision/libs/{lib}.blend"
-
- category = bpy.data.collections.new(name=lib)
- top.children.link(category)
- with bpy.data.libraries.load(path, link=True) as (data_from, data_to):
- data_to.collections = ["Assets"]
-
- print(len(data_to.collections[0].children))
-
- for coll in data_to.collections[0].children:
- print(coll)
- if coll is not None:
- category.children.link(coll)
-
- objects = bpy.data.collections.new(name="Microvision Objects")
- context.view_layer.layer_collection.collection.children.link(objects)
-
- def register():
- print("Hi")
- importlib.reload(attribution)
- for cls in classes:
- bpy.utils.register_class(cls)
- bpy.types.Scene.micro = PointerProperty(type=MicrovisionProperties)
- bpy.types.Collection.microvision = PointerProperty(type=MicrovisionData)
-
- def unregister():
- print("Bye")
- for cls in classes:
- bpy.utils.unregister_class(cls)
|