From 4549be0d055746aebe9bb7edc72673ea2ca5bf74 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 23 Sep 2023 14:50:36 +1000 Subject: [PATCH] Autodetect dense meshes to make it faster when loading so users don't need to go into advanced mode. --- src/blenderbim/blenderbim/bim/import_ifc.py | 36 ++++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index db041a46d6..3074b4b7b0 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -146,12 +146,15 @@ class MaterialCreator: faces_remap = None texture_map = None if coordinates.is_a("IfcIndexedPolygonalTextureMap"): - faces_remap = [[coordinates_remap[i-1] for i in tex_coord_index.TexCoordsOf.CoordIndex] - for tex_coord_index in coordinates.TexCoordIndices] + faces_remap = [ + [coordinates_remap[i - 1] for i in tex_coord_index.TexCoordsOf.CoordIndex] + for tex_coord_index in coordinates.TexCoordIndices + ] texture_map = [tex_coord_index.TexCoordIndex for tex_coord_index in coordinates.TexCoordIndices] elif coordinates.is_a("IfcIndexedTriangleTextureMap"): - faces_remap = [[coordinates_remap[i-1] for i in triangle_face] - for triangle_face in coordinates.MappedTo.CoordIndex] + faces_remap = [ + [coordinates_remap[i - 1] for i in triangle_face] for triangle_face in coordinates.MappedTo.CoordIndex + ] texture_map = coordinates.TexCoordIndex # apply uv to each face @@ -166,7 +169,7 @@ class MaterialCreator: ) # apply uv to each loop for loop, i in zip(bface.loops, texCoordIndex): - loop[uv_layer].uv = coordinates.TexCoords.TexCoordsList[i-1] + loop[uv_layer].uv = coordinates.TexCoords.TexCoordsList[i - 1] # Finish up, write the bmesh back to the mesh bm.to_mesh(self.mesh) @@ -263,6 +266,8 @@ class IfcImporter: self.profile_code("Calculate unit scale") self.calculate_model_offset() self.profile_code("Calculate model offset") + self.predict_dense_mesh() + self.profile_code("Predict dense mesh") self.set_units() self.profile_code("Set units") self.create_project() @@ -348,6 +353,7 @@ class IfcImporter: ) if self.body_contexts: self.settings.set_context_ids(self.body_contexts) + self.settings_body_2d.set_context_ids(self.body_contexts) # Annotation ContextType is to accommodate broken Revit files # See https://github.com/Autodesk/revit-ifc/issues/187 self.plan_contexts = [ @@ -498,6 +504,26 @@ class IfcImporter: products.extend(self.get_products_from_shape_representation(inverse_element)) return products + def predict_dense_mesh(self): + threshold = 10000 # Just from experience. + + faces = [len(e.CfsFaces) for e in self.file.by_type("IfcClosedShell")] + if faces and max(faces) > threshold: + self.ifc_import_settings.should_use_native_meshes = True + return + + if self.file.schema == "IFC2X3": + return + + faces = [len(e.Faces) for e in self.file.by_type("IfcPolygonalFaceSet")] + if faces and max(faces) > threshold: + self.ifc_import_settings.should_use_native_meshes = True + return + + faces = [len(e.CoordIndex) for e in self.file.by_type("IfcTriangulatedFaceSet")] + if faces and max(faces) > threshold: + self.ifc_import_settings.should_use_native_meshes = True + def calculate_model_offset(self): props = bpy.context.scene.BIMGeoreferenceProperties if props.has_blender_offset: