2016-04-20 9 views
0

私は、入力としてworldMatrixとシリンダーの可視性をとるデフォーマノードを作成しています。シリンダーはグループに編成され、この構造はデフォーマでミラーリングされます。私は2次元配列を持ち、子供のためのシリンダーを持つグループで編成されています。各配列は複合属性ですので、グループ全体の可視性と個々の穴を制御できます。Maya API複合配列の属性を複製/削除します

これは、属性の設定です:私は、それが属するべきグループを見つけ出すであろう、これにシリンダーを追加する新しいエントリを追加し、視認性とworldMatrixを接続するためのPythonスクリプトを書いた

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)); 

アップ。

このセットアップにはいくつか問題があります。まず、配列のインスタンスを削除するためにdisconnectBehaviourを定義しているので、私が期待するように、シリンダを削除することができます。しかし、グループを削除すると、階層の最上位レベルで切断された属性が残るため、手動でクリーンアップする必要があります。

第2に、削除はかなりうまくいくが、複製を使用することができれば便利だろう。したがって、誰かがシリンダを複製した場合、配列エントリが作成され、必要な属性が接続されました。これは可能ですか?これまでデフォーマを使用していた人々は自然にこれを試みましたが、スクリプトを使用する必要がありました。

答えて

0

ドキュメントに記載されている配列削除の一部が欠落しているようです。 APIドキュメントから撮影:

kDelete行動が唯一の接続が親にあるその子にないケース属性を処理する化合物である配列属性に設定されている場合。したがって、親要素(node.parent [3]など)への接続を切断すると、その要素が削除されますが、子ノード(node.parent [3] .childなど)への接続が切断されると、要素はそのまま残りますたとえそれが最後の接続であったとしても。

子への最後の接続が切断されたときに親配列要素を削除するには、接続可能な子ノードでもkDeleteビヘイビアを設定する必要があります。あなたは行列属性を作成行で

、次の行はこのようになります。

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

ないこの:nAttr.setDiconnectBehaviorはそうでない場合、MATTRあるべき

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

お知らせそれを最初の可視性属性に適用します。

ドキュメントに従って、最後の子属性が切断されたときに親配列要素が削除されるので、子と配列の両方の属性に対して切断動作を設定する必要があります。あなたはあなたにもそれに応じてそこに切断動作を設定を確認する必要がありますので、私はこのコードスニペットで不足している属性「aGroupHoles」を参照してください

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)); 

:これは、私はそれがどのように見えるべきだと思うものです。

重複の2番目の問題。私はあなたのユーザーがこれを適切に処理するために呼び出すスクリプトを用意するのが最善のことだと言います。

+0

ありがとう@scottiedoo、愚かなコピー&ペーストエラーが上部にあります。あなたが提案したDisconnectBehaviorsも追加しましたが、残念ながら私の問題はまだ残っています。 グループを直接削除する場合、配列のインスタンスは、接続のない同じインデックスに残ります。しかし、最初にシリンダーを削除し、子配列を空にしてからグループを削除すると、インスタンスは正常に削除されます。私はaGroupVisibilityがDisconnectBehaviorをトリガーすると思ったが、それはそう思わなかった。私の推測では、親の削除は子の削除を引き起こさないので、要素は存続します。 – jhod91

+0

削除される複合配列である複合グループの子が表示されないというMayaのバグのようです。私はあなたが削除のためのスクリプトを持っている必要がありますので、それは適切なクリーンアップを行うだろうと思います。申し訳ありませんが、それが重要であればあなたの属性を再構築するのには不十分です。 – scottiedoo

+0

心配する必要はありません、私は、クリーンアップを行うpythonスクリプトを持っている、私はちょうど私が間違って何かをしていたかどうかを確認すると思った/良い方法があった。オートデスクと連絡を取る場合があります – jhod91

関連する問題