【问题标题】:Maya API duplicate/delete compound array attributeMaya API 复制/删除复合数组属性
【发布时间】:2016-04-20 09:00:18
【问题描述】:

我正在编写一个变形器节点,它将世界矩阵和圆柱体的可见性作为输入。圆柱体被组织成组,这种结构反映在我的变形器上。我有一个二维数组,由带有儿童圆柱体的组组织,每个数组都是一个复合属性,因此我可以控制整个组的可见性和单个孔。

这是属性设置:

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 来删除数组中的实例。但是,删除组会在层次结构的顶层留下一个断开连接的属性,我必须手动清理它。

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

【问题讨论】:

    标签: c++ duplicates maya maya-api


    【解决方案1】:

    根据文档,您似乎缺少数组删除的一些部分。取自 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));
    

    我在此代码 sn-p 中看到了一个缺失的属性“aGroupHoles”,因此您必须确保在那里也相应地设置了断开连接的行为。

    您的第二个重复问题。我想说最好的办法是有一个您的用户调用的脚本来正确处理这个问题。

    【讨论】:

    • 感谢@scottiedoo,顶部出现愚蠢的复制和粘贴错误。我还添加了您建议的 DisconnectBehaviors,不幸的是我的问题仍然存在。直接删除组时,数组的实例将保留在相同的索引处,没有连接。但是,如果我先删除圆柱体,清空子数组,然后是组,则实例会正常删除。我认为 aGroupVisibility 会触发 DisconnectBehavior 但似乎没有。我的猜测是,因为父删除不会触发子删除,所以元素仍然存在。
    • 听起来像是 Maya 中的一个错误,它看不到作为复合数组的复合组的子级被删除。我想你也必须有一个用于删除的脚本,以便它进行适当的清理。抱歉,我没有想法,如果有那么重要的话,我没有重组你的属性。
    • 别担心,我有 python 脚本在做清理工作,我只是想问问我是否做错了什么/有更好的方法。我可能会与 Autodesk 取得联系
    猜你喜欢
    • 1970-01-01
    • 2016-09-10
    • 2017-05-18
    • 2021-03-28
    • 2020-02-02
    • 1970-01-01
    • 2016-11-08
    • 2020-12-06
    • 2023-03-20
    相关资源
    最近更新 更多