不是我牛逼,是豆包牛逼!
一个简化版的窗口
import c4d
from c4d import gui
class MyDialog(gui.GeDialog):
def __init__(self):
super().__init__()
self.SetTitle("My Dialog")
def CreateLayout(self):
# 设置对话框布局
return True
my_dialog = MyDialog()
my_dialog.Open(c4d.DLG_TYPE_ASYNC, xpos=100, ypos=100, defaultw=300, defaulth=200)
进化了的重命名工具
保存为py文件单独调用会运行速度更快
使用方法:扩展菜单,用户脚本,运行脚本
import c4d
from c4d import gui
# 根据自定义的元素名设定 ID 号:
Title_Text = 101
GP1 = 1
ReName_Text = 11
ReName_Field = 12
DigNum_Text = 13
DigNum_Field = 14
ReNameObj_Bt = 1001
ReNameMat_Bt = 1002
GP2 = 2
Fi_Text = 15
FiText_Field = 16
Re_Text = 17
ReText_Field = 18
FiRe_Bt = 1003
GP3 = 3
Pre_Text = 19
PreText_Field = 20
UsePreText_Bt = 1004
GP4 = 4
Suf_Text = 21
SufText_Field = 22
UseSufText_Bt = 1005
GP5 = 5
Index_Text = 23
IndexNum_Field = 24
AddIndexNum_Bt = 1006
DelIndexNum_Bt = 1007
class MyDialog(gui.GeDialog):
'''def __init__(self):
self.ReName_Field = "Name"
self.DigNum_Field = 2
self.FiText_Field = "FindText"
self.ReText_Field = "ReText"
self.PreText_Field = "preName"
self.SufText_Field = "SufName"
self.IndexNum_Field = 1'''
def CreateLayout(self):
self.SetTitle("rename")
self.AddStaticText(Title_Text, c4d.BFH_CENTER, name="阿拉丁的重命名工具")
# 创建行布局用于放置“命名和位数”相关的元素 GP1
self.GroupBegin(GP1, c4d.BFH_LEFT | c4d.BFV_TOP, cols=6, rows=1)
self.GroupBorderSpace(1, 1, 1, 1)
self.AddStaticText(ReName_Text, c4d.BFH_LEFT, name="命名")
self.AddEditText(ReName_Field, c4d.BFH_LEFT, 120, 15)
self.AddStaticText(DigNum_Text, c4d.BFH_LEFT, name="位数")
self.AddEditNumberArrows(DigNum_Field, c4d.BFH_LEFT, 40, 15)
self.AddButton(ReNameObj_Bt, c4d.BFH_LEFT, 100, 15, "重命名物体")
self.AddButton(ReNameMat_Bt, c4d.BFH_LEFT, 100, 15, "重命名材质")
self.GroupEnd()
# 创建行布局用于放置“查找和替换”相关的元素 GP2
self.GroupBegin(GP2, c4d.BFH_LEFT | c4d.BFV_TOP, cols=5, rows=1)
self.GroupBorderSpace(1, 1, 1, 1)
self.AddStaticText(Fi_Text, c4d.BFH_LEFT, name="查找文本")
self.AddEditText(FiText_Field, c4d.BFH_LEFT, 120, 15)
self.AddStaticText(Re_Text, c4d.BFH_LEFT, name="替换文本")
self.AddEditText(ReText_Field, c4d.BFH_LEFT, 120, 15)
self.AddButton(FiRe_Bt, c4d.BFH_LEFT, 100, 15, "查找替换")
self.GroupEnd()
# 创建行布局用于增加前缀的元素 GP3
self.GroupBegin(GP3, c4d.BFH_LEFT | c4d.BFV_TOP, cols=5, rows=1)
self.GroupBorderSpace(1, 1, 1, 1)
self.AddStaticText(Pre_Text, c4d.BFH_LEFT, name="增加前缀")
self.AddEditText(PreText_Field, c4d.BFH_LEFT, 120, 15)
self.AddButton(UsePreText_Bt, c4d.BFH_RIGHT, name="增加前缀")
self.GroupEnd()
# 创建行布局用于增加后缀的元素 GP4
self.GroupBegin(GP4, c4d.BFH_LEFT | c4d.BFV_TOP, cols=5, rows=1)
self.GroupBorderSpace(1, 1, 1, 1)
self.AddStaticText(Suf_Text, c4d.BFH_LEFT, name="增加后缀")
self.AddEditText(SufText_Field, c4d.BFH_LEFT, 120, 15)
self.AddButton(UseSufText_Bt, c4d.BFH_LEFT, name="增加后缀")
self.GroupEnd()
# 创建行布局用于增加序号的元素 GP5
self.GroupBegin(GP5, c4d.BFH_LEFT | c4d.BFV_TOP, cols=5, rows=1)
self.GroupBorderSpace(1, 1, 1, 1)
self.AddStaticText(Index_Text, c4d.BFH_LEFT, name="增删序号")
self.AddEditNumberArrows(IndexNum_Field, c4d.BFH_LEFT, 40, 15)
self.AddButton(AddIndexNum_Bt, c4d.BFH_LEFT, name="增加序号")
self.AddButton(DelIndexNum_Bt, c4d.BFH_LEFT, name="删除小节")
self.GroupEnd()
return True
def Command(self, id, msg):
if id == ReNameObj_Bt:
self.rename()
elif id == ReNameMat_Bt:
self.renameMaterials()
elif id == FiRe_Bt:
self.find_replace()
elif id == UsePreText_Bt:
self.add_prefix()
elif id == UseSufText_Bt:
self.add_suffix()
elif id == AddIndexNum_Bt:
self.add_index()
elif id == DelIndexNum_Bt:
self.del_index()
return True
def rename(self):
char_input = "bat"
dig_num_input = 2
doc = c4d.documents.GetActiveDocument()
selection = doc.GetSelection()
#print(f"{selection}")
if selection:
i = 1
for obj in selection:
obj.SetName(f"{char_input}_{i:0{dig_num_input}}")
i += 1
else:
materials = doc.GetActiveMaterials()
print(f"{materials}")
i = 1
for mat in materials:
mat.SetName(f"{char_input}_{i:0{dig_num_input}}")
i += 1
c4d.EventAdd()
def find_replace(self):
find_text = self.GetString(FiText_Field)
replace_text = self.GetString(ReText_Field)
selection = doc.GetSelection()
if not selection:
c4d.gui.MessageDialog("没有选中任何对象。")
return
names = [obj.GetName() for obj in selection]
for i, obj in enumerate(selection):
new_name = names[i].replace(find_text, replace_text)
obj.SetName(new_name)
c4d.EventAdd()
def add_prefix(self):
char_input = self.GetString(PreText_Field)
print(f"{char_input}")
selection = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER)
for obj in selection:
current_name = obj.GetName()
new_name = char_input + '_' + current_name
obj.SetName(new_name)
c4d.EventAdd()
def add_suffix(self):
char_input = self.GetString(SufText_Field)
selection = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER)
for obj in selection:
current_name = obj.GetName()
last_underscore_index = current_name.rfind('_')
if last_underscore_index!= -1:
new_name = current_name[:last_underscore_index] + '_' + char_input + current_name[last_underscore_index:]
else:
new_name = current_name + '_' + char_input
obj.SetName(new_name)
c4d.EventAdd()
def add_index(self):
dig_num_input = self.GetInt32(IndexNum_Field)
selection = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER)
i = 1
for obj in selection:
current_name = obj.GetName()
new_name = current_name + '_' + str(i).zfill(dig_num_input)
obj.SetName(new_name)
i += 1
c4d.EventAdd()
def del_index(self):
selection = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER)
for obj in selection:
current_name = obj.GetName()
last_underscore_index = current_name.rfind('_')
if last_underscore_index!= -1:
new_name = current_name[:last_underscore_index]
else:
new_name = current_name
obj.SetName(new_name)
c4d.EventAdd()
if __name__ == '__main__':
dialog = MyDialog()
dialog.Open(c4d.DLG_TYPE_ASYNC, xpos=100, ypos=100, defaultw=200, defaulth=240)
def main():
pass