From edfd446833e39d58ccc2e295786fb090d47d11d2 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 23 May 2024 15:17:08 +1000 Subject: [PATCH] Allow custom qtos without a template --- .../blenderbim/bim/module/pset/__init__.py | 24 ++-- .../blenderbim/bim/module/pset/data.py | 4 +- .../blenderbim/bim/module/pset/operator.py | 8 +- .../blenderbim/bim/module/pset/prop.py | 112 ++++++------------ src/blenderbim/blenderbim/core/pset.py | 3 +- src/blenderbim/blenderbim/core/tool.py | 2 +- src/blenderbim/blenderbim/tool/pset.py | 9 +- 7 files changed, 59 insertions(+), 103 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/__init__.py b/src/blenderbim/blenderbim/bim/module/pset/__init__.py index 905ed3a1d1..1d4ca05324 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/pset/__init__.py @@ -40,14 +40,6 @@ classes = ( prop.IfcPropertyEnumeratedValue, prop.IfcProperty, prop.PsetProperties, - prop.MaterialPsetProperties, - prop.MaterialSetPsetProperties, - prop.MaterialSetItemPsetProperties, - prop.TaskPsetProperties, - prop.ResourcePsetProperties, - prop.GroupPsetProperties, - prop.ProfilePsetProperties, - prop.WorkSchedulePsetProperties, prop.RenameProperties, prop.AddEditProperties, prop.DeletePsets, @@ -72,14 +64,14 @@ classes = ( def register(): bpy.types.Object.PsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) - bpy.types.Object.MaterialSetPsetProperties = bpy.props.PointerProperty(type=prop.MaterialSetPsetProperties) - bpy.types.Object.MaterialSetItemPsetProperties = bpy.props.PointerProperty(type=prop.MaterialSetItemPsetProperties) - bpy.types.Material.PsetProperties = bpy.props.PointerProperty(type=prop.MaterialPsetProperties) - bpy.types.Scene.TaskPsetProperties = bpy.props.PointerProperty(type=prop.TaskPsetProperties) - bpy.types.Scene.ResourcePsetProperties = bpy.props.PointerProperty(type=prop.ResourcePsetProperties) - bpy.types.Scene.GroupPsetProperties = bpy.props.PointerProperty(type=prop.GroupPsetProperties) - bpy.types.Scene.ProfilePsetProperties = bpy.props.PointerProperty(type=prop.ProfilePsetProperties) - bpy.types.Scene.WorkSchedulePsetProperties = bpy.props.PointerProperty(type=prop.WorkSchedulePsetProperties) + bpy.types.Object.MaterialSetPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Object.MaterialSetItemPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Material.PsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Scene.TaskPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Scene.ResourcePsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Scene.GroupPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Scene.ProfilePsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) + bpy.types.Scene.WorkSchedulePsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) bpy.types.Scene.RenameProperties = bpy.props.CollectionProperty(type=prop.RenameProperties) bpy.types.Scene.AddEditProperties = bpy.props.CollectionProperty(type=prop.AddEditProperties) bpy.types.Scene.DeletePsets = bpy.props.CollectionProperty(type=prop.DeletePsets) diff --git a/src/blenderbim/blenderbim/bim/module/pset/data.py b/src/blenderbim/blenderbim/bim/module/pset/data.py index 34c2759e45..0c3093f3a5 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/data.py +++ b/src/blenderbim/blenderbim/bim/module/pset/data.py @@ -101,9 +101,7 @@ class ObjectPsetsData(Data): ) psetnames = cls.format_pset_enum(psets) assigned_names = ifcopenshell.util.element.get_psets(element, psets_only=True, should_inherit=False).keys() - return [("BBIM_CUSTOM_PSET", "Custom Pset", "Create a property set without using a template."), None] + [ - p for p in psetnames if p[0] not in assigned_names - ] + return [p for p in psetnames if p[0] not in assigned_names] @classmethod def qto_name(cls): diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index 30f1ccbe67..bef8466d62 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -144,6 +144,8 @@ class EditPset(bpy.types.Operator, Operator): for key, value in properties.items(): if isinstance(value, float): properties[key] = round(value, 4) + elif not isinstance(value, int): + properties[key] = 0 ifcopenshell.api.run( "pset.edit_qto", self.file, @@ -206,11 +208,9 @@ class AddQto(bpy.types.Operator, Operator): def _execute(self, context): self.file = IfcStore.get_file() - props = tool.Pset.get_pset_props(self.obj, self.obj_type) - ifc_definition_id = tool.Blender.get_obj_ifc_definition_id(self.obj, self.obj_type, context) - element = tool.Ifc.get().by_id(ifc_definition_id) + qto_name = tool.Pset.get_pset_name(self.obj, self.obj_type, pset_type="QTO") bpy.ops.bim.enable_pset_editing( - pset_id=0, pset_name=props.qto_name, pset_type="QTO", obj=self.obj, obj_type=self.obj_type + pset_id=0, pset_name=qto_name, pset_type="QTO", obj=self.obj, obj_type=self.obj_type ) diff --git a/src/blenderbim/blenderbim/bim/module/pset/prop.py b/src/blenderbim/blenderbim/bim/module/pset/prop.py index c22642057c..36c3f11362 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset/prop.py @@ -59,6 +59,30 @@ def blender_formatted_enum_from_psets(psets): def get_pset_name(self, context): + pset_type = repr(self) + prop_type = pset_type.split(".")[-1] + results = [] + if "bpy.data.objects" in pset_type: + if prop_type == "PsetProperties": + results = get_object_pset_name(self, context) + elif prop_type == "MaterialSetPsetProperties": + results = get_material_set_pset_names(self, context) + elif prop_type == "MaterialSetItemPsetProperties": + results = get_material_set_item_pset_names(self, context) + elif "bpy.data.materials" in pset_type: + results = get_material_pset_names(self, context) + elif prop_type == "ResourcePsetProperties": + results = get_resource_pset_names(self, context) + elif prop_type == "GroupPsetProperties": + results = get_group_pset_names(self, context) + elif prop_type == "ProfilePsetProperties": + results = get_profile_pset_names(self, context) + elif prop_type == "WorkSchedulePsetProperties": + results = get_work_schedule_pset_names(self, context) + return [("BBIM_CUSTOM", "Custom Pset", "Create a property set without using a template."), None] + results + + +def get_object_pset_name(self, context): if not ObjectPsetsData.is_loaded: ObjectPsetsData.load() return ObjectPsetsData.data["pset_name"] @@ -168,6 +192,21 @@ def get_work_schedule_pset_names(self, context): def get_qto_name(self, context): + pset_type = repr(self) + prop_type = pset_type.split(".")[-1] + if "bpy.data.objects" in pset_type: + if prop_type == "PsetProperties": + results = get_object_qto_name(self, context) + elif prop_type == "TaskPsetProperties": + results = get_task_qto_names(self, context) + elif prop_type == "ResourcePsetProperties": + results = get_resource_qto_names(self, context) + elif prop_type == "GroupPsetProperties": + results = get_group_qto_names(self, context) + return [("BBIM_CUSTOM", "Custom Qto", "Create a quantity set without using a template."), None] + results + + +def get_object_qto_name(self, context): if not ObjectPsetsData.is_loaded: ObjectPsetsData.load() return ObjectPsetsData.data["qto_name"] @@ -209,79 +248,6 @@ class PsetProperties(PropertyGroup): prop_value: StringProperty(name="Property Value", default="Some Value") -class MaterialPsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_material_pset_names, name="Pset Name") - - -class MaterialSetPsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_material_set_pset_names, name="Pset Name") - - -class MaterialSetItemPsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_material_set_item_pset_names, name="Pset Name") - - -class TaskPsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - qto_name: EnumProperty(items=get_task_qto_names, name="Qto Name") - - -class ResourcePsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_resource_pset_names, name="Pset Name") - qto_name: EnumProperty(items=get_resource_qto_names, name="Qto Name") - - -class GroupPsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_group_pset_names, name="Pset Name") - qto_name: EnumProperty(items=get_group_qto_names, name="Qto Name") - -class ProfilePsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_profile_pset_names, name="Pset Name") - - -class WorkSchedulePsetProperties(PropertyGroup): - active_pset_id: IntProperty(name="Active Pset ID") - active_pset_has_template: BoolProperty(name="Active Pset Has Template") - active_pset_name: StringProperty(name="Pset Name") - active_pset_type: StringProperty(name="Active Pset Type") - properties: CollectionProperty(name="Properties", type=IfcProperty) - pset_name: EnumProperty(items=get_work_schedule_pset_names, name="Pset Name") - - class RenameProperties(PropertyGroup): pset_name: StringProperty(name="Pset") existing_property_name: StringProperty(name="Existing Property Name") diff --git a/src/blenderbim/blenderbim/core/pset.py b/src/blenderbim/blenderbim/core/pset.py index 270eb9993e..c21b59ccf5 100644 --- a/src/blenderbim/blenderbim/core/pset.py +++ b/src/blenderbim/blenderbim/core/pset.py @@ -31,13 +31,12 @@ def copy_property_to_selection(ifc, pset, is_pset=True, obj=None, pset_name=None def add_pset(ifc, pset, blender, obj_name, obj_type): - pset_name = pset.get_pset_name(obj_name, obj_type) + pset_name = pset.get_pset_name(obj_name, obj_type, pset_type="PSET") if obj_type == "Object": elements = [ifc.get_entity(obj) for obj in blender.get_selected_objects()] else: elements = [ifc.get().by_id(blender.get_obj_ifc_definition_id(obj_name, obj_type))] for element in elements: - print('checking', element, pset_name) if not element: continue if pset_name and not pset.is_pset_applicable(element, pset_name): diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index ae8ce81919..d2a226567f 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -624,7 +624,7 @@ class Pset: def enable_proposed_pset(cls, props, pset_name, pset_type, has_template): pass def get_element_pset(cls, element, pset_name): pass def get_prop_template_primitive_type(cls, prop_template): pass - def get_pset_name(cls, obj, obj_type): pass + def get_pset_name(cls, obj, obj_type, pset_type): pass def get_pset_template(cls, name): pass def import_enumerated_value_from_template(cls, prop_template, data, props): pass def import_pset_from_existing(cls, pset, props): pass diff --git a/src/blenderbim/blenderbim/tool/pset.py b/src/blenderbim/blenderbim/tool/pset.py index 31493ded61..110938fb9d 100644 --- a/src/blenderbim/blenderbim/tool/pset.py +++ b/src/blenderbim/blenderbim/tool/pset.py @@ -57,9 +57,10 @@ class Pset(blenderbim.core.tool.Pset): return bpy.context.scene.GroupPsetProperties @classmethod - def get_pset_name(cls, obj, obj_type): - pset = cls.get_pset_props(obj, obj_type) - if (name := pset.pset_name) == "BBIM_CUSTOM_PSET": + def get_pset_name(cls, obj, obj_type, pset_type="PSET"): + props = cls.get_pset_props(obj, obj_type) + name = props.pset_name if pset_type == "PSET" else props.qto_name + if name == "BBIM_CUSTOM": return "" return name @@ -244,7 +245,7 @@ class Pset(blenderbim.core.tool.Pset): @classmethod def enable_proposed_pset(cls, props, pset_name, pset_type, has_template): props.active_pset_id = 0 - props.active_pset_name = pset_name or "My_Pset" + props.active_pset_name = pset_name or "My_Data" props.active_pset_type = pset_type props.active_pset_has_template = has_template