don't constrain single edge extrude, annoying for retopo
[blender.git] / release / scripts / startup / bl_operators / view3d.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8-80 compliant>
20
21 import bpy
22 from bpy.types import Operator
23
24
25 class VIEW3D_OT_edit_mesh_extrude_individual_move(Operator):
26     "Extrude individual elements and move"
27     bl_label = "Extrude Individual and Move"
28     bl_idname = "view3d.edit_mesh_extrude_individual_move"
29
30     def execute(self, context):
31         mesh = context.object.data
32         select_mode = context.tool_settings.mesh_select_mode
33
34         totface = mesh.total_face_sel
35         totedge = mesh.total_edge_sel
36         #~ totvert = mesh.total_vert_sel
37
38         if select_mode[2] and totface == 1:
39             bpy.ops.mesh.extrude_region_move('INVOKE_REGION_WIN',
40                     TRANSFORM_OT_translate={
41                         "constraint_orientation": 'NORMAL',
42                         "constraint_axis": (False, False, True)})
43         elif select_mode[2] and totface > 1:
44             bpy.ops.mesh.extrude_faces_move('INVOKE_REGION_WIN')
45         elif select_mode[1] and totedge >= 1:
46             bpy.ops.mesh.extrude_edges_move('INVOKE_REGION_WIN')
47         else:
48             bpy.ops.mesh.extrude_vertices_move('INVOKE_REGION_WIN')
49
50         # ignore return from operators above because they are 'RUNNING_MODAL',
51         # and cause this one not to be freed. [#24671]
52         return {'FINISHED'}
53
54     def invoke(self, context, event):
55         return self.execute(context)
56
57
58 class VIEW3D_OT_edit_mesh_extrude_move(Operator):
59     "Extrude and move along normals"
60     bl_label = "Extrude and Move on Normals"
61     bl_idname = "view3d.edit_mesh_extrude_move_normal"
62
63     def execute(self, context):
64         mesh = context.object.data
65
66         totface = mesh.total_face_sel
67         totedge = mesh.total_edge_sel
68         #~ totvert = mesh.total_vert_sel
69
70         if totface >= 1:
71             bpy.ops.mesh.extrude_region_move('INVOKE_REGION_WIN',
72                     TRANSFORM_OT_translate={
73                         "constraint_orientation": 'NORMAL',
74                         "constraint_axis": (False, False, True)})
75         elif totedge == 1:
76             bpy.ops.mesh.extrude_region_move('INVOKE_REGION_WIN',
77                     TRANSFORM_OT_translate={
78                         "constraint_orientation": 'NORMAL',
79                         # not a popular choice, too restrictive for retopo.
80                         #~ "constraint_axis": (True, True, False)})
81                         "constraint_axis": (False, False, False)})
82         else:
83             bpy.ops.mesh.extrude_region_move('INVOKE_REGION_WIN')
84
85         # ignore return from operators above because they are 'RUNNING_MODAL',
86         # and cause this one not to be freed. [#24671]
87         return {'FINISHED'}
88
89     def invoke(self, context, event):
90         return self.execute(context)