From 0959a7f6a3eb7b5e624a80f4dfa63677345182eb Mon Sep 17 00:00:00 2001 From: Sigma Dimensions <79010126+myoualid@users.noreply.github.com> Date: Mon, 12 Jun 2023 15:21:33 +0100 Subject: [PATCH] Refactor and re-use common spatial_tool.select_products --- .../blenderbim/bim/module/material/operator.py | 2 +- .../blenderbim/bim/module/style/operator.py | 2 +- .../blenderbim/bim/module/system/operator.py | 2 +- src/blenderbim/blenderbim/core/material.py | 7 +++++-- src/blenderbim/blenderbim/core/style.py | 4 ++-- src/blenderbim/blenderbim/core/system.py | 4 ++-- src/blenderbim/blenderbim/core/tool.py | 3 --- src/blenderbim/blenderbim/tool/material.py | 7 ------- src/blenderbim/blenderbim/tool/system.py | 8 +------- src/blenderbim/test/core/test_material.py | 6 +++--- src/blenderbim/test/core/test_style.py | 9 ++++++++- src/blenderbim/test/core/test_system.py | 14 +++++++------- src/blenderbim/test/tool/test_material.py | 11 ----------- src/blenderbim/test/tool/test_spatial.py | 12 ++++++++++++ src/blenderbim/test/tool/test_style.py | 12 ------------ src/blenderbim/test/tool/test_system.py | 12 ------------ 16 files changed, 43 insertions(+), 72 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/material/operator.py b/src/blenderbim/blenderbim/bim/module/material/operator.py index e3cf6fa02e..5fdbc4ea2a 100644 --- a/src/blenderbim/blenderbim/bim/module/material/operator.py +++ b/src/blenderbim/blenderbim/bim/module/material/operator.py @@ -56,7 +56,7 @@ class SelectByMaterial(bpy.types.Operator, tool.Ifc.Operator): material: bpy.props.IntProperty() def _execute(self, context): - core.select_by_material(tool.Material, material=tool.Ifc.get().by_id(self.material)) + core.select_by_material(tool.Material, tool.Spatial, material=tool.Ifc.get().by_id(self.material)) class EnableEditingMaterial(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/blenderbim/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py index 1aebd3d97c..9dd0401c7c 100644 --- a/src/blenderbim/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -332,4 +332,4 @@ class SelectByStyle(bpy.types.Operator, tool.Ifc.Operator): style: bpy.props.IntProperty() def _execute(self, context): - core.select_by_style(tool.Style, style=tool.Ifc.get().by_id(self.style)) + core.select_by_style(tool.Style, tool.Spatial, style=tool.Ifc.get().by_id(self.style)) diff --git a/src/blenderbim/blenderbim/bim/module/system/operator.py b/src/blenderbim/blenderbim/bim/module/system/operator.py index 9b9165e97d..f421f77625 100644 --- a/src/blenderbim/blenderbim/bim/module/system/operator.py +++ b/src/blenderbim/blenderbim/bim/module/system/operator.py @@ -140,7 +140,7 @@ class ShowPorts(bpy.types.Operator, Operator): bl_options = {"REGISTER", "UNDO"} def _execute(self, context): - core.show_ports(tool.Ifc, tool.System, element=tool.Ifc.get_entity(context.active_object)) + core.show_ports(tool.Ifc, tool.System, tool.Spatial, element=tool.Ifc.get_entity(context.active_object)) class HidePorts(bpy.types.Operator, Operator): diff --git a/src/blenderbim/blenderbim/core/material.py b/src/blenderbim/blenderbim/core/material.py index ca0c872199..d65e91c5e2 100644 --- a/src/blenderbim/blenderbim/core/material.py +++ b/src/blenderbim/blenderbim/core/material.py @@ -70,13 +70,15 @@ def disable_editing_materials(material): material.disable_editing_materials() -def select_by_material(material_tool, material=None): - material_tool.select_elements(material_tool.get_elements_by_material(material)) +def select_by_material(material_tool, spatial, material=None): + spatial.select_products(material_tool.get_elements_by_material(material)) + def enable_editing_material(material_tool, material): material_tool.load_material_attributes(material) material_tool.enable_editing_material(material) + def edit_material(ifc, material_tool, material): attributes = material_tool.get_material_attributes() ifc.run("material.edit_material", material=material, attributes=attributes) @@ -85,5 +87,6 @@ def edit_material(ifc, material_tool, material): material_tool.import_material_definitions(material_type) material_tool.enable_editing_materials() + def disable_editing_material(material_tool): material_tool.disable_editing_material() diff --git a/src/blenderbim/blenderbim/core/style.py b/src/blenderbim/blenderbim/core/style.py index e8eb462f9c..b00d437fff 100644 --- a/src/blenderbim/blenderbim/core/style.py +++ b/src/blenderbim/blenderbim/core/style.py @@ -142,5 +142,5 @@ def disable_editing_styles(style): style.disable_editing_styles() -def select_by_style(style_tool, style=None): - style_tool.select_elements(style_tool.get_elements_by_style(style)) +def select_by_style(style_tool, spatial, style=None): + spatial.select_products(style_tool.get_elements_by_style(style)) diff --git a/src/blenderbim/blenderbim/core/system.py b/src/blenderbim/blenderbim/core/system.py index b635521222..5afc2b0420 100644 --- a/src/blenderbim/blenderbim/core/system.py +++ b/src/blenderbim/blenderbim/core/system.py @@ -66,14 +66,14 @@ def select_system_products(system_tool, system=None): system_tool.select_system_products(system) -def show_ports(ifc, system, element=None): +def show_ports(ifc, system, spatial, element=None): obj = ifc.get_object(element) if obj and ifc.is_moved(obj): system.run_geometry_edit_object_placement(obj=obj) ports = system.get_ports(element) system.load_ports(element, ports) - system.select_elements(ports) + spatial.select_products(ports) def hide_ports(ifc, system, element=None): diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index cfe42c95e4..ebf5202a98 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -447,7 +447,6 @@ class Material: def is_editing_materials(cls): pass def is_material_used_in_sets(cls, material): pass def load_material_attributes(cls, material): pass - def select_elements(cls, elements): pass @interface @@ -816,7 +815,6 @@ class Style: def import_surface_attributes(cls, style, obj): pass def is_editing_styles(cls): pass def record_shading(cls, obj): pass - def select_elements(cls, elements): pass @interface @@ -839,7 +837,6 @@ class System: def load_ports(cls, element, ports): pass def run_geometry_edit_object_placement(cls, obj=None): pass def run_root_assign_class(cls, obj=None, ifc_class=None, predefined_type=None, should_add_representation=True, context=None, ifc_representation_class=None): pass - def select_elements(cls, elements): pass def select_system_products(cls, system): pass def set_active_system(cls, system): pass diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index 27aaab96f5..b0a9a3dd09 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -101,13 +101,6 @@ class Material(blenderbim.core.tool.Material): return True return False - @classmethod - def select_elements(cls, elements): - for element in elements: - obj = tool.Ifc.get_object(element) - if obj: - obj.select_set(True) - @classmethod def get_active_material_type(cls): return bpy.context.scene.BIMMaterialProperties.material_type diff --git a/src/blenderbim/blenderbim/tool/system.py b/src/blenderbim/blenderbim/tool/system.py index 538b2db863..cc6975df37 100644 --- a/src/blenderbim/blenderbim/tool/system.py +++ b/src/blenderbim/blenderbim/tool/system.py @@ -129,16 +129,10 @@ class System(blenderbim.core.tool.System): ifc_representation_class=ifc_representation_class, ) - @classmethod - def select_elements(cls, elements): - for element in elements: - obj = tool.Ifc.get_object(element) - if obj: - obj.select_set(True) @classmethod def select_system_products(cls, system): - cls.select_elements(ifcopenshell.util.system.get_system_elements(system)) + tool.Spatial.select_products(ifcopenshell.util.system.get_system_elements(system)) @classmethod def set_active_system(cls, system): diff --git a/src/blenderbim/test/core/test_material.py b/src/blenderbim/test/core/test_material.py index 9b6a30c70b..c5856927ab 100644 --- a/src/blenderbim/test/core/test_material.py +++ b/src/blenderbim/test/core/test_material.py @@ -17,7 +17,7 @@ # along with BlenderBIM Add-on. If not, see . import blenderbim.core.material as subject -from test.core.bootstrap import ifc, material, style +from test.core.bootstrap import ifc, material, style, spatial class TestUnlinkMaterial: @@ -158,7 +158,7 @@ class TestDisableEditingMaterials: class TestSelectByMaterial: - def test_run(self, material): + def test_run(self, material, spatial): material.get_elements_by_material("material").should_be_called().will_return("elements") - material.select_elements("elements").should_be_called() + spatial.select_products("elements").should_be_called() subject.select_by_material(material, material="material") diff --git a/src/blenderbim/test/core/test_style.py b/src/blenderbim/test/core/test_style.py index 3ec61bd645..d9ccb1aed1 100644 --- a/src/blenderbim/test/core/test_style.py +++ b/src/blenderbim/test/core/test_style.py @@ -17,7 +17,7 @@ # along with BlenderBIM Add-on. If not, see . import blenderbim.core.style as subject -from test.core.bootstrap import ifc, material, style +from test.core.bootstrap import ifc, material, style, spatial class TestAddStyle: @@ -212,3 +212,10 @@ class TestDisableEditingStyles: def test_run(self, style): style.disable_editing_styles().should_be_called() subject.disable_editing_styles(style) + + +class TestSelectByStyle: + def test_run(self, style, spatial): + style.get_elements_by_style("style").should_be_called().will_return("elements") + spatial.select_products("elements").should_be_called() + subject.select_by_style(style, style="style") diff --git a/src/blenderbim/test/core/test_system.py b/src/blenderbim/test/core/test_system.py index a27d0f90e5..cabd2d9a68 100644 --- a/src/blenderbim/test/core/test_system.py +++ b/src/blenderbim/test/core/test_system.py @@ -18,7 +18,7 @@ import blenderbim.core.system as subject -from test.core.bootstrap import ifc, system +from test.core.bootstrap import ifc, system, spatial class TestLoadSystems: @@ -91,24 +91,24 @@ class TestSelectSystemProducts: class TestShowPorts: - def test_run(self, ifc, system): + def test_run(self, ifc, system, spatial): ifc.get_object("element").should_be_called().will_return("obj") ifc.is_moved("obj").should_be_called().will_return(False) system.get_ports("element").should_be_called().will_return(["port"]) system.load_ports("element", ["port"]).should_be_called() - system.select_elements(["port"]).should_be_called() - subject.show_ports(ifc, system, element="element") + spatial.select_products(["port"]).should_be_called() + subject.show_ports(ifc, system, spatial, element="element") - def test_syncing_locations_if_objects_moved_prior_to_showing_ports(self, ifc, system): + def test_syncing_locations_if_objects_moved_prior_to_showing_ports(self, ifc, system, spatial): ifc.get_object("element").should_be_called().will_return("obj") ifc.is_moved("obj").should_be_called().will_return(True) system.run_geometry_edit_object_placement(obj="obj").should_be_called() system.get_ports("element").should_be_called().will_return(["port"]) system.load_ports("element", ["port"]).should_be_called() - system.select_elements(["port"]).should_be_called() - subject.show_ports(ifc, system, element="element") + spatial.select_products(["port"]).should_be_called() + subject.show_ports(ifc, system, spatial, element="element") class TestHidePorts: diff --git a/src/blenderbim/test/tool/test_material.py b/src/blenderbim/test/tool/test_material.py index 794669545b..fa2e7b8b4e 100644 --- a/src/blenderbim/test/tool/test_material.py +++ b/src/blenderbim/test/tool/test_material.py @@ -170,14 +170,3 @@ class TestIsMaterialUsedInSets(NewFile): material_set_item.Material = material assert subject.is_material_used_in_sets(material) is True - -class TestSelectElements(NewFile): - def test_run(self): - ifc = ifcopenshell.file() - tool.Ifc().set(ifc) - element = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcPump") - obj = bpy.data.objects.new("Object", None) - bpy.context.scene.collection.objects.link(obj) - tool.Ifc.link(element, obj) - subject.select_elements([element]) - assert obj in bpy.context.selected_objects diff --git a/src/blenderbim/test/tool/test_spatial.py b/src/blenderbim/test/tool/test_spatial.py index 9ecb069cd8..7aafc1e882 100644 --- a/src/blenderbim/test/tool/test_spatial.py +++ b/src/blenderbim/test/tool/test_spatial.py @@ -257,3 +257,15 @@ class TestSetRelativeObjectMatrix(NewFile): matrix[0][3] = 1 subject.set_relative_object_matrix(obj, relative_obj, matrix) assert obj.matrix_world[0][3] == 2 + + +class TestSelectProducts(NewFile): + def test_select_products(self): + ifc = ifcopenshell.file() + tool.Ifc.set(ifc) + product = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcWall") + obj = bpy.data.objects.new("Object", None) + bpy.context.scene.collection.objects.link(obj) + tool.Ifc.link(product, obj) + subject.select_products([product]) + assert obj in bpy.context.selected_objects \ No newline at end of file diff --git a/src/blenderbim/test/tool/test_style.py b/src/blenderbim/test/tool/test_style.py index 77e59edc55..3de9896825 100644 --- a/src/blenderbim/test/tool/test_style.py +++ b/src/blenderbim/test/tool/test_style.py @@ -440,15 +440,3 @@ class TestIsEditingStyles(NewFile): subject.is_editing_styles() is False bpy.context.scene.BIMStylesProperties.is_editing = True subject.is_editing_styles() is True - - -class TestSelectElements(NewFile): - def test_run(self): - ifc = ifcopenshell.file() - tool.Ifc().set(ifc) - element = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcPump") - obj = bpy.data.objects.new("Object", None) - bpy.context.scene.collection.objects.link(obj) - tool.Ifc.link(element, obj) - subject.select_elements([element]) - assert obj in bpy.context.selected_objects diff --git a/src/blenderbim/test/tool/test_system.py b/src/blenderbim/test/tool/test_system.py index 4105c72530..2b23513f05 100644 --- a/src/blenderbim/test/tool/test_system.py +++ b/src/blenderbim/test/tool/test_system.py @@ -196,18 +196,6 @@ class TestRunRootAssignClass(NewFile): pass -class TestSelectElements(NewFile): - def test_run(self): - ifc = ifcopenshell.file() - tool.Ifc().set(ifc) - element = ifcopenshell.api.run("root.create_entity", ifc, ifc_class="IfcPump") - obj = bpy.data.objects.new("Object", None) - bpy.context.scene.collection.objects.link(obj) - tool.Ifc.link(element, obj) - subject.select_elements([element]) - assert obj in bpy.context.selected_objects - - class TestSelectSystemProducts(NewFile): def test_run(self): ifc = ifcopenshell.file()