Fix bug where no colour is set if only a styled item has a style but a material has no representation

This commit is contained in:
Dion Moult
2020-11-19 22:38:23 +11:00
parent 1f938c7f1a
commit 44dc5a92b7
@@ -38,12 +38,12 @@ class MaterialCreator:
def __init__(self, ifc_import_settings): def __init__(self, ifc_import_settings):
self.mesh = None self.mesh = None
self.materials = {} self.materials = {}
self.current_object_materials = [] self.current_object_styles = []
self.parsed_meshes = [] self.parsed_meshes = []
self.ifc_import_settings = ifc_import_settings self.ifc_import_settings = ifc_import_settings
def create(self, element, obj, mesh): def create(self, element, obj, mesh):
self.current_object_materials = [] self.current_object_styles = []
self.obj = obj self.obj = obj
self.mesh = mesh self.mesh = mesh
if (hasattr(element, "Representation") and not element.Representation) or ( if (hasattr(element, "Representation") and not element.Representation) or (
@@ -90,25 +90,23 @@ class MaterialCreator:
material_name = self.get_material_name(styled_item) material_name = self.get_material_name(styled_item)
if material_name in self.current_object_materials: if material_name in self.current_object_styles:
return True return True
if material_name not in self.materials.keys(): material = bpy.data.materials.get(material_name)
material = bpy.data.materials.get(material_name) if not material:
if material: self.materials[material_name] = bpy.data.materials.new(material_name)
self.materials[material_name] = material
else: self.parse_styled_item(styled_item, self.materials[material_name])
self.materials[material_name] = bpy.data.materials.new(material_name)
self.parse_styled_item(styled_item, self.materials[material_name])
if self.ifc_import_settings.should_treat_styled_item_as_material: if self.ifc_import_settings.should_treat_styled_item_as_material:
# Revit workaround: since Revit/DDS-CAD exports all material # Revit workaround: since Revit/DDS-CAD exports all material
# assignments as individual object styled items. Treating them as # assignments as individual object styled items. Treating them as
# reusable materials makes things much more efficient in Blender. # reusable materials makes things much more efficient in Blender.
self.assign_material_to_mesh(self.materials[material_name]) self.assign_style_to_mesh(self.materials[material_name])
else: else:
# Proper behaviour # Proper behaviour
self.assign_material_to_mesh(self.materials[material_name], is_styled_item=True) self.assign_style_to_mesh(self.materials[material_name], is_styled_item=True)
return True return True
def assign_material_slots_to_faces(self, obj, mesh): def assign_material_slots_to_faces(self, obj, mesh):
@@ -337,11 +335,11 @@ class MaterialCreator:
items.append(item) items.append(item)
return items return items
def assign_material_to_mesh(self, material, is_styled_item=False): def assign_style_to_mesh(self, material, is_styled_item=False):
if not self.mesh: if not self.mesh:
return return
self.mesh.materials.append(material) self.mesh.materials.append(material)
self.current_object_materials.append(material.name) self.current_object_styles.append(material.name)
if is_styled_item: if is_styled_item:
index = len(self.obj.material_slots) - 1 index = len(self.obj.material_slots) - 1
self.obj.material_slots[index].link = "OBJECT" self.obj.material_slots[index].link = "OBJECT"