diff --git a/src/bonsai/bonsai/bim/module/geometry/operator.py b/src/bonsai/bonsai/bim/module/geometry/operator.py index a4d54ab9c3..e4e4e0e3c8 100644 --- a/src/bonsai/bonsai/bim/module/geometry/operator.py +++ b/src/bonsai/bonsai/bim/module/geometry/operator.py @@ -1909,7 +1909,7 @@ class RemoveRepresentationItem(bpy.types.Operator, tool.Ifc.Operator): bpy.ops.bim.enable_editing_representation_items() -def poll_editing_representaiton_item_style(cls, context): +def poll_editing_representation_item_style(cls, context): if not (obj := getattr(context, "active_object", None)): return False props = obj.BIMGeometryProperties @@ -1944,7 +1944,7 @@ class EnableEditingRepresentationItemStyle(bpy.types.Operator, tool.Ifc.Operator @classmethod def poll(cls, context): - return poll_editing_representaiton_item_style(cls, context) + return poll_editing_representation_item_style(cls, context) def _execute(self, context): props = context.active_object.BIMGeometryProperties @@ -1994,30 +1994,76 @@ class DisableEditingRepresentationItemStyle(bpy.types.Operator, tool.Ifc.Operato class UnassignRepresentationItemStyle(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.unassign_representation_item_style" bl_label = "Unassign Representation Item Style" + bl_description = "Will remove the style from all selected objects" bl_options = {"REGISTER", "UNDO"} @classmethod def poll(cls, context): - return poll_editing_representaiton_item_style(cls, context) + return poll_editing_representation_item_style(cls, context) def _execute(self, context): - obj = context.active_object - props = obj.BIMGeometryProperties - props.is_editing_item_style = False + active_obj = context.active_object + active_props = active_obj.BIMGeometryProperties + active_props.is_editing_item_style = False - # get active representation item - representation_item_id = props.items[props.active_item_index].ifc_definition_id - representation_item = tool.Ifc.get_entity_by_id(representation_item_id) - if not representation_item: - self.report({"ERROR"}, f"Couldn't find representation item by id {representation_item_id}.") + # Get active representation item + active_representation_item_id = active_props.items[active_props.active_item_index].ifc_definition_id + active_representation_item = tool.Ifc.get_entity_by_id(active_representation_item_id) + if not active_representation_item: + self.report({"ERROR"}, f"Couldn't find representation item by id {active_representation_item_id}.") return {"CANCELLED"} - tool.Style.assign_style_to_representation_item(representation_item, None) - tool.Geometry.reload_representation(obj) - # reload items ui + # Retrieve styles applied to the active representation item + active_styles = set() + if hasattr(active_representation_item, 'StyledByItem'): + for styled_by_item in active_representation_item.StyledByItem: + if hasattr(styled_by_item, 'Styles'): + active_styles.update(styled_by_item.Styles) + + if not active_styles: + self.report({"ERROR"}, "Couldn't find any styles associated with the active representation item.") + return {"CANCELLED"} + + # Unassign matching styles from the active object itself + for style in active_styles: + tool.Style.assign_style_to_representation_item(active_representation_item, None) + tool.Geometry.reload_representation(active_obj) + break # No need to check further if one matching style is found + + # Iterate over selected objects and unassign matching styles + for obj in context.selected_objects: + if obj == active_obj: + continue # Skip the active object itself + + # Get the IFC entity directly from the object + element = tool.Ifc.get_entity(obj) + if not element: + continue # Skip if no IFC entity is found + + representation_item_id = element.Representation.Representations[0].Items[0].id() + representation_item = tool.Ifc.get_entity_by_id(representation_item_id) + + if representation_item: + # Retrieve styles for the current representation item + styles = set() + if hasattr(representation_item, 'StyledByItem'): + for styled_by_item in representation_item.StyledByItem: + if hasattr(styled_by_item, 'Styles'): + styles.update(styled_by_item.Styles) + + # Unassign matching styles + for style in styles: + if style in active_styles: + tool.Style.assign_style_to_representation_item(representation_item, None) + tool.Geometry.reload_representation(obj) + break # No need to check further if one matching style is found + + # Reload UI items bpy.ops.bim.disable_editing_representation_items() bpy.ops.bim.enable_editing_representation_items() + + class EnableEditingRepresentationItemShapeAspect(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.enable_editing_representation_item_shape_aspect"