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
This commit is contained in:
Andrej730
2023-11-10 11:39:49 +05:00
parent fd69d91776
commit 6cf1f8f49f
2 changed files with 28 additions and 21 deletions
@@ -126,8 +126,8 @@ class PortData:
"total_ports": cls.total_ports(), "total_ports": cls.total_ports(),
"located_ports_data": cls.located_ports_data(), "located_ports_data": cls.located_ports_data(),
"is_port": is_port, "is_port": is_port,
"port_connected_object": cls.port_connected_object() if is_port else None, "port_connected_object_name": cls.port_connected_object_name() if is_port else None,
"port_relating_object": cls.port_relating_object() if is_port else None, "port_relating_object_name": cls.port_relating_object_name() if is_port else None,
} }
# AFTER located_ports_data # AFTER located_ports_data
cls.data["selected_objects_flow_direction"] = cls.selected_objects_flow_direction() if not is_port else None 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") return cls.element and cls.element.is_a("IfcDistributionPort")
@classmethod @classmethod
def port_relating_object(cls): def port_relating_object_name(cls):
return tool.Ifc.get_object(tool.System.get_port_relating_element(cls.element)) return tool.Ifc.get_object(tool.System.get_port_relating_element(cls.element)).name
@classmethod @classmethod
def port_connected_object(cls): def port_connected_object_name(cls):
connected_port = tool.System.get_connected_port(cls.element) connected_port = tool.System.get_connected_port(cls.element)
if not connected_port: if not connected_port:
return return
connected_element = tool.System.get_port_relating_element(connected_port) 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 @classmethod
def located_ports_data(cls): def located_ports_data(cls):
@@ -159,19 +159,23 @@ class PortData:
data = [] data = []
for port in ports: 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) connected_port = tool.System.get_connected_port(port)
if connected_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: 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 return data
@classmethod @classmethod
def selected_objects_flow_direction(cls): 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: if connected_obj in bpy.context.selected_objects:
return port.FlowDirection return port.FlowDirection
@@ -177,23 +177,24 @@ class BIM_PT_ports(Panel):
cols = [row.column(align=True) for i in range(6)] cols = [row.column(align=True) for i in range(6)]
for i, port_data in enumerate(PortData.data["located_ports_data"]): 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"] 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[0].label(text="", icon=flow_direction_icon)
cols[1].operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = port.id() 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: else:
cols[0].label(text="", icon=flow_direction_icon) cols[0].label(text="", icon=flow_direction_icon)
cols[1].label(text="", icon="HIDE_ON") cols[1].label(text="", icon="HIDE_ON")
cols[2].label(text="Port is hidden") 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[3].operator("bim.disconnect_port", text="", icon="UNLINKED").element_id = port.id()
cols[4].operator( cols[4].operator(
"bim.select_entity", text="", icon="RESTRICT_SELECT_OFF" "bim.select_entity", text="", icon="RESTRICT_SELECT_OFF"
).ifc_id = connected_obj.BIMObjectProperties.ifc_definition_id ).ifc_id = connected_obj.BIMObjectProperties.ifc_definition_id
cols[5].label(text=f"{connected_obj.name}") cols[5].label(text=connected_obj_name)
else: else:
cols[3].label(text="", icon="UNLINKED") cols[3].label(text="", icon="UNLINKED")
cols[4].label(text="", icon="BLANK1") cols[4].label(text="", icon="BLANK1")
@@ -243,19 +244,21 @@ class BIM_PT_port(Panel):
# port located on # port located on
row = layout.row(align=True) 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="Port located on:")
row.label(text=relating_object.name) row.label(text=relating_object_name)
row.operator( row.operator(
"bim.select_entity", text="", icon="RESTRICT_SELECT_OFF" "bim.select_entity", text="", icon="RESTRICT_SELECT_OFF"
).ifc_id = relating_object.BIMObjectProperties.ifc_definition_id ).ifc_id = relating_object.BIMObjectProperties.ifc_definition_id
# object connected to the port # object connected to the port
row = layout.row(align=True) row = layout.row(align=True)
connected_object = PortData.data["port_connected_object"] connected_object_name = PortData.data["port_connected_object_name"]
if connected_object: if connected_object_name:
connected_object = bpy.data.objects[connected_object_name]
row.label(text="Port connected to:") row.label(text="Port connected to:")
row.label(text=connected_object.name) row.label(text=connected_object_name)
row.operator( row.operator(
"bim.select_entity", text="", icon="RESTRICT_SELECT_OFF" "bim.select_entity", text="", icon="RESTRICT_SELECT_OFF"
).ifc_id = connected_object.BIMObjectProperties.ifc_definition_id ).ifc_id = connected_object.BIMObjectProperties.ifc_definition_id