diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 4377d085c4..92c493a91d 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -172,9 +172,10 @@ class RefreshLibrary(bpy.types.Operator): self.props.active_library_element = "" types = IfcStore.library_file.wrapped_data.types_with_super() - if "IfcTypeProduct" in types: - new = self.props.library_elements.add() - new.name = "IfcTypeProduct" + for importable_type in ["IfcTypeProduct", "IfcMaterial"]: + if importable_type in types: + new = self.props.library_elements.add() + new.name = importable_type return {"FINISHED"} @@ -201,7 +202,9 @@ class ChangeLibraryElement(bpy.types.Operator): new.ifc_definition_id = element.id() if IfcStore.library_file.schema == "IFC2X3" or not IfcStore.library_file.by_type("IfcProjectLibrary"): new.is_declared = False - elif element.HasContext and element.HasContext[0].RelatingContext.is_a("IfcProjectLibrary"): + elif getattr(element, "HasContext", None) and element.HasContext[0].RelatingContext.is_a( + "IfcProjectLibrary" + ): new.is_declared = True else: for ifc_class in ifc_classes: @@ -328,10 +331,22 @@ class AppendLibraryElement(bpy.types.Operator): ) if not element: return {"FINISHED"} - self.import_type_from_ifc(element, context) + if element.is_a("IfcTypeProduct"): + self.import_type_from_ifc(element, context) + elif element.is_a("IfcMaterial"): + self.import_material_from_ifc(element, context) blenderbim.bim.handler.purge_module_data() return {"FINISHED"} + def import_material_from_ifc(self, element, context): + self.file = IfcStore.get_file() + logger = logging.getLogger("ImportIFC") + ifc_import_settings = import_ifc.IfcImportSettings.factory(context, IfcStore.path, logger) + ifc_importer = import_ifc.IfcImporter(ifc_import_settings) + ifc_importer.file = self.file + blender_material = ifc_importer.create_material(element) + self.import_material_styles(blender_material, element, ifc_importer) + def import_type_from_ifc(self, element, context): self.file = IfcStore.get_file() logger = logging.getLogger("ImportIFC") diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py index 30c7bfa36c..9088f11b3b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/append_asset.py @@ -18,6 +18,13 @@ class Usecase: except: pass return self.append_type_product() + elif self.settings["element"].is_a("IfcMaterial"): + if [e for e in self.file.by_type("IfcMaterial") if e.Name == self.settings["element"].Name]: + return + return self.append_material() + + def append_material(self): + return self.file.add(self.settings["element"]) def append_type_product(self): self.whitelisted_inverse_attributes = { diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py index ec476df3f2..19a6eab048 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/project/assign_declaration.py @@ -17,6 +17,9 @@ class Usecase: if self.settings["relating_context"].Declares: declares = self.settings["relating_context"].Declares[0] + if not hasattr(self.settings["definition"], "HasContext"): + return + has_context = None if self.settings["definition"].HasContext: has_context = self.settings["definition"].HasContext[0]