diff --git a/object_print3d_utils/mesh_helpers.py b/object_print3d_utils/mesh_helpers.py index ca6e07168e5f08e4548d72709c8a83d2ceeba186..e1386b84b5aac7fae8ae39d9110b90b14688e667 100644 --- a/object_print3d_utils/mesh_helpers.py +++ b/object_print3d_utils/mesh_helpers.py @@ -279,3 +279,19 @@ def object_merge(context, objects): # return new object return base_base + + +def face_is_distorted(ele, angle_distort): + no = ele.normal + angle_fn = no.angle + + for loop in ele.loops: + loopno = loop.calc_normal() + + if loopno.dot(no) < 0.0: + loopno.negate() + + if angle_fn(loopno, 1000.0) > angle_distort: + return True + + return False diff --git a/object_print3d_utils/operators.py b/object_print3d_utils/operators.py index 8dcdf2110ea9cab87a7c91ba5ee60d038f8e760e..be8c323e801dfeb13347fa035692410a60d15fd9 100644 --- a/object_print3d_utils/operators.py +++ b/object_print3d_utils/operators.py @@ -20,6 +20,8 @@ # All Operator +import array + import bpy from bpy.types import Operator from bpy.props import ( @@ -129,8 +131,6 @@ class MESH_OT_Print3D_Check_Solid(Operator): @staticmethod def main_check(obj, info): - import array - bm = mesh_helpers.bmesh_copy_from_object(obj, transform=False, triangulate=False) edges_non_manifold = array.array('i', (i for i, ele in enumerate(bm.edges) @@ -173,7 +173,6 @@ class MESH_OT_Print3D_Check_Degenerate(Operator): @staticmethod def main_check(obj, info): - import array scene = bpy.context.scene print_3d = scene.print_3d threshold = print_3d.threshold_zero @@ -202,27 +201,17 @@ class MESH_OT_Print3D_Check_Distorted(Operator): @staticmethod def main_check(obj, info): - import array - scene = bpy.context.scene print_3d = scene.print_3d angle_distort = print_3d.angle_distort - def face_is_distorted(ele): - no = ele.normal - angle_fn = no.angle - for loop in ele.loops: - loopno = loop.calc_normal() - if loopno.dot(no) < 0.0: - loopno.negate() - if angle_fn(loopno, 1000.0) > angle_distort: - return True - return False - bm = mesh_helpers.bmesh_copy_from_object(obj, transform=True, triangulate=False) bm.normal_update() - faces_distort = array.array('i', (i for i, ele in enumerate(bm.faces) if face_is_distorted(ele))) + faces_distort = array.array( + 'i', + (i for i, ele in enumerate(bm.faces) if mesh_helpers.face_is_distorted(ele, angle_distort)) + ) info.append(("Non-Flat Faces: %d" % len(faces_distort), (bmesh.types.BMFace, faces_distort))) @@ -418,20 +407,11 @@ class MESH_OT_Print3D_Clean_Distorted(Operator): print_3d = scene.print_3d angle_distort = print_3d.angle_distort - def face_is_distorted(ele): - no = ele.normal - angle_fn = no.angle - for loop in ele.loops: - if angle_fn(loop.calc_normal(), 1000.0) > angle_distort: - return True - return False - obj = context.active_object bm = mesh_helpers.bmesh_from_object(obj) bm.normal_update() - elems_triangulate = [ele for ele in bm.faces if face_is_distorted(ele)] + elems_triangulate = [ele for ele in bm.faces if mesh_helpers.face_is_distorted(ele, angle_distort)] - # edit if elems_triangulate: bmesh.ops.triangulate(bm, faces=elems_triangulate) mesh_helpers.bmesh_to_object(obj, bm)