下面的代码递归遍历C4D中的shader。 首先遍历doc中的所有material,因每个material都是一个shader网络,要先获取其第一个shader,这是一个GeListNode实例,也是个4D列表。剩下就是遍历了。
import c4d, os
############################################################
# 递归函数,在其中操作shader
############################################################
def shadertree(shader):
# 遍历 BaseList
while(shader):
# 操作shader,这里简单输出其名字
print shader.GetName()
# 查看文件名
if shader.GetType() == c4d.Xbitmap:
filename = shader[c4d.BITMAPSHADER_FILENAME]
print filename
# 修改实例的文件名
filename = os.path.basename(filename)
shader[c4d.BITMAPSHADER_FILENAME] = filename
# 检查是否有子类,递归处理
if shader.GetDown():
shadertree(shader.GetDown())
shader = shader.GetNext()
############################################################
# main function
############################################################
def main():
# 获取第一个material
mat = doc.GetFirstMaterial()
# 遍历 materials
while(mat):
# 拿第一个shader
# 这是个4D列表
shd = mat.GetFirstShader()
# 用上面的递归函数处理
shadertree(shd)
# 来,下一个
mat = mat.GetNext()
if__name__=='__main__':
main()