C4D一键复制对象名称脚本代码(原创)

9小时前 / Directory:Plugin · cinema4d / Views:7

有时候会需要复制对象名称到文本工具中进行编辑处理,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.选中对象进行测试,如果没有问题可以将脚本保存,以便后续调用