C4D python 创建物体修改属性
首先,这里会讨论c4d 对象管理器中的objects,以及编程语言中的实例。
Object中的对象是c4d.BaseObject类中的实例,其是c4d.BaseList2D的子类,实现了层级组织的数据,你在c4d中常会看到(对象管理器,
层级通道,渲染选项)。子类中可以使用父类中的函数。baseobject可以使用baselist2d中的函数。
修改物体属性
c4d.BaseList2D有一个c4d.BaseContainer的引用。其有一个数组包含了属性管理器中所有的属性。
1. Accessing the BaseContainer and using it’s methods
修改对象的参数很简单。首先,我们获取c4d.BaseContainer实例,然后,找到想修改参数的id,然后就可以改了。
运行脚本前确认cube对象被选中了
importc4d
bc =op.GetDataInstance()
bc.SetVector(c4d.PRIM_CUBE_LEN, c4d.Vector(500, 100, 20))
注意,c4d.BaseContainer.GetDataInstance()返回最初的容器,不是拷贝。修改容器会直接修改容器的参数。如果想使用拷贝,使用c4d.BaseObject.GetData()
2. Accessing the BaseContainer and using subscripting
有更简单的方法,替代方法就是SetVector,SetReal等。技巧就是使用索引下标法[]
importc4d
bc =op.GetDataInstance()
bc[c4d.PRIM_CUBE_LEN] =c4d.Vector(500, 100, 20)
3. Using subscripting directly on the object
直接在物体上使用下标。 第三种也就是最后一种修改物体参数的饿方法就是直接在物体上使用下标
import c4d
op[c4d.PRIM_CUBE_LEN] =c4d.Vector(500, 100, 20)
有更好的吗,基本上你会说“越不方便,效率越高”, 编程方面是对的。添加很多简便易用的接口就得包装更底层的接口。 可以这么说,
第一种方法最快,第二种和第三种是最慢的,但这是为什么呢
Creating new objects in Python
python中穿件新物体,讨论了如何修改物体的参数,现在可以学怎么创建物体了。有好几种方法呢.
1. Create an all new object from scratch 从头创建物体
如第一节所说,每个物体都是c4d.BaseObject的实例,为啥不直接创建这个类的实例呢? 很简单,构造函数需要一个type来决定实例化那个类
importc4d
op =c4d.BaseObject(c4d.Ocube)
现在就创建了一个物体。随后干啥呢。给document中添加物体有很多方法,可以使用当前文档或者其他物体来这么做。
import c4d
op =c4d.BaseObject(c4d.Ocube)
doc.InsertObject(op)
# .. or ..
op.InsertBefore(doc.GetFirstObject())
两种方法结果一样,但第一种更有优势,如果doc.GetFirstObject()返回none,如果document中没有object,那么调用就会在
op.InsertBefore(None)停下来,并引发一个异常。
2. Cloning an existing object 拷贝物体
如果不怕c4d崩溃,就测试下面的代码
op =doc.GetFirstObject()
op.InsertUnder(op)
很简单,op就是内部实例的的第一个物体,将其插入自己下面,会导致死循环。
MyUniqueCube
MyUniqueCube
MyUniqueCube
[and so on ... ]
永远不要插入一个已在别处存在的物体
创建物体的拷贝就能避免这个
op =doc.GetFirstObject()
op.InsertUnder(op.GetClone())