Autodetect dense meshes to make it faster when loading so users don't need to go into advanced mode.

This commit is contained in:
Dion Moult
2023-09-23 14:50:36 +10:00
parent e3f2f2175d
commit 4549be0d05
+31 -5
View File
@@ -146,12 +146,15 @@ class MaterialCreator:
faces_remap = None faces_remap = None
texture_map = None texture_map = None
if coordinates.is_a("IfcIndexedPolygonalTextureMap"): if coordinates.is_a("IfcIndexedPolygonalTextureMap"):
faces_remap = [[coordinates_remap[i-1] for i in tex_coord_index.TexCoordsOf.CoordIndex] faces_remap = [
for tex_coord_index in coordinates.TexCoordIndices] [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] texture_map = [tex_coord_index.TexCoordIndex for tex_coord_index in coordinates.TexCoordIndices]
elif coordinates.is_a("IfcIndexedTriangleTextureMap"): elif coordinates.is_a("IfcIndexedTriangleTextureMap"):
faces_remap = [[coordinates_remap[i-1] for i in triangle_face] faces_remap = [
for triangle_face in coordinates.MappedTo.CoordIndex] [coordinates_remap[i - 1] for i in triangle_face] for triangle_face in coordinates.MappedTo.CoordIndex
]
texture_map = coordinates.TexCoordIndex texture_map = coordinates.TexCoordIndex
# apply uv to each face # apply uv to each face
@@ -166,7 +169,7 @@ class MaterialCreator:
) )
# apply uv to each loop # apply uv to each loop
for loop, i in zip(bface.loops, texCoordIndex): 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 # Finish up, write the bmesh back to the mesh
bm.to_mesh(self.mesh) bm.to_mesh(self.mesh)
@@ -263,6 +266,8 @@ class IfcImporter:
self.profile_code("Calculate unit scale") self.profile_code("Calculate unit scale")
self.calculate_model_offset() self.calculate_model_offset()
self.profile_code("Calculate model offset") self.profile_code("Calculate model offset")
self.predict_dense_mesh()
self.profile_code("Predict dense mesh")
self.set_units() self.set_units()
self.profile_code("Set units") self.profile_code("Set units")
self.create_project() self.create_project()
@@ -348,6 +353,7 @@ class IfcImporter:
) )
if self.body_contexts: if self.body_contexts:
self.settings.set_context_ids(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 # Annotation ContextType is to accommodate broken Revit files
# See https://github.com/Autodesk/revit-ifc/issues/187 # See https://github.com/Autodesk/revit-ifc/issues/187
self.plan_contexts = [ self.plan_contexts = [
@@ -498,6 +504,26 @@ class IfcImporter:
products.extend(self.get_products_from_shape_representation(inverse_element)) products.extend(self.get_products_from_shape_representation(inverse_element))
return products 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): def calculate_model_offset(self):
props = bpy.context.scene.BIMGeoreferenceProperties props = bpy.context.scene.BIMGeoreferenceProperties
if props.has_blender_offset: if props.has_blender_offset: