Skip to content

Commit 3bb3a80

Browse files
committed
Fix bug where materials weren't created when importing assets from a library
1 parent d71e89f commit 3bb3a80

3 files changed

Lines changed: 41 additions & 9 deletions

File tree

src/blenderbim/blenderbim/bim/import_ifc.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,10 +1069,14 @@ def create_openings_collection(self):
10691069

10701070
def create_materials(self):
10711071
for material in self.file.by_type("IfcMaterial"):
1072-
blender_material = bpy.data.materials.new(material.Name)
1073-
self.link_element(material, blender_material)
1074-
self.material_creator.materials[material.id()] = blender_material
1075-
blender_material.use_fake_user = True
1072+
self.create_material(material)
1073+
1074+
def create_material(self, material):
1075+
blender_material = bpy.data.materials.new(material.Name)
1076+
self.link_element(material, blender_material)
1077+
self.material_creator.materials[material.id()] = blender_material
1078+
blender_material.use_fake_user = True
1079+
return blender_material
10761080

10771081
def create_styles(self):
10781082
parsed_styles = set()
@@ -1088,11 +1092,13 @@ def create_styles(self):
10881092
for style in self.file.by_type("IfcSurfaceStyle"):
10891093
if style.id() in parsed_styles:
10901094
continue
1095+
self.create_style(style)
1096+
1097+
def create_style(self, style, blender_material=None):
1098+
if not blender_material:
10911099
name = style.Name or str(style.id())
10921100
blender_material = bpy.data.materials.new(name)
1093-
self.create_style(style, blender_material)
10941101

1095-
def create_style(self, style, blender_material):
10961102
old_definition_id = blender_material.BIMObjectProperties.ifc_definition_id
10971103
if not old_definition_id:
10981104
self.link_element(style, blender_material)

src/blenderbim/blenderbim/bim/module/project/operator.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,37 @@ def import_type_from_ifc(self, element, context):
346346
ifc_importer = import_ifc.IfcImporter(ifc_import_settings)
347347
ifc_importer.file = self.file
348348
ifc_importer.type_collection = type_collection
349+
self.import_type_materials(element, ifc_importer)
350+
self.import_type_styles(element, ifc_importer)
349351
ifc_importer.create_type_product(element)
350352
ifc_importer.place_objects_in_spatial_tree()
351353

354+
def import_type_materials(self, element, ifc_importer):
355+
for rel in element.HasAssociations:
356+
if not rel.is_a("IfcRelAssociatesMaterial"):
357+
continue
358+
for material in [e for e in self.file.traverse(rel) if e.is_a("IfcMaterial")]:
359+
if IfcStore.get_element(material.id()):
360+
continue
361+
blender_material = ifc_importer.create_material(material)
362+
self.import_material_styles(blender_material, material, ifc_importer)
363+
364+
def import_type_styles(self, element, ifc_importer):
365+
for representation_map in element.RepresentationMaps or []:
366+
for element in self.file.traverse(representation_map):
367+
if not element.is_a("IfcRepresentationItem") or not element.StyledByItem:
368+
continue
369+
for element2 in self.file.traverse(element.StyledByItem[0]):
370+
if element2.is_a("IfcSurfaceStyle") and not IfcStore.get_element(element2.id()):
371+
ifc_importer.create_style(element2)
372+
373+
def import_material_styles(self, blender_material, material, ifc_importer):
374+
if not material.HasRepresentation:
375+
return
376+
for element in self.file.traverse(material.HasRepresentation[0]):
377+
if element.is_a("IfcSurfaceStyle") and not IfcStore.get_element(element.id()):
378+
ifc_importer.create_style(element, blender_material)
379+
352380

353381
class EnableEditingHeader(bpy.types.Operator):
354382
bl_idname = "bim.enable_editing_header"

src/ifcopenshell-python/ifcopenshell/util/element.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,7 @@ def get_material(element, should_skip_usage=False):
7474
return relationship.RelatingMaterial
7575
relating_type = get_type(element)
7676
if hasattr(relating_type, "HasAssociations") and relating_type.HasAssociations:
77-
for relationship in relating_type.HasAssociations:
78-
if relationship.is_a("IfcRelAssociatesMaterial"):
79-
return relationship.RelatingMaterial
77+
return get_material(relating_type, should_skip_usage)
8078

8179

8280
def get_container(element):

0 commit comments

Comments
 (0)