Fix #5949. Remove material set psets panel in favour of merging into material manager psets panel.

Previously, to edit a single IfcMaterial pset, you'd do so in the
material manager. In contrast, to edit a IfcMaterialSet pset, you'd do
so only when assigned to an object. Not only is it bad to edit psets in
two locations, it also means you can't edit psets until you've first
assigned the material set to an object which is bad. Now it's less code,
and material / material set psets are in the same spot.

There still more consolidation work to do, to allow editing of sets in
the material manager and to figure out how to show item psets, but it's
a step in the right direction.
This commit is contained in:
Dion Moult
2025-01-12 15:44:57 +11:00
parent 02632440b0
commit 8e77011dda
6 changed files with 2 additions and 70 deletions
@@ -47,7 +47,6 @@ classes = (
ui.BIM_PT_object_psets, ui.BIM_PT_object_psets,
ui.BIM_PT_object_qtos, ui.BIM_PT_object_qtos,
ui.BIM_PT_material_psets, ui.BIM_PT_material_psets,
ui.BIM_PT_material_set_psets,
ui.BIM_PT_material_set_item_psets, ui.BIM_PT_material_set_item_psets,
ui.BIM_PT_task_qtos, ui.BIM_PT_task_qtos,
ui.BIM_PT_resource_qtos, ui.BIM_PT_resource_qtos,
@@ -66,7 +65,6 @@ classes = (
def register(): def register():
bpy.types.Object.PsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) bpy.types.Object.PsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties)
bpy.types.Scene.MaterialPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) bpy.types.Scene.MaterialPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties)
bpy.types.Object.MaterialSetPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties)
bpy.types.Object.MaterialSetItemPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties) bpy.types.Object.MaterialSetItemPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties)
bpy.types.Scene.TaskPsetProperties = 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.ResourcePsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties)
@@ -82,7 +80,6 @@ def register():
def unregister(): def unregister():
del bpy.types.Object.PsetProperties del bpy.types.Object.PsetProperties
del bpy.types.Scene.MaterialPsetProperties del bpy.types.Scene.MaterialPsetProperties
del bpy.types.Object.MaterialSetPsetProperties
del bpy.types.Object.MaterialSetItemPsetProperties del bpy.types.Object.MaterialSetItemPsetProperties
del bpy.types.Scene.TaskPsetProperties del bpy.types.Scene.TaskPsetProperties
del bpy.types.Scene.ResourcePsetProperties del bpy.types.Scene.ResourcePsetProperties
+1 -18
View File
@@ -33,7 +33,6 @@ def refresh():
ObjectPsetsData.is_loaded = False ObjectPsetsData.is_loaded = False
ObjectQtosData.is_loaded = False ObjectQtosData.is_loaded = False
MaterialPsetsData.is_loaded = False MaterialPsetsData.is_loaded = False
MaterialSetPsetsData.is_loaded = False
MaterialSetItemPsetsData.is_loaded = False MaterialSetItemPsetsData.is_loaded = False
TaskQtosData.is_loaded = False TaskQtosData.is_loaded = False
ResourceQtosData.is_loaded = False ResourceQtosData.is_loaded = False
@@ -185,7 +184,7 @@ class MaterialPsetsData(Data):
if material.ifc_definition_id: if material.ifc_definition_id:
material = tool.Ifc.get().by_id(material.ifc_definition_id) material = tool.Ifc.get().by_id(material.ifc_definition_id)
category = getattr(material, "Category", None) or None category = getattr(material, "Category", None) or None
psets = bonsai.bim.schema.ifc.psetqto.get_applicable("IfcMaterial", category, pset_only=True) psets = bonsai.bim.schema.ifc.psetqto.get_applicable(props.material_type, category, pset_only=True)
psetnames = cls.format_pset_enum(psets) psetnames = cls.format_pset_enum(psets)
assigned_names = ifcopenshell.util.element.get_psets( assigned_names = ifcopenshell.util.element.get_psets(
material, psets_only=True, should_inherit=False material, psets_only=True, should_inherit=False
@@ -194,22 +193,6 @@ class MaterialPsetsData(Data):
return [] return []
class MaterialSetPsetsData(Data):
data = {}
is_loaded = False
@classmethod
def load(cls):
psets = {}
element = tool.Ifc.get_entity(bpy.context.active_object)
if element:
material = ifcopenshell.util.element.get_material(element, should_skip_usage=True)
if material and "Set" in material.is_a():
psets = cls.psetqtos(material)
cls.data = {"psets": psets}
cls.is_loaded = True
class MaterialSetItemPsetsData(Data): class MaterialSetItemPsetsData(Data):
data = {} data = {}
is_loaded = False is_loaded = False
+1 -42
View File
@@ -25,7 +25,6 @@ from bonsai.bim.module.pset.data import (
ObjectPsetsData, ObjectPsetsData,
ObjectQtosData, ObjectQtosData,
MaterialPsetsData, MaterialPsetsData,
MaterialSetPsetsData,
MaterialSetItemPsetsData, MaterialSetItemPsetsData,
TaskQtosData, TaskQtosData,
ResourceQtosData, ResourceQtosData,
@@ -88,7 +87,7 @@ def draw_enumerated_property(
def get_active_pset_obj_name(context: bpy.types.Context, obj_type: tool.Ifc.OBJECT_TYPE) -> str: def get_active_pset_obj_name(context: bpy.types.Context, obj_type: tool.Ifc.OBJECT_TYPE) -> str:
if obj_type in ("Object", "MaterialSet", "MaterialSetItem"): if obj_type in ("Object", "MaterialSetItem"):
return context.active_object.name return context.active_object.name
return "" return ""
@@ -430,46 +429,6 @@ class BIM_PT_material_psets(Panel):
draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "Material") draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "Material")
class BIM_PT_material_set_psets(Panel):
bl_label = "Material Set Property Sets"
bl_idname = "BIM_PT_material_set_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
if not ObjectMaterialData.is_loaded:
ObjectMaterialData.load()
ifc_class = ObjectMaterialData.data["material_class"]
return bool(ifc_class and "Set" in ifc_class)
def draw(self, context):
if not MaterialSetPsetsData.is_loaded:
MaterialSetPsetsData.load()
props = context.active_object.MaterialSetPsetProperties
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 = "MaterialSet"
if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "PSET":
draw_psetqto_ui(context, 0, {}, props, self.layout, "MaterialSet")
for pset in MaterialSetPsetsData.data["psets"]:
draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "MaterialSet")
class BIM_PT_material_set_item_psets(Panel): class BIM_PT_material_set_item_psets(Panel):
bl_label = "Material Set Item Property Sets" bl_label = "Material Set Item Property Sets"
bl_idname = "BIM_PT_material_set_item_psets" bl_idname = "BIM_PT_material_set_item_psets"
-4
View File
@@ -185,10 +185,6 @@ class Blender(bonsai.core.tool.Blender):
return context.scene.BIMMaterialProperties.materials[ return context.scene.BIMMaterialProperties.materials[
context.scene.BIMMaterialProperties.active_material_index context.scene.BIMMaterialProperties.active_material_index
].ifc_definition_id ].ifc_definition_id
elif obj_type == "MaterialSet":
return ifcopenshell.util.element.get_material(
tool.Ifc.get_entity(bpy.data.objects.get(obj)), should_skip_usage=True
).id()
elif obj_type == "MaterialSetItem": elif obj_type == "MaterialSetItem":
return bpy.data.objects.get(obj).BIMObjectMaterialProperties.active_material_set_item_id return bpy.data.objects.get(obj).BIMObjectMaterialProperties.active_material_set_item_id
elif obj_type == "Task": elif obj_type == "Task":
-1
View File
@@ -34,7 +34,6 @@ class Ifc(bonsai.core.tool.Ifc):
OBJECT_TYPE = Literal[ OBJECT_TYPE = Literal[
"Object", "Object",
"Material", "Material",
"MaterialSet",
"MaterialSetItem", "MaterialSetItem",
"Task", "Task",
"Cost", "Cost",
-2
View File
@@ -45,8 +45,6 @@ class Pset(bonsai.core.tool.Pset):
return bpy.data.objects.get(obj).PsetProperties return bpy.data.objects.get(obj).PsetProperties
elif obj_type == "Material": elif obj_type == "Material":
return bpy.context.scene.MaterialPsetProperties return bpy.context.scene.MaterialPsetProperties
elif obj_type == "MaterialSet":
return bpy.data.objects.get(obj).MaterialSetPsetProperties
elif obj_type == "MaterialSetItem": elif obj_type == "MaterialSetItem":
return bpy.data.objects.get(obj).MaterialSetItemPsetProperties return bpy.data.objects.get(obj).MaterialSetItemPsetProperties
elif obj_type == "Task": elif obj_type == "Task":