diff --git a/src/bonsai/bonsai/bim/module/pset/operator.py b/src/bonsai/bonsai/bim/module/pset/operator.py index a9f57bd9d4..8940e60a59 100644 --- a/src/bonsai/bonsai/bim/module/pset/operator.py +++ b/src/bonsai/bonsai/bim/module/pset/operator.py @@ -213,25 +213,7 @@ class UnsharePset(bpy.types.Operator, tool.Ifc.Operator): return f"{properties.description_}{cls.bl_description}" def _execute(self, context): - # TODO: move to core - ifc_file = tool.Ifc.get() - obj_type: tool.Ifc.OBJECT_TYPE = self.obj_type - elements: list[ifcopenshell.entity_instance] - - pset = ifc_file.by_id(self.pset_id) - pset_elements = ifcopenshell.util.element.get_elements_by_pset(pset) - - if obj_type == "Object": - elements = [ - element - for obj in tool.Blender.get_selected_objects() - if (element := tool.Ifc.get_entity(obj)) and element in pset_elements - ] - else: - element_id = tool.Blender.get_obj_ifc_definition_id(self.obj, obj_type) - assert element_id - elements = [ifc_file.by_id(element_id)] - ifcopenshell.api.pset.unshare_pset(ifc_file, elements, pset) + core.unshare_pset(tool.Ifc, tool.Pset, self.obj_type, self.obj, self.pset_id) class AddQto(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/bonsai/bonsai/core/pset.py b/src/bonsai/bonsai/core/pset.py index c3ffd65046..c2b87836df 100644 --- a/src/bonsai/bonsai/core/pset.py +++ b/src/bonsai/bonsai/core/pset.py @@ -92,3 +92,13 @@ def enable_pset_editing( def add_proposed_prop(pset: tool.Pset, obj_name: str, obj_type: tool.Ifc.OBJECT_TYPE, name: str, value: Any) -> None: props = pset.get_pset_props(obj_name, obj_type) pset.add_proposed_property(name, pset.cast_string_to_primitive(value), props) + + +def unshare_pset( + ifc: tool.Ifc, pset_tool: tool.Pset, obj_type: tool.Ifc.OBJECT_TYPE, obj_name: str, pset_id: int +) -> None: + elements: list[ifcopenshell.entity_instance] + pset = ifc.get_entity_by_id(pset_id) + assert pset + elements = pset_tool.get_selected_pset_elements(obj_name, obj_type, pset) + ifc.run("pset.unshare_pset", products=elements, pset=pset) diff --git a/src/bonsai/bonsai/core/tool.py b/src/bonsai/bonsai/core/tool.py index 356567fe71..e3566b72cf 100644 --- a/src/bonsai/bonsai/core/tool.py +++ b/src/bonsai/bonsai/core/tool.py @@ -465,6 +465,7 @@ class Georeference: class Ifc: def get(cls): pass def get_entity(cls, obj): pass + def get_entity_by_id(cls, element_id): pass def get_object(cls, entity): pass def get_path(cls): pass def get_schema(cls): pass @@ -651,6 +652,7 @@ class Pset: def get_prop_template_primitive_type(cls, prop_template): pass def get_pset_name(cls, obj, obj_type, pset_type): pass def get_pset_template(cls, name): pass + def get_selected_pset_elements(cls, obj_name, obj_type, pset): pass def import_enumerated_value_from_template(cls, prop_template, data, props): pass def import_pset_from_existing(cls, pset, props): pass def import_pset_from_template(cls, pset_template, pset, props): pass diff --git a/src/bonsai/bonsai/tool/pset.py b/src/bonsai/bonsai/tool/pset.py index 9cfef32dfb..b4d9e936d6 100644 --- a/src/bonsai/bonsai/tool/pset.py +++ b/src/bonsai/bonsai/tool/pset.py @@ -150,6 +150,27 @@ class Pset(bonsai.core.tool.Pset): tool.Ifc.schema().declaration_by_name(prop_template.PrimaryMeasureType or "IfcLabel") ) + @classmethod + def get_selected_pset_elements( + cls, obj_name: str, obj_type: tool.Ifc.OBJECT_TYPE, pset: ifcopenshell.entity_instance + ) -> list[ifcopenshell.entity_instance]: + ifc_file = tool.Ifc.get() + pset_elements = ifcopenshell.util.element.get_elements_by_pset(pset) + elements: list[ifcopenshell.entity_instance] + + if obj_type == "Object": + elements = [ + element + for obj in tool.Blender.get_selected_objects() + if (element := tool.Ifc.get_entity(obj)) and element in pset_elements + ] + else: + element_id = tool.Blender.get_obj_ifc_definition_id(obj_name, obj_type) + assert element_id + elements = [ifc_file.by_id(element_id)] + + return elements + @classmethod def import_enumerated_value_from_template( cls, prop_template: ifcopenshell.entity_instance, data: dict[str, Any], props: bpy.types.PropertyGroup diff --git a/src/bonsai/test/core/test_pset.py b/src/bonsai/test/core/test_pset.py index 39f0dde47d..9ebf82bb8d 100644 --- a/src/bonsai/test/core/test_pset.py +++ b/src/bonsai/test/core/test_pset.py @@ -60,3 +60,11 @@ class TestCopyPropertyToSelection: subject.copy_property_to_selection( ifc, pset, is_pset=False, obj="obj", pset_name="qto_name", prop_name="prop_name", prop_value="prop_value" ) + + +class TestUnsharePset: + def test_run(self, ifc, pset): + ifc.get_entity_by_id("pset_id").should_be_called().will_return("pset") + pset.get_selected_pset_elements("obj_name", "obj_type", "pset").should_be_called().will_return("elements") + ifc.run("pset.unshare_pset", products="elements", pset="pset").should_be_called() + subject.unshare_pset(ifc, pset, "obj_type", "obj_name", "pset_id")