diff --git a/src/blenderbim/blenderbim/bim/module/spatial/__init__.py b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py index 56f03cdc27..76b5532d28 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/__init__.py @@ -37,6 +37,7 @@ classes = ( operator.ContractContainer, operator.ExpandContainer, operator.DeleteContainer, + operator.SelectDecomposedElements, prop.SpatialElement, prop.BIMSpatialProperties, prop.BIMObjectSpatialProperties, diff --git a/src/blenderbim/blenderbim/bim/module/spatial/operator.py b/src/blenderbim/blenderbim/bim/module/spatial/operator.py index 4cc2298ec8..451ee442ac 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/operator.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/operator.py @@ -246,3 +246,13 @@ class AddBuildingStorey(bpy.types.Operator, tool.Ifc.Operator): part_name="Unnamed", ) core.load_container_manager(tool.Spatial) + + +class SelectDecomposedElements(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.select_decomposed_elements" + bl_label = "Select Children" + bl_options = {"REGISTER", "UNDO"} + + def _execute(self, context): + core.select_decomposed_elements(tool.Spatial) + return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/spatial/ui.py b/src/blenderbim/blenderbim/bim/module/spatial/ui.py index f1727acd58..e51060e9c0 100644 --- a/src/blenderbim/blenderbim/bim/module/spatial/ui.py +++ b/src/blenderbim/blenderbim/bim/module/spatial/ui.py @@ -119,6 +119,7 @@ class BIM_PT_SpatialManager(Panel): ifc_definition_id = self.props.containers[self.props.active_container_index].ifc_definition_id row = self.layout.row() row.alignment = "RIGHT" + row.operator("bim.select_decomposed_elements", icon="RESTRICT_SELECT_OFF", text="Select Children") if SpatialData.data["containers"][ifc_definition_id]["type"] in ["IfcBuildingStorey", "IfcBuilding"]: row.operator("bim.add_building_storey", icon="ADD", text="Add storey").part_class = "IfcBuildingStorey" row.operator("bim.delete_container", icon="X", text="Delete").container = ifc_definition_id diff --git a/src/blenderbim/blenderbim/core/spatial.py b/src/blenderbim/blenderbim/core/spatial.py index 0bbbf614f4..fb75dd2671 100644 --- a/src/blenderbim/blenderbim/core/spatial.py +++ b/src/blenderbim/blenderbim/core/spatial.py @@ -115,3 +115,8 @@ def expand_container(spatial, container=None): def delete_container(ifc, spatial, geometry, container=None): geometry.delete_ifc_object(ifc.get_object(container)) spatial.load_container_manager() + +def select_decomposed_elements(spatial): + container = spatial.get_active_container() + if container: + spatial.select_products(spatial.get_decomposed_elements(container)) diff --git a/src/blenderbim/blenderbim/tool/spatial.py b/src/blenderbim/blenderbim/tool/spatial.py index b88d87aa4b..95369338fd 100644 --- a/src/blenderbim/blenderbim/tool/spatial.py +++ b/src/blenderbim/blenderbim/tool/spatial.py @@ -203,7 +203,7 @@ class Spatial(blenderbim.core.tool.Spatial): cls.props.is_container_update_enabled = False parent = tool.Ifc.get().by_type("IfcProject")[0] - for object in ifcopenshell.util.element.get_parts(parent): + for object in ifcopenshell.util.element.get_parts(parent) or []: if object.is_a("IfcSpatialElement"): cls.create_new_storey_li(object, 0) cls.props.is_container_update_enabled = True @@ -222,7 +222,7 @@ class Spatial(blenderbim.core.tool.Spatial): if new.has_decomposition: new.has_children = True if new.is_expanded: - for related_object in ifcopenshell.util.element.get_parts(element): + for related_object in ifcopenshell.util.element.get_parts(element) or []: if related_object.is_a("IfcSpatialElement"): cls.create_new_storey_li(related_object, level_index + 1)