C4D之家原创脚本:Cinema 4D批量重命名对象Python脚本

2025-09-02 11:59 发布 | 作品版权归原作者所有,仅供参考学习,禁止商业使用!

插件脚本 /[脚本预设]
549 1 0
C4D之家原创脚本:Cinema 4D批量重命名对象Python脚本 - C4D之家 - 重命名.jpg 这是一个Cinema 4D的Python脚本,可以实现批量重命名对象的功能。这个脚本包含序列号重命名、自定义重命名和字符替换功能。使用说明:
1. 安装使用:
将脚本保存为 .py 文件
在 Cinema 4D 中通过 脚本 → 用户脚本 → 加载脚本 来运行

2. 功能介绍:
序列号重命名:
可以设置前缀(如"对象_")
可以设置起始序号
会自动生成 对象_001、对象_002 这样的名称

自定义重命名:
输入新的名称
如果选择多个对象,会自动添加序号

字符替换:
输入要替换的文字(如广告内容)
输入替换成的文字
会在所有对象名称中进行查找替换

3. 操作选项:
重命名所有对象:处理场景中的所有对象
重命名选中对象:只处理当前选中的对象(包括子对象)

4. 安全特性:
支持撤销操作(Ctrl+Z)
操作前会提示确认
显示处理结果统计
这个脚本应该能够很好地解决你遇到的广告名称问题,你可以根据需要选择合适的重命名方式。

脚本代码:
  1. # -*- coding: utf-8 -*-
  2. """
  3. Cinema 4D 批量重命名工具
  4. 支持序列号重命名、自定义重命名和字符替换
  5. """

  6. import c4d
  7. from c4d import gui

  8. # 全局变量定义
  9. DIALOG_ID = 1000
  10. GROUP_MAIN = 2000
  11. GROUP_BUTTONS = 2001
  12. GROUP_RADIO = 2002 # 单选按钮组

  13. # 控件ID
  14. RADIO_SEQUENCE = 3001 # 序列号重命名
  15. RADIO_CUSTOM = 3002 # 自定义重命名
  16. RADIO_REPLACE = 3003 # 字符替换

  17. EDIT_PREFIX = 4001 # 前缀输入框
  18. EDIT_START_NUM = 4002 # 起始序号
  19. EDIT_CUSTOM_NAME = 4003 # 自定义名称
  20. EDIT_OLD_TEXT = 4004 # 要替换的文字
  21. EDIT_NEW_TEXT = 4005 # 替换成的文字

  22. BTN_RENAME_ALL = 5001 # 重命名所有对象
  23. BTN_RENAME_SELECTED = 5002 # 重命名选中对象
  24. BTN_CANCEL = 5003 # 取消按钮

  25. class RenameDialog(gui.GeDialog):
  26. """重命名对话框类"""

  27. def CreateLayout(self):
  28. """创建对话框布局"""
  29. self.SetTitle("批量重命名工具")

  30. # 主要分组
  31. self.GroupBegin(GROUP_MAIN, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT, 1, 0)
  32. self.GroupBorderSpace(10, 10, 10, 10)

  33. # 重命名方式选择标题
  34. self.AddStaticText(0, c4d.BFH_LEFT, 0, 0, "选择重命名方式:", 0)
  35. self.AddSeparatorH(0, c4d.BFH_SCALEFIT)

  36. # 单选按钮组 - 确保互斥
  37. self.GroupBegin(GROUP_RADIO, c4d.BFH_SCALEFIT, 1, 0)

  38. # 方式1:序列号重命名
  39. self.AddRadioButton(RADIO_SEQUENCE, c4d.BFH_LEFT, 0, 0, "1. 序列号重命名")

  40. # 序列号重命名的参数
  41. self.GroupBegin(0, c4d.BFH_SCALEFIT, 2, 0)
  42. self.GroupBorderSpace(20, 5, 10, 5)
  43. self.AddStaticText(0, c4d.BFH_LEFT, 60, 0, "前缀:", 0)
  44. self.AddEditText(EDIT_PREFIX, c4d.BFH_SCALEFIT, 150, 0)
  45. self.AddStaticText(0, c4d.BFH_LEFT, 60, 0, "起始序号:", 0)
  46. self.AddEditNumberArrows(EDIT_START_NUM, c4d.BFH_LEFT, 80, 0)
  47. self.GroupEnd()

  48. # 分隔线
  49. self.AddSeparatorH(0, c4d.BFH_SCALEFIT)

  50. # 方式2:自定义重命名
  51. self.AddRadioButton(RADIO_CUSTOM, c4d.BFH_LEFT, 0, 0, "2. 自定义重命名")

  52. # 自定义重命名的参数
  53. self.GroupBegin(0, c4d.BFH_SCALEFIT, 2, 0)
  54. self.GroupBorderSpace(20, 5, 10, 5)
  55. self.AddStaticText(0, c4d.BFH_LEFT, 60, 0, "新名称:", 0)
  56. self.AddEditText(EDIT_CUSTOM_NAME, c4d.BFH_SCALEFIT, 150, 0)
  57. self.AddStaticText(0, c4d.BFH_LEFT, 0, 0, "注意:多个对象会自动添加序号", 0)
  58. self.GroupEnd()

  59. # 分隔线
  60. self.AddSeparatorH(0, c4d.BFH_SCALEFIT)

  61. # 方式3:字符替换
  62. self.AddRadioButton(RADIO_REPLACE, c4d.BFH_LEFT, 0, 0, "3. 字符替换")

  63. # 字符替换的参数
  64. self.GroupBegin(0, c4d.BFH_SCALEFIT, 2, 0)
  65. self.GroupBorderSpace(20, 5, 10, 5)
  66. self.AddStaticText(0, c4d.BFH_LEFT, 80, 0, "要替换的文字:", 0)
  67. self.AddEditText(EDIT_OLD_TEXT, c4d.BFH_SCALEFIT, 150, 0)
  68. self.AddStaticText(0, c4d.BFH_LEFT, 80, 0, "替换成:", 0)
  69. self.AddEditText(EDIT_NEW_TEXT, c4d.BFH_SCALEFIT, 150, 0)
  70. self.AddStaticText(0, c4d.BFH_LEFT, 0, 0, "注意:仅替换包含指定文字的对象名称", 0)
  71. self.GroupEnd()

  72. self.GroupEnd() # 结束单选按钮组
  73. self.GroupEnd() # 结束主分组

  74. # 分隔线
  75. self.AddSeparatorH(0, c4d.BFH_SCALEFIT)

  76. # 按钮组
  77. self.GroupBegin(GROUP_BUTTONS, c4d.BFH_CENTER, 3, 1)
  78. self.AddButton(BTN_RENAME_ALL, c4d.BFH_LEFT, 120, 0, "处理所有对象")
  79. self.AddButton(BTN_RENAME_SELECTED, c4d.BFH_LEFT, 120, 0, "处理选中对象")
  80. self.AddButton(BTN_CANCEL, c4d.BFH_LEFT, 80, 0, "取消")
  81. self.GroupEnd()

  82. return True

  83. def InitValues(self):
  84. """初始化控件值"""
  85. # 设置单选按钮组 - 默认选择序列号重命名
  86. self.SetBool(RADIO_SEQUENCE, True)
  87. self.SetBool(RADIO_CUSTOM, False)
  88. self.SetBool(RADIO_REPLACE, False)

  89. # 设置默认值
  90. self.SetString(EDIT_PREFIX, "对象_")
  91. self.SetInt32(EDIT_START_NUM, 1)
  92. self.SetString(EDIT_CUSTOM_NAME, "新对象")
  93. self.SetString(EDIT_OLD_TEXT, "")
  94. self.SetString(EDIT_NEW_TEXT, "")

  95. return True

  96. def Command(self, id, msg):
  97. """处理命令事件"""
  98. # 处理单选按钮互斥
  99. if id == RADIO_SEQUENCE:
  100. self.SetBool(RADIO_SEQUENCE, True)
  101. self.SetBool(RADIO_CUSTOM, False)
  102. self.SetBool(RADIO_REPLACE, False)

  103. elif id == RADIO_CUSTOM:
  104. self.SetBool(RADIO_SEQUENCE, False)
  105. self.SetBool(RADIO_CUSTOM, True)
  106. self.SetBool(RADIO_REPLACE, False)

  107. elif id == RADIO_REPLACE:
  108. self.SetBool(RADIO_SEQUENCE, False)
  109. self.SetBool(RADIO_CUSTOM, False)
  110. self.SetBool(RADIO_REPLACE, True)

  111. # 处理按钮点击
  112. elif id == BTN_RENAME_ALL:
  113. self.ProcessObjects(False) # 处理所有对象

  114. elif id == BTN_RENAME_SELECTED:
  115. self.ProcessObjects(True) # 处理选中对象

  116. elif id == BTN_CANCEL:
  117. self.Close()

  118. return True

  119. def ProcessObjects(self, selected_only):
  120. """处理对象 - 根据选择的模式执行不同操作"""
  121. doc = c4d.documents.GetActiveDocument()
  122. if not doc:
  123. gui.MessageDialog("没有活动的文档!")
  124. return

  125. # 获取要处理的对象列表
  126. if selected_only:
  127. objects = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN)
  128. if not objects:
  129. gui.MessageDialog("请先选择要处理的对象!")
  130. return
  131. scope_text = "选中"
  132. else:
  133. objects = self.GetAllObjects(doc.GetFirstObject())
  134. scope_text = "所有"

  135. if not objects:
  136. gui.MessageDialog("没有找到可处理的对象!")
  137. return

  138. # 开始撤销记录
  139. doc.StartUndo()

  140. try:
  141. # 根据选择的重命名方式进行处理
  142. if self.GetBool(RADIO_SEQUENCE):
  143. processed_count = self.RenameWithSequence(objects, doc)
  144. operation_text = "重命名"
  145. elif self.GetBool(RADIO_CUSTOM):
  146. processed_count = self.RenameWithCustomName(objects, doc)
  147. operation_text = "重命名"
  148. elif self.GetBool(RADIO_REPLACE):
  149. processed_count = self.ReplaceInObjects(objects, doc)
  150. operation_text = "替换"
  151. else:
  152. gui.MessageDialog("请选择一种处理方式!")
  153. doc.EndUndo()
  154. return

  155. # 结束撤销记录
  156. doc.EndUndo()

  157. # 刷新视图
  158. c4d.EventAdd()

  159. # 显示结果
  160. if processed_count > 0:
  161. gui.MessageDialog(f"成功{operation_text}了 {processed_count} 个对象!\n(从{scope_text}{len(objects)}个对象中筛选)")
  162. else:
  163. if self.GetBool(RADIO_REPLACE):
  164. old_text = self.GetString(EDIT_OLD_TEXT)
  165. gui.MessageDialog(f"在{scope_text}{len(objects)}个对象中没有找到包含'{old_text}'的对象名称!")
  166. else:
  167. gui.MessageDialog("没有对象需要处理!")

  168. except Exception as e:
  169. doc.EndUndo()
  170. gui.MessageDialog(f"处理过程中出现错误:{str(e)}")

  171. def GetAllObjects(self, obj):
  172. """递归获取所有对象"""
  173. objects = []
  174. while obj:
  175. objects.append(obj)
  176. # 递归获取子对象
  177. if obj.GetDown():
  178. objects.extend(self.GetAllObjects(obj.GetDown()))
  179. obj = obj.GetNext()
  180. return objects

  181. def RenameWithSequence(self, objects, doc):
  182. """使用序列号重命名 - 重命名所有传入的对象"""
  183. prefix = self.GetString(EDIT_PREFIX)
  184. start_num = self.GetInt32(EDIT_START_NUM)

  185. processed_count = 0
  186. for i, obj in enumerate(objects):
  187. doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
  188. new_name = f"{prefix}{start_num + i:03d}"
  189. obj.SetName(new_name)
  190. processed_count += 1

  191. return processed_count

  192. def RenameWithCustomName(self, objects, doc):
  193. """使用自定义名称重命名 - 重命名所有传入的对象"""
  194. custom_name = self.GetString(EDIT_CUSTOM_NAME)

  195. if not custom_name.strip():
  196. gui.MessageDialog("请输入自定义名称!")
  197. return 0

  198. processed_count = 0
  199. if len(objects) == 1:
  200. # 只有一个对象时直接使用自定义名称
  201. doc.AddUndo(c4d.UNDOTYPE_CHANGE, objects[0])
  202. objects[0].SetName(custom_name)
  203. processed_count = 1
  204. else:
  205. # 多个对象时添加序号
  206. for i, obj in enumerate(objects):
  207. doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
  208. new_name = f"{custom_name}_{i + 1:03d}"
  209. obj.SetName(new_name)
  210. processed_count += 1

  211. return processed_count

  212. def ReplaceInObjects(self, objects, doc):
  213. """字符替换功能 - 只替换包含指定字符的对象"""
  214. old_text = self.GetString(EDIT_OLD_TEXT)
  215. new_text = self.GetString(EDIT_NEW_TEXT)

  216. if not old_text.strip():
  217. gui.MessageDialog("请输入要替换的文字!")
  218. return 0

  219. processed_count = 0

  220. # 扫描所有对象,只处理包含指定文字的对象
  221. for obj in objects:
  222. current_name = obj.GetName()
  223. if old_text in current_name:
  224. doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
  225. new_name = current_name.replace(old_text, new_text)
  226. obj.SetName(new_name)
  227. processed_count += 1
  228. # 可以添加调试信息
  229. print(f"替换: '{current_name}' -> '{new_name}'")

  230. return processed_count

  231. def main():
  232. """主函数"""
  233. dialog = RenameDialog()
  234. dialog.Open(c4d.DLG_TYPE_MODAL, defaultw=400, defaulth=500)

  235. if __name__ == '__main__':
  236. main()
复制代码

附件信息

  • 下载积分: 共享分 -1

    批量更名.py.rar
    2.81 KB, 阅读权限: 125, 下载次数: 0, 下载积分: 共享分 -1
B Color Smilies

Comment :1

插件脚本
软件性质: 脚本
适用版本: C4D R15 - C4D 2025
软件版本: Version: unknown
系统平台: Win MAC
软件语言: 中文
插件来源: https://www.c4d.com.cn/c4dsoft.html
百套精美Kitbash3D模型专题合集下载
时尚卡通办公室人物C4D立体图标工程下载Cinema 4D Fashion Cartoon Office Character 3D Icon Project Download
C4D科技新闻片头电视栏目频道包装动画工程下载Cinema 4D Technology News Headline TV Program Channel Packaging Animation Project Download
关闭

C4D精选推荐 /10

知识
问答
快速回复 返回顶部 返回列表