diff --git a/src/bonsai/bonsai/bim/module/geometry/operator.py b/src/bonsai/bonsai/bim/module/geometry/operator.py index 4e954af69f..1845330ef9 100644 --- a/src/bonsai/bonsai/bim/module/geometry/operator.py +++ b/src/bonsai/bonsai/bim/module/geometry/operator.py @@ -2218,7 +2218,7 @@ class OverrideModeSetObject(bpy.types.Operator, tool.Ifc.Operator): class FlipObject(bpy.types.Operator): bl_idname = "bim.flip_object" bl_label = "Flip Object" - bl_description = "Flip object's local axes, keep the position" + bl_description = "Flip Element about its local axes, keep the position" bl_options = {"REGISTER", "UNDO"} flip_local_axes: bpy.props.EnumProperty( diff --git a/src/bonsai/bonsai/bim/module/model/data.py b/src/bonsai/bonsai/bim/module/model/data.py index 3a6eda5033..55715b517c 100644 --- a/src/bonsai/bonsai/bim/module/model/data.py +++ b/src/bonsai/bonsai/bim/module/model/data.py @@ -63,14 +63,14 @@ class AuthoringData: cls.data["relating_type_description"] = cls.relating_type_description() # only after .relating_type_id() cls.data["predefined_type"] = cls.predefined_type() # only after .relating_type_id() - # only after .ifc_classes() + # Only after .ifc_classes() cls.data["total_types"] = cls.total_types() cls.data["total_pages"] = cls.total_pages() cls.data["next_page"] = cls.next_page() cls.data["prev_page"] = cls.prev_page() cls.data["paginated_relating_types"] = cls.paginated_relating_types() - cls.data["type_thumbnail"] = cls.type_thumbnail() # only after .relating_type_id() + cls.data["type_thumbnail"] = cls.type_thumbnail() # Only after .relating_type_id() cls.data["is_voidable_element"] = cls.is_voidable_element() cls.data["has_visible_openings"] = cls.has_visible_openings() cls.data["has_visible_boundaries"] = cls.has_visible_boundaries() @@ -81,6 +81,9 @@ class AuthoringData: cls.data["boundary_class"] = cls.boundary_class() cls.data["selected_material_usages"] = cls.selected_material_usages() + # Only after .active_material_usage() and .active_class() + cls.data["is_flippable_element"] = cls.is_flippable_element() + @classmethod def default_container(cls) -> str | None: props = bpy.context.scene.BIMSpatialDecompositionProperties @@ -159,6 +162,15 @@ class AuthoringData: element = tool.Ifc.get_entity(active_object) return element and element.is_a("IfcElement") and not element.is_a("IfcOpeningElement") + @classmethod + def is_flippable_element(cls): + return cls.data["active_material_usage"] in ("LAYER2", "PROFILE") or cls.data["active_class"] in ( + "IfcWindow", + "IfcWindowStandardCase", + "IfcDoor", + "IfcDoorStandardCase", + ) + @classmethod def has_visible_openings(cls): if active_object := tool.Blender.get_active_object(): diff --git a/src/bonsai/bonsai/bim/module/model/ui.py b/src/bonsai/bonsai/bim/module/model/ui.py index 83a0657e2a..8c7bdfbad6 100644 --- a/src/bonsai/bonsai/bim/module/model/ui.py +++ b/src/bonsai/bonsai/bim/module/model/ui.py @@ -548,7 +548,7 @@ class BIM_PT_door(bpy.types.Panel): else: row = self.layout.row() row.label(text="No Door Found") - row.operator("bim.add_door", icon="ADD", text="").obj = "" + row.operator("bim.add_door", icon="ADD", text="") class BIM_PT_railing(bpy.types.Panel): diff --git a/src/bonsai/bonsai/bim/module/model/workspace.py b/src/bonsai/bonsai/bim/module/model/workspace.py index e75e4d178c..3aacbcc817 100644 --- a/src/bonsai/bonsai/bim/module/model/workspace.py +++ b/src/bonsai/bonsai/bim/module/model/workspace.py @@ -698,10 +698,6 @@ class EditObjectUI: ) row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row add_layout_hotkey_operator(row, "Rotate 90", "S_R", "Rotate the selected Element by 90 degrees", ui_context) - row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row - add_layout_hotkey_operator( - row, "Flip", "S_F", "Flip Element about its local axes, keep the position", ui_context - ) elif AuthoringData.data["active_material_usage"] == "LAYER3": if "LAYER2" in AuthoringData.data["selected_material_usages"]: @@ -711,8 +707,6 @@ class EditObjectUI: elif AuthoringData.data["active_material_usage"] == "PROFILE": row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row add_layout_hotkey_operator(row, "Extend", "S_E", "", ui_context) - row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row - add_layout_hotkey_operator(row, "Flip", "S_F", bpy.ops.bim.flip_object.__doc__, ui_context) row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row if AuthoringData.data["active_class"] in ( @@ -758,6 +752,9 @@ class EditObjectUI: row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row add_layout_hotkey_operator(row, "Rotate 90", "S_R", bpy.ops.bim.rotate_90.__doc__, ui_context) + if AuthoringData.data["is_flippable_element"]: + cls.draw_flip(ui_context, row) + if PortData.data["total_ports"] > 0: row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row row.operator( @@ -905,6 +902,11 @@ class EditObjectUI: row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else row add_layout_hotkey_operator(row, "Decomposition", "A_D", "Select decomposition", ui_context) + @classmethod + def draw_flip(cls, ui_context, layout) -> None: + row = cls.layout.row(align=True) if ui_context != "TOOL_HEADER" else layout + add_layout_hotkey_operator(row, "Flip", "S_F", bpy.ops.bim.flip_object.__doc__, ui_context) + class Hotkey(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.hotkey"