C4D 2024一键复制粘贴材质球脚本
2个月前 /
Directory:cinema4d
/
Views:14
在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()