From 7a7fde0a2afaeba25fe9050589996a02475c2f47 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 24 Jan 2024 10:39:20 +1100 Subject: [PATCH] See #4247. Loading models now skips excessively voided objects for performance. --- src/blenderbim/blenderbim/bim/import_ifc.py | 29 ++++++++++++++++++- .../blenderbim/bim/module/project/prop.py | 1 + .../blenderbim/bim/module/project/ui.py | 2 ++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index bcac0a95cc..d71084b4b4 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -188,6 +188,7 @@ class IfcImporter: self.diff = None self.file = None self.context_settings = [] + self.gross_context_settings = [] self.contexts = [] self.project = None self.has_existing_project = False @@ -375,6 +376,15 @@ class IfcImporter: settings.set_context_ids([context.id()]) self.context_settings.append(settings) + settings = ifcopenshell.geom.settings() + settings.set_deflection_tolerance(self.ifc_import_settings.deflection_tolerance) + settings.set_angular_tolerance(self.ifc_import_settings.angular_tolerance) + settings.set(settings.STRICT_TOLERANCE, True) + settings.set(settings.INCLUDE_CURVES, True) + settings.set(settings.DISABLE_OPENING_SUBTRACTIONS, True) + settings.set_context_ids([context.id()]) + self.gross_context_settings.append(settings) + def process_element_filter(self): offset = self.ifc_import_settings.element_offset offset_limit = offset + self.ifc_import_settings.element_limit @@ -418,6 +428,17 @@ class IfcImporter: else: self.spatial_elements = set(self.file.by_type("IfcSpatialElement")) + # Detect excessive voids + self.gross_elements = set( + filter(lambda e: len(getattr(e, "HasOpenings", [])) > self.ifc_import_settings.void_limit, self.elements) + ) + self.elements = self.elements.difference(self.gross_elements) + + if self.gross_elements: + print("Warning! Excessive voids were found and skipped for the following elements:") + for element in self.gross_elements: + print(element) + def get_spatial_elements_filtered_by_elements(self, elements): leaf_spatial_elements = set([ifcopenshell.util.element.get_container(e) for e in elements]) results = set() @@ -816,6 +837,10 @@ class IfcImporter: def create_elements(self): self.create_generic_elements(self.elements) + tmp = self.context_settings + self.context_settings = self.gross_context_settings + self.create_generic_elements(self.gross_elements) + self.context_settings = tmp def create_generic_shape(self, element): for settings in self.context_settings: @@ -1556,7 +1581,7 @@ class IfcImporter: rel_aggregates.add(element.IsDecomposedBy[0]) elif element.Decomposes: rel_aggregates.add(element.Decomposes[0]) - elif getattr(element, "IsNestedBy", []): # IFC2X3 does not have IsNestedBy + elif getattr(element, "IsNestedBy", []): # IFC2X3 does not have IsNestedBy if [e for e in element.IsNestedBy[0].RelatedObjects if not e.is_a("IfcPort")]: rel_aggregates.add(element.IsNestedBy[0]) elif getattr(element, "Nests", []): @@ -1955,6 +1980,7 @@ class IfcImportSettings: self.is_coordinating = True self.deflection_tolerance = 0.001 self.angular_tolerance = 0.5 + self.void_limit = 30 self.distance_limit = 1000 self.false_origin = None self.element_offset = 0 @@ -1986,6 +2012,7 @@ class IfcImportSettings: settings.is_coordinating = props.is_coordinating settings.deflection_tolerance = props.deflection_tolerance settings.angular_tolerance = props.angular_tolerance + settings.void_limit = props.void_limit settings.distance_limit = props.distance_limit settings.false_origin = [float(o) for o in props.false_origin.split(",")] if props.false_origin else None if settings.false_origin == [0, 0, 0]: diff --git a/src/blenderbim/blenderbim/bim/module/project/prop.py b/src/blenderbim/blenderbim/bim/module/project/prop.py index bbc3c64f00..2a7ccb7360 100644 --- a/src/blenderbim/blenderbim/bim/module/project/prop.py +++ b/src/blenderbim/blenderbim/bim/module/project/prop.py @@ -157,6 +157,7 @@ class BIMProjectProperties(PropertyGroup): is_coordinating: BoolProperty(name="For Coordination Only", default=False) deflection_tolerance: FloatProperty(name="Deflection Tolerance", default=0.001) angular_tolerance: FloatProperty(name="Angular Tolerance", default=0.5) + void_limit: IntProperty(name="Void Limit", default=30) distance_limit: FloatProperty(name="Distance Limit", default=1000) false_origin: StringProperty(name="False Origin", default="0,0,0") element_offset: IntProperty(name="Element Offset", default=0) diff --git a/src/blenderbim/blenderbim/bim/module/project/ui.py b/src/blenderbim/blenderbim/bim/module/project/ui.py index 7a4947b7c2..f71755deae 100644 --- a/src/blenderbim/blenderbim/bim/module/project/ui.py +++ b/src/blenderbim/blenderbim/bim/module/project/ui.py @@ -146,6 +146,8 @@ class BIM_PT_project(Panel): row = self.layout.row() row.prop(pprops, "angular_tolerance") row = self.layout.row() + row.prop(pprops, "void_limit") + row = self.layout.row() row.prop(pprops, "distance_limit") row = self.layout.row() row.prop(pprops, "false_origin")