[Bf-extensions-cvs] [30e801e] master: 3D Print Tools: use BVH for overlap check

Campbell Barton noreply at git.blender.org
Mon Aug 24 00:27:27 CEST 2015


Commit: 30e801eb06e47591b658a3faf6e3545b542ddf0d
Author: Campbell Barton
Date:   Mon Aug 24 08:16:54 2015 +1000
Branches: master
https://developer.blender.org/rBA30e801eb06e47591b658a3faf6e3545b542ddf0d

3D Print Tools: use BVH for overlap check

Fixes T38241

===================================================================

M	object_print3d_utils/mesh_helpers.py

===================================================================

diff --git a/object_print3d_utils/mesh_helpers.py b/object_print3d_utils/mesh_helpers.py
index 450e238..40659e2 100644
--- a/object_print3d_utils/mesh_helpers.py
+++ b/object_print3d_utils/mesh_helpers.py
@@ -106,63 +106,14 @@ def bmesh_check_self_intersect_object(obj):
     if not obj.data.polygons:
         return array.array('i', ())
 
-    # Heres what we do!
-    #
-    # * Take original Mesh.
-    # * Copy it and triangulate it (keeping list of original edge index values)
-    # * Move the BMesh into a temp Mesh.
-    # * Make a temp Object in the scene and assign the temp Mesh.
-    # * For every original edge - ray-cast on the object to find which intersect.
-    # * Report all edge intersections.
-
-    # Triangulate
     bm = bmesh_copy_from_object(obj, transform=False, triangulate=False)
-    face_map_index_org = {f: i for i, f in enumerate(bm.faces)}
-    ret = bmesh.ops.triangulate(bm, faces=bm.faces)
-    face_map = ret["face_map"]
-    # map new index to original index
-    face_map_index = {i: face_map_index_org[face_map.get(f, f)] for i, f in enumerate(bm.faces)}
-    del face_map_index_org
-    del ret
-
-    # Create a real mesh (lame!)
-    scene = bpy.context.scene
-    me_tmp = bpy.data.meshes.new(name="~temp~")
-    bm.to_mesh(me_tmp)
-    bm.free()
-    obj_tmp = bpy.data.objects.new(name=me_tmp.name, object_data=me_tmp)
-    scene.objects.link(obj_tmp)
-    scene.update()
-    ray_cast = obj_tmp.ray_cast
-
-    faces_error = set()
-
-    EPS_NORMAL = 0.000001
-    EPS_CENTER = 0.01  # should always be bigger
-
-    for ed in me_tmp.edges:
-        v1i, v2i = ed.vertices
-        v1 = me_tmp.vertices[v1i]
-        v2 = me_tmp.vertices[v2i]
-
-        # setup the edge with an offset
-        co_1 = v1.co.copy()
-        co_2 = v2.co.copy()
-        co_mid = (co_1 + co_2) * 0.5
-        no_mid = (v1.normal + v2.normal).normalized() * EPS_NORMAL
-        co_1 = co_1.lerp(co_mid, EPS_CENTER) + no_mid
-        co_2 = co_2.lerp(co_mid, EPS_CENTER) + no_mid
 
-        co, no, index = ray_cast(co_1, co_2)
-        if index != -1:
-            faces_error.add(face_map_index[index])
-
-    scene.objects.unlink(obj_tmp)
-    bpy.data.objects.remove(obj_tmp)
-    bpy.data.meshes.remove(me_tmp)
-
-    scene.update()
+    import mathutils
+    tree = mathutils.bvhtree.BVHTree.FromBMesh(bm, epsilon=0.00001)
 
+    overlap = tree.overlap(tree)
+    faces_error = {i for i_pair in overlap for i in i_pair}
+    print(faces_error)
     return array.array('i', faces_error)



More information about the Bf-extensions-cvs mailing list