Fix for invalid break statement outside loop.
[blender-addons-contrib.git] / mesh_tinyCAD / PERP.py
1 '''
2 BEGIN GPL LICENSE BLOCK
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.    See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation,
16 Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17
18 END GPL LICENCE BLOCK
19 '''
20
21 import bpy
22 import bmesh
23 import mathutils
24 import math
25 from mathutils import Vector
26
27
28 def cut_visible_by_perpendicular(self):
29
30     obj = bpy.context.object
31     me = obj.data
32     bm = bmesh.from_edit_mesh(me)
33
34     verts = [v for v in bm.verts if (v.select and not v.hide)]
35
36     if not len(verts) == 2:
37         msg = "select two vertices"
38         self.report({"WARNING"}, msg)
39         return {'CANCELLED'}
40
41     v1, v2 = [v.co for v in verts]
42     print('vectors found:\n', v1, '\n', v2)
43
44     mid_vec = v1.lerp(v2, 0.5)
45     plane_no = v2 - mid_vec
46     plane_co = mid_vec
47     dist = 0.0001
48
49     # hidden geometry will not be affected.
50     visible_geom = [g for g in bm.faces[:]
51                     + bm.verts[:] + bm.edges[:] if not g.hide]
52
53     bmesh.ops.bisect_plane(
54         bm,
55         geom=visible_geom,
56         dist=dist,
57         plane_co=plane_co, plane_no=plane_no,
58         use_snap_center=False,
59         clear_outer=False,
60         clear_inner=False)
61
62     bmesh.update_edit_mesh(me, True)
63
64
65 class CutOnPerpendicular(bpy.types.Operator):
66
67     bl_idname = 'mesh.cutonperp'
68     bl_label = 'perp cutline for verts'
69     bl_options = {'REGISTER', 'UNDO'}
70
71     @classmethod
72     def poll(self, context):
73         obj = context.active_object
74         return all([obj is not None, obj.type == 'MESH', obj.mode == 'EDIT'])
75
76     def execute(self, context):
77         cut_visible_by_perpendicular(self)
78         return {'FINISHED'}