UI: Move Extensions repositories popover to header
[blender-addons-contrib.git] / object_batch_rename_datablocks.py
blobcae7c0545b2d1da6243cf08cba4ef3b185b309b9
1 # ##### BEGIN GPL LICENSE BLOCK #####
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.
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.
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.
17 # ##### END GPL LICENSE BLOCK #####
19 bl_info = {
20 "name": "Batch Rename Datablocks",
21 "author": "tstscr",
22 "version": (1, 1),
23 "blender": (2, 80, 0),
24 "location": "Search > (rename)",
25 "description": "Batch renaming of datablocks "
26 "(e.g. rename materials after objectnames)",
27 "warning": "",
28 "doc_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
29 "Scripts/Object/Batch_Rename_Datablocks",
30 "tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/",
31 "category": "Object"}
34 import bpy
35 from bpy.props import (
36 EnumProperty,
37 StringProperty,
38 BoolProperty,
42 def get_first_material_name(ob):
43 for m_slot in ob.material_slots:
44 if m_slot.material:
45 material_name = m_slot.material.name
46 return material_name
47 return None
50 def get_name(self, ob):
51 if self.naming_base == 'Object':
52 return ob.name
54 if self.naming_base == 'Mesh':
55 if ob.data:
56 return ob.data.name
57 else:
58 return ob.name
60 if self.naming_base == 'Material':
61 material_name = get_first_material_name(ob)
62 if not material_name:
63 return ob.name
64 else:
65 return material_name
67 if self.naming_base == 'Custom':
68 return self.rename_custom
71 def rename_datablocks_main(self, context):
72 obs = context.selected_editable_objects
73 for ob in obs:
74 name = get_name(self, ob)
76 if self.rename_object:
77 if (self.rename_use_prefix and self.prefix_object):
78 ob.name = self.rename_prefix + name
79 else:
80 ob.name = name
82 if self.rename_data:
83 if (ob.data
84 and ob.data.users == 1):
85 if (self.rename_use_prefix and self.prefix_data):
86 ob.data.name = self.rename_prefix + name
87 else:
88 ob.data.name = name
90 if self.rename_material:
91 if ob.material_slots:
92 for m_slot in ob.material_slots:
93 if m_slot.material:
94 if m_slot.material.users == 1:
95 if (self.rename_use_prefix and self.prefix_material):
96 m_slot.material.name = self.rename_prefix + name
97 else:
98 m_slot.material.name = name
101 class OBJECT_OT_batch_rename_datablocks(bpy.types.Operator):
102 """Batch rename Datablocks"""
103 bl_idname = "object.batch_rename_datablocks"
104 bl_label = "Batch Rename Datablocks"
105 bl_options = {'REGISTER', 'UNDO'}
107 name_origins = [
108 ('Object', 'Object', 'Use object name to rename other datablocks'),
109 ('Mesh', 'Mesh', 'Use mesh name to rename other datablocks'),
110 ('Material', 'Material', 'Use material name to rename other datablocks'),
111 ('Custom', 'Custom', 'Use new custom name to rename other datablocks')
113 naming_base: EnumProperty(
114 name='Name after:',
115 items=name_origins)
116 rename_custom: StringProperty(
117 name='Custom Name',
118 default='New Name',
119 description='Custom new name')
120 rename_object: BoolProperty(
121 name='Rename Objects',
122 default=False,
123 description='Rename Objects')
124 rename_data: BoolProperty(
125 name='Rename Data',
126 default=True,
127 description='Rename Object\'s Data')
128 rename_material: BoolProperty(
129 name='Rename Materials',
130 default=True,
131 description='Rename Objects\' Materials')
132 rename_use_prefix: BoolProperty(
133 name='Add Prefix',
134 default=False,
135 description='Prefix Objectnames with first Groups name')
136 rename_prefix: StringProperty(
137 name='Prefix',
138 default='',
139 description='Prefix name with this string')
140 prefix_object: BoolProperty(
141 name='Object',
142 default=True,
143 description='Prefix Object Names')
144 prefix_data: BoolProperty(
145 name='Data',
146 default=True,
147 description='Prefix Data Names')
148 prefix_material: BoolProperty(
149 name='Material',
150 default=True,
151 description='Prefix Material Names')
153 dialog_width = 260
155 def draw(self, context):
156 layout = self.layout
157 col = layout.column()
158 col.label(text='Rename after:')
160 row = layout.row()
161 row.prop(self.properties, 'naming_base', expand=True)
163 col = layout.column()
164 col.prop(self.properties, 'rename_custom')
166 col.separator()
167 col.label(text='Datablocks to rename:')
168 col.prop(self.properties, 'rename_object')
169 col.prop(self.properties, 'rename_data')
170 col.prop(self.properties, 'rename_material')
172 col.separator()
173 col.prop(self.properties, 'rename_use_prefix')
174 col.prop(self.properties, 'rename_prefix')
176 row = layout.row()
177 row.prop(self.properties, 'prefix_object')
178 row.prop(self.properties, 'prefix_data')
179 row.prop(self.properties, 'prefix_material')
181 col = layout.column()
183 @classmethod
184 def poll(cls, context):
185 return context.selected_objects != None
187 def execute(self, context):
189 rename_datablocks_main(self, context)
191 return {'FINISHED'}
193 def invoke(self, context, event):
194 wm = context.window_manager
195 wm.invoke_props_dialog(self, width=self.dialog_width)
196 return {'RUNNING_MODAL'}
199 classes = [
200 OBJECT_OT_batch_rename_datablocks,
204 def register():
205 from bpy.utils import register_class
206 for cls in classes:
207 register_class(cls)
210 def unregister():
211 from bpy.utils import unregister_class
212 for cls in reversed(classes):
213 unregister_class(cls)
216 if __name__ == '__main__':
217 register()