2016-06-24 13 views
0

Ich führe einen Befehl aus, in dem eine neue Kamera erstellt wird. Am Ende der Funktion gibt es jedoch keine Auswahl, und die Funktion wählt das Objekt nicht aus, nachdem es seinen Ablauf ausgeführt hat. Also gibt es irgendwelche Befehle, in denen ich möglicherweise nach dem zuletzt erstellten Gegenstand fragen könnte?Die zuletzt erstellte Elementauswahl abrufen

Ich habe versucht, `cmds.listHistory‘ verwenden, aber das wird Sie Ergebnisse nur zeigt, wenn es bereits eine Auswahl ist ..

Alle Möglichkeiten, in denen ich mit ihm umgehen kann?

Außerdem sagen ich den folgenden Befehl bin mit mit den

cameraShape... 
aaa = "cameraShape1" 
mel.eval('<Some mel-based command> cameraShape.transformX cameraShape.transformY cameraShape.transformZ;') 

aber als ich versuchte, in einer anderen Art und Weise, dass der Befehl Schreiben wie: mel.eval('<Some mel-based command> %s.transformX %s.transformY %s.transformZ;' %aaa)

ich einen Fehler bekam sagen

# Error: not enough arguments for format string 
# Traceback (most recent call last): 
# File "<maya console>", line 1, in <module> 
# TypeError: not enough arguments for format string # 

Wo schreibe ich es genau falsch? Ich habe versucht zu schreiben wie %aaa, aaa, aaa immer noch der gleiche Fehler auftritt

+0

% (aaa, aaa, aaa) – galaxyan

+0

@galaxyan das funktioniert ... Es scheint, dass ich die '()' oder ich als '% aaa schreibe es fehle,% aaa,% aaa'. Fehler meinerseits – dissidia

+0

lol. kein Problem – galaxyan

Antwort

1

Warum können Sie nicht einfach die neue Kamera in eine Variable stopfen statt sich auf die Auswahl verlassen?

new_camera, new_camera_shape = cmds.camera() 

Sie sind nicht die richtige Syntax, wenn sie mit % Formatierung:

"My name is %s" % "Jon Snow" # Works for single 
"My name is %s and I was born in %s" % ("Jon Snow", "Winterfell") # Multiple 

Persönlich bevorzuge ich format() wie es weiter nach vorne nehme ist für Python kompatibel zu sein 3:

"My name is {0} and I was born in {1}".format("Jon Snow", "Winterfell") 

Erkennen neuer Objekte:

scene_before = cmds.ls(l=True, transforms=True) 

# Run command to import object here 

scene_after = cmds.ls(l=True, transforms=True) 

new_objs = list(set(scene_after).difference(scene_before)) 
+0

Hallo, ich benutze 'camera' als Beispiel, vielleicht ist das ein sehr schlechtes Beispiel. Der Code für die Erstellung dieses Objekts von mir ist in etwa so: 'import thisModule; thisModule.createItem() 'und als solches, nach dieser Codeausführung, wird es das Objekt erstellen, während überhaupt keine Auswahl übrig bleibt, daher habe ich gefragt, ob es möglich ist, einige Möglichkeiten zu verwenden, um den zuletzt erzeugten Knoten auszuwählen. – dissidia

+0

Können Sie die Methode dieses Moduls posten? Die Methode gibt das erstellte Objekt nicht zurück? Auf Anhieb kann ich mir ein paar Wege vorstellen, um das Objekt zu bekommen. Eine günstige Möglichkeit besteht darin, vor dem Ausführen des Befehls eine Liste aller Objekte in der Szene zu erstellen und diese dann mit einer neuen Liste zu vergleichen, um die neuen Objekte zu erhalten. Dies kann mit Pythons set.difference geschehen. Sie können auch die MSceneMessage-Callbacks von Maya API verwenden, um ein neues Objekt zu erhalten. Da Ihr Beitrag etwas vage ist, ist es schwierig, Sie auf einen bestimmten Ansatz hinzuweisen. –

+0

Sagen Sie, der Befehl ist - 'import createCam; createCam.newNode() 'anscheinend in der Funktion newNode() hat es eine andere Funktion innerhalb und ruft diese Funktion - z. createNewCam() ... CreateNewCam() hat zwar eine Rückgabe, aber newNode() nicht. Ist das ein Grund zur Besorgnis oder vielleicht ist es nur ich nicht wissen, wie man solche Rückgabewerte greifen ... FYI, das createCam wurde nicht von mir gemacht, es war ein In-House-Ding .. – dissidia

0

Wenn Sie das zuletzt erstellte Objekt behalten möchten. Sie können eine Klasse erstellen, die eine Variablenhistorie enthält, in der Sie in Ihrem anderen Skript das zuletzt erstellte Objekt anhängen.

class History: 
    idCounter = [] 
    def __init__(self, name): 
     History.idCounter.append(name) 
     print(History.idCounter) 

for name in ['nana', 'tata', 'zaza']: 
    objectCreated = History(name) 
+0

Gibt es eine einfache Möglichkeit, es so zu tun? ohne zusätzliche Klassen zu erstellen – dissidia

+0

Für mich ist die Klasse der einfache Weg. Wenn Sie mit etwas unordentlichem gehen möchten, könnte yoi mit maya scriptjob oder api Rückrufen gehen. Wenn Sie auf maya scriptJob schauen, können Sie sehen, dass das Ereignis 'DagObjectCreated' existiert. Es mag deine Lösung sein, aber ich denke es ist eine wirklich gefährliche Art und Weise. Ich denke, Sie werden eine Art neuer Stapel Geschichte sein, es kann wirklich schwer sein. Mit der Klasse können Sie filtern, was Sie wollen, es dauert 5 Zeilen Code statt ... viel .... – DrWeeny

+0

Nun, da ich den Kommentar neu gelesen habe, habe ich Angst, dass Sie möglicherweise missverstanden haben, was ich meine. Was ich will, ist die Auswahl des zuletzt erstellten Knotens und nicht die Auswahl des zuletzt erstellten Knotens. – dissidia

Verwandte Themen