From b9723c08e47aa95c6b4c35af1d0afc18ab8b3bf2 Mon Sep 17 00:00:00 2001 From: s-leger Date: Mon, 24 May 2021 00:19:39 +0200 Subject: [PATCH] Ensure polygons are always coplanar (#1482) * Ensure polygons are always coplanar fix #1481 May adopt a bmesh approach instead ? * Ensure polygons are coplanar The bmesh version is lot faster than modifier one --- .../api/geometry/add_representation.py | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index 2c439ba2e9..26c844bffc 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -44,29 +44,36 @@ class Usecase: return self.create_variable_representation() def evaluate_geometry(self): - self.boolean_modifiers = [] + for modifier in self.settings["blender_object"].modifiers: if modifier.type == "BOOLEAN": modifier.show_viewport = False + + mesh = self.settings["blender_object"].evaluated_get(bpy.context.evaluated_depsgraph_get()).to_mesh() + bm = bmesh.new() + bm.from_mesh(mesh) + bmesh.ops.triangulate(bm, faces=bm.faces) - if self.settings["should_force_triangulation"]: - mesh = self.settings["blender_object"].evaluated_get(bpy.context.evaluated_depsgraph_get()).to_mesh() - bm = bmesh.new() - bm.from_mesh(mesh) - bmesh.ops.triangulate(bm, faces=bm.faces) - bm.to_mesh(mesh) - bm.free() - del bm - self.settings["geometry"] = mesh - else: - self.settings["geometry"] = ( - self.settings["blender_object"].evaluated_get(bpy.context.evaluated_depsgraph_get()).to_mesh() + if not self.settings["should_force_triangulation"]: + bmesh.ops.dissolve_limit( + bm, + angle_limit=0.00174533, + use_dissolve_boundaries=False, + verts=bm.verts[:], + edges=bm.edges[:], + delimit={'MATERIAL'} ) + bm.to_mesh(mesh) + bm.free() + del bm + self.settings["geometry"] = mesh + for modifier in self.settings["blender_object"].modifiers: if modifier.type == "BOOLEAN": modifier.show_viewport = True + def create_model_representation(self): if self.settings["context"].is_a() == "IfcGeometricRepresentationContext": return self.create_variable_representation()