JACKADUX 发表于 2019-12-2 19:31

[002]C4D脚本入门-删除无用的材质标签


import c4d

#遍历对象管理窗口 ,对每个物体进行删除标签命令
def iterObject(objx):
    removeMatTag(objx)
    #获取该物体所有的子集
    childenList = objx.GetChildren()

    #判断是否存在子集
    if len(childenList) != 0:
      #遍历子集
      for i in childenList:
            #迭代
            iterObject(i)

    return

#删除物体上无用的材质标签
def removeMatTag(objx):
    obj1 = objx
    #获取该物体所有的标签
    tagList1 = obj1.GetTags()

    for tag1 in tagList1:
      #判断标签是否是材质标签
      if tag1.GetRealType() == 5616:
            #判断该标签是否有材质
            if tag1 == None:
                tag1.Remove()


if __name__=='__main__':

    #获取对象管理器最高层级的物体为列表
    objectList1 = doc.GetObjects()

    #通过print 打印输出结果到 控制台 console查看
    print objectList1

    #遍历列表
    for i in objectList1:
      #开始迭代
      iterObject(i)

    #刷新
    c4d.EventAdd()


首先附上代码。

我们在使用C4D的时候经常会遇到这种情况。

一般情况下如果不是很复杂只要手动删除就好。但是如果物体过多,层级太复杂,删起来费时费力,这时就是脚本发挥作用的时候到了!

脚本的简单思路就是:遍历对象管理器里的每一个物体,然后判断这个物体是否有材质标签?有多少个?然后判断每一个材质标签是否赋予了材质,如果没有就把它删掉。

通常来说我们可以从删除一个物体上的无用材质开始入手写这个脚本
像这样:


这个代码第20行中的op指的是当前选择的物体,所以我们选择一个物体点击脚本就能把它上面无用的材质删除掉。
这个功能主要是有我们自己写的removeMatTag()这个函数完成的。
obj1就是我们选择的物体(因为我们通过objx这个变量来传入到了函数内部)
第8行,又通过.GetTags()这个方法获取了该物体所有的标签。(GetTags这个方法在c4d-BaseObject这个类里,关于物体的大多数方法都在这里)
第10行,我们通过for 循环来遍历了所有的标签,
第12行,用GetRealType这个方法来判断标签的ID类型,材质标签的ID号是 5616,所以只要这个标签的ID是5616,他就是材质标签。
然后在14行判断材质标签是否有材质,如果没有它就会返回None,这样我们就可以直接把返回None的材质标签删除。
这样我们就完成了第一步。
接下来我们只需要遍历所有的物体,对每个物体都执行一遍步骤一中写好的函数就可以了。

doc.GetObjects()这个方法可以返回对象管理器最高层级的所有物体到一个列表里
我们用for循环遍历这个列表,然后用iterObject()这个函数来对每个物体执行删除命令,
objx.GetChildren()会给我们返回物体objx的所有直接子集(第一层子集)
在循环每个子集并执行迭代即可~
代码结束。

可以看到像循环 迭代这些都是非常常用的方法。都是属于python的基础语法,建议新手多多练习,之后会有更深入的使用~




发表于 2020-6-20 19:04

杂用啊

发表于 2020-2-21 15:27

長知識,謝謝

发表于 2020-1-20 22:42

太牛逼了

发表于 2020-1-13 16:19

作者快出啊,脚本可有意思了
页: [1]
查看完整版本: [002]C4D脚本入门-删除无用的材质标签