Fetch pset and qto names via pset data instead of real time to prevent UI lag on larger models.

This commit is contained in:
Dion Moult
2023-06-16 13:24:26 +10:00
parent 0e02c97fc6
commit 816efc8810
2 changed files with 44 additions and 24 deletions
@@ -18,7 +18,9 @@
import bpy import bpy
import ifcopenshell import ifcopenshell
import ifcopenshell.util.doc
import blenderbim.tool as tool import blenderbim.tool as tool
import blenderbim.bim.schema
# TODO: Should this cache belong here? Dunno. Maybe. # TODO: Should this cache belong here? Dunno. Maybe.
@@ -67,6 +69,8 @@ class ObjectPsetsData(Data):
cls.data = { cls.data = {
"psets": cls.psetqtos(tool.Ifc.get_entity(bpy.context.active_object), psets_only=True), "psets": cls.psetqtos(tool.Ifc.get_entity(bpy.context.active_object), psets_only=True),
"inherited_psets": cls.inherited_psets(), "inherited_psets": cls.inherited_psets(),
"pset_name": cls.pset_name(),
"qto_name": cls.qto_name(),
} }
cls.is_loaded = True cls.is_loaded = True
@@ -79,6 +83,35 @@ class ObjectPsetsData(Data):
if element_type: if element_type:
return cls.psetqtos(element_type) return cls.psetqtos(element_type)
@classmethod
def pset_name(cls):
obj = bpy.context.active_object
element = tool.Ifc.get_entity(obj)
if not element:
return []
psets = blenderbim.bim.schema.ifc.psetqto.get_applicable(element.is_a(), pset_only=True)
psetnames = cls.format_pset_enum(psets)
assigned_names = ifcopenshell.util.element.get_psets(element, psets_only=True).keys()
return [p for p in psetnames if p[0] not in assigned_names]
@classmethod
def qto_name(cls):
obj = bpy.context.active_object
element = tool.Ifc.get_entity(obj)
if not element:
return []
qtos = blenderbim.bim.schema.ifc.psetqto.get_applicable(element.is_a(), qto_only=True)
return cls.format_pset_enum(qtos)
@classmethod
def format_pset_enum(cls, psets):
enum_items = []
version = tool.Ifc.get_schema()
for pset in psets:
doc = ifcopenshell.util.doc.get_property_set_doc(version, pset.Name) or {}
enum_items.append((pset.Name, pset.Name, doc.get("description", "")))
return enum_items
class ObjectQtosData(Data): class ObjectQtosData(Data):
data = {} data = {}
@@ -22,7 +22,7 @@ import ifcopenshell
import ifcopenshell.util.element import ifcopenshell.util.element
import blenderbim.tool as tool import blenderbim.tool as tool
from blenderbim.bim.prop import Attribute, StrProperty from blenderbim.bim.prop import Attribute, StrProperty
from blenderbim.bim.module.pset.data import AddEditCustomPropertiesData from blenderbim.bim.module.pset.data import AddEditCustomPropertiesData, ObjectPsetsData
from blenderbim.bim.ifc import IfcStore from blenderbim.bim.ifc import IfcStore
from bpy.types import PropertyGroup from bpy.types import PropertyGroup
from bpy.props import ( from bpy.props import (
@@ -57,18 +57,10 @@ def blender_formatted_enum_from_psets(psets):
return enum_items return enum_items
def get_pset_names(self, context): def get_pset_name(self, context):
global psetnames if not ObjectPsetsData.is_loaded:
obj = context.active_object ObjectPsetsData.load()
if not obj.BIMObjectProperties.ifc_definition_id: return ObjectPsetsData.data["pset_name"]
return []
element = IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id)
ifc_class = element.is_a()
if ifc_class not in psetnames:
psets = blenderbim.bim.schema.ifc.psetqto.get_applicable(ifc_class, pset_only=True)
psetnames[ifc_class] = blender_formatted_enum_from_psets(psets)
assigned_names = ifcopenshell.util.element.get_psets(element, psets_only=True).keys()
return [p for p in psetnames[ifc_class] if p[0] not in assigned_names]
def get_material_pset_names(self, context): def get_material_pset_names(self, context):
@@ -157,15 +149,10 @@ def get_work_schedule_pset_names(self, context):
return psetnames[ifc_class] return psetnames[ifc_class]
def get_qto_names(self, context): def get_qto_name(self, context):
global qtonames if not ObjectPsetsData.is_loaded:
if "/" in context.active_object.name: ObjectPsetsData.load()
ifc_class = context.active_object.name.split("/")[0] return ObjectPsetsData.data["qto_name"]
if ifc_class not in qtonames:
psets = blenderbim.bim.schema.ifc.psetqto.get_applicable(ifc_class, qto_only=True)
qtonames[ifc_class] = blender_formatted_enum_from_psets(psets)
return qtonames[ifc_class]
return []
def get_template_type(self, context): def get_template_type(self, context):
@@ -197,8 +184,8 @@ class PsetProperties(PropertyGroup):
active_pset_name: StringProperty(name="Pset Name") active_pset_name: StringProperty(name="Pset Name")
active_pset_type: StringProperty(name="Active Pset Type") active_pset_type: StringProperty(name="Active Pset Type")
properties: CollectionProperty(name="Properties", type=IfcProperty) properties: CollectionProperty(name="Properties", type=IfcProperty)
pset_name: EnumProperty(items=get_pset_names, name="Pset Name") pset_name: EnumProperty(items=get_pset_name, name="Pset Name")
qto_name: EnumProperty(items=get_qto_names, name="Qto Name") qto_name: EnumProperty(items=get_qto_name, name="Qto Name")
class MaterialPsetProperties(PropertyGroup): class MaterialPsetProperties(PropertyGroup):