From a0e6605834b955840ae2e439fd2d7144dd863004 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 16 Oct 2024 17:42:27 +0500 Subject: [PATCH] support adding parametric roof to object without representations --- src/bonsai/bonsai/bim/module/model/roof.py | 23 +++++++++++++++------- src/bonsai/bonsai/bim/module/model/ui.py | 6 ++++-- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/model/roof.py b/src/bonsai/bonsai/bim/module/model/roof.py index 41ea8d1bdb..3626f30352 100644 --- a/src/bonsai/bonsai/bim/module/model/roof.py +++ b/src/bonsai/bonsai/bim/module/model/roof.py @@ -428,12 +428,12 @@ def update_bbim_roof_pset(element: ifcopenshell.entity_instance, roof_data: dict ifcopenshell.api.run("pset.edit_pset", tool.Ifc.get(), pset=pset, properties={"Data": roof_data}) -def update_roof_modifier_bmesh(context: bpy.types.Context) -> None: +def update_roof_modifier_bmesh(obj: bpy.types.Object) -> None: """before using should make sure that Data contains up-to-date information. If BBIM Pset just changed should call refresh() before updating bmesh """ - obj = context.active_object props = obj.BIMRoofProperties + assert isinstance(obj.data, bpy.types.Mesh) # NOTE: using Data since bmesh update will hapen very often if not RoofData.is_loaded: @@ -555,6 +555,7 @@ class AddRoof(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): obj = context.active_object + assert obj element = tool.Ifc.get_entity(obj) props = obj.BIMRoofProperties si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) @@ -587,7 +588,12 @@ class AddRoof(bpy.types.Operator, tool.Ifc.Operator): update_bbim_roof_pset(element, roof_data) refresh() - update_roof_modifier_bmesh(context) + + if obj.type == "EMPTY": + obj = tool.Geometry.recreate_object_with_data(obj, data=bpy.data.meshes.new("temp"), is_global=True) + tool.Blender.set_active_object(obj) + + update_roof_modifier_bmesh(obj) update_roof_modifier_ifc_data(context) tool.Model.add_body_representation(obj) @@ -614,12 +620,13 @@ class CancelEditingRoof(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): obj = context.active_object + assert obj data = tool.Model.get_modeling_bbim_pset_data(obj, "BBIM_Roof")["data_dict"] props = obj.BIMRoofProperties # restore previous settings since editing was canceled props.set_props_kwargs_from_ifc_data(data) - update_roof_modifier_bmesh(context) + update_roof_modifier_bmesh(obj) props.is_editing = False return {"FINISHED"} @@ -655,6 +662,7 @@ class EnableEditingRoofPath(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): obj = context.active_object + assert obj [o.select_set(False) for o in context.selected_objects if o != obj] props = obj.BIMRoofProperties data = tool.Model.get_modeling_bbim_pset_data(obj, "BBIM_Roof")["data_dict"] @@ -662,7 +670,7 @@ class EnableEditingRoofPath(bpy.types.Operator, tool.Ifc.Operator): props.set_props_kwargs_from_ifc_data(data) props.is_editing_path = True - update_roof_modifier_bmesh(context) + update_roof_modifier_bmesh(obj) if bpy.context.active_object.mode != "EDIT": bpy.ops.object.mode_set(mode="EDIT") @@ -710,13 +718,14 @@ class EnableEditingRoofPath(bpy.types.Operator, tool.Ifc.Operator): def cancel_editing_roof_path(context: bpy.types.Context) -> set[str]: obj = context.active_object + assert obj props = obj.BIMRoofProperties ProfileDecorator.uninstall() props.is_editing_path = False - update_roof_modifier_bmesh(context) - if bpy.context.active_object.mode == "EDIT": + update_roof_modifier_bmesh(obj) + if obj.mode == "EDIT": bpy.ops.object.mode_set(mode="OBJECT") return {"FINISHED"} diff --git a/src/bonsai/bonsai/bim/module/model/ui.py b/src/bonsai/bonsai/bim/module/model/ui.py index a0004e39cb..7616c04c78 100644 --- a/src/bonsai/bonsai/bim/module/model/ui.py +++ b/src/bonsai/bonsai/bim/module/model/ui.py @@ -630,7 +630,9 @@ class BIM_PT_roof(bpy.types.Panel): if not RoofData.is_loaded: RoofData.load() - props = context.active_object.BIMRoofProperties + obj = context.active_object + assert obj + props = obj.BIMRoofProperties if RoofData.data["pset_data"]: row = self.layout.row(align=True) @@ -645,7 +647,7 @@ class BIM_PT_roof(bpy.types.Panel): for prop in general_props: self.layout.prop(props, prop) - update_roof_modifier_bmesh(context) + update_roof_modifier_bmesh(obj) elif props.is_editing_path: row.operator("bim.finish_editing_roof_path", icon="CHECKMARK", text="")