Maya API复制/删除复合数组属性

时间:2016-04-20 09:00:19

标签: c++ duplicates maya maya-api

我正在编写一个变形器节点,它将worldMatrix和圆柱体的可见性作为输入。圆柱体被组织成组,这个结构在我的变形器上被镜像。我有一个2D数组,由带有圆柱体的组织组成,每个数组都是复合属性,因此我可以控制整个组的可见性和单个孔。

这是属性设置:

aVisibility = nAttr.create("Visibility", "vis", MFnNumericData::kBoolean);
CHECK_MSTATUS(addAttribute(aVisibility));

aTransform = mAttr.create("Transform", "trans", MFnMatrixAttribute::kDouble);
nAttr.setDisconnectBehavior(MFnAttribute::DisconnectBehavior::kDelete);
CHECK_MSTATUS(addAttribute(aTransform));

aCylinders = cAttr.create("Cylinders", "cylinders");
cAttr.addChild(aTransform);
cAttr.addChild(aVisibility);
cAttr.setArray(true);
CHECK_MSTATUS(addAttribute(aCylinders));

aGroupVisibility = nAttr.create("GroupVisibility", "grpVis", MFnNumericData::kBoolean, true);
nAttr.setDisconnectBehavior(MFnAttribute::DisconnectBehavior::kDelete);
CHECK_MSTATUS(addAttribute(aGroupVisibility));

aGroups = cAttr.create("Groups", "grps");
cAttr.addChild(aGroupVisibility);
cAttr.addChild(aGroupHoles);
cAttr.setArray(true);
CHECK_MSTATUS(addAttribute(aGroups));

我编写了python脚本来为此添加一个柱面,它将确定它应该属于哪个组,添加一个新条目并连接可见性和worldMatrix。

这个设置有几个问题。首先,删除一个柱面就像我预期的那样,因为我已经定义了disconnectBehaviour来删除数组中的实例。但是,删除组会在层次结构的顶层留下断开连接的属性,我必须手动清理它。

其次,虽然删除效果很好,但如果可以使用重复也会非常方便。因此,如果某人复制了一个圆柱体,则会创建一个数组条目并连接必要的属性。这可能吗?到目前为止,使用变形器的人自然尝试了这一点,我不得不让他们使用脚本。

1 个答案:

答案 0 :(得分:0)

根据文档,您似乎缺少数组删除部分。摘自API文档:

  

如果在作为复合的数组属性上设置kDelete行为,则只处理连接到父属性而不是其子属的情况。因此断开与父元素的连接(例如node.parent [3])会导致删除该元素,但断开与子节点的连接(例如node.parent [3] .child)会使元素保持不变,即使这是最后一次这样的联系。

     

要在最后一次连接到子项时删除父数组元素,您还必须在可连接的子项上设置kDelete行为。

在您创建矩阵属性的行上,以下行应为:

aTransform = mAttr.create("Transform", "trans", MFnMatrixAttribute::kDouble);
mAttr.setDisconnectBehavior(MFnAttribute::DisconnectBehavior::kDelete);

不是这个:

aTransform = mAttr.create("Transform", "trans", MFnMatrixAttribute::kDouble);
nAttr.setDisconnectBehavior(MFnAttribute::DisconnectBehavior::kDelete);

请注意,nAttr.setDiconnectBehavior应为mAttr,否则您将其应用于第一个可见性属性。

因此,根据文档,您需要为子属性和数组属性设置断开连接行为,因此当最后一个子属性断开连接时,它将删除父数组元素。所以我认为这应该是这样的:

aVisibility = nAttr.create("Visibility", "vis", MFnNumericData::kBoolean);
nAttr.setDisconnectBehavior(MFnAttribute::DisconnectBehavior::kDelete);
CHECK_MSTATUS(addAttribute(aVisibility));

aTransform = mAttr.create("Transform", "trans", MFnMatrixAttribute::kDouble);
mAttr.setDisconnectBehavior(MFnAttribute::DisconnectBehavior::kDelete);
CHECK_MSTATUS(addAttribute(aTransform));

aCylinders = cAttr.create("Cylinders", "cylinders");
cAttr.addChild(aTransform);
cAttr.addChild(aVisibility);
cAttr.setArray(true);
cAttr.setDisconnectBehavior(MFnAttribute::DisconnectBehavior::kDelete);
CHECK_MSTATUS(addAttribute(aCylinders));

aGroupVisibility = nAttr.create("GroupVisibility", "grpVis", MFnNumericData::kBoolean, true);
nAttr.setDisconnectBehavior(MFnAttribute::DisconnectBehavior::kDelete);
CHECK_MSTATUS(addAttribute(aGroupVisibility));

aGroups = cAttr.create("Groups", "grps");
cAttr.addChild(aGroupVisibility);
cAttr.addChild(aGroupHoles);
cAttr.setArray(true);
cAttr.setDisconnectBehavior(MFnAttribute::DisconnectBehavior::kDelete);
CHECK_MSTATUS(addAttribute(aGroups));

我看到一个缺失的属性" aGroupHoles"在此代码段中,您必须确保相应地设置断开连接的行为。

重复的第二个问题。我想说最好的办法是让用户调用的脚本可以正确处理。