2006-01-20 02:40:05 +00:00
#!BPY
"""
Name : ' Batch Object Name Edit '
Blender : 240
Group : ' Object '
Tooltip : ' Apply the chosen rule to rename all selected objects at once. '
"""
__author__ = " Campbell Barton "
__url__ = ( " blender " , " elysiun " )
__version__ = " 1.0 "
__bpydoc__ = """ \
" Batch Object Name Edit " allows you to change multiple names of Blender
objects at once . It provides options to define if you want to : replace text
in the current names , truncate their beginnings or endings or prepend / append
strings to them .
Usage :
Select the objects to be renamed and run this script from the Object - > Scripts
menu of the 3 d View .
"""
# $Id$
#
# --------------------------------------------------------------------------
# Batch Name Edit by Campbell Barton (AKA Ideasman)
# --------------------------------------------------------------------------
# ***** BEGIN GPL LICENSE BLOCK *****
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ***** END GPL LICENCE BLOCK *****
# --------------------------------------------------------------------------
from Blender import *
2007-03-26 19:44:44 +00:00
import bpy
2006-01-20 02:40:05 +00:00
global renameCount
renameCount = 0
2007-04-26 19:05:22 +00:00
obsel = [ ob for ob in bpy . data . scenes . active . objects . context if not ob . lib ]
2006-01-20 02:40:05 +00:00
2006-05-06 09:11:11 +00:00
def setDataNameWrapper ( ob , newname ) :
if ob . getData ( name_only = 1 ) == newname :
return False
2006-07-12 12:36:19 +00:00
data = ob . getData ( mesh = 1 )
2006-05-06 09:11:11 +00:00
2007-04-26 19:05:22 +00:00
if data and not data . lib :
2006-05-06 09:11:11 +00:00
data . name = newname
return True
return False
2006-01-20 02:40:05 +00:00
def main ( ) :
global renameCount
# Rename the datablocks that are used by the object.
def renameLinkedDataFromObject ( ) :
# Result 1, we want to rename data
2006-12-15 22:14:33 +00:00
for ob in obsel :
2006-07-12 12:36:19 +00:00
if ob . name == ob . getData ( name_only = 1 ) :
2006-01-20 02:40:05 +00:00
return # Alredy the same name, dont bother.
2006-07-12 12:36:19 +00:00
data = ob . getData ( mesh = 1 ) # use mesh so we dont have to update the nmesh.
2007-04-26 19:05:22 +00:00
if data and not data . lib :
2006-01-20 02:40:05 +00:00
data . name = ob . name
def new ( ) :
global renameCount
NEW_NAME_STRING = Draw . Create ( ' ' )
RENAME_LINKED = Draw . Create ( 0 )
pup_block = [ \
( ' New Name: ' , NEW_NAME_STRING , 19 , 19 , ' New Name ' ) , \
( ' Rename ObData ' , RENAME_LINKED , ' Renames objects data to match the obname ' ) , \
]
if not Draw . PupBlock ( ' Replace in name... ' , pup_block ) :
return 0
NEW_NAME_STRING = NEW_NAME_STRING . val
Window . WaitCursor ( 1 )
2006-12-15 22:14:33 +00:00
for ob in obsel :
2006-01-20 02:40:05 +00:00
if ob . name != NEW_NAME_STRING :
ob . name = NEW_NAME_STRING
renameCount + = 1
return RENAME_LINKED . val
def replace ( ) :
global renameCount
REPLACE_STRING = Draw . Create ( ' ' )
WITH_STRING = Draw . Create ( ' ' )
RENAME_LINKED = Draw . Create ( 0 )
pup_block = [ \
( ' Replace: ' , REPLACE_STRING , 19 , 19 , ' Text to find ' ) , \
( ' With: ' , WITH_STRING , 19 , 19 , ' Text to replace with ' ) , \
2006-05-06 09:11:11 +00:00
( ' Rename ObData ' , RENAME_LINKED , ' Renames objects data to match the obname ' ) , \
2006-01-20 02:40:05 +00:00
]
if not Draw . PupBlock ( ' Replace in name... ' , pup_block ) or \
2006-05-06 09:11:11 +00:00
( ( not REPLACE_STRING . val ) and ( not WITH_STRING ) ) :
2006-01-20 02:40:05 +00:00
return 0
REPLACE_STRING = REPLACE_STRING . val
WITH_STRING = WITH_STRING . val
Window . WaitCursor ( 1 )
2006-12-15 22:14:33 +00:00
for ob in obsel :
2006-01-20 02:40:05 +00:00
newname = ob . name . replace ( REPLACE_STRING , WITH_STRING )
if ob . name != newname :
ob . name = newname
renameCount + = 1
return RENAME_LINKED . val
2006-10-25 01:32:46 +00:00
2006-01-20 02:40:05 +00:00
def prefix ( ) :
global renameCount
PREFIX_STRING = Draw . Create ( ' ' )
RENAME_LINKED = Draw . Create ( 0 )
pup_block = [ \
( ' Prefix: ' , PREFIX_STRING , 19 , 19 , ' Name prefix ' ) , \
( ' Rename ObData ' , RENAME_LINKED , ' Renames objects data to match the obname ' ) , \
]
if not Draw . PupBlock ( ' Prefix... ' , pup_block ) or \
not PREFIX_STRING . val :
return 0
PREFIX_STRING = PREFIX_STRING . val
Window . WaitCursor ( 1 )
2006-12-15 22:14:33 +00:00
for ob in obsel :
2006-01-20 02:40:05 +00:00
ob . name = PREFIX_STRING + ob . name
renameCount + = 1 # we knows these are different.
return RENAME_LINKED . val
2006-10-25 01:32:46 +00:00
2006-01-20 02:40:05 +00:00
def suffix ( ) :
global renameCount
SUFFIX_STRING = Draw . Create ( ' ' )
RENAME_LINKED = Draw . Create ( 0 )
pup_block = [ \
( ' Suffix: ' , SUFFIX_STRING , 19 , 19 , ' Name suffix ' ) , \
( ' Rename ObData ' , RENAME_LINKED , ' Renames objects data to match the obname ' ) , \
]
if not Draw . PupBlock ( ' Suffix... ' , pup_block ) or \
not SUFFIX_STRING . val :
return 0
SUFFIX_STRING = SUFFIX_STRING . val
Window . WaitCursor ( 1 )
2006-12-15 22:14:33 +00:00
for ob in obsel :
2006-01-20 02:40:05 +00:00
ob . name = ob . name + SUFFIX_STRING
renameCount + = 1 # we knows these are different.
2006-10-25 01:32:46 +00:00
return RENAME_LINKED . val
2006-01-20 02:40:05 +00:00
def truncate_start ( ) :
global renameCount
TRUNCATE_START = Draw . Create ( 0 )
RENAME_LINKED = Draw . Create ( 0 )
pup_block = [ \
( ' Truncate Start: ' , TRUNCATE_START , 0 , 19 , ' Truncate chars from the start of the name ' ) , \
( ' Rename ObData ' , RENAME_LINKED , ' Renames objects data to match the obname ' ) , \
]
if not Draw . PupBlock ( ' Truncate Start... ' , pup_block ) or \
not TRUNCATE_START . val :
return 0
Window . WaitCursor ( 1 )
TRUNCATE_START = TRUNCATE_START . val
2006-12-15 22:14:33 +00:00
for ob in obsel :
2006-01-20 02:40:05 +00:00
newname = ob . name [ TRUNCATE_START : ]
ob . name = newname
renameCount + = 1
return RENAME_LINKED . val
def truncate_end ( ) :
global renameCount
TRUNCATE_END = Draw . Create ( 0 )
RENAME_LINKED = Draw . Create ( 0 )
pup_block = [ \
( ' Truncate End: ' , TRUNCATE_END , 0 , 19 , ' Truncate chars from the end of the name ' ) , \
( ' Rename ObData ' , RENAME_LINKED , ' Renames objects data to match the obname ' ) , \
]
if not Draw . PupBlock ( ' Truncate End... ' , pup_block ) or \
not TRUNCATE_END . val :
return 0
Window . WaitCursor ( 1 )
TRUNCATE_END = TRUNCATE_END . val
2006-12-15 22:14:33 +00:00
for ob in obsel :
2006-01-20 02:40:05 +00:00
newname = ob . name [ : - TRUNCATE_END ]
ob . name = newname
renameCount + = 1
return RENAME_LINKED . val
def renameObjectFromLinkedData ( ) :
global renameCount
Window . WaitCursor ( 1 )
2006-12-15 22:14:33 +00:00
for ob in obsel :
2006-07-12 12:36:19 +00:00
newname = ob . getData ( name_only = 1 )
2006-01-20 02:40:05 +00:00
if newname != None and ob . name != newname :
ob . name = newname
renameCount + = 1
return 0
2006-10-25 01:32:46 +00:00
def renameObjectFromDupGroup ( ) :
global renameCount
Window . WaitCursor ( 1 )
2006-01-20 02:40:05 +00:00
2006-12-15 22:14:33 +00:00
for ob in obsel :
2006-10-25 01:32:46 +00:00
group = ob . DupGroup
if group != None :
newname = group . name
if newname != ob . name :
ob . name = newname
renameCount + = 1
return 0
2006-05-06 09:11:11 +00:00
def renameLinkedDataFromObject ( ) :
global renameCount
Window . WaitCursor ( 1 )
2006-10-25 01:32:46 +00:00
2006-12-15 22:14:33 +00:00
for ob in obsel :
2006-05-06 09:11:11 +00:00
if setDataNameWrapper ( ob , ob . name ) :
renameCount + = 1
return 0
2006-10-25 01:32:46 +00:00
name = " Selected Object Names % t|New Name|Replace Text|Add Prefix|Add Suffix|Truncate Start|Truncate End|Rename Objects to Data Names|Rename Objects to DupGroup Names|Rename Data to Object Names "
2006-01-20 02:40:05 +00:00
result = Draw . PupMenu ( name )
renLinked = 0 # Rename linked data to the object name?
if result == - 1 :
return
elif result == 1 : renLinked = new ( )
elif result == 2 : renLinked = replace ( )
elif result == 3 : renLinked = prefix ( )
elif result == 4 : renLinked = suffix ( )
elif result == 5 : renLinked = truncate_start ( )
elif result == 6 : renLinked = truncate_end ( )
elif result == 7 : renameObjectFromLinkedData ( )
2006-10-25 01:32:46 +00:00
elif result == 8 : renameObjectFromDupGroup ( )
elif result == 9 : renameLinkedDataFromObject ( )
2006-01-20 02:40:05 +00:00
if renLinked :
renameLinkedDataFromObject ( )
Window . WaitCursor ( 0 )
Draw . PupMenu ( ' renamed: %d objects. ' % renameCount )
2006-07-08 06:14:45 +00:00
if __name__ == ' __main__ ' :
main ( )