diff --git a/__init__.py b/__init__.py index 8cb3631..a5233e8 100644 --- a/__init__.py +++ b/__init__.py @@ -1,7 +1,8 @@ import bpy from bpy.props import CollectionProperty, EnumProperty, PointerProperty, StringProperty from bpy.types import PropertyGroup -from . attribution import people +from . import attribution +import importlib bl_info = { "name": "Microvision", @@ -19,10 +20,15 @@ class MicrovisionPerson(PropertyGroup): 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) @@ -96,7 +102,7 @@ class LoadAssets(bpy.types.Operator): def execute(self, context: bpy.types.Context): link_data(context) - return {'FINISHED'} + return {'FINISHED'} class Spawn(bpy.types.Operator): bl_idname = "microvision.spawn" @@ -110,12 +116,89 @@ class Spawn(bpy.types.Operator): 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.scene.collection.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" @@ -136,50 +219,85 @@ class MicrovisionAttributionPanel(bpy.types.Panel): layout = self.layout scene = context.scene - layout.label(text="Authors") + attribution_data = context.active_object.instance_collection.microvision.attribution - for author in context.active_object.instance_collection.microvision.attribution.authors: + layout.label(text="Authors") + for author in attribution_data.authors: id = author.id - layout.operator('wm.url_open', text=people[id]["name"]).url=people[id]["url"] + 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 = "Microvision" + 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 - layout.label(text="BIG TIME") - - layout.operator("microvision.load_assets") - - layout.prop(context.scene.micro, "group") - layout.prop(context.scene.micro, "kind") - layout.prop(context.scene.micro, "object") + 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") + layout.operator("microvision.spawn") classes = [ LoadAssets, Spawn, MicrovisionPerson, MicrovisionSource, - MicrovisionPanel, - MicrovisionAttributionPanel, + 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.children["Microvision Assets"].hide_viewport = True + context.view_layer.layer_collection.collection.children["Microvision Assets"].hide_viewport = True for lib in ["Buildings", "Vehicles"]: path = f"C:/Users/hausss/AppData/Roaming/Blender Foundation/Blender/2.93/scripts/addons/microvision/libs/{lib}.blend" @@ -194,9 +312,13 @@ def link_data(context: bpy.types.Context): 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) diff --git a/attribution.py b/attribution.py index 09a10a7..e0e1295 100644 --- a/attribution.py +++ b/attribution.py @@ -2,5 +2,16 @@ people = { "chemicalcrux": { "name": "chemicalcrux", "url": "https://furaffinity.net/user/chemicalcrux/" + }, + "Boldly Building": { + "name": "Boldly Building", + "url": "https://sketchfab.com/TitanicKyle" + } +} + +tools = { + "Building Tools": { + "name": "Building Tools", + "url": "https://ranjian0.github.io/building_tools/" } } \ No newline at end of file diff --git a/libs/Buildings.blend b/libs/Buildings.blend index d6dc1d9..fc460a7 100644 --- a/libs/Buildings.blend +++ b/libs/Buildings.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2dff5707f76f37760551bff6b3bbc9518cb748906ca9f0e57045853877fce6b8 -size 3135400 +oid sha256:05f09405070520f9f1dec1ac9068b696985a11e13ddb269b9cbdfb33a8572a18 +size 3143996 diff --git a/libs/Vehicles.blend b/libs/Vehicles.blend index e3fed90..7c167d4 100644 --- a/libs/Vehicles.blend +++ b/libs/Vehicles.blend @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d8e81ad0e7afb54a9fffe8c857b7e135a1f087cb820ea27806e2c4866b5020af -size 807160 +oid sha256:a8877d530320721965138d70db1e84e2aa3251ed76974b5449e1887d62313c33 +size 811328