From a67927ae67dfdb0f33fa81f4e72bae8eb3876c02 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 7 Mar 2025 17:02:05 +1100 Subject: [PATCH] Automatically merge excessive styles when loading models Came across this problem with some models from 12D --- src/bonsai/bonsai/bim/import_ifc.py | 10 +++++++++- src/bonsai/bonsai/bim/module/project/prop.py | 6 ++++++ src/bonsai/bonsai/bim/module/project/ui.py | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/bonsai/bonsai/bim/import_ifc.py b/src/bonsai/bonsai/bim/import_ifc.py index 6fb0dd6fd0..14fa8a43ff 100644 --- a/src/bonsai/bonsai/bim/import_ifc.py +++ b/src/bonsai/bonsai/bim/import_ifc.py @@ -20,6 +20,7 @@ from __future__ import annotations import bpy import time import json +import ifcpatch import logging import traceback import mathutils @@ -952,7 +953,12 @@ class IfcImporter: props.collection = self.collections[project.GlobalId] = self.project["blender"] def create_styles(self) -> None: - for style in self.file.by_type("IfcSurfaceStyle"): + styles = self.file.by_type("IfcSurfaceStyle") + if len(styles) > self.ifc_import_settings.style_limit: # Probably something strange happening + print("Warning! Excessive styles were found and merged where applicable.") + ifcpatch.execute({"file": self.file, "recipe": "MergeStyles", "arguments": []}) + styles = self.file.by_type("IfcSurfaceStyle") + for style in styles: self.create_style(style) def create_style(self, style: ifcopenshell.entity_instance) -> None: @@ -1132,6 +1138,7 @@ class IfcImportSettings: self.deflection_tolerance = 0.001 self.angular_tolerance = 0.5 self.void_limit = 30 + self.style_limit = 300 # Locations greater than 1km are not considered "small sites" according to the georeferencing guide # Users can configure this if they have to handle larger sites but beware of surveying precision self.distance_limit = 1000 @@ -1169,6 +1176,7 @@ class IfcImportSettings: settings.deflection_tolerance = props.deflection_tolerance settings.angular_tolerance = props.angular_tolerance settings.void_limit = props.void_limit + settings.style_limit = props.style_limit settings.distance_limit = props.distance_limit settings.false_origin_mode = props.false_origin_mode try: diff --git a/src/bonsai/bonsai/bim/module/project/prop.py b/src/bonsai/bonsai/bim/module/project/prop.py index a570724fee..a8ca1f2edd 100644 --- a/src/bonsai/bonsai/bim/module/project/prop.py +++ b/src/bonsai/bonsai/bim/module/project/prop.py @@ -318,6 +318,11 @@ class BIMProjectProperties(PropertyGroup): default=30, description="Maxium number of openings that object can have. If object has more openings, it will be loaded without openings", ) + style_limit: IntProperty( + name="Style Limit", + default=300, + description="Maxium number of styles before styles are automatically merged", + ) distance_limit: FloatProperty(name="Distance Limit", default=1000, subtype="DISTANCE") false_origin_mode: bpy.props.EnumProperty( items=[ @@ -454,6 +459,7 @@ class BIMProjectProperties(PropertyGroup): deflection_tolerance: float angular_tolerance: float void_limit: int + style_limit: int distance_limit: float false_origin_mode: Literal["AUTOMATIC", "MANUAL", "DISABLED"] false_origin: str diff --git a/src/bonsai/bonsai/bim/module/project/ui.py b/src/bonsai/bonsai/bim/module/project/ui.py index c5d390c780..237fe75f52 100644 --- a/src/bonsai/bonsai/bim/module/project/ui.py +++ b/src/bonsai/bonsai/bim/module/project/ui.py @@ -213,6 +213,8 @@ class BIM_PT_project(Panel): row = self.layout.row() row.prop(pprops, "void_limit") row = self.layout.row() + row.prop(pprops, "style_limit") + row = self.layout.row() row.prop(pprops, "distance_limit") row = self.layout.row() row.prop(pprops, "false_origin_mode")