diff --git a/src/blenderbim/blenderbim/bim/helper.py b/src/blenderbim/blenderbim/bim/helper.py index 277ff83e4d..2dc7460c3d 100644 --- a/src/blenderbim/blenderbim/bim/helper.py +++ b/src/blenderbim/blenderbim/bim/helper.py @@ -212,6 +212,8 @@ def get_obj_ifc_definition_id(context, obj, obj_type): return ifcopenshell.util.element.get_material( tool.Ifc.get_entity(bpy.data.objects.get(obj)), should_skip_usage=True ).id() + elif obj_type == "MaterialSetItem": + return bpy.data.objects.get(obj).BIMObjectMaterialProperties.active_material_set_item_id elif obj_type == "Task": return context.scene.BIMTaskTreeProperties.tasks[ context.scene.BIMWorkScheduleProperties.active_task_index diff --git a/src/blenderbim/blenderbim/bim/module/pset/__init__.py b/src/blenderbim/blenderbim/bim/module/pset/__init__.py index f6840e8032..168d453d7a 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/pset/__init__.py @@ -42,6 +42,7 @@ classes = ( prop.PsetProperties, prop.MaterialPsetProperties, prop.MaterialSetPsetProperties, + prop.MaterialSetItemPsetProperties, prop.TaskPsetProperties, prop.ResourcePsetProperties, prop.ProfilePsetProperties, @@ -53,6 +54,7 @@ classes = ( ui.BIM_PT_object_qtos, ui.BIM_PT_material_psets, ui.BIM_PT_material_set_psets, + ui.BIM_PT_material_set_item_psets, ui.BIM_PT_task_qtos, ui.BIM_PT_resource_qtos, ui.BIM_PT_resource_psets, @@ -68,6 +70,7 @@ 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) diff --git a/src/blenderbim/blenderbim/bim/module/pset/data.py b/src/blenderbim/blenderbim/bim/module/pset/data.py index 23e2d371c2..e25123432c 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/data.py +++ b/src/blenderbim/blenderbim/bim/module/pset/data.py @@ -30,6 +30,7 @@ def refresh(): ObjectQtosData.is_loaded = False MaterialPsetsData.is_loaded = False MaterialSetPsetsData.is_loaded = False + MaterialSetItemPsetsData.is_loaded = False TaskQtosData.is_loaded = False ResourceQtosData.is_loaded = False ResourcePsetsData.is_loaded = False @@ -115,6 +116,20 @@ class MaterialSetPsetsData(Data): cls.is_loaded = True +class MaterialSetItemPsetsData(Data): + data = {} + is_loaded = False + + @classmethod + def load(cls): + psets = {} + ifc_definition_id = bpy.context.active_object.BIMObjectMaterialProperties.active_material_set_item_id + if ifc_definition_id: + psets = cls.psetqtos(tool.Ifc.get().by_id(ifc_definition_id)) + cls.data = {"psets": psets} + cls.is_loaded = True + + class TaskQtosData(Data): data = {} is_loaded = False diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index ba06c8283b..9f96f61177 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -50,6 +50,8 @@ def get_pset_props(context, obj, obj_type): return bpy.data.materials.get(obj).PsetProperties elif obj_type == "MaterialSet": return bpy.data.objects.get(obj).MaterialSetPsetProperties + elif obj_type == "MaterialSetItem": + return bpy.data.objects.get(obj).MaterialSetItemPsetProperties elif obj_type == "Task": return context.scene.TaskPsetProperties elif obj_type == "Resource": diff --git a/src/blenderbim/blenderbim/bim/module/pset/prop.py b/src/blenderbim/blenderbim/bim/module/pset/prop.py index 8d512a2716..74ba715634 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset/prop.py @@ -97,6 +97,18 @@ def get_material_set_pset_names(self, context): return psetnames[ifc_class] +def get_material_set_item_pset_names(self, context): + global psetnames + ifc_definition_id = context.active_object.BIMObjectMaterialProperties.active_material_set_item_id + if not ifc_definition_id: + return [] + ifc_class = tool.Ifc.get().by_id(ifc_definition_id).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) + return psetnames[ifc_class] + + def get_task_qto_names(self, context): global qtonames ifc_class = "IfcTask" @@ -204,6 +216,13 @@ class MaterialSetPsetProperties(PropertyGroup): 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_name: StringProperty(name="Pset Name") + 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_name: StringProperty(name="Pset Name") diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py index 21a850f9c1..9ee59ef116 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -25,6 +25,7 @@ from blenderbim.bim.module.pset.data import ( ObjectQtosData, MaterialPsetsData, MaterialSetPsetsData, + MaterialSetItemPsetsData, TaskQtosData, ResourceQtosData, ResourcePsetsData, @@ -79,6 +80,8 @@ def get_active_pset_obj_name(context, obj_type): return context.active_object.active_material.name elif obj_type == "MaterialSet": return context.active_object.name + elif obj_type == "MaterialSetItem": + return context.active_object.name return "" @@ -305,6 +308,41 @@ class BIM_PT_material_set_psets(Panel): draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "MaterialSet") +class BIM_PT_material_set_item_psets(Panel): + bl_label = "IFC Material Set Item Property Sets" + bl_idname = "BIM_PT_material_set_item_psets" + bl_options = {"DEFAULT_CLOSED"} + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "object" + bl_parent_id = "BIM_PT_object_material" + + @classmethod + def poll(cls, context): + if not context.active_object: + return False + if not tool.Ifc.get() or tool.Ifc.get().schema == "IFC2X3": + return False # We don't support material psets in IFC2X3 because they suck + if not tool.Ifc.get_entity(context.active_object): + return False + return True + + def draw(self, context): + if not MaterialSetItemPsetsData.is_loaded: + MaterialSetItemPsetsData.load() + + props = context.active_object.MaterialSetItemPsetProperties + row = self.layout.row(align=True) + prop_with_search(row, props, "pset_name", text="") + op = row.operator("bim.add_pset", icon="ADD", text="") + op.obj = context.active_object.name + op.obj_type = "MaterialSetItem" + + for pset in MaterialSetItemPsetsData.data["psets"]: + draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "MaterialSetItem") + + + class BIM_PT_task_qtos(Panel): bl_label = "IFC Task Quantity Sets" bl_idname = "BIM_PT_task_qtos"