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(),
"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
@@ -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