mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-11 22:31:55 +00:00
Autodetect dense meshes to make it faster when loading so users don't need to go into advanced mode.
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user