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_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,
@@ -66,7 +65,6 @@ classes = (
def register():
bpy.types.Object.PsetProperties = 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.Scene.TaskPsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties)
bpy.types.Scene.ResourcePsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties)
@@ -82,7 +80,6 @@ def register():
def unregister():
del bpy.types.Object.PsetProperties
del bpy.types.Scene.MaterialPsetProperties
del bpy.types.Object.MaterialSetPsetProperties
del bpy.types.Object.MaterialSetItemPsetProperties
del bpy.types.Scene.TaskPsetProperties
del bpy.types.Scene.ResourcePsetProperties
+1 -18
View File
@@ -33,7 +33,6 @@ def refresh():
ObjectPsetsData.is_loaded = False
ObjectQtosData.is_loaded = False
MaterialPsetsData.is_loaded = False
MaterialSetPsetsData.is_loaded = False
MaterialSetItemPsetsData.is_loaded = False
TaskQtosData.is_loaded = False
ResourceQtosData.is_loaded = False
@@ -185,7 +184,7 @@ class MaterialPsetsData(Data):
if material.ifc_definition_id:
material = tool.Ifc.get().by_id(material.ifc_definition_id)
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)
assigned_names = ifcopenshell.util.element.get_psets(
material, psets_only=True, should_inherit=False
@@ -194,22 +193,6 @@ class MaterialPsetsData(Data):
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):
data = {}
is_loaded = False
+1 -42
View File
@@ -25,7 +25,6 @@ from bonsai.bim.module.pset.data import (
ObjectPsetsData,
ObjectQtosData,
MaterialPsetsData,
MaterialSetPsetsData,
MaterialSetItemPsetsData,
TaskQtosData,
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:
if obj_type in ("Object", "MaterialSet", "MaterialSetItem"):
if obj_type in ("Object", "MaterialSetItem"):
return context.active_object.name
return ""
@@ -430,46 +429,6 @@ class BIM_PT_material_psets(Panel):
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):
bl_label = "Material Set Item Property Sets"
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[
context.scene.BIMMaterialProperties.active_material_index
].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":
return bpy.data.objects.get(obj).BIMObjectMaterialProperties.active_material_set_item_id
elif obj_type == "Task":
-1
View File
@@ -34,7 +34,6 @@ class Ifc(bonsai.core.tool.Ifc):
OBJECT_TYPE = Literal[
"Object",
"Material",
"MaterialSet",
"MaterialSetItem",
"Task",
"Cost",
-2
View File
@@ -45,8 +45,6 @@ class Pset(bonsai.core.tool.Pset):
return bpy.data.objects.get(obj).PsetProperties
elif obj_type == "Material":
return bpy.context.scene.MaterialPsetProperties
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":