mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-10-02 13:04:49 +00:00
See #6030. You can now select elements in groups recursively.
This commit is contained in:
@@ -28,10 +28,9 @@ classes = (
|
|||||||
operator.EnableEditingGroup,
|
operator.EnableEditingGroup,
|
||||||
operator.LoadGroups,
|
operator.LoadGroups,
|
||||||
operator.RemoveGroup,
|
operator.RemoveGroup,
|
||||||
operator.SelectGroupProducts,
|
operator.SelectGroupElements,
|
||||||
operator.ToggleGroup,
|
operator.ToggleGroup,
|
||||||
operator.UnassignGroup,
|
operator.UnassignGroup,
|
||||||
operator.SelectGroupElements,
|
|
||||||
prop.ExpandedGroups,
|
prop.ExpandedGroups,
|
||||||
prop.Group,
|
prop.Group,
|
||||||
prop.BIMGroupProperties,
|
prop.BIMGroupProperties,
|
||||||
|
|||||||
@@ -201,41 +201,26 @@ class UnassignGroup(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
ifcopenshell.api.group.unassign_group(tool.Ifc.get(), products=products, group=tool.Ifc.get().by_id(self.group))
|
ifcopenshell.api.group.unassign_group(tool.Ifc.get(), products=products, group=tool.Ifc.get().by_id(self.group))
|
||||||
|
|
||||||
|
|
||||||
class SelectGroupProducts(bpy.types.Operator, tool.Ifc.Operator):
|
|
||||||
bl_idname = "bim.select_group_products"
|
|
||||||
bl_label = "Select Group Products"
|
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
|
||||||
bl_description = "Select objects assigned to the selected group"
|
|
||||||
group: bpy.props.IntProperty()
|
|
||||||
|
|
||||||
def _execute(self, context):
|
|
||||||
self.file = IfcStore.get_file()
|
|
||||||
for obj in context.visible_objects:
|
|
||||||
obj.select_set(False)
|
|
||||||
element = tool.Ifc.get_entity(obj)
|
|
||||||
if not element:
|
|
||||||
continue
|
|
||||||
product_groups = [
|
|
||||||
r.RelatingGroup.id()
|
|
||||||
for r in getattr(element, "HasAssignments", []) or []
|
|
||||||
if r.is_a("IfcRelAssignsToGroup")
|
|
||||||
]
|
|
||||||
if self.group in product_groups:
|
|
||||||
obj.select_set(True)
|
|
||||||
return {"FINISHED"}
|
|
||||||
|
|
||||||
|
|
||||||
class SelectGroupElements(bpy.types.Operator):
|
class SelectGroupElements(bpy.types.Operator):
|
||||||
bl_idname = "bim.select_group_elements"
|
bl_idname = "bim.select_group_elements"
|
||||||
bl_label = "Select Group elements"
|
bl_label = "Select Group elements"
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
|
bl_description = (
|
||||||
|
"Select objects assigned to the selected group and all nested groups\nALT + CLICK to exclude children"
|
||||||
|
)
|
||||||
group: bpy.props.IntProperty()
|
group: bpy.props.IntProperty()
|
||||||
|
is_recursive: bpy.props.BoolProperty(name="Is Recursive", default=True, options={"SKIP_SAVE"})
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def poll(cls, context):
|
def poll(cls, context):
|
||||||
return bool(tool.Ifc.get() and context.active_object)
|
return bool(tool.Ifc.get() and context.active_object)
|
||||||
|
|
||||||
|
def invoke(self, context, event):
|
||||||
|
self.is_recursive = not event.alt
|
||||||
|
return self.execute(context)
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
elements = tool.Drawing.get_group_elements(tool.Ifc.get().by_id(self.group))
|
tool.Spatial.select_products(
|
||||||
tool.Spatial.select_products(elements)
|
ifcopenshell.util.element.get_grouped_by(tool.Ifc.get().by_id(self.group), is_recursive=self.is_recursive)
|
||||||
|
)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ class BIM_PT_groups(Panel):
|
|||||||
if (group := self.props.active_group) and (group_id := group.ifc_definition_id):
|
if (group := self.props.active_group) and (group_id := group.ifc_definition_id):
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
row.alignment = "RIGHT"
|
row.alignment = "RIGHT"
|
||||||
row.operator("bim.select_group_products", text="", icon="RESTRICT_SELECT_OFF").group = group_id
|
row.operator("bim.select_group_elements", text="", icon="RESTRICT_SELECT_OFF").group = group_id
|
||||||
row.operator("bim.assign_group", text="", icon="FOLDER_REDIRECT").group = group_id
|
row.operator("bim.assign_group", text="", icon="FOLDER_REDIRECT").group = group_id
|
||||||
row.operator("bim.enable_editing_group", text="", icon="GREASEPENCIL").group = group_id
|
row.operator("bim.enable_editing_group", text="", icon="GREASEPENCIL").group = group_id
|
||||||
row.operator("bim.add_group", text="", icon="ADD").group = group_id
|
row.operator("bim.add_group", text="", icon="ADD").group = group_id
|
||||||
|
|||||||
@@ -1000,7 +1000,9 @@ def get_decomposition(element: ifcopenshell.entity_instance, is_recursive=True)
|
|||||||
return results
|
return results
|
||||||
|
|
||||||
|
|
||||||
def get_grouped_by(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entity_instance]:
|
def get_grouped_by(
|
||||||
|
element: ifcopenshell.entity_instance, is_recursive: bool = True
|
||||||
|
) -> list[ifcopenshell.entity_instance]:
|
||||||
"""Retrieves all subelements of an element based on the group.
|
"""Retrieves all subelements of an element based on the group.
|
||||||
|
|
||||||
:param element: IfcGroup entity
|
:param element: IfcGroup entity
|
||||||
@@ -1021,6 +1023,8 @@ def get_grouped_by(element: ifcopenshell.entity_instance) -> list[ifcopenshell.e
|
|||||||
related_objects = rel.RelatedObjects
|
related_objects = rel.RelatedObjects
|
||||||
queue.extend(related_objects)
|
queue.extend(related_objects)
|
||||||
results.extend(related_objects)
|
results.extend(related_objects)
|
||||||
|
if not is_recursive:
|
||||||
|
break
|
||||||
return results
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user