From 86ed354a05019e3ee5e2adf22cd5aa30b99385b3 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 1 Apr 2023 21:27:20 +1100 Subject: [PATCH] Fix #2922. You can now edit extrusion profiles of swept solids. --- .../blenderbim/bim/module/model/data.py | 7 +++++ .../blenderbim/bim/module/model/opening.py | 5 ++-- .../blenderbim/bim/module/model/slab.py | 12 ++++++--- .../blenderbim/bim/module/model/workspace.py | 27 ++++++++++++------- src/blenderbim/blenderbim/tool/geometry.py | 5 ++++ 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/data.py b/src/blenderbim/blenderbim/bim/module/model/data.py index 336cd28b02..9f394dc076 100644 --- a/src/blenderbim/blenderbim/bim/module/model/data.py +++ b/src/blenderbim/blenderbim/bim/module/model/data.py @@ -64,6 +64,7 @@ class AuthoringData: cls.data["has_visible_openings"] = cls.has_visible_openings() cls.data["active_class"] = cls.active_class() cls.data["active_material_usage"] = cls.active_material_usage() + cls.data["active_representation_type"] = cls.active_representation_type() @classmethod def type_class(cls): @@ -187,6 +188,12 @@ class AuthoringData: if element: return tool.Model.get_usage_type(element) + @classmethod + def active_representation_type(cls): + representation = tool.Geometry.get_active_representation(bpy.context.active_object) + if representation: + return representation.RepresentationType + @classmethod def ifc_classes(cls): results = [] diff --git a/src/blenderbim/blenderbim/bim/module/model/opening.py b/src/blenderbim/blenderbim/bim/module/model/opening.py index 7bdcc766a1..0d0115177f 100644 --- a/src/blenderbim/blenderbim/bim/module/model/opening.py +++ b/src/blenderbim/blenderbim/bim/module/model/opening.py @@ -709,13 +709,12 @@ class EditOpenings(Operator, tool.Ifc.Operator): if opening_obj: if tool.Ifc.is_edited(opening_obj): tool.Geometry.run_geometry_update_representation(obj=opening_obj) - building_objs.add(obj) - building_objs.update(self.get_all_building_objects_of_similar_openings(opening)) elif tool.Ifc.is_moved(opening_obj): blenderbim.core.geometry.edit_object_placement( tool.Ifc, tool.Geometry, tool.Surveyor, obj=opening_obj ) - building_objs.add(obj) + building_objs.add(obj) + building_objs.update(self.get_all_building_objects_of_similar_openings(opening)) tool.Ifc.unlink(element=opening, obj=opening_obj) bpy.data.objects.remove(opening_obj) diff --git a/src/blenderbim/blenderbim/bim/module/model/slab.py b/src/blenderbim/blenderbim/bim/module/model/slab.py index f151fe343e..d41e0087fb 100644 --- a/src/blenderbim/blenderbim/bim/module/model/slab.py +++ b/src/blenderbim/blenderbim/bim/module/model/slab.py @@ -604,6 +604,7 @@ class EnableEditingExtrusionProfile(bpy.types.Operator, tool.Ifc.Operator): element = tool.Ifc.get_entity(obj) body = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") + body = ifcopenshell.util.representation.resolve_representation(body) extrusion = tool.Model.get_extrusion(body) if extrusion.Position: @@ -636,8 +637,9 @@ class EditExtrusionProfile(bpy.types.Operator, tool.Ifc.Operator): obj = context.active_object element = tool.Ifc.get_entity(obj) - representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") - extrusion = tool.Model.get_extrusion(representation) + body = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW") + body = ifcopenshell.util.representation.resolve_representation(body) + extrusion = tool.Model.get_extrusion(body) if extrusion.Position: position = Matrix(ifcopenshell.util.placement.get_axis2placement(extrusion.Position).tolist()) position[0][3] *= self.unit_scale @@ -670,13 +672,17 @@ class EditExtrusionProfile(bpy.types.Operator, tool.Ifc.Operator): tool.Ifc, tool.Geometry, obj=obj, - representation=representation, + representation=body, should_reload=True, is_global=True, should_sync_changes_first=False, ) bpy.data.meshes.remove(profile_mesh) + # Only certain classes should have a footprint + if element.is_a() not in ("IfcSlab", "IfcRamp"): + return {"FINISHED"} + footprint_context = ifcopenshell.util.representation.get_context( tool.Ifc.get(), "Plan", "FootPrint", "SKETCH_VIEW" ) diff --git a/src/blenderbim/blenderbim/bim/module/model/workspace.py b/src/blenderbim/blenderbim/bim/module/model/workspace.py index 06e5e2a170..95054955a6 100644 --- a/src/blenderbim/blenderbim/bim/module/model/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/model/workspace.py @@ -190,12 +190,10 @@ class BimToolUI: row.operator("bim.join_wall", icon="X", text="").join_type = "" elif AuthoringData.data["active_material_usage"] == "LAYER3": - # unnecessary check because BIM Tool is not available in EDIT mode? - if context.active_object.mode == "OBJECT": - row = cls.layout.row(align=True) - row.label(text="", icon="EVENT_SHIFT") - row.label(text="", icon="EVENT_E") - row.operator("bim.hotkey", text="Edit Profile").hotkey = "S_E" + row = cls.layout.row(align=True) + row.label(text="", icon="EVENT_SHIFT") + row.label(text="", icon="EVENT_E") + row.operator("bim.hotkey", text="Edit Profile").hotkey = "S_E" row = cls.layout.row(align=True) row.prop(data=cls.props, property="x_angle", text="X Angle") @@ -240,6 +238,11 @@ class BimToolUI: row.label(text="", icon="EVENT_G") add_layout_hotkey_operator(row, "Regen", "S_G", bpy.ops.bim.recalculate_profile.__doc__) row.operator("bim.extend_profile", icon="X", text="").join_type = "" + elif AuthoringData.data["active_representation_type"] == "SweptSolid": + row = cls.layout.row(align=True) + row.label(text="", icon="EVENT_SHIFT") + row.label(text="", icon="EVENT_E") + row.operator("bim.hotkey", text="Edit Profile").hotkey = "S_E" elif AuthoringData.data["active_class"] in ( "IfcWindow", @@ -483,8 +486,12 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator): continue usage = tool.Model.get_usage_type(element) if not usage: - obj.select_set(False) - continue + representation = tool.Geometry.get_active_representation(obj) + if representation and representation.RepresentationType == "SweptSolid": + usage = "SWEPTSOLID" + else: + obj.select_set(False) + continue selected_usages.setdefault(usage, []).append(obj) if len(bpy.context.selected_objects) == 1: @@ -498,7 +505,9 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator): elif self.active_material_usage == "PROFILE": # Extend PROFILE to cursor bpy.ops.bim.extend_profile(join_type="T") - + else: + # Edit SWEPTSOLID profile (assuming single profile for now) + bpy.ops.bim.enable_editing_extrusion_profile() elif self.active_material_usage == "LAYER2" and selected_usages.get("PROFILE", []): # Extend PROFILEs to LAYER2 [o.select_set(False) for o in selected_usages.get("LAYER3", [])] diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 2df24d3fa8..59621b8374 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -77,6 +77,11 @@ class Geometry(blenderbim.core.tool.Geometry): if obj.data: return obj.data.copy() + @classmethod + def get_active_representation(cls, obj): + if obj.data and hasattr(obj.data, "BIMMeshProperties") and obj.data.BIMMeshProperties.ifc_definition_id: + return tool.Ifc.get().by_id(obj.data.BIMMeshProperties.ifc_definition_id) + @classmethod def get_cartesian_point_coordinate_offset(cls, obj): props = bpy.context.scene.BIMGeoreferenceProperties