2016-04-20 11 views
0

Ich schreibe einen Deformer-Knoten, der als Inputs die WorldMatrix und die Sichtbarkeit von Zylindern nimmt. Die Zylinder sind in Gruppen organisiert, und diese Struktur spiegelt sich auf meinem Deformer wider. Ich habe ein 2D-Array, das nach Gruppen mit Zylindern für Kinder organisiert ist, und jedes Array ist ein zusammengesetztes Attribut, sodass ich die Sichtbarkeit einer ganzen Gruppe und einzelner Löcher kontrollieren kann. Maya API duplizieren/löschen zusammengesetzte Array-Attribut

Dies ist das Attribut Setup:

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

ich Python-Skripte geschrieben haben, um einen Zylinder zu dieser hinzuzufügen, die herausfinden, welche Gruppe es sollte einen neuen Eintrag, fügen Sie gehören und die Sichtbarkeit und worldMatrix verbinden oben.

Ich habe ein paar Probleme mit dieser Einrichtung. Erstens funktioniert das Löschen eines Zylinders so, wie ich es erwartet hätte, seit ich definiert habe, dass disconnectBehaviour die Instanz im Array löscht. Beim Löschen einer Gruppe bleibt jedoch ein getrenntes Attribut auf der obersten Ebene der Hierarchie, die ich manuell bereinigen muss.

Zweitens, während das Löschen recht gut funktioniert, wäre es sehr praktisch, wenn Duplikate ebenfalls verwendet werden könnten. Wenn also jemand einen Zylinder dupliziert hat, wurde ein Array-Eintrag erstellt und die notwendigen Attribute verbunden. Ist das möglich? Bisher haben Leute, die den Deformierer benutzen, dies natürlich versucht, und ich musste sie dazu bringen, ein Skript zu benutzen.

Antwort

0

Es scheint, dass Sie einige fehlende Teile zum Löschen des Arrays gemäß der Dokumentation haben. Aus der API-Dokumentation:

Wenn das kDelete-Verhalten für ein Array-Attribut festgelegt ist, das eine Verbindung ist, wird nur der Fall behandelt, in dem die Verbindung zum übergeordneten Attribut und nicht zu seinen untergeordneten Elementen besteht. Wenn also eine Verbindung zu einem Element des Elternelements unterbrochen würde (z. B. node.parent [3]), würde dieses Element entfernt, aber eine Verbindung zu einem Kind (z. B. node.parent [3] .child) würde das Element intakt lassen , auch wenn es die letzte Verbindung war.

Damit das übergeordnete Arrayelement gelöscht wird, wenn die letzte Verbindung zu einem untergeordneten Knoten unterbrochen wird, müssen Sie das Verhalten kDelete auch für die verbundenen untergeordneten Elemente festlegen.

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

Nicht dies:

Auf der Linie, wo Sie Ihre Matrix-Attribut zu erstellen, sollte die folgende Zeile das sein

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

Beachten Sie die nAttr.setDiconnectBehavior MattR, anders sein sollte Sie wenden es auf das erste Sichtbarkeitsattribut an.

Gemäß der Dokumentation müssen Sie das Trennungsverhalten für das untergeordnete und das Array-Attribut festlegen. Wenn das letzte untergeordnete Attribut getrennt wird, löscht es das übergeordnete Arrayelement. So ist es das, was ich denke, es sollte wie folgt aussehen:

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

ich ein fehlendes Attribut „aGroupHoles“ in diesem Code-Schnipsel zu sehen, so dass Sie müssen sicherstellen, dass Sie das getrennte Verhalten entsprechend auch dort eingestellt.

Ihr zweites Problem mit der Duplizierung. Ich würde sagen, das Beste, was zu tun ist, ist ein Skript, das Ihre Benutzer aufrufen, das das richtig handhabt.

+0

Dank @scottiedoo, dumm Kopie und Einfügen Fehler an der Spitze. Ich habe auch die DisconnectBehaviors hinzugefügt, die Sie vorgeschlagen haben, leider ist mein Problem immer noch da. Wenn eine Gruppe direkt gelöscht wird, bleibt die Instanz des Arrays dort auf demselben Index ohne Verbindungen. Wenn ich zuerst die Zylinder lösche, das Kind-Array leert und dann die Gruppe lösche, löscht die Instanz normal. Ich dachte, dass aGroupVisibility das DisconnectBehavior auslösen würde, aber anscheinend nicht. Meine Vermutung ist, dass das Element persistent bleibt, weil die Eliminierung der Eltern die Löschung des Kindes nicht auslöst. – jhod91

+0

Klingt wie ein Fehler in Maya, dass es kein Kind der zusammengesetzten Gruppe sieht, das ein zusammengesetztes Array ist, das gelöscht wird. Ich nehme an, dass du dafür auch ein Skript haben musst, um es zu löschen, damit es sauber gemacht wird. Tut mir leid, aber ich habe keine Ideen mehr, ich möchte Ihre Attribute nicht umstrukturieren, wenn es so wichtig ist. – scottiedoo

+0

keine Sorge, ich habe Python-Skripte, die das Aufräumen erledigen, ich dachte nur, ich würde fragen, ob ich etwas falsch mache/es gab einen besseren Weg. Ich kann mich mit Autodesk in Verbindung setzen – jhod91