From 6cf1f8f49ffc48fa250ebf4754d8688ef4fd46e2 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 10 Nov 2023 11:39:49 +0500 Subject: [PATCH] fixed issues with ports ui on undo data.py doesn't update on every undo, so passed blender objects got invalidated on undo resulting in errors. changed blender objects to blender object names --- .../blenderbim/bim/module/system/data.py | 26 +++++++++++-------- .../blenderbim/bim/module/system/ui.py | 23 +++++++++------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/system/data.py b/src/blenderbim/blenderbim/bim/module/system/data.py index a1c8665e7e..9a37c1f48d 100644 --- a/src/blenderbim/blenderbim/bim/module/system/data.py +++ b/src/blenderbim/blenderbim/bim/module/system/data.py @@ -126,8 +126,8 @@ class PortData: "total_ports": cls.total_ports(), "located_ports_data": cls.located_ports_data(), "is_port": is_port, - "port_connected_object": cls.port_connected_object() if is_port else None, - "port_relating_object": cls.port_relating_object() if is_port else None, + "port_connected_object_name": cls.port_connected_object_name() if is_port else None, + "port_relating_object_name": cls.port_relating_object_name() if is_port else None, } # AFTER located_ports_data cls.data["selected_objects_flow_direction"] = cls.selected_objects_flow_direction() if not is_port else None @@ -142,16 +142,16 @@ class PortData: return cls.element and cls.element.is_a("IfcDistributionPort") @classmethod - def port_relating_object(cls): - return tool.Ifc.get_object(tool.System.get_port_relating_element(cls.element)) + def port_relating_object_name(cls): + return tool.Ifc.get_object(tool.System.get_port_relating_element(cls.element)).name @classmethod - def port_connected_object(cls): + def port_connected_object_name(cls): connected_port = tool.System.get_connected_port(cls.element) if not connected_port: return connected_element = tool.System.get_port_relating_element(connected_port) - return tool.Ifc.get_object(connected_element) + return tool.Ifc.get_object(connected_element).name @classmethod def located_ports_data(cls): @@ -159,19 +159,23 @@ class PortData: data = [] for port in ports: - port_obj = tool.Ifc.get_object(port) + # port may be not present as a scene object + port_obj_name = getattr(tool.Ifc.get_object(port), "name", None) connected_port = tool.System.get_connected_port(port) if connected_port: - connected_obj = tool.Ifc.get_object(tool.System.get_port_relating_element(connected_port)) + connected_obj_name = tool.Ifc.get_object(tool.System.get_port_relating_element(connected_port)).name else: - connected_obj = None + connected_obj_name = None - data.append((port, port_obj, connected_obj)) + data.append((port, port_obj_name, connected_obj_name)) return data @classmethod def selected_objects_flow_direction(cls): - for port, port_obj, connected_obj in cls.data["located_ports_data"]: + for port, _, connected_obj_name in cls.data["located_ports_data"]: + if connected_obj_name is None: + continue + connected_obj = bpy.data.objects[connected_obj_name] if connected_obj in bpy.context.selected_objects: return port.FlowDirection diff --git a/src/blenderbim/blenderbim/bim/module/system/ui.py b/src/blenderbim/blenderbim/bim/module/system/ui.py index 063a28c4ee..d4a9bf9d5e 100644 --- a/src/blenderbim/blenderbim/bim/module/system/ui.py +++ b/src/blenderbim/blenderbim/bim/module/system/ui.py @@ -177,23 +177,24 @@ class BIM_PT_ports(Panel): cols = [row.column(align=True) for i in range(6)] for i, port_data in enumerate(PortData.data["located_ports_data"]): - port, port_obj, connected_obj = port_data + port, port_obj_name, connected_obj_name = port_data flow_direction_icon = FLOW_DIRECTION_TO_ICON[port.FlowDirection or "NOTDEFINED"] - if port_obj: + if port_obj_name: cols[0].label(text="", icon=flow_direction_icon) cols[1].operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = port.id() - cols[2].label(text=port_obj.name) + cols[2].label(text=port_obj_name) else: cols[0].label(text="", icon=flow_direction_icon) cols[1].label(text="", icon="HIDE_ON") cols[2].label(text="Port is hidden") - if connected_obj: + if connected_obj_name: + connected_obj = bpy.data.objects[connected_obj_name] cols[3].operator("bim.disconnect_port", text="", icon="UNLINKED").element_id = port.id() cols[4].operator( "bim.select_entity", text="", icon="RESTRICT_SELECT_OFF" ).ifc_id = connected_obj.BIMObjectProperties.ifc_definition_id - cols[5].label(text=f"{connected_obj.name}") + cols[5].label(text=connected_obj_name) else: cols[3].label(text="", icon="UNLINKED") cols[4].label(text="", icon="BLANK1") @@ -243,19 +244,21 @@ class BIM_PT_port(Panel): # port located on row = layout.row(align=True) - relating_object = PortData.data["port_relating_object"] + relating_object_name = PortData.data["port_relating_object_name"] + relating_object = bpy.data.objects[relating_object_name] row.label(text="Port located on:") - row.label(text=relating_object.name) + row.label(text=relating_object_name) row.operator( "bim.select_entity", text="", icon="RESTRICT_SELECT_OFF" ).ifc_id = relating_object.BIMObjectProperties.ifc_definition_id # object connected to the port row = layout.row(align=True) - connected_object = PortData.data["port_connected_object"] - if connected_object: + connected_object_name = PortData.data["port_connected_object_name"] + if connected_object_name: + connected_object = bpy.data.objects[connected_object_name] row.label(text="Port connected to:") - row.label(text=connected_object.name) + row.label(text=connected_object_name) row.operator( "bim.select_entity", text="", icon="RESTRICT_SELECT_OFF" ).ifc_id = connected_object.BIMObjectProperties.ifc_definition_id