Size visualization...IN THREE DIMENSIONS!
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

208 lignes
6.2 KiB

  1. import bpy
  2. from bpy.props import CollectionProperty, EnumProperty, PointerProperty, StringProperty
  3. from bpy.types import PropertyGroup
  4. from . attribution import people
  5. bl_info = {
  6. "name": "Microvision",
  7. "description": "Size comparison, now in 3D!",
  8. "version": (0, 1, 0),
  9. "blender": (2, 80, 0),
  10. "location": "View3D > Toolbar > Microvision",
  11. "author": "chemicalcrux",
  12. "category": "Development"
  13. }
  14. class MicrovisionPerson(PropertyGroup):
  15. id: StringProperty(name="Identifier")
  16. class MicrovisionSource(PropertyGroup):
  17. url: StringProperty(name="URL")
  18. class MicrovisionAttribution(PropertyGroup):
  19. authors: CollectionProperty(name="Authors", type=MicrovisionPerson)
  20. owners: CollectionProperty(name="Owners", type=MicrovisionPerson)
  21. sources: CollectionProperty(name="Owners", type=MicrovisionSource)
  22. class MicrovisionData(PropertyGroup):
  23. attribution: PointerProperty(type=MicrovisionAttribution)
  24. class MicrovisionProperties(PropertyGroup):
  25. def groups(self, context:bpy.types.Context):
  26. results = []
  27. if "Microvision Assets" in bpy.data.collections:
  28. assets = bpy.data.collections["Microvision Assets"]
  29. for index, child in enumerate(assets.children):
  30. results.append(
  31. (child.name, child.name, "", "", index)
  32. )
  33. return results
  34. def kinds(self, context:bpy.types.Context):
  35. results = []
  36. if context.scene.micro.group:
  37. assets = bpy.data.collections[context.scene.micro.group]
  38. for index, child in enumerate(assets.children):
  39. results.append(
  40. (child.name, child.name, "", "", index)
  41. )
  42. return results
  43. def objects(self, context:bpy.types.Context):
  44. results = []
  45. if context.scene.micro.kind:
  46. assets = bpy.data.collections[context.scene.micro.kind]
  47. for index, child in enumerate(assets.children):
  48. results.append(
  49. (child.name, child.name, "", "", index)
  50. )
  51. return results
  52. group: EnumProperty(
  53. name="Group",
  54. items=groups,
  55. description="What general kind of thing to browse",
  56. default=None
  57. )
  58. kind: EnumProperty(
  59. name="Kind",
  60. items=kinds,
  61. description="What specific kind of thing to browse",
  62. default=None
  63. )
  64. object: EnumProperty(
  65. name="Object",
  66. items=objects,
  67. description="The object to spawn",
  68. default=None
  69. )
  70. class LoadAssets(bpy.types.Operator):
  71. bl_idname = "microvision.load_assets"
  72. bl_label = "Load Assets"
  73. def execute(self, context: bpy.types.Context):
  74. link_data(context)
  75. return {'FINISHED'}
  76. class Spawn(bpy.types.Operator):
  77. bl_idname = "microvision.spawn"
  78. bl_label = "Spawn"
  79. def execute(self, context: bpy.types.Context):
  80. empty = bpy.data.objects.new(context.scene.micro.object, None)
  81. empty.instance_type = 'COLLECTION'
  82. empty.instance_collection = bpy.data.collections[context.scene.micro.object]
  83. empty.show_instancer_for_viewport = False
  84. empty.show_instancer_for_render = False
  85. context.scene.collection.objects.link(empty)
  86. return {'FINISHED'}
  87. class MicrovisionAttributionPanel(bpy.types.Panel):
  88. bl_idname = "OBJECT_PT_microvision_attribution_panel"
  89. bl_label = "Attribution"
  90. bl_space_type = "VIEW_3D"
  91. bl_region_type = "UI"
  92. bl_category = "Microvision"
  93. bl_context = "objectmode"
  94. @classmethod
  95. def poll(self, context):
  96. if context.active_object is not None:
  97. if context.active_object.instance_collection is not None:
  98. return True
  99. else:
  100. return False
  101. def draw(self, context: bpy.types.Context):
  102. layout = self.layout
  103. scene = context.scene
  104. layout.label(text="Authors")
  105. for author in context.active_object.instance_collection.microvision.attribution.authors:
  106. id = author.id
  107. layout.operator('wm.url_open', text=people[id]["name"]).url=people[id]["url"]
  108. class MicrovisionPanel(bpy.types.Panel):
  109. bl_idname = "OBJECT_PT_microvision_panel"
  110. bl_label = "Microvision"
  111. bl_space_type = "VIEW_3D"
  112. bl_region_type = "UI"
  113. bl_category = "Microvision"
  114. bl_context = "objectmode"
  115. def draw(self, context: bpy.types.Context):
  116. layout = self.layout
  117. scene = context.scene
  118. layout.label(text="BIG TIME")
  119. layout.operator("microvision.load_assets")
  120. layout.prop(context.scene.micro, "group")
  121. layout.prop(context.scene.micro, "kind")
  122. layout.prop(context.scene.micro, "object")
  123. layout.operator("microvision.spawn")
  124. classes = [
  125. LoadAssets,
  126. Spawn,
  127. MicrovisionPerson,
  128. MicrovisionSource,
  129. MicrovisionPanel,
  130. MicrovisionAttributionPanel,
  131. MicrovisionAttribution,
  132. MicrovisionData,
  133. MicrovisionProperties,
  134. ]
  135. def link_data(context: bpy.types.Context):
  136. top = bpy.data.collections.new(name="Microvision Assets")
  137. context.view_layer.layer_collection.collection.children.link(top)
  138. context.view_layer.layer_collection.children["Microvision Assets"].hide_viewport = True
  139. for lib in ["Buildings", "Vehicles"]:
  140. path = f"C:/Users/hausss/AppData/Roaming/Blender Foundation/Blender/2.93/scripts/addons/microvision/libs/{lib}.blend"
  141. category = bpy.data.collections.new(name=lib)
  142. top.children.link(category)
  143. with bpy.data.libraries.load(path, link=True) as (data_from, data_to):
  144. data_to.collections = ["Assets"]
  145. print(len(data_to.collections[0].children))
  146. for coll in data_to.collections[0].children:
  147. print(coll)
  148. if coll is not None:
  149. category.children.link(coll)
  150. def register():
  151. print("Hi")
  152. for cls in classes:
  153. bpy.utils.register_class(cls)
  154. bpy.types.Scene.micro = PointerProperty(type=MicrovisionProperties)
  155. bpy.types.Collection.microvision = PointerProperty(type=MicrovisionData)
  156. def unregister():
  157. print("Bye")
  158. for cls in classes:
  159. bpy.utils.unregister_class(cls)