瀏覽代碼

Add a proper attribution editing system

master
Fen Dweller 4 年之前
父節點
當前提交
b4371afae9
共有 4 個檔案被更改,包括 155 行新增22 行删除
  1. +140
    -18
      __init__.py
  2. +11
    -0
      attribution.py
  3. 二進制
      libs/Buildings.blend
  4. 二進制
      libs/Vehicles.blend

+ 140
- 18
__init__.py 查看文件

@@ -1,7 +1,8 @@
import bpy import bpy
from bpy.props import CollectionProperty, EnumProperty, PointerProperty, StringProperty from bpy.props import CollectionProperty, EnumProperty, PointerProperty, StringProperty
from bpy.types import PropertyGroup from bpy.types import PropertyGroup
from . attribution import people
from . import attribution
import importlib


bl_info = { bl_info = {
"name": "Microvision", "name": "Microvision",
@@ -19,10 +20,15 @@ class MicrovisionPerson(PropertyGroup):
class MicrovisionSource(PropertyGroup): class MicrovisionSource(PropertyGroup):
url: StringProperty(name="URL") url: StringProperty(name="URL")


class MicrovisionTool(PropertyGroup):
id: StringProperty(name="identifier")

class MicrovisionAttribution(PropertyGroup): class MicrovisionAttribution(PropertyGroup):
authors: CollectionProperty(name="Authors", type=MicrovisionPerson) authors: CollectionProperty(name="Authors", type=MicrovisionPerson)
owners: CollectionProperty(name="Owners", type=MicrovisionPerson) owners: CollectionProperty(name="Owners", type=MicrovisionPerson)
sources: CollectionProperty(name="Owners", type=MicrovisionSource) sources: CollectionProperty(name="Owners", type=MicrovisionSource)
citations: CollectionProperty(name="Owners", type=MicrovisionSource)
tools: CollectionProperty(name="Owners", type=MicrovisionTool)


class MicrovisionData(PropertyGroup): class MicrovisionData(PropertyGroup):
attribution: PointerProperty(type=MicrovisionAttribution) attribution: PointerProperty(type=MicrovisionAttribution)
@@ -96,7 +102,7 @@ class LoadAssets(bpy.types.Operator):
def execute(self, context: bpy.types.Context): def execute(self, context: bpy.types.Context):
link_data(context) link_data(context)


return {'FINISHED'}
return {'FINISHED'}


class Spawn(bpy.types.Operator): class Spawn(bpy.types.Operator):
bl_idname = "microvision.spawn" bl_idname = "microvision.spawn"
@@ -110,12 +116,89 @@ class Spawn(bpy.types.Operator):
empty.show_instancer_for_viewport = False empty.show_instancer_for_viewport = False
empty.show_instancer_for_render = 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'} 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): class MicrovisionAttributionPanel(bpy.types.Panel):
bl_idname = "OBJECT_PT_microvision_attribution_panel" bl_idname = "OBJECT_PT_microvision_attribution_panel"
bl_label = "Attribution" bl_label = "Attribution"
@@ -136,50 +219,85 @@ class MicrovisionAttributionPanel(bpy.types.Panel):
layout = self.layout layout = self.layout
scene = context.scene 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 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): class MicrovisionPanel(bpy.types.Panel):
bl_idname = "OBJECT_PT_microvision_panel" bl_idname = "OBJECT_PT_microvision_panel"
bl_label = "Microvision"
bl_label = "Spawn"
bl_space_type = "VIEW_3D" bl_space_type = "VIEW_3D"
bl_region_type = "UI" bl_region_type = "UI"
bl_category = "Microvision" bl_category = "Microvision"
bl_context = "objectmode" 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): def draw(self, context: bpy.types.Context):
layout = self.layout layout = self.layout
scene = context.scene 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 = [ classes = [
LoadAssets, LoadAssets,
Spawn, Spawn,
MicrovisionPerson, MicrovisionPerson,
MicrovisionSource, MicrovisionSource,
MicrovisionPanel,
MicrovisionAttributionPanel,
MicrovisionTool,
MicrovisionAttribution, MicrovisionAttribution,
MicrovisionData, MicrovisionData,
AddListItem,
MicrovisionPanel,
MicrovisionAttributionEditPanel,
MicrovisionAttributionPanel,
MicrovisionProperties, 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): def link_data(context: bpy.types.Context):
top = bpy.data.collections.new(name="Microvision Assets") top = bpy.data.collections.new(name="Microvision Assets")
context.view_layer.layer_collection.collection.children.link(top) 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"]: for lib in ["Buildings", "Vehicles"]:
path = f"C:/Users/hausss/AppData/Roaming/Blender Foundation/Blender/2.93/scripts/addons/microvision/libs/{lib}.blend" 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) print(coll)
if coll is not None: if coll is not None:
category.children.link(coll) category.children.link(coll)
objects = bpy.data.collections.new(name="Microvision Objects")
context.view_layer.layer_collection.collection.children.link(objects)


def register(): def register():
print("Hi") print("Hi")
importlib.reload(attribution)
for cls in classes: for cls in classes:
bpy.utils.register_class(cls) bpy.utils.register_class(cls)
bpy.types.Scene.micro = PointerProperty(type=MicrovisionProperties) bpy.types.Scene.micro = PointerProperty(type=MicrovisionProperties)


+ 11
- 0
attribution.py 查看文件

@@ -2,5 +2,16 @@ people = {
"chemicalcrux": { "chemicalcrux": {
"name": "chemicalcrux", "name": "chemicalcrux",
"url": "https://furaffinity.net/user/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/"
} }
} }

二進制
libs/Buildings.blend (儲存到到 Git LFS) 查看文件

oid sha256:05f09405070520f9f1dec1ac9068b696985a11e13ddb269b9cbdfb33a8572a18
size 3143996

二進制
libs/Vehicles.blend (儲存到到 Git LFS) 查看文件

oid sha256:a8877d530320721965138d70db1e84e2aa3251ed76974b5449e1887d62313c33
size 811328

Loading…
取消
儲存