From e87faa167c9589394e29e60fc42151cfa3715b45 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Sat, 7 Sep 2024 10:55:16 +0500 Subject: [PATCH] typing also small optimization in MaterialCreator.create to address ifc a couple times less --- src/bonsai/bonsai/bim/import_ifc.py | 22 +++++++++++-------- .../api/material/copy_material.py | 8 ++++--- .../api/style/assign_representation_styles.py | 5 +++++ .../ifcopenshell/util/selector.py | 1 - .../test/api/pset/test_unshare_pset.py | 1 - 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/bonsai/bonsai/bim/import_ifc.py b/src/bonsai/bonsai/bim/import_ifc.py index 5fde08e638..35c4b12dfa 100644 --- a/src/bonsai/bonsai/bim/import_ifc.py +++ b/src/bonsai/bonsai/bim/import_ifc.py @@ -40,29 +40,33 @@ from typing import Dict, Union, Optional, Any class MaterialCreator: + mesh: bpy.types.Mesh + obj: bpy.types.Object + def __init__(self, ifc_import_settings: IfcImportSettings, ifc_importer: IfcImporter): - self.mesh: bpy.types.Mesh = None - self.obj: bpy.types.Object = None self.styles: Dict[int, bpy.types.Material] = {} self.parsed_meshes: set[str] = set() self.ifc_import_settings = ifc_import_settings self.ifc_importer = ifc_importer - def create(self, element: ifcopenshell.entity_instance, obj: bpy.types.Object, mesh: OBJECT_DATA_TYPE) -> None: - self.mesh = mesh - # as ifcopenshell triangulates the mesh, we need to merge it to quads again - self.obj = obj - if (hasattr(element, "Representation") and not element.Representation) or ( - hasattr(element, "RepresentationMaps") and not element.RepresentationMaps + def create( + self, element: ifcopenshell.entity_instance, obj: bpy.types.Object, mesh: Union[OBJECT_DATA_TYPE, None] + ) -> None: + if ((rep := getattr(element, "Representation", ...) is not ...) and not rep) or ( + (rep := getattr(element, "RepresentationMaps", ...) is not ...) and not rep ): return - if not self.mesh or self.mesh.name in self.parsed_meshes: + + if not mesh or mesh.name in self.parsed_meshes: return # We don't support curve styles yet. if isinstance(mesh, bpy.types.Curve): return + self.mesh = mesh + self.obj = obj + # mesh["ios_materials"] can contain: # - ifc style id if style assigned to the representation items directly # or through material with a style; diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py index b98490ef07..d250ac742b 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py +++ b/src/ifcopenshell-python/ifcopenshell/api/material/copy_material.py @@ -33,9 +33,7 @@ def copy_material(file: ifcopenshell.file, material: ifcopenshell.entity_instanc style is reused. :param material: The IfcMaterialDefinition to copy - :type material: ifcopenshell.entity_instance :return: The new copy of the material - :rtype: ifcopenshell.entity_instance Example: @@ -68,9 +66,13 @@ def copy_material(file: ifcopenshell.file, material: ifcopenshell.entity_instanc return _copy_material_with_inverses(file, material) elif material.is_a("IfcMaterialList"): return _copy_material_with_inverses(file, material) + else: + raise Exception(f"Unexpected material type: '{material.is_a()}' ({material}).") -def _copy_material_with_inverses(file, material): +def _copy_material_with_inverses( + file: ifcopenshell.file, material: ifcopenshell.entity_instance +) -> ifcopenshell.entity_instance: new = ifcopenshell.util.element.copy(file, material) for inverse in file.get_inverse(material): if inverse.is_a("IfcMaterialProperties"): diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py b/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py index b9b43ee8d0..e1c92995be 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py +++ b/src/ifcopenshell-python/ifcopenshell/api/style/assign_representation_styles.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . import ifcopenshell +from typing import Any def assign_representation_styles( @@ -112,6 +113,10 @@ def assign_representation_styles( class Usecase: + file: ifcopenshell.file + settings: dict[str, Any] + results: list[ifcopenshell.entity_instance] + def execute(self): if not self.settings["styles"]: return [] diff --git a/src/ifcopenshell-python/ifcopenshell/util/selector.py b/src/ifcopenshell-python/ifcopenshell/util/selector.py index 824b7f1864..8497e99a07 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/selector.py +++ b/src/ifcopenshell-python/ifcopenshell/util/selector.py @@ -21,7 +21,6 @@ import lark import numpy as np import ifcopenshell.api.pset import ifcopenshell.api.geometry -import ifcopenshell.ifcopenshell_wrapper as W import ifcopenshell.util import ifcopenshell.util.attribute import ifcopenshell.util.fm diff --git a/src/ifcopenshell-python/test/api/pset/test_unshare_pset.py b/src/ifcopenshell-python/test/api/pset/test_unshare_pset.py index b13bd5196e..846d2d5a54 100644 --- a/src/ifcopenshell-python/test/api/pset/test_unshare_pset.py +++ b/src/ifcopenshell-python/test/api/pset/test_unshare_pset.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Lesser General Public License # along with IfcOpenShell. If not, see . -import operator import test.bootstrap import ifcopenshell.api.pset import ifcopenshell.api.root