mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-27 02:31:09 +00:00
Add support for adding material layer set usages to elements
This commit is contained in:
@@ -9,7 +9,7 @@ class Usecase:
|
|||||||
self.settings[key] = value
|
self.settings[key] = value
|
||||||
|
|
||||||
def execute(self):
|
def execute(self):
|
||||||
constituents = list(self.settings["constituent_set"].MaterialConstituents)
|
constituents = list(self.settings["constituent_set"].MaterialConstituents or [])
|
||||||
constituent = self.file.create_entity("IfcMaterialConstituent", **{"Material": self.settings["material"]})
|
constituent = self.file.create_entity("IfcMaterialConstituent", **{"Material": self.settings["material"]})
|
||||||
constituents.append(constituent)
|
constituents.append(constituent)
|
||||||
self.settings["constituent_set"].MaterialConstituents = constituents
|
self.settings["constituent_set"].MaterialConstituents = constituents
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class Usecase:
|
|||||||
self.settings[key] = value
|
self.settings[key] = value
|
||||||
|
|
||||||
def execute(self):
|
def execute(self):
|
||||||
layers = list(self.settings["layer_set"].MaterialLayers)
|
layers = list(self.settings["layer_set"].MaterialLayers or [])
|
||||||
layer = self.file.create_entity("IfcMaterialLayer", **{
|
layer = self.file.create_entity("IfcMaterialLayer", **{
|
||||||
"Material": self.settings["material"],
|
"Material": self.settings["material"],
|
||||||
"LayerThickness": 0.
|
"LayerThickness": 0.
|
||||||
|
|||||||
@@ -9,6 +9,6 @@ class Usecase:
|
|||||||
self.settings[key] = value
|
self.settings[key] = value
|
||||||
|
|
||||||
def execute(self):
|
def execute(self):
|
||||||
materials = list(self.settings["material_list"].Materials)
|
materials = list(self.settings["material_list"].Materials or [])
|
||||||
materials.append(self.settings["material"])
|
materials.append(self.settings["material"])
|
||||||
self.settings["material_list"].Materials = materials
|
self.settings["material_list"].Materials = materials
|
||||||
|
|||||||
@@ -17,8 +17,11 @@ class Usecase:
|
|||||||
self.create_material_association(material_set)
|
self.create_material_association(material_set)
|
||||||
elif self.settings["type"] == "IfcMaterialLayerSet":
|
elif self.settings["type"] == "IfcMaterialLayerSet":
|
||||||
material_set = self.file.create_entity(self.settings["type"])
|
material_set = self.file.create_entity(self.settings["type"])
|
||||||
material_set.MaterialLayers = [self.settings["material"]]
|
|
||||||
self.create_material_association(material_set)
|
self.create_material_association(material_set)
|
||||||
|
elif self.settings["type"] == "IfcMaterialLayerSetUsage":
|
||||||
|
material_set = self.file.create_entity("IfcMaterialLayerSet")
|
||||||
|
material_set_usage = self.create_layer_set_usage(material_set)
|
||||||
|
self.create_material_association(material_set_usage)
|
||||||
elif self.settings["type"] == "IfcMaterialProfileSet":
|
elif self.settings["type"] == "IfcMaterialProfileSet":
|
||||||
material_set = self.file.create_entity(self.settings["type"])
|
material_set = self.file.create_entity(self.settings["type"])
|
||||||
material_set.MaterialProfiles = [self.settings["material"]]
|
material_set.MaterialProfiles = [self.settings["material"]]
|
||||||
@@ -28,6 +31,14 @@ class Usecase:
|
|||||||
material_set.Materials = [self.settings["material"]]
|
material_set.Materials = [self.settings["material"]]
|
||||||
self.create_material_association(material_set)
|
self.create_material_association(material_set)
|
||||||
|
|
||||||
|
def create_layer_set_usage(self, material_set):
|
||||||
|
return self.file.create_entity("IfcMaterialLayerSetUsage", **{
|
||||||
|
"ForLayerSet": material_set,
|
||||||
|
"LayerSetDirection": "AXIS2" if self.settings["product"].is_a("IfcWall") else "AXIS3",
|
||||||
|
"DirectionSense": "POSITIVE",
|
||||||
|
"OffsetFromReferenceLine": 0
|
||||||
|
})
|
||||||
|
|
||||||
def assign_ifc_material(self):
|
def assign_ifc_material(self):
|
||||||
rel = self.get_rel_associates_material(self.settings["material"])
|
rel = self.get_rel_associates_material(self.settings["material"])
|
||||||
if not rel:
|
if not rel:
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ class AssignMaterial(bpy.types.Operator):
|
|||||||
"material": self.file.by_id(int(obj.BIMObjectMaterialProperties.material)),
|
"material": self.file.by_id(int(obj.BIMObjectMaterialProperties.material)),
|
||||||
},
|
},
|
||||||
).execute()
|
).execute()
|
||||||
|
Data.load()
|
||||||
Data.load(obj.BIMObjectProperties.ifc_definition_id)
|
Data.load(obj.BIMObjectProperties.ifc_definition_id)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|||||||
@@ -34,11 +34,12 @@ def getMaterialTypes(self, context):
|
|||||||
"IfcMaterial",
|
"IfcMaterial",
|
||||||
"IfcMaterialConstituentSet",
|
"IfcMaterialConstituentSet",
|
||||||
"IfcMaterialLayerSet",
|
"IfcMaterialLayerSet",
|
||||||
|
"IfcMaterialLayerSetUsage",
|
||||||
"IfcMaterialProfileSet",
|
"IfcMaterialProfileSet",
|
||||||
"IfcMaterialList",
|
"IfcMaterialList",
|
||||||
]
|
]
|
||||||
if IfcStore.get_file().schema == "IFC2X3":
|
if IfcStore.get_file().schema == "IFC2X3":
|
||||||
material_types = ["IfcMaterial", "IfcMaterialLayerSet", "IfcMaterialList"]
|
material_types = ["IfcMaterial", "IfcMaterialLayerSet", "IfcMaterialLayerSetUsage", "IfcMaterialList"]
|
||||||
materialtypes_enum.clear()
|
materialtypes_enum.clear()
|
||||||
materialtypes_enum = [(m, m, "") for m in material_types]
|
materialtypes_enum = [(m, m, "") for m in material_types]
|
||||||
return materialtypes_enum
|
return materialtypes_enum
|
||||||
|
|||||||
@@ -53,32 +53,32 @@ class BIM_PT_object_material(Panel):
|
|||||||
if self.product_data["type"] == "IfcMaterialConstituentSet":
|
if self.product_data["type"] == "IfcMaterialConstituentSet":
|
||||||
self.material_set_id = self.product_data["id"]
|
self.material_set_id = self.product_data["id"]
|
||||||
self.material_set_data = Data.constituent_sets[self.material_set_id]
|
self.material_set_data = Data.constituent_sets[self.material_set_id]
|
||||||
self.set_items = self.material_set_data["MaterialConstituents"]
|
self.set_items = self.material_set_data["MaterialConstituents"] or []
|
||||||
self.set_data = Data.constituents
|
self.set_data = Data.constituents
|
||||||
self.set_item_name = "constituent"
|
self.set_item_name = "constituent"
|
||||||
elif self.product_data["type"] == "IfcMaterialLayerSet":
|
elif self.product_data["type"] == "IfcMaterialLayerSet":
|
||||||
self.material_set_id = self.product_data["id"]
|
self.material_set_id = self.product_data["id"]
|
||||||
self.material_set_data = Data.layer_sets[self.material_set_id]
|
self.material_set_data = Data.layer_sets[self.material_set_id]
|
||||||
self.set_items = self.material_set_data["MaterialLayers"]
|
self.set_items = self.material_set_data["MaterialLayers"] or []
|
||||||
self.set_data = Data.layers
|
self.set_data = Data.layers
|
||||||
self.set_item_name = "layer"
|
self.set_item_name = "layer"
|
||||||
elif self.product_data["type"] == "IfcMaterialLayerSetUsage":
|
elif self.product_data["type"] == "IfcMaterialLayerSetUsage":
|
||||||
self.material_set_usage = Data.layer_set_usages[self.product_data["id"]]
|
self.material_set_usage = Data.layer_set_usages[self.product_data["id"]]
|
||||||
self.material_set_id = self.material_set_usage["ForLayerSet"]
|
self.material_set_id = self.material_set_usage["ForLayerSet"]
|
||||||
self.material_set_data = Data.layer_sets[self.material_set_id]
|
self.material_set_data = Data.layer_sets[self.material_set_id]
|
||||||
self.set_items = self.material_set_data["MaterialLayers"]
|
self.set_items = self.material_set_data["MaterialLayers"] or []
|
||||||
self.set_data = Data.layers
|
self.set_data = Data.layers
|
||||||
self.set_item_name = "layer"
|
self.set_item_name = "layer"
|
||||||
elif self.product_data["type"] == "IfcMaterialProfileSet":
|
elif self.product_data["type"] == "IfcMaterialProfileSet":
|
||||||
self.material_set_id = self.product_data["id"]
|
self.material_set_id = self.product_data["id"]
|
||||||
self.material_set_data = Data.profile_sets[self.material_set_id]
|
self.material_set_data = Data.profile_sets[self.material_set_id]
|
||||||
self.set_items = self.material_set_data["MaterialProfiles"]
|
self.set_items = self.material_set_data["MaterialProfiles"] or []
|
||||||
self.set_data = Data.profiles
|
self.set_data = Data.profiles
|
||||||
self.set_item_name = "profile"
|
self.set_item_name = "profile"
|
||||||
elif self.product_data["type"] == "IfcMaterialList":
|
elif self.product_data["type"] == "IfcMaterialList":
|
||||||
self.material_set_id = self.product_data["id"]
|
self.material_set_id = self.product_data["id"]
|
||||||
self.material_set_data = Data.lists[self.material_set_id]
|
self.material_set_data = Data.lists[self.material_set_id]
|
||||||
self.set_items = self.material_set_data["Materials"]
|
self.set_items = self.material_set_data["Materials"] or []
|
||||||
self.set_item_name = "list_item"
|
self.set_item_name = "list_item"
|
||||||
return self.draw_material_ui()
|
return self.draw_material_ui()
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@ class BIM_PT_object_material(Panel):
|
|||||||
else:
|
else:
|
||||||
item = self.set_data[set_item_id]
|
item = self.set_data[set_item_id]
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
row.label(text=item.get("Name", "Unnamed"), icon="ALIGN_CENTER")
|
row.label(text=item.get("Name", "Unnamed") or "Unnamed", icon="ALIGN_CENTER")
|
||||||
row.label(text=Data.materials[item["Material"]]["Name"], icon="MATERIAL")
|
row.label(text=Data.materials[item["Material"]]["Name"], icon="MATERIAL")
|
||||||
|
|
||||||
if not is_first:
|
if not is_first:
|
||||||
@@ -200,7 +200,7 @@ class BIM_PT_object_material(Panel):
|
|||||||
name_attr = "Name"
|
name_attr = "Name"
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
row.label(text=name_attr)
|
row.label(text=name_attr)
|
||||||
row.label(text=self.material_set_data.get(name_attr, "Unnamed"))
|
row.label(text=self.material_set_data.get(name_attr, "Unnamed") or "Unnamed")
|
||||||
if hasattr(self.material_set_data, "Description") and self.material_set_data["Description"]:
|
if hasattr(self.material_set_data, "Description") and self.material_set_data["Description"]:
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
row.label(text="Description")
|
row.label(text="Description")
|
||||||
@@ -214,5 +214,5 @@ class BIM_PT_object_material(Panel):
|
|||||||
else:
|
else:
|
||||||
item = self.set_data[item_id]
|
item = self.set_data[item_id]
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
row.label(text=item.get("Name", "Unnamed"), icon="ALIGN_CENTER")
|
row.label(text=item.get("Name", "Unnamed") or "Unnamed", icon="ALIGN_CENTER")
|
||||||
row.label(text=Data.materials[item["Material"]]["Name"], icon="MATERIAL")
|
row.label(text=Data.materials[item["Material"]]["Name"], icon="MATERIAL")
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ def add_object(self, context):
|
|||||||
obj.name = "Slab"
|
obj.name = "Slab"
|
||||||
context.view_layer.active_layer_collection.collection.objects.link(obj)
|
context.view_layer.active_layer_collection.collection.objects.link(obj)
|
||||||
if IfcStore.get_file():
|
if IfcStore.get_file():
|
||||||
bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcSlab")
|
bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcSlab", predefined_type="FLOOR")
|
||||||
obj.location = context.scene.cursor.location
|
obj.location = context.scene.cursor.location
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user