C4D一键复制对象名称脚本代码(原创)
有时候会需要复制对象名称到文本工具中进行编辑处理,C4D默认好像没有这个功能。所以我自行写了一个可以一键将名称复制出来的脚本,无论是父级或是子级只要选择中的对象,即可将名称复制出来。
有需要的朋友可以免费使用,脚本内容如下:
import c4d
import subprocess
import sys
def copy_to_clipboard(text):
"""跨平台剪贴板复制函数"""
try:
# Windows
if sys.platform.startswith('win'):
subprocess.run('clip', shell=True, input=text.strip().encode('utf-16'), check=True)
# macOS
elif sys.platform.startswith('darwin'):
subprocess.run('pbcopy', shell=True, input=text.strip().encode('utf-8'), check=True)
# Linux
else:
subprocess.run(['xsel', '-bi'], shell=True, input=text.strip().encode('utf-8'), check=True)
return True
except:
return False
def main():
# 使用 GetSelection() 而不是 GetActiveObjects() 来获取所有选中的对象
selection = doc.GetSelection()
# 过滤出对象(排除标签、材质等)
selected_objects = [obj for obj in selection if isinstance(obj, c4d.BaseObject)]
if not selected_objects:
c4d.gui.MessageDialog("请先选择一个或多个对象")
return
object_names = [obj.GetName() for obj in selected_objects]
names_text = "\n".join(object_names)
if copy_to_clipboard(names_text):
c4d.gui.MessageDialog(f"成功复制 {len(selected_objects)} 个对象的名称")
else:
# 如果系统剪贴板失败,显示在对话框中可以手动复制
c4d.gui.MessageDialog(f"对象名称:\n\n{names_text}\n\n请手动复制上面的文本")
if __name__ == '__main__':
main()下面提供另一个版本,可以显示层级信息的版本:
import c4d
import subprocess
import sys
def copy_to_clipboard(text):
"""跨平台剪贴板复制函数"""
try:
# Windows
if sys.platform.startswith('win'):
subprocess.run('clip', shell=True, input=text.strip().encode('utf-16'), check=True)
# macOS
elif sys.platform.startswith('darwin'):
subprocess.run('pbcopy', shell=True, input=text.strip().encode('utf-8'), check=True)
# Linux
else:
subprocess.run(['xsel', '-bi'], shell=True, input=text.strip().encode('utf-8'), check=True)
return True
except:
return False
def get_object_path(obj):
"""获取对象的完整层级路径"""
path_parts = []
current = obj
# 从当前对象向上遍历到根级
while current:
path_parts.insert(0, current.GetName())
current = current.GetUp()
return " > ".join(path_parts)
def main():
# 获取所有选中的对象
selection = doc.GetSelection()
# 过滤出基础对象
selected_objects = [obj for obj in selection if isinstance(obj, c4d.BaseObject)]
if not selected_objects:
c4d.gui.MessageDialog("请先选择一个或多个对象")
return
# 收集对象名称和路径
object_info = []
for obj in selected_objects:
object_info.append({
'name': obj.GetName(),
'path': get_object_path(obj)
})
# 创建两种格式的输出
simple_names = [info['name'] for info in object_info]
detailed_paths = [info['path'] for info in object_info]
# 简单名称版本
simple_text = "\n".join(simple_names)
# 详细路径版本
detailed_text = "\n".join(detailed_paths)
# 复制简单名称到剪贴板
if copy_to_clipboard(simple_text):
# 显示详细信息
c4d.gui.MessageDialog(f"成功复制 {len(selected_objects)} 个对象的名称\n\n简单名称已复制到剪贴板\n\n完整层级:\n{detailed_text}")
else:
c4d.gui.MessageDialog(f"对象名称:\n\n{simple_text}\n\n完整层级:\n{detailed_text}\n\n请手动复制上面的文本")
if __name__ == '__main__':
main()使用方法:
1.复制以上代码(任选一个版本即可)
2.打开C4D,打开菜单扩展——脚本管理器
3.新建一个空白脚本,将复制的代码粘贴进去
4.选中对象进行测试,如果没有问题可以将脚本保存,以便后续调用