C4D 2024一键复制粘贴材质球脚本

1周前 / Directory:cinema4d / Views:7

在C4D中将选中的材质球一键克隆出来,替代了ctrl+c和ctl+v的操作

功能特点:

✅ 一键复制选中材质

✅ 自动重命名避免冲突

✅ 保持新材质为选中状态

✅ 错误处理和用户提示

✅ 兼容Cinema 4D 2024


超级简洁版本(最少代码):

import c4d
def main():
    doc = c4d.documents.GetActiveDocument()
    mat = doc.GetActiveMaterial()
    if mat:
        new_mat = mat.GetClone()
        new_mat.SetName(mat.GetName() + "")
        doc.InsertMaterial(new_mat)
        doc.SetActiveMaterial(new_mat)
        c4d.EventAdd()
if __name__ == '__main__':
    main()

简洁的版本:

import c4d
def duplicate_material():
    doc = c4d.documents.GetActiveDocument()
    active_mat = doc.GetActiveMaterial()
    
    if not active_mat:
        c4d.gui.MessageDialog("请先选中一个材质球")
        return
    
    # 复制材质
    new_mat = active_mat.GetClone()
    
    # 获取所有材质名称用于检查重复
    all_materials = doc.GetMaterials()
    existing_names = [mat.GetName() for mat in all_materials]
    
    # 生成新名称
    base_name = active_mat.GetName()
    new_name = base_name + " 副本"
    
    # 处理重复名称
    counter = 1
    while new_name in existing_names:
        new_name = f"{base_name} 副本 {counter}"
        counter += 1
    
    new_mat.SetName(new_name)
    
    # 插入新材质
    doc.InsertMaterial(new_mat)
    doc.SetActiveMaterial(new_mat)
    
    c4d.EventAdd()
if __name__ == '__main__':
    duplicate_material()


另一个版本:

import c4d
def main():
    doc = c4d.documents.GetActiveDocument()
    active_mat = doc.GetActiveMaterial()
    
    if active_mat is None:
        c4d.gui.MessageDialog("请先在材质管理器中选中一个材质球")
        return
    
    try:
        # 复制材质
        copied_mat = active_mat.GetClone()
        
        # 生成唯一名称
        base_name = active_mat.GetName()
        new_name = generate_unique_material_name(doc, base_name)
        copied_mat.SetName(new_name)
        
        # 插入到文档
        doc.InsertMaterial(copied_mat)
        
        # 设置为活动材质
        doc.SetActiveMaterial(copied_mat)
        
        # 更新界面
        c4d.EventAdd()
        
        print(f"成功复制材质: {base_name} -> {new_name}")
        
    except Exception as e:
        c4d.gui.MessageDialog(f"复制失败: {str(e)}")
def generate_unique_material_name(doc, base_name):
    """生成唯一的材质名称"""
    # 获取所有材质
    materials = doc.GetMaterials()
    
    # 检查基础名称是否已存在
    if " 副本" in base_name:
        base_name = base_name.split(" 副本")[0]
    
    new_name = f"{base_name} 副本"
    
    # 检查名称是否唯一
    material_names = [mat.GetName() for mat in materials]
    
    if new_name not in material_names:
        return new_name
    
    # 如果名称已存在,添加数字后缀
    counter = 1
    while True:
        test_name = f"{base_name} 副本 {counter}"
        if test_name not in material_names:
            return test_name
        counter += 1
if __name__ == '__main__':
    main()