diff --git a/src/blenderbim/blenderbim/core/geometry.py b/src/blenderbim/blenderbim/core/geometry.py index b25ec4703a..195f4b3b51 100644 --- a/src/blenderbim/blenderbim/core/geometry.py +++ b/src/blenderbim/blenderbim/core/geometry.py @@ -115,6 +115,7 @@ def switch_representation( geometry.change_object_data(obj, data, is_global=is_global) geometry.record_object_materials(obj) + geometry.remove_triangulation(obj) if should_reload and existing_data: geometry.delete_data(existing_data) diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 839f67ffb8..01cdbfa53c 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -31,6 +31,7 @@ import blenderbim.bim.import_ifc from math import radians from mathutils import Vector from blenderbim.bim.ifc import IfcStore +from math import radians class Geometry(blenderbim.core.tool.Geometry): @@ -545,6 +546,19 @@ class Geometry(blenderbim.core.tool.Geometry): def rename_object(cls, obj, name): obj.name = name + @classmethod + def remove_triangulation(cls, obj): + """ + Convert triangles to quads without bpy.ops. + Note that it uses bmesh based on object mesh. + """ + mesh = obj.data + bm = tool.Blender.get_bmesh_for_mesh(mesh) + # angle values come from defaults for `bpy.ops.mesh.tris_convert_to_quads()`` + bmesh.ops.join_triangles(bm, faces=bm.faces[:], angle_face_threshold=radians(40), angle_shape_threshold=radians(40)) + bm.normal_update() + tool.Blender.apply_bmesh(mesh, bm, obj) + @classmethod def replace_object_with_empty(cls, obj): element = tool.Ifc.get_entity(obj)