Size visualization...IN THREE DIMENSIONS!
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

330 lines
10 KiB

  1. import bpy
  2. from bpy.props import CollectionProperty, EnumProperty, PointerProperty, StringProperty
  3. from bpy.types import PropertyGroup
  4. from . import attribution
  5. import importlib
  6. bl_info = {
  7. "name": "Microvision",
  8. "description": "Size comparison, now in 3D!",
  9. "version": (0, 1, 0),
  10. "blender": (2, 80, 0),
  11. "location": "View3D > Toolbar > Microvision",
  12. "author": "chemicalcrux",
  13. "category": "Development"
  14. }
  15. class MicrovisionPerson(PropertyGroup):
  16. id: StringProperty(name="Identifier")
  17. class MicrovisionSource(PropertyGroup):
  18. url: StringProperty(name="URL")
  19. class MicrovisionTool(PropertyGroup):
  20. id: StringProperty(name="identifier")
  21. class MicrovisionAttribution(PropertyGroup):
  22. authors: CollectionProperty(name="Authors", type=MicrovisionPerson)
  23. owners: CollectionProperty(name="Owners", type=MicrovisionPerson)
  24. sources: CollectionProperty(name="Owners", type=MicrovisionSource)
  25. citations: CollectionProperty(name="Owners", type=MicrovisionSource)
  26. tools: CollectionProperty(name="Owners", type=MicrovisionTool)
  27. class MicrovisionData(PropertyGroup):
  28. attribution: PointerProperty(type=MicrovisionAttribution)
  29. class MicrovisionProperties(PropertyGroup):
  30. def groups(self, context:bpy.types.Context):
  31. results = []
  32. if "Microvision Assets" in bpy.data.collections:
  33. assets = bpy.data.collections["Microvision Assets"]
  34. for index, child in enumerate(assets.children):
  35. results.append(
  36. (child.name, child.name, "", "", index)
  37. )
  38. return results
  39. def kinds(self, context:bpy.types.Context):
  40. results = []
  41. if context.scene.micro.group:
  42. assets = bpy.data.collections[context.scene.micro.group]
  43. for index, child in enumerate(assets.children):
  44. results.append(
  45. (child.name, child.name, "", "", index)
  46. )
  47. return results
  48. def objects(self, context:bpy.types.Context):
  49. results = []
  50. if context.scene.micro.kind:
  51. assets = bpy.data.collections[context.scene.micro.kind]
  52. for index, child in enumerate(assets.children):
  53. results.append(
  54. (child.name, child.name, "", "", index)
  55. )
  56. return results
  57. group: EnumProperty(
  58. name="Group",
  59. items=groups,
  60. description="What general kind of thing to browse",
  61. default=None
  62. )
  63. kind: EnumProperty(
  64. name="Kind",
  65. items=kinds,
  66. description="What specific kind of thing to browse",
  67. default=None
  68. )
  69. object: EnumProperty(
  70. name="Object",
  71. items=objects,
  72. description="The object to spawn",
  73. default=None
  74. )
  75. class LoadAssets(bpy.types.Operator):
  76. bl_idname = "microvision.load_assets"
  77. bl_label = "Load Assets"
  78. def execute(self, context: bpy.types.Context):
  79. link_data(context)
  80. return {'FINISHED'}
  81. class Spawn(bpy.types.Operator):
  82. bl_idname = "microvision.spawn"
  83. bl_label = "Spawn"
  84. def execute(self, context: bpy.types.Context):
  85. empty = bpy.data.objects.new(context.scene.micro.object, None)
  86. empty.instance_type = 'COLLECTION'
  87. empty.instance_collection = bpy.data.collections[context.scene.micro.object]
  88. empty.show_instancer_for_viewport = False
  89. empty.show_instancer_for_render = False
  90. context.view_layer.layer_collection.collection.children["Microvision Objects"].objects.link(empty)
  91. context.view_layer.objects.active = empty
  92. bpy.ops.object.select_all(action="DESELECT")
  93. empty.select_set(state=True)
  94. return {'FINISHED'}
  95. class AddListItem(bpy.types.Operator):
  96. bl_idname = "microvision.addlist"
  97. bl_label = "Add Entry"
  98. target: StringProperty()
  99. action: StringProperty()
  100. def execute(self, context: bpy.types.Context):
  101. if self.action == "add":
  102. context.collection.microvision.attribution.__getattribute__(self.target).add()
  103. if self.action == "remove":
  104. context.collection.microvision.attribution.__getattribute__(self.target).remove(len(context.collection.microvision.attribution.__getattribute__(self.target)) - 1)
  105. return {'FINISHED'}
  106. class MicrovisionAttributionEditPanel(bpy.types.Panel):
  107. bl_idname = "OBJECT_PT_microvision_attribution_edit_panel"
  108. bl_label = "Attribution Editor"
  109. bl_space_type = "VIEW_3D"
  110. bl_region_type = "UI"
  111. bl_category = "Microvision"
  112. bl_context = "objectmode"
  113. @classmethod
  114. def poll(self, context: bpy.types.Context):
  115. return context.view_layer.layer_collection.collection.children[0].name == "Assets"
  116. def add_buttons(self, layout, target):
  117. row = layout.row()
  118. op = row.operator('microvision.addlist', text="Add")
  119. op.target = target
  120. op.action = "add"
  121. op = row.operator('microvision.addlist', text="Remove")
  122. op.target = target
  123. op.action = "remove"
  124. def draw(self, context: bpy.types.Context):
  125. layout = self.layout
  126. scene = context.scene
  127. attribution_data = context.collection.microvision.attribution
  128. layout.label(text="Authors")
  129. for author in attribution_data.authors:
  130. layout.prop(author, "id")
  131. self.add_buttons(layout, "authors")
  132. layout.label(text="Owners")
  133. for owner in attribution_data.owners:
  134. layout.prop(owner, "id")
  135. self.add_buttons(layout, "owners")
  136. layout.label(text="Sources")
  137. for source in attribution_data.sources:
  138. layout.prop(source, "url")
  139. self.add_buttons(layout, "sources")
  140. layout.label(text="Citations")
  141. for citation in attribution_data.citations:
  142. layout.prop(citation, "url")
  143. self.add_buttons(layout, "citations")
  144. layout.label(text="Tools")
  145. for tool in attribution_data.tools:
  146. layout.prop(tool, "id")
  147. self.add_buttons(layout, "tools")
  148. class MicrovisionAttributionPanel(bpy.types.Panel):
  149. bl_idname = "OBJECT_PT_microvision_attribution_panel"
  150. bl_label = "Attribution"
  151. bl_space_type = "VIEW_3D"
  152. bl_region_type = "UI"
  153. bl_category = "Microvision"
  154. bl_context = "objectmode"
  155. @classmethod
  156. def poll(self, context):
  157. if context.active_object is not None:
  158. if context.active_object.instance_collection is not None:
  159. return True
  160. else:
  161. return False
  162. def draw(self, context: bpy.types.Context):
  163. layout = self.layout
  164. scene = context.scene
  165. attribution_data = context.active_object.instance_collection.microvision.attribution
  166. layout.label(text="Authors")
  167. for author in attribution_data.authors:
  168. id = author.id
  169. layout.operator('wm.url_open', text=attribution.people[id]["name"]).url=attribution.people[id]["url"]
  170. layout.label(text="Owners")
  171. for owner in attribution_data.owners:
  172. id = owner.id
  173. layout.operator('wm.url_open', text=attribution.people[id]["name"]).url=attribution.people[id]["url"]
  174. layout.label(text="Sources")
  175. for source in attribution_data.sources:
  176. url = source.url
  177. layout.operator('wm.url_open', text="Source").url=url
  178. layout.label(text="Citations")
  179. for citation in attribution_data.citations:
  180. url = citation.url
  181. layout.operator('wm.url_open', text="Citation").url=url
  182. layout.label(text="Tools")
  183. for tool in attribution_data.tools:
  184. id = tool.id
  185. layout.operator('wm.url_open', text=attribution.tools[id]["name"]).url=attribution.tools[id]["url"]
  186. class MicrovisionPanel(bpy.types.Panel):
  187. bl_idname = "OBJECT_PT_microvision_panel"
  188. bl_label = "Spawn"
  189. bl_space_type = "VIEW_3D"
  190. bl_region_type = "UI"
  191. bl_category = "Microvision"
  192. bl_context = "objectmode"
  193. @classmethod
  194. def poll(self, context: bpy.types.Context):
  195. return context.view_layer.layer_collection.collection.children[0].name != "Assets"
  196. def draw(self, context: bpy.types.Context):
  197. layout = self.layout
  198. scene = context.scene
  199. if "Microvision Assets" not in bpy.context.view_layer.layer_collection.children:
  200. layout.operator("microvision.load_assets")
  201. else:
  202. layout.prop(context.scene.micro, "group")
  203. layout.prop(context.scene.micro, "kind")
  204. layout.prop(context.scene.micro, "object")
  205. layout.operator("microvision.spawn")
  206. classes = [
  207. LoadAssets,
  208. Spawn,
  209. MicrovisionPerson,
  210. MicrovisionSource,
  211. MicrovisionTool,
  212. MicrovisionAttribution,
  213. MicrovisionData,
  214. AddListItem,
  215. MicrovisionPanel,
  216. MicrovisionAttributionEditPanel,
  217. MicrovisionAttributionPanel,
  218. MicrovisionProperties,
  219. ]
  220. def remove_recursive(collection: bpy.types.Collection):
  221. print(collection)
  222. for child in collection.children:
  223. remove_recursive(child)
  224. collection.children.unlink(child)
  225. bpy.data.collections.remove(child)
  226. def link_data(context: bpy.types.Context):
  227. top = bpy.data.collections.new(name="Microvision Assets")
  228. context.view_layer.layer_collection.collection.children.link(top)
  229. context.view_layer.layer_collection.collection.children["Microvision Assets"].hide_viewport = True
  230. for lib in ["Buildings", "Creatures", "Vehicles"]:
  231. path = f"C:/Users/hausss/AppData/Roaming/Blender Foundation/Blender/2.93/scripts/addons/microvision/libs/{lib}.blend"
  232. category = bpy.data.collections.new(name=lib)
  233. top.children.link(category)
  234. with bpy.data.libraries.load(path, link=True) as (data_from, data_to):
  235. data_to.collections = ["Assets"]
  236. print(len(data_to.collections[0].children))
  237. for coll in data_to.collections[0].children:
  238. print(coll)
  239. if coll is not None:
  240. category.children.link(coll)
  241. objects = bpy.data.collections.new(name="Microvision Objects")
  242. context.view_layer.layer_collection.collection.children.link(objects)
  243. def register():
  244. print("Hi")
  245. importlib.reload(attribution)
  246. for cls in classes:
  247. bpy.utils.register_class(cls)
  248. bpy.types.Scene.micro = PointerProperty(type=MicrovisionProperties)
  249. bpy.types.Collection.microvision = PointerProperty(type=MicrovisionData)
  250. def unregister():
  251. print("Bye")
  252. for cls in classes:
  253. bpy.utils.unregister_class(cls)