2016-07-09 18 views
0

Ich arbeite an etwas, das die Transformationen eines vom Benutzer verschobenen Objekts abruft und speichert und dann dem Benutzer ermöglicht, auf eine Schaltfläche zu klicken, um zu den von Benutzer.Abrufen, Speichern, Einstellen und Ändern von Transformationsattributen durch PyMel

Bis jetzt habe ich herausgefunden, wie man das Attribut bekommt, und setze es. Allerdings kann ich nur einmal einstellen und einstellen. Gibt es eine Möglichkeit, dies mehrmals innerhalb des einmal ausgeführten Skripts zu tun? Oder muss ich das Skript erneut ausführen? Das ist eine lebenswichtige Frage, die mir klar wird.

im Grunde:

btn1 = button(label="Get x Shape", parent = layout, command ='GetPressed()')  
btn2 = button(label="Set x Shape", parent = layout, command ='SetPressed()') 
def GetPressed(): 
    print gx #to see value 
    gx = PyNode('object').tx.get() #to get the attr 
def SetPressed(): 
    PyNode('object').tx.set(gx) #set the attr??? 

Ich bin nicht 100%, wie dies richtig zu tun, oder wenn ich auf dem richtigen Weg bin?

Dank

+0

Können Sie klarer sein, wonach Sie fragen? Versuchen Sie, ein Attribut für mehrere Objekte zu erhalten und festzulegen? –

Antwort

0

Sie die Variable nicht vorbei gx so SetPressed() wird scheitern, wenn Sie es ausführen, wie geschrieben (es könnte sporadisch arbeiten, wenn Sie die gx = ... Linie direkt in den Hörer Ausführung versucht, bevor das Ganze läuft - aber es wird unberechenbar sein). Sie müssen einen Wert in Ihrer SetPressed()-Funktion angeben, damit die set-Operation etwas zu arbeiten hat.

Nebenbei, die Verwendung von String-Namen zum Aufrufen Ihrer Schaltflächenfunktionen ist kein guter Weg zu gehen - Sie Code funktioniert, wenn vom Listener ausgeführt wird aber nicht funktioniert, wenn in einer Funktion gebündelt: Wenn Sie eine Zeichenfolge verwenden Name für die Funktionen Maya wird sie nur finden, wenn sie den globalen Namespace leben - das ist der Punkt, an dem die Listener Befehle absetzen, aber von anderen Funktionen aus nur schwer zu erreichen sind.

Hier ist ein minimales Beispiel dafür, wie dies zu tun, indem alle Funktionen und Variablen in einer anderen Funktion zu halten:

import maya.cmds as cmds 
import pymel.core as pm 

def example_window(): 

    # make the UI 

    with pm.window(title = 'example') as w: 
     with pm.rowLayout(nc =3) as cs: 
      field = pm.floatFieldGrp(label = 'value', nf=3) 
      get_button = pm.button('get') 
      set_button = pm.button('set') 

    # define these after the UI is made, so they inherit the names 
    # of the UI elements 

    def get_command(_): 
     sel = pm.ls(sl=True) 
     if not sel: 
      cmds.warning("nothing selected") 
      return 
     value = sel[0].t.get() + [0] 
     pm.floatFieldGrp(field, e=True, v1= value[0], v2 = value[1], v3 = value[2]) 


    def set_command(_): 
     sel = pm.ls(sl=True) 
     if not sel: 
      cmds.warning("nothing selected") 
      return 
     value = pm.floatFieldGrp(field, q=True, v=True) 
     sel[0].t.set(value[:3]) 


    # edit the existing UI to attech the commands. They'll remember the UI pieces they 
    # are connected to 

    pm.button(get_button, e=True, command = get_command) 
    pm.button(set_button, e=True, command = set_command) 

    w.show() 

#open the window 
example_window() 

Im Allgemeinen ist es diese Art der Sache, die die kniffligsten Bit dabei Maya GUI ist - - Sie müssen sicherstellen, dass alle Funktionen und Handler usw. sich gegenseitig sehen und Informationen austauschen können. In diesem Beispiel teilt die Funktion die Informationen mit, indem sie die Handler definiert, nachdem die Benutzeroberfläche vorhanden ist, damit sie die Namen der UI-Elemente erben und wissen können, woran sie arbeiten sollen. Es gibt andere Möglichkeiten, dies zu tun (Klassen sind die anspruchsvollsten und komplexesten), aber dies ist der minimalistische Weg, dies zu tun. Es gibt einen tieferen Tauchgang auf, wie man das tut here

+0

Vielen Dank! Ich werde das versuchen und später zu dir zurückkommen. – JCubed