key shortcits for sculpt back
[blender-staging.git] / release / scripts / op / object.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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20
21 import bpy
22 from bpy.props import *
23
24
25 class SelectPattern(bpy.types.Operator):
26     '''Select object matching a naming pattern.'''
27     bl_idname = "object.select_pattern"
28     bl_label = "Select Pattern"
29     bl_register = True
30     bl_undo = True
31
32     pattern = StringProperty(name="Pattern", description="Name filter using '*' and '?' wildcard chars", maxlen=32, default="*")
33     case_sensitive = BoolProperty(name="Case Sensitive", description="Do a case sensitive compare", default=False)
34     extend = BoolProperty(name="Extend", description="Extend the existing selection", default=True)
35
36     def execute(self, context):
37
38         import fnmatch
39
40         if self.properties.case_sensitive:
41             pattern_match = fnmatch.fnmatchcase
42         else:
43             pattern_match = lambda a, b: fnmatch.fnmatchcase(a.upper(), b.upper())
44
45         obj = context.object
46         if obj and obj.mode == 'POSE':
47             items = obj.data.bones
48         elif obj and obj.type == 'ARMATURE' and obj.mode == 'EDIT':
49             items = obj.data.edit_bones
50         else:
51             items = context.visible_objects
52
53         # Can be pose bones or objects
54         for item in items:
55             if pattern_match(item.name, self.properties.pattern):
56                 item.selected = True
57             elif not self.properties.extend:
58                 item.selected = False
59
60         return ('FINISHED',)
61
62     def invoke(self, context, event):
63         wm = context.manager
64         # return wm.invoke_props_popup(self, event)
65         wm.invoke_props_popup(self, event)
66         return ('RUNNING_MODAL',)
67
68     def draw(self, context):
69         layout = self.layout
70         props = self.properties
71
72         layout.prop(props, "pattern")
73         row = layout.row()
74         row.prop(props, "case_sensitive")
75         row.prop(props, "extend")
76
77
78 class SubdivisionSet(bpy.types.Operator):
79     '''Sets a Subdivision Surface Level (1-5)'''
80
81     bl_idname = "object.subdivision_set"
82     bl_label = "Subdivision Set"
83     bl_register = True
84     bl_undo = True
85
86     level = IntProperty(name="Level",
87             default=1, min=-100, max=100, soft_min=-6, soft_max=6)
88
89     relative = BoolProperty(name="Relative", description="Apply the subsurf level as an offset relative to the current level", default=False)
90
91     def poll(self, context):
92         obs = context.selected_editable_objects
93         return (obs is not None)
94
95     def execute(self, context):
96         level = self.properties.level
97         relative = self.properties.relative
98
99         if relative and level == 0:
100             return ('CANCELLED',) # nothing to do
101
102         def set_object_subd(obj):
103             for mod in obj.modifiers:
104                 if mod.type == 'MULTIRES':
105                     if level <= mod.total_levels:
106                         if obj.mode == 'SCULPT':
107                             if relative:
108                                 mod.sculpt_levels += level
109                             else:
110                                 if mod.sculpt_levels != level:
111                                     mod.sculpt_levels = level
112                         elif obj.mode == 'OBJECT':
113                             if relative:
114                                 mod.levels += level
115                             else:
116                                 if mod.levels != level:
117                                     mod.levels = level
118                     return
119                 elif mod.type == 'SUBSURF':
120                     if relative:
121                         mod.levels += level
122                     else:
123                         if mod.levels != level:
124                             mod.levels = level
125
126                     return
127
128             # adda new modifier
129             mod = obj.modifiers.new("Subsurf", 'SUBSURF')
130             mod.levels = level
131
132         for obj in context.selected_editable_objects:
133             set_object_subd(obj)
134
135         return ('FINISHED',)
136
137
138 class Retopo(bpy.types.Operator):
139     '''TODO - doc'''
140
141     bl_idname = "object.retopology"
142     bl_label = "Retopology from Grease Pencil"
143     bl_register = True
144     bl_undo = True
145
146     def execute(self, context):
147         import retopo
148         retopo.main()
149         return ('FINISHED',)
150
151
152 bpy.ops.add(SelectPattern)
153 bpy.ops.add(SubdivisionSet)
154 bpy.ops.add(Retopo)