From 683e316088d1f5aec54a11f7170bac74d2142cd0 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 30 Oct 2021 18:00:25 +1100 Subject: [PATCH] New MEP utility to select and print debug information about connected system elements --- .../blenderbim/bim/module/misc/__init__.py | 1 + .../blenderbim/bim/module/misc/operator.py | 48 +++++++++++++++++++ .../blenderbim/bim/module/misc/ui.py | 2 + 3 files changed, 51 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/misc/__init__.py b/src/blenderbim/blenderbim/bim/module/misc/__init__.py index 494005dfe4..7ef7c571d6 100644 --- a/src/blenderbim/blenderbim/bim/module/misc/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/misc/__init__.py @@ -20,6 +20,7 @@ import bpy from . import ui, prop, operator classes = ( + operator.GetConnectedSystemElements, operator.ResizeToStorey, operator.SetOverrideColour, operator.SetViewportShadowFromSun, diff --git a/src/blenderbim/blenderbim/bim/module/misc/operator.py b/src/blenderbim/blenderbim/bim/module/misc/operator.py index f1d5b630a9..a33dc6a892 100644 --- a/src/blenderbim/blenderbim/bim/module/misc/operator.py +++ b/src/blenderbim/blenderbim/bim/module/misc/operator.py @@ -139,3 +139,51 @@ class SplitAlongEdge(bpy.types.Operator, Operator): def _execute(self, context): core.split_along_edge(tool.Misc, cutter=context.active_object, objs=context.selected_objects) + + +class GetConnectedSystemElements(bpy.types.Operator, Operator): + bl_idname = "bim.get_connected_system_elements" + bl_label = "Get Connected System Elements" + bl_options = {"REGISTER", "UNDO"} + + @classmethod + def poll(cls, context): + return context.selected_objects and tool.Ifc.get() + + def _execute(self, context): + # Just dumped here for now before the system module gets properly planned + def pprint_element(e): + return '{} ({})'.format(e.Name, e.GlobalId) + + start = tool.Ifc.get_entity(bpy.context.active_object) + + connected_elements = [] + + # Note: this code is for IFC2X3. IFC4 has a different approach. + print('Investigating element:', pprint_element(start)) + for rel in start.HasPorts: + for rel2 in rel.RelatingPort.ConnectedTo: + print('{} is connected as via {} ({}) TO {} ({}), contained in {}'.format( + pprint_element(start), + rel.RelatingPort.FlowDirection, + rel.RelatingPort.GlobalId, + rel2.RelatedPort.FlowDirection, + rel2.RelatedPort.GlobalId, + [pprint_element(r.RelatedElement) for r in rel2.RelatedPort.ContainedIn] + )) + connected_elements.extend([r.RelatedElement for r in rel2.RelatedPort.ContainedIn]) + for rel2 in rel.RelatingPort.ConnectedFrom: + print('{} is connected as via {} ({}) FROM {} ({}), contained in {}'.format( + pprint_element(start), + rel.RelatingPort.FlowDirection, + rel.RelatingPort.GlobalId, + rel2.RelatingPort.FlowDirection, + rel2.RelatingPort.GlobalId, + [pprint_element(r.RelatedElement) for r in rel2.RelatingPort.ContainedIn] + )) + connected_elements.extend([r.RelatedElement for r in rel2.RelatingPort.ContainedIn]) + + for element in connected_elements: + obj = tool.Ifc.get_object(element) + if obj: + obj.select_set(True) diff --git a/src/blenderbim/blenderbim/bim/module/misc/ui.py b/src/blenderbim/blenderbim/bim/module/misc/ui.py index c3cb5300fe..cb464ac99b 100644 --- a/src/blenderbim/blenderbim/bim/module/misc/ui.py +++ b/src/blenderbim/blenderbim/bim/module/misc/ui.py @@ -43,3 +43,5 @@ class BIM_PT_misc_utilities(bpy.types.Panel): row.operator("bim.resize_to_storey").total_storeys = props.total_storeys row = layout.row() row.operator("bim.split_along_edge") + row = layout.row() + row.operator("bim.get_connected_system_elements")