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
This commit is contained in:
s-leger
2021-05-24 00:19:39 +02:00
committed by GitHub
parent 1e80e67df5
commit b9723c08e4
@@ -44,29 +44,36 @@ class Usecase:
return self.create_variable_representation() return self.create_variable_representation()
def evaluate_geometry(self): def evaluate_geometry(self):
self.boolean_modifiers = []
for modifier in self.settings["blender_object"].modifiers: for modifier in self.settings["blender_object"].modifiers:
if modifier.type == "BOOLEAN": if modifier.type == "BOOLEAN":
modifier.show_viewport = False modifier.show_viewport = False
if self.settings["should_force_triangulation"]: mesh = self.settings["blender_object"].evaluated_get(bpy.context.evaluated_depsgraph_get()).to_mesh()
mesh = self.settings["blender_object"].evaluated_get(bpy.context.evaluated_depsgraph_get()).to_mesh() bm = bmesh.new()
bm = bmesh.new() bm.from_mesh(mesh)
bm.from_mesh(mesh) bmesh.ops.triangulate(bm, faces=bm.faces)
bmesh.ops.triangulate(bm, faces=bm.faces)
bm.to_mesh(mesh) if not self.settings["should_force_triangulation"]:
bm.free() bmesh.ops.dissolve_limit(
del bm bm,
self.settings["geometry"] = mesh angle_limit=0.00174533,
else: use_dissolve_boundaries=False,
self.settings["geometry"] = ( verts=bm.verts[:],
self.settings["blender_object"].evaluated_get(bpy.context.evaluated_depsgraph_get()).to_mesh() 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: for modifier in self.settings["blender_object"].modifiers:
if modifier.type == "BOOLEAN": if modifier.type == "BOOLEAN":
modifier.show_viewport = True modifier.show_viewport = True
def create_model_representation(self): def create_model_representation(self):
if self.settings["context"].is_a() == "IfcGeometricRepresentationContext": if self.settings["context"].is_a() == "IfcGeometricRepresentationContext":
return self.create_variable_representation() return self.create_variable_representation()