mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-11 18:16:40 +00:00
Implement support for showing IfcMaterialLayerSetUsage material types
This commit is contained in:
@@ -21,6 +21,7 @@ class Data:
|
||||
cls.materials = {}
|
||||
cls.constituent_sets = {}
|
||||
cls.constituents = {}
|
||||
cls.layer_set_usages = {}
|
||||
cls.layer_sets = {}
|
||||
cls.layers = {}
|
||||
cls.profile_sets = {}
|
||||
@@ -39,6 +40,7 @@ class Data:
|
||||
cls.load_materials()
|
||||
cls.load_constituents()
|
||||
cls.load_layers()
|
||||
cls.load_layer_usages()
|
||||
cls.load_profiles()
|
||||
cls.load_lists()
|
||||
cls.is_loaded = True
|
||||
@@ -62,6 +64,11 @@ class Data:
|
||||
cls.load_element("IfcMaterialLayer", cls.layers)
|
||||
cls.load_element("IfcMaterialLayerSet", cls.layer_sets)
|
||||
|
||||
@classmethod
|
||||
def load_layer_usages(cls):
|
||||
cls.layer_set_usages = {}
|
||||
cls.load_element("IfcMaterialLayerSetUsage", cls.layer_set_usages)
|
||||
|
||||
@classmethod
|
||||
def load_profiles(cls):
|
||||
cls.profile_sets = {}
|
||||
@@ -103,8 +110,6 @@ class Data:
|
||||
@classmethod
|
||||
def load_association(cls, association, product_id):
|
||||
material_select = association.RelatingMaterial
|
||||
if material_select.is_a("IfcMaterialLayerSetUsage"): # TODO: implement usages
|
||||
material_select = material_select.ForLayerSet
|
||||
elif material_select.is_a("IfcMaterialProfileSetUsage"): # TODO: implement usages
|
||||
if material_select.is_a("IfcMaterialProfileSetUsage"): # TODO: implement usages
|
||||
material_select = material_select.ForProfileSet
|
||||
cls.products[product_id] = {"type": material_select.is_a(), "id": material_select.id()}
|
||||
|
||||
@@ -206,10 +206,15 @@ class EnableEditingAssignedMaterial(bpy.types.Operator):
|
||||
props.material = str(product_data["id"])
|
||||
return {"FINISHED"}
|
||||
|
||||
material_set_class = product_data["type"]
|
||||
if product_data["type"] == "IfcMaterialConstituentSet":
|
||||
material_set_data = Data.constituent_sets[product_data["id"]]
|
||||
elif product_data["type"] == "IfcMaterialLayerSet":
|
||||
material_set_data = Data.layer_sets[product_data["id"]]
|
||||
elif product_data["type"] == "IfcMaterialLayerSetUsage":
|
||||
layer_set_usage = Data.layer_set_usages[product_data["id"]]
|
||||
material_set_data = Data.layer_sets[layer_set_usage["ForLayerSet"]]
|
||||
material_set_class = "IfcMaterialLayerSet"
|
||||
elif product_data["type"] == "IfcMaterialProfileSet":
|
||||
material_set_data = Data.profile_sets[product_data["id"]]
|
||||
elif product_data["type"] == "IfcMaterialList":
|
||||
@@ -220,7 +225,7 @@ class EnableEditingAssignedMaterial(bpy.types.Operator):
|
||||
while len(props.material_set_attributes) > 0:
|
||||
props.material_set_attributes.remove(0)
|
||||
|
||||
for attribute in IfcStore.get_schema().declaration_by_name(product_data["type"]).all_attributes():
|
||||
for attribute in IfcStore.get_schema().declaration_by_name(material_set_class).all_attributes():
|
||||
if "<string>" not in str(attribute.type_of_attribute):
|
||||
continue
|
||||
if attribute.name() in material_set_data:
|
||||
@@ -254,8 +259,7 @@ class EditAssignedMaterial(bpy.types.Operator):
|
||||
obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object
|
||||
props = obj.BIMObjectMaterialProperties
|
||||
product_data = Data.products[obj.BIMObjectProperties.ifc_definition_id]
|
||||
material_set_id = self.material_set or product_data["id"]
|
||||
material_set = self.file.by_id(material_set_id)
|
||||
material_set = self.file.by_id(self.material_set)
|
||||
|
||||
if product_data["type"] == "IfcMaterial":
|
||||
bpy.ops.bim.unassign_material(obj=obj.name)
|
||||
@@ -301,7 +305,7 @@ class EnableEditingMaterialSetItem(bpy.types.Operator):
|
||||
|
||||
if product_data["type"] == "IfcMaterialConstituentSet":
|
||||
material_set_item_data = Data.constituents[self.material_set_item]
|
||||
elif product_data["type"] == "IfcMaterialLayerSet":
|
||||
elif product_data["type"] == "IfcMaterialLayerSet" or product_data["type"] == "IfcMaterialLayerSetUsage":
|
||||
material_set_item_data = Data.layers[self.material_set_item]
|
||||
elif product_data["type"] == "IfcMaterialProfileSet":
|
||||
material_set_item_data = Data.profiles[self.material_set_item]
|
||||
@@ -382,7 +386,7 @@ class EditMaterialSetItem(bpy.types.Operator):
|
||||
},
|
||||
).execute()
|
||||
Data.load_constituents()
|
||||
elif product_data["type"] == "IfcMaterialLayerSet":
|
||||
elif product_data["type"] == "IfcMaterialLayerSet" or product_data["type"] == "IfcMaterialLayerSetUsage":
|
||||
edit_layer.Usecase(
|
||||
self.file,
|
||||
{
|
||||
|
||||
@@ -51,22 +51,33 @@ class BIM_PT_object_material(Panel):
|
||||
|
||||
if self.product_data:
|
||||
if self.product_data["type"] == "IfcMaterialConstituentSet":
|
||||
self.material_set_data = Data.constituent_sets[self.product_data["id"]]
|
||||
self.material_set_id = self.product_data["id"]
|
||||
self.material_set_data = Data.constituent_sets[self.material_set_id]
|
||||
self.set_items = self.material_set_data["MaterialConstituents"]
|
||||
self.set_data = Data.constituents
|
||||
self.set_item_name = "constituent"
|
||||
elif self.product_data["type"] == "IfcMaterialLayerSet":
|
||||
self.material_set_data = Data.layer_sets[self.product_data["id"]]
|
||||
self.material_set_id = self.product_data["id"]
|
||||
self.material_set_data = Data.layer_sets[self.material_set_id]
|
||||
self.set_items = self.material_set_data["MaterialLayers"]
|
||||
self.set_data = Data.layers
|
||||
self.set_item_name = "layer"
|
||||
elif self.product_data["type"] == "IfcMaterialLayerSetUsage":
|
||||
self.material_set_usage = Data.layer_set_usages[self.product_data["id"]]
|
||||
self.material_set_id = self.material_set_usage["ForLayerSet"]
|
||||
self.material_set_data = Data.layer_sets[self.material_set_id]
|
||||
self.set_items = self.material_set_data["MaterialLayers"]
|
||||
self.set_data = Data.layers
|
||||
self.set_item_name = "layer"
|
||||
elif self.product_data["type"] == "IfcMaterialProfileSet":
|
||||
self.material_set_data = Data.profile_sets[self.product_data["id"]]
|
||||
self.material_set_id = self.product_data["id"]
|
||||
self.material_set_data = Data.profile_sets[self.material_set_id]
|
||||
self.set_items = self.material_set_data["MaterialProfiles"]
|
||||
self.set_data = Data.profiles
|
||||
self.set_item_name = "profile"
|
||||
elif self.product_data["type"] == "IfcMaterialList":
|
||||
self.material_set_data = Data.lists[self.product_data["id"]]
|
||||
self.material_set_id = self.product_data["id"]
|
||||
self.material_set_data = Data.lists[self.material_set_id]
|
||||
self.set_items = self.material_set_data["Materials"]
|
||||
self.set_item_name = "list_item"
|
||||
return self.draw_material_ui()
|
||||
@@ -82,7 +93,8 @@ class BIM_PT_object_material(Panel):
|
||||
row.label(text=self.product_data["type"])
|
||||
|
||||
if self.props.is_editing:
|
||||
row.operator("bim.edit_assigned_material", icon="CHECKMARK", text="")
|
||||
op = row.operator("bim.edit_assigned_material", icon="CHECKMARK", text="")
|
||||
op.material_set = self.material_set_id
|
||||
row.operator("bim.disable_editing_assigned_material", icon="X", text="")
|
||||
else:
|
||||
row.operator("bim.enable_editing_assigned_material", icon="GREASEPENCIL", text="")
|
||||
@@ -122,7 +134,7 @@ class BIM_PT_object_material(Panel):
|
||||
row.prop(self.props, "material", text="")
|
||||
|
||||
op = row.operator(f"bim.add_{self.set_item_name}", icon="ADD", text="")
|
||||
setattr(op, f"{self.set_item_name}_set", self.product_data["id"])
|
||||
setattr(op, f"{self.set_item_name}_set", self.material_set_id)
|
||||
|
||||
total_items = len(self.set_items)
|
||||
for index, set_item_id in enumerate(self.set_items):
|
||||
@@ -175,11 +187,17 @@ class BIM_PT_object_material(Panel):
|
||||
op.material_set_item = set_item_id
|
||||
op = row.operator(f"bim.remove_{self.set_item_name}", icon="X", text="")
|
||||
if self.product_data["type"] == "IfcMaterialList":
|
||||
setattr(op, "list_item_set", self.product_data["id"])
|
||||
setattr(op, "list_item_set", self.material_set_id)
|
||||
setattr(op, self.set_item_name, item["id"])
|
||||
|
||||
def draw_read_only_set_ui(self):
|
||||
name_attr = "LayerSetName" if self.product_data["type"] == "IfcMaterialLayerSet" else "Name"
|
||||
if (
|
||||
self.product_data["type"] == "IfcMaterialLayerSetUsage"
|
||||
or self.product_data["type"] == "IfcMaterialLayerSet"
|
||||
):
|
||||
name_attr = "LayerSetName"
|
||||
else:
|
||||
name_attr = "Name"
|
||||
row = self.layout.row(align=True)
|
||||
row.label(text=name_attr)
|
||||
row.label(text=self.material_set_data.get(name_attr, "Unnamed"))
|
||||
|
||||
Reference in New Issue
Block a user