From 77a97233c54a4580d8abecd3525527be662c3901 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 19 May 2021 16:24:34 +1000 Subject: [PATCH] New authoring panel for adding instances and fix bug where new cube instances were missing a face --- src/blenderbim/blenderbim/bim/__init__.py | 3 +- .../blenderbim/bim/module/clash/ui.py | 1 + .../blenderbim/bim/module/georeference/ui.py | 1 + .../blenderbim/bim/module/model/__init__.py | 5 +- .../blenderbim/bim/module/model/operator.py | 45 ++++++++++++++++++ .../blenderbim/bim/module/model/ui.py | 39 ++++++++++++++++ .../blenderbim/bim/module/qto/ui.py | 1 + .../blenderbim/bim/module/search/ui.py | 1 + .../blenderbim/bim/module/type/__init__.py | 8 ++-- .../blenderbim/bim/module/type/operator.py | 46 ------------------- .../blenderbim/bim/module/type/prop.py | 5 ++ src/blenderbim/blenderbim/bim/ui.py | 21 --------- 12 files changed, 102 insertions(+), 74 deletions(-) create mode 100644 src/blenderbim/blenderbim/bim/module/model/operator.py create mode 100644 src/blenderbim/blenderbim/bim/module/model/ui.py diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index b2363a58ff..dd182b00c8 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -15,6 +15,7 @@ if bpy is not None: "bcf": None, "root": None, "unit": None, + "model": None, "georeference": None, "context": None, "drawing": None, @@ -33,7 +34,6 @@ if bpy is not None: "material": None, "style": None, "layer": None, - "model": None, "owner": None, "pset": None, "qto": None, @@ -87,7 +87,6 @@ if bpy is not None: prop.ItemSlotMap, prop.BIMMeshProperties, ui.BIM_PT_section_plane, - ui.BIM_PT_misc_utilities, ui.BIM_UL_generic, ui.BIM_UL_topics, ui.BIM_ADDON_preferences, diff --git a/src/blenderbim/blenderbim/bim/module/clash/ui.py b/src/blenderbim/blenderbim/bim/module/clash/ui.py index d7f3416b65..a6a37a7680 100644 --- a/src/blenderbim/blenderbim/bim/module/clash/ui.py +++ b/src/blenderbim/blenderbim/bim/module/clash/ui.py @@ -93,6 +93,7 @@ class BIM_PT_ifcclash(Panel): class BIM_PT_clash_manager(Panel): bl_idname = "BIM_PT_clash_manager" bl_label = "Clash Manager" + bl_options = {"DEFAULT_CLOSED"} bl_space_type = "VIEW_3D" bl_region_type = "UI" bl_category = "BlenderBIM" diff --git a/src/blenderbim/blenderbim/bim/module/georeference/ui.py b/src/blenderbim/blenderbim/bim/module/georeference/ui.py index 163053f83b..58c5ec0e35 100644 --- a/src/blenderbim/blenderbim/bim/module/georeference/ui.py +++ b/src/blenderbim/blenderbim/bim/module/georeference/ui.py @@ -187,6 +187,7 @@ class BIM_PT_gis(Panel): class BIM_PT_gis_utilities(Panel): bl_idname = "BIM_PT_gis_utilities" bl_label = "Georeferencing Utilities" + bl_options = {"DEFAULT_CLOSED"} bl_space_type = "VIEW_3D" bl_region_type = "UI" bl_category = "BlenderBIM" diff --git a/src/blenderbim/blenderbim/bim/module/model/__init__.py b/src/blenderbim/blenderbim/bim/module/model/__init__.py index 23f5bbb353..b6dc4f5eb0 100644 --- a/src/blenderbim/blenderbim/bim/module/model/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/model/__init__.py @@ -1,7 +1,10 @@ import bpy -from . import grid, wall, stair, door, window, slab, opening, pie +from . import operator, ui, grid, wall, stair, door, window, slab, opening, pie classes = ( + operator.AddTypeInstance, + ui.BIM_PT_authoring, + ui.BIM_PT_misc_utilities, grid.BIM_OT_add_object, wall.BIM_OT_add_object, stair.BIM_OT_add_object, diff --git a/src/blenderbim/blenderbim/bim/module/model/operator.py b/src/blenderbim/blenderbim/bim/module/model/operator.py new file mode 100644 index 0000000000..6741d48e45 --- /dev/null +++ b/src/blenderbim/blenderbim/bim/module/model/operator.py @@ -0,0 +1,45 @@ +import bpy +import ifcopenshell +import ifcopenshell.util.type +from blenderbim.bim.ifc import IfcStore +from mathutils import Vector + + +class AddTypeInstance(bpy.types.Operator): + bl_idname = "bim.add_type_instance" + bl_label = "Add Type Instance" + + def execute(self, context): + tprops = context.scene.BIMTypeProperties + if not tprops.ifc_class or not tprops.relating_type: + return {"FINISHED"} + # A cube + verts = [ + Vector((-1, -1, -1)), + Vector((-1, -1, 1)), + Vector((-1, 1, -1)), + Vector((-1, 1, 1)), + Vector((1, -1, -1)), + Vector((1, -1, 1)), + Vector((1, 1, -1)), + Vector((1, 1, 1)), + ] + edges = [] + faces = [ + [0, 2, 3, 1], + [2, 3, 7, 6], + [4, 5, 7, 6], + [0, 1, 5, 4], + [1, 3, 7, 5], + [0, 2, 6, 4], + ] + mesh = bpy.data.meshes.new(name="Instance") + mesh.from_pydata(verts, edges, faces) + obj = bpy.data.objects.new("Instance", mesh) + obj.location = context.scene.cursor.location + context.view_layer.active_layer_collection.collection.objects.link(obj) + self.file = IfcStore.get_file() + instance_class = ifcopenshell.util.type.get_applicable_entities(tprops.ifc_class, self.file.schema)[0] + bpy.ops.bim.assign_class(obj=obj.name, ifc_class=instance_class) + bpy.ops.bim.assign_type(relating_type=int(tprops.relating_type), related_object=obj.name) + return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/model/ui.py b/src/blenderbim/blenderbim/bim/module/model/ui.py new file mode 100644 index 0000000000..487e941f2f --- /dev/null +++ b/src/blenderbim/blenderbim/bim/module/model/ui.py @@ -0,0 +1,39 @@ +from bpy.types import Panel +from blenderbim.bim.ifc import IfcStore + + +class BIM_PT_authoring(Panel): + bl_idname = "BIM_PT_authoring" + bl_label = "Authoring" + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "BlenderBIM" + + def draw(self, context): + tprops = context.scene.BIMTypeProperties + col = self.layout.column(align=True) + col.prop(tprops, "ifc_class", text="", icon="FILE_VOLUME") + col.prop(tprops, "relating_type", text="", icon="FILE_3D") + col.operator("bim.add_type_instance", icon="ADD") + + +class BIM_PT_misc_utilities(Panel): + bl_idname = "BIM_PT_misc_utilities" + bl_label = "Miscellaneous" + bl_options = {"DEFAULT_CLOSED"} + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "BlenderBIM" + + def draw(self, context): + layout = self.layout + props = context.scene.BIMProperties + + row = layout.row() + row.prop(props, "override_colour", text="") + row = layout.row(align=True) + row.operator("bim.set_override_colour") + row = layout.row(align=True) + row.operator("bim.set_viewport_shadow_from_sun") + row = layout.row(align=True) + row.operator("bim.snap_spaces_together") diff --git a/src/blenderbim/blenderbim/bim/module/qto/ui.py b/src/blenderbim/blenderbim/bim/module/qto/ui.py index 567d2eee11..9bdcbb8147 100644 --- a/src/blenderbim/blenderbim/bim/module/qto/ui.py +++ b/src/blenderbim/blenderbim/bim/module/qto/ui.py @@ -4,6 +4,7 @@ from bpy.types import Panel class BIM_PT_qto_utilities(Panel): bl_idname = "BIM_PT_qto_utilities" bl_label = "Quantity Take-off" + bl_options = {"DEFAULT_CLOSED"} bl_space_type = "VIEW_3D" bl_region_type = "UI" bl_category = "BlenderBIM" diff --git a/src/blenderbim/blenderbim/bim/module/search/ui.py b/src/blenderbim/blenderbim/bim/module/search/ui.py index 2e815f716d..a12b4ace6a 100644 --- a/src/blenderbim/blenderbim/bim/module/search/ui.py +++ b/src/blenderbim/blenderbim/bim/module/search/ui.py @@ -1,5 +1,6 @@ import bpy from bpy.types import Panel +from blenderbim.bim.ifc import IfcStore class BIM_PT_search(Panel): diff --git a/src/blenderbim/blenderbim/bim/module/type/__init__.py b/src/blenderbim/blenderbim/bim/module/type/__init__.py index 4c0a895510..dc1afcd7e2 100644 --- a/src/blenderbim/blenderbim/bim/module/type/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/type/__init__.py @@ -7,17 +7,17 @@ classes = ( operator.EnableEditingType, operator.DisableEditingType, operator.SelectSimilarType, - operator.AddTypeInstance, prop.BIMTypeProperties, + prop.BIMTypeObjectProperties, ui.BIM_PT_type, ) def register(): - bpy.types.Object.BIMTypeProperties = bpy.props.PointerProperty(type=prop.BIMTypeProperties) - bpy.types.VIEW3D_MT_mesh_add.append(ui.add_object_button) + bpy.types.Scene.BIMTypeProperties = bpy.props.PointerProperty(type=prop.BIMTypeProperties) + bpy.types.Object.BIMTypeProperties = bpy.props.PointerProperty(type=prop.BIMTypeObjectProperties) def unregister(): + del bpy.types.Scene.BIMTypeProperties del bpy.types.Object.BIMTypeProperties - bpy.types.VIEW3D_MT_mesh_add.remove(ui.add_object_button) diff --git a/src/blenderbim/blenderbim/bim/module/type/operator.py b/src/blenderbim/blenderbim/bim/module/type/operator.py index bd03a490e1..9d50aa6804 100644 --- a/src/blenderbim/blenderbim/bim/module/type/operator.py +++ b/src/blenderbim/blenderbim/bim/module/type/operator.py @@ -5,8 +5,6 @@ import ifcopenshell.api from blenderbim.bim.ifc import IfcStore from ifcopenshell.api.type.data import Data from ifcopenshell.api.geometry.data import Data as GeometryData -from blenderbim.bim.module.type.prop import getIfcTypes, getAvailableTypes, updateTypeInstanceIfcClass -from mathutils import Vector class AssignType(bpy.types.Operator): @@ -115,47 +113,3 @@ class SelectSimilarType(bpy.types.Operator): if obj.BIMObjectProperties.ifc_definition_id in related_objects: obj.select_set(True) return {"FINISHED"} - - -class AddTypeInstance(bpy.types.Operator): - bl_idname = "bim.add_type_instance" - bl_label = "Add Type Instance" - ifc_class: bpy.props.EnumProperty(items=getIfcTypes, name="IFC Class", update=updateTypeInstanceIfcClass) - relating_type: bpy.props.EnumProperty(items=getAvailableTypes, name="Relating Type") - - def execute(self, context): - if not self.ifc_class or not self.relating_type: - return {"FINISHED"} - # A cube - verts = [ - Vector((-1, -1, -1)), - Vector((-1, -1, 1)), - Vector((-1, 1, -1)), - Vector((-1, 1, 1)), - Vector((1, -1, -1)), - Vector((1, -1, 1)), - Vector((1, 1, -1)), - Vector((1, 1, 1)), - ] - edges = [] - faces = [ - [0, 2, 3, 1], - [2, 3, 7, 6], - [4, 5, 7, 6], - [0, 1, 5, 4], - [1, 3, 7, 5], - ] - mesh = bpy.data.meshes.new(name="Instance") - mesh.from_pydata(verts, edges, faces) - obj = bpy.data.objects.new("Instance", mesh) - obj.location = context.scene.cursor.location - context.view_layer.active_layer_collection.collection.objects.link(obj) - self.file = IfcStore.get_file() - instance_class = ifcopenshell.util.type.get_applicable_entities(self.ifc_class, self.file.schema)[0] - bpy.ops.bim.assign_class(obj=obj.name, ifc_class=instance_class) - bpy.ops.bim.assign_type(relating_type=int(self.relating_type), related_object=obj.name) - return {"FINISHED"} - - def invoke(self, context, event): - wm = context.window_manager - return wm.invoke_props_dialog(self) diff --git a/src/blenderbim/blenderbim/bim/module/type/prop.py b/src/blenderbim/blenderbim/bim/module/type/prop.py index bb895a7a36..3a40fe3da4 100644 --- a/src/blenderbim/blenderbim/bim/module/type/prop.py +++ b/src/blenderbim/blenderbim/bim/module/type/prop.py @@ -88,6 +88,11 @@ def updateTypeDropdowns(self, context): class BIMTypeProperties(PropertyGroup): + ifc_class: bpy.props.EnumProperty(items=getIfcTypes, name="IFC Class", update=updateTypeInstanceIfcClass) + relating_type: bpy.props.EnumProperty(items=getAvailableTypes, name="Relating Type") + + +class BIMTypeObjectProperties(PropertyGroup): is_editing_type: BoolProperty(name="Is Editing Type", update=updateTypeDropdowns) relating_type_class: EnumProperty(items=getApplicableTypes, name="Relating Type Class") relating_type: EnumProperty(items=getRelatingTypes, name="Relating Type") diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 6242224e23..29fbac4c0a 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -89,27 +89,6 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences): row.prop(self, "should_hide_empty_props") -class BIM_PT_misc_utilities(Panel): - bl_idname = "BIM_PT_misc_utilities" - bl_label = "Miscellaneous" - bl_space_type = "VIEW_3D" - bl_region_type = "UI" - bl_category = "BlenderBIM" - - def draw(self, context): - layout = self.layout - props = context.scene.BIMProperties - - row = layout.row() - row.prop(props, "override_colour", text="") - row = layout.row(align=True) - row.operator("bim.set_override_colour") - row = layout.row(align=True) - row.operator("bim.set_viewport_shadow_from_sun") - row = layout.row(align=True) - row.operator("bim.snap_spaces_together") - - def ifc_units(self, context): scene = context.scene props = context.scene.BIMProperties