Python、Alembic.io、Cask:使用write_to_file()时不保存对象的属性

Python、Alembic.io、Cask:使用write_to_file()时不保存对象的属性,python,3d,export,maya,alembic,Python,3d,Export,Maya,Alembic,我经常为各种3d软件包(3ds max、Maya等)编写脚本,这就是我对Alembic感兴趣的原因,Alembic是一种最近备受关注的文件格式 对不了解此项目的任何人的快速解释:alembic-www.alembic.io-是一种创建用于包含三维网格和与其连接的数据的文件格式。它使用树状结构,正如您在下面看到的,有一个根节点及其child、childs of childs等。该节点的对象可以具有属性 我正在尝试学习如何将这个Alembic与Python结合使用 本项目的docks页面上有一些教程

我经常为各种3d软件包(3ds max、Maya等)编写脚本,这就是我对Alembic感兴趣的原因,Alembic是一种最近备受关注的文件格式

对不了解此项目的任何人的快速解释:alembic-
www.alembic.io
-是一种创建用于包含三维网格和与其连接的数据的文件格式。它使用树状结构,正如您在下面看到的,有一个根节点及其child、childs of childs等。该节点的对象可以具有属性

我正在尝试学习如何将这个Alembic与Python结合使用

本项目的docks页面上有一些教程,我对此有一些问题: 这是关于使用cask模块的,它是一个包装器,可以更轻松地处理文件内容

本部分:

a = cask.Archive("animatedcube.abc")
r = cask.Xform()
x = a.top.children["cube1"]
a.top.children["root"] = r
r.children["cube1"] = x
a.write_to_file("/var/tmp/cask_insert_node.abc")
效果很好。在有了新文件“cask_insert_node.abc”并且它有了预期的对象之后

但当我向对象添加一些属性时,如:

a = cask.Archive("animatedcube.abc")
r = cask.Xform()
x = a.top.children["cube1"]
x.properties['new_property'] = cask.Property()
a.top.children["root"] = r
r.children["cube1"] = x
a.write_to_file("/var/tmp/cask_insert_node.abc")
结果文件中的“cube1”对象不包含属性“new_property”。 保存过程是个问题,我知道属性在保存之前已经添加到“cube1”中,我用另一种方法检查了它,我编写了一个函数,该函数在存档中创建对象的图形

该模块的代码如下:


有人知道我做错了什么吗?如何保存参数?还有别的办法吗?

遗憾的是,木桶不支持这种方法。不能修改归档文件并保存结果(某种程度上与Alembic如何从磁盘上传输数据有关)。您要做的是创建一个输出存档

oArchive = alembic.Abc.CreateArchiveWithInfo(...)
然后将所有需要的数据从输入存档复制到输出存档,包括时间采样(

,和对象,通过iArchive.getTop()和oArchive.getTop()递归,当您在iArchive中遇到输出属性(alembic.Abc.OArrayProperty或OScalarProperty)时,它们会定义输出属性。定义这些属性后,您可以将新值作为样本插入到该属性中


这是一个真正的野兽,cask真的应该支持它。事实上,Alembic社区中的某个人应该帮每个人的忙,编写一个cask2(casket?),像你本能地尝试做的那样,将所有这些都封装到简单的调用中。

遗憾的是,cask不支持这一点。不能修改存档并保存结果(某种程度上与Alembic如何从磁盘上传输数据有关)。您要做的是创建一个输出存档

oArchive = alembic.Abc.CreateArchiveWithInfo(...)
然后将所有需要的数据从输入存档复制到输出存档,包括时间采样(

,和对象,通过iArchive.getTop()和oArchive.getTop()递归,当您在iArchive中遇到输出属性(alembic.Abc.OArrayProperty或OScalarProperty)时,它们会定义输出属性。定义这些属性后,您可以将新值作为样本插入到该属性中


这是一个真正的野兽,cask真的应该支持它。事实上,Alembic社区中的某个人应该帮每个人的忙,写一个cask2(casket?),它将所有这些都包装成简单的调用,就像你本能地尝试做的那样。

你试过x.save()吗在写文件之前?是的,我已经尝试了不同的对象,效果很抱歉,我没有编辑我最后的评论N时间,我确实错误地提交了。是的,我已经尝试过不同的对象,并且作为例子,对于<代码> ApTest.SaveE()/代码>的效果是一个长的错误,从C++,类似于:<代码>…第1227行中的“保存< /COD> > Obj.Objult.Objult[O/COD] <代码>…………在.ygGETyOObj[.]…PoST.python .AguMurror:Python参数类型在ObObjuly.IITTyx(ObObje,NoType,STR,元数据,int)与C++签名不匹配:在写文件之前?是的,我已经尝试了不同的对象,效果很抱歉,我没有编辑我最后的评论N时间,我确实错误地提交了。是的,我已经尝试过不同的对象,并且作为例子,对于<代码> ApTest.SaveE()/代码>的效果是一个长的错误,从C++,类似于:<代码>…第1227行在保存< /COD> < Obj.ObjultObj> O/Obj> <代码>…………在.yGETGyOObj[O]中,Pyth.python .AguMurror:Python参数类型在ObObjuly.INITTY中(ObObje,NoType,STR,元数据,int)不匹配C++签名: