I am not an experienced programmer. But I wrote a script which uses Regular Expressions to rename many objects or bones.
You can find the User Interface on the Tool shelf. It works in Object Mode and in Armature Edit Mode.
For example, if you are rigging and you are fed up renaming bones one by one (Adding prefixes like DEF_ or MCH_ ), you might want to give Regular Expressions a try. Let the computer do the work for you.
import re
import bpy
from bpy.props import *
class RE_Tool_PropertyGroup(bpy.types.PropertyGroup):
simple_op_prefix = StringProperty(name="Simple Operator Prefix", default="My Prefix")
regex_sel = StringProperty(name="Regexp Select", default=r".*")
regex_src = StringProperty(name="Regexp Src", default=r"(.*)")
regex_repl = StringProperty(name="Regexp Repl", default=r"\1")
class RE_Tool_Object(bpy.types.Panel):
bl_label = "Regular Expression Tool"
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_context = "objectmode"
def draw(self, context):
layout = self.layout
sce = context.scene
obj = context.object
# init argument
row = layout.row()
row.label("Selecting Objects")
row = layout.row()
row.prop(sce.retoolproperties, "regex_sel", text="")
row.operator("object.regex_select")
row = layout.row()
row.separator()
#
row = layout.row()
row.label("Renaming Objects")
row = layout.row()
row.prop(sce.retoolproperties, "regex_src", text="")
row.prop(sce.retoolproperties, "regex_repl", text="")
row = layout.row()
row.operator("object.regex_rename")
class RE_Tool_Armature(bpy.types.Panel):
bl_label = "Regular Expression Tool"
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_context = "armature_edit"
def draw(self, context):
layout = self.layout
sce = context.scene
obj = context.object
# init argument
row = layout.row()
row.label("Selecting Bones")
row = layout.row()
row.prop(sce.retoolproperties, "regex_sel", text="")
row.operator("object.regex_select")
row = layout.row()
row.separator()
#
row = layout.row()
row.label("Renaming Bones")
row = layout.row()
row.prop(sce.retoolproperties, "regex_src", text="")
row.prop(sce.retoolproperties, "regex_repl", text="")
row = layout.row()
row.operator("object.regex_rename")
# ---
# ---
# ---
class RenameOperator(bpy.types.Operator):
''''''
bl_idname = "object.regex_rename"
bl_label = "Rename"
# bpy.types.Scene.retoolproperties.simple_op_prefix = StringProperty(name="Simple Operator Prefix", default="My Prefix")
@classmethod
def poll(cls, context):
return context.active_object != None
def execute(self, context):
sce = context.scene
re_src=sce.retoolproperties.regex_src
re_repl=sce.retoolproperties.regex_repl
if (bpy.context.mode == 'EDIT_ARMATURE'):
for b in context.selected_editable_bones:
b.name = re.sub(re_src, re_repl, b.name)
elif (bpy.context.mode == 'OBJECT'):
for o in context.selected_editable_objects:
o.name = re.sub(re_src, re_repl, o.name)
return {'FINISHED'}
# ---
# ---
# ---
def select_regexp_bones(context, reg):
arm_obj = context.active_object
arm=arm_obj.data
reg_exp = re.compile (reg)
for b in arm.edit_bones:
if reg_exp.match(b.name):
b.select = True
b.select_head = True
b.select_tail = True
def select_regexp_objects(context, reg):
reg_exp = re.compile (reg)
for o in context.visible_objects:
if reg_exp.match(o.name):
o.select = True
class RegexpSelect(bpy.types.Operator):
''''''
bl_idname = "object.regex_select"
bl_label = "Select"
@classmethod
def poll(cls, context):
return context.active_object != None
def execute(self, context):
print(bpy.context.mode)
sce = context.scene
re_sel=sce.retoolproperties.regex_sel
if (bpy.context.mode == 'EDIT_ARMATURE'):
select_regexp_bones(context, re_sel)
elif (bpy.context.mode == 'OBJECT'):
select_regexp_objects(context, re_sel)
return {'FINISHED'}
def register():
bpy.utils.register_class(RE_Tool_PropertyGroup)
bpy.types.Scene.retoolproperties = bpy.props.PointerProperty( type = RE_Tool_PropertyGroup )
bpy.utils.register_class(RenameOperator)
bpy.utils.register_class(RegexpSelect)
bpy.utils.register_class(RE_Tool_Armature)
bpy.utils.register_class(RE_Tool_Object)
def unregister():
bpy.utils.unregister_class(RE_Tool_Armature)
bpy.utils.unregister_class(RE_Tool_Object)
bpy.utils.unregister_class(RenameOperator)
bpy.utils.unregister_class(RegexpSelect)
bpy.utils.unregister_class(RE_Tool_PropertyGroup)
if __name__ == "__main__":
register()