set api rev nr
[blender-addons-contrib.git] / object_batch_rename_datablocks.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 bl_addon_info = {
20     "name": "Batch Rename Datablocks",
21     "author": "tstscr",
22     "version": (1, 0),
23     "blender": (2, 5, 5),
24     "api": 33684,
25     "location": "use the search :)",
26     "description": "Batch renaming of datablocks (e.g. rename materials after objectnames)",
27     "warning": "",
28     "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/Scripts/Object/Batch_Rename_Datablocks",
29     "tracker_url": "http://projects.blender.org/tracker/index.php?func=detail&aid=25242&group_id=153&atid=468",
30     "category": "Object"}
31
32 #######################################################################
33 import bpy
34 from bpy.props import *
35
36 def get_first_material_name(ob):
37     for m_slot in ob.material_slots:
38         if m_slot.material:
39             material_name = m_slot.material.name
40             return material_name
41
42 def get_name(self, ob):
43     if self.naming_base == 'Object':
44         return ob.name
45     
46     if self.naming_base == 'Mesh':
47         if ob.data: return ob.data.name
48         else: return ob.name
49     
50     if self.naming_base == 'Material':
51         material_name = get_first_material_name(ob)
52         if not material_name: return ob.name
53         else: return material_name
54
55     if self.naming_base == 'Custom':
56         return self.rename_custom
57     
58     
59 def rename_datablocks_main(self, context):
60     obs = context.selected_editable_objects
61     for ob in obs:
62         name = get_name(self, ob)
63         
64         if self.rename_object:
65             if (self.rename_use_prefix
66             and self.prefix_object):
67                 ob.name = self.rename_prefix + name
68             else:
69                 ob.name = name
70         
71         if self.rename_data:
72             if (ob.data
73             and ob.data.users == 1):
74                 if (self.rename_use_prefix
75                 and self.prefix_data):
76                     ob.data.name = self.rename_prefix + name
77                 else:
78                     ob.data.name = name
79         
80         if self.rename_material:
81             if ob.material_slots:
82                 for m_slot in ob.material_slots:
83                     if m_slot.material:
84                         if m_slot.material.users == 1:
85                             if (self.rename_use_prefix
86                             and self.prefix_material):
87                                 m_slot.material.name = self.rename_prefix + name
88                             else:
89                                 m_slot.material.name = name
90
91 class OBJECT_OT_batch_rename_datablocks(bpy.types.Operator):
92     '''Batch rename Datablocks'''
93     bl_idname = "object.batch_rename_datablocks"
94     bl_label = "Batch Rename Datablocks"
95     bl_options = {'REGISTER', 'UNDO'}
96     
97     name_origins = [
98                     ('Object', 'Object', 'Object'),
99                     ('Mesh', 'Mesh', 'Mesh'),
100                     ('Material', 'Material', 'Material'),
101                     ('Custom', 'Custom', 'Custom')
102                     ]
103     naming_base = EnumProperty(name='Name after:',
104                                 items=name_origins)
105     rename_custom = StringProperty(name='Custom Name',
106                                 default='New Name',
107                                 description='Rename all with this String')
108     rename_object = BoolProperty(name='Rename Objects',
109                                 default=False,
110                                 description='Rename Objects')
111     rename_data = BoolProperty(name='Rename Data',
112                                 default=True,
113                                 description='Rename Object\'s Data')
114     rename_material = BoolProperty(name='Rename Materials',
115                                 default=True,
116                                 description='Rename Objects\' Materials')
117     rename_use_prefix = BoolProperty(name='Add Prefix',
118                                 default=False,
119                                 description='Prefix Objectnames with first Groups name')
120     rename_prefix = StringProperty(name='Prefix',
121                                 default='',
122                                 description='Prefix name with this string')
123     prefix_object = BoolProperty(name='Object',
124                                 default=True,
125                                 description='Prefix Object Names')
126     prefix_data = BoolProperty(name='Data',
127                                 default=True,
128                                 description='Prefix Data Names')
129     prefix_material = BoolProperty(name='Material',
130                                 default=True,
131                                 description='Prefix Material Names')
132
133     dialog_width = 260
134
135     def draw(self, context):
136         layout = self.layout
137         col = layout.column()
138         col.label(text='Rename after:')
139         
140         row = layout.row()
141         row.prop(self.properties, 'naming_base', expand=True)
142         
143         col = layout.column()
144         col.prop(self.properties, 'rename_custom')
145
146         col.separator()
147         col.label('Datablocks to rename:')
148         col.prop(self.properties, 'rename_object')
149         col.prop(self.properties, 'rename_data')
150         col.prop(self.properties, 'rename_material')
151         
152         col.separator()
153         col.prop(self.properties, 'rename_use_prefix')
154         col.prop(self.properties, 'rename_prefix')
155         
156         row = layout.row()
157         row.prop(self.properties, 'prefix_object')
158         row.prop(self.properties, 'prefix_data')
159         row.prop(self.properties, 'prefix_material')
160         
161         col = layout.column()
162         
163     @classmethod
164     def poll(cls, context):
165         return context.selected_objects != None
166
167     def execute(self, context):
168
169         rename_datablocks_main(self, context)
170         
171         return {'FINISHED'}
172
173     def invoke(self, context, event):
174         wm = context.window_manager
175         wm.invoke_props_dialog(self, self.dialog_width)
176         return {'RUNNING_MODAL'}
177         
178         
179 def register():
180     pass
181 def unregister():
182     pass
183 if __name__ == '__main__':
184     register()