2016-05-24 14 views
0

I eine windowUI mit einem Knopf 2 Funktionen auszuführen gemacht, so habe ich eine neue Funktion definiert, um die anderen 2Python Maya, Funktionsaufruf-2-Funktionen, Kraft laufen beide

def addSlider_splitLoop(): 
    addSlider() 
    splitLoop() 

mc.button(label ='Combo' , command = 'addSlider_splitLoop()') 

laufen, wenn die Taste gedrückt wird, nur 1-Funktion funktioniert:

  • wenn nichts wird der Befehl nur dann ausgewählt wird mit dem addSlider() -Funktion,

  • wenn die Polygonschleife nur den Befehl ausgewählt wird, läuft die Split Loop() Funktion

, die tatsächlich Sinn machen, aber hilft mir nicht, und ändert die Reihenfolge der Funktionen ot auch nicht hilft

ich möchte es zwingen, beide Funktionen ausführen, wie kann ich mach das?

eigentlich die beste Sache wäre, die addSlider() zu haben, nur wenn die splitLoop() funktioniert, aber ich bin ein echter Anfänger und ich habe keine Ahnung, wie dies zu tun ... zwingen, beide Funktionen auszuführen könnte eine schmutzige Lösung sein, ist aber im Moment für mich genug

dies der vollständige Code ist sowieso (die Combo-Taste ist nur zum Testen)

import maya.cmds as mc 

def addSlider_splitLoop(): 
     addSlider() 
     splitLoop()  




def addSlider(): 
     mc.floatSliderGrp(minValue = 1.00 , maxValue = 99.00 , value = 50.00 , field = True) 

def splitLoop():  
     mc.ConvertSelectionToContainedEdges() 
     mc.polySplitRing(sma = 180 , wt = 0.5) 
     mc.polyDuplicateEdge(ch = True , of = loopDistance()) 
     #addSlider() 




def doubleLoop(): 
     mc.ConvertSelectionToContainedEdges() 
     mc.polySplitRing(sma = 180 , wt = 0.5) 
     mc.polyDuplicateEdge(ch = True , of = loopDistance()) 
     mc.polyDelEdge(e = False, cv = True,) 
     #addSlider() 

def loopDistance(): 
     distance = mc.floatSliderGrp('LoopDistanceValue' , query = True, value = True) 
     convertedDistance = distance/100 
     return convertedDistance  



def splitLoopUI(): 

     if mc.window('splitLoopUI' , exists = True): 
      mc.deleteUI('splitLoopUI') 

     mc.window('splitLoopUI') 

     mc.frameLayout(label='       set loop distance') 
     mc.floatSliderGrp('LoopDistanceValue' , minValue = 1.00 , maxValue = 99.00 , value = 50.00 , field = True)  

     mc.button(label ='Triple Loop' , command = 'splitLoop()') 
     mc.button(label ='Double Loop' , command = 'doubleLoop()') 
     mc.button(label ='Combo' , command = 'addSlider_splitLoop()') 

     mc.text(label=' + edit loop distance + ') 

     mc.scrollLayout('scrollLayout') 
     mc.columnLayout(adjustableColumn=True) 


     mc.showWindow('splitLoopUI') 
splitLoopUI() 

Antwort

1

Ein paar Dinge gehen hier vor.

  1. Nennen Sie die Skripte nicht als Strings - das ist ein Rezept für Wissness auf der Straße. Übergeben Sie stattdessen die Funktionsobjekte, wie im Beispiel von @ Dr. Weeny. Es ist zuverlässiger und auch schneller. More here
  2. addSlider() macht keine Arbeit, um das gerade aktive GUI-Objekt zu bekommen - je nachdem, wann es läuft, könnte der Slider irgendwo auftauchen - in der Kanal-Box, in irgendeinem anderen Fenster, oder es könnte scheitern. Das ist wahrscheinlich der Grund, warum die Funktion scheinbar nicht läuft: Sie finden den neuen Slider einfach nirgendwo. Versuchen Sie, einen Debug-Druck hinzuzufügen.
  3. wenn Sie addSlider() nach anderen Befehle ausführen möchten, ist die einfachste Sache zu tun, wahrscheinlich alle Werkzeug Befehle ein Wert zurück angibt, zu haben ist, dass sie erfolgreich waren oder fehlgeschlagen:

    def splitLoop():  
        try: 
         mc.ConvertSelectionToContainedEdges() 
         mc.polySplitRing(sma = 180 , wt = 0.5) 
         return mc.polyDuplicateEdge(ch = True , of = loopDistance()) 
        except: 
         return None 
    
    def addSlider_splitLoop(): 
        if splitLoop(): 
         addSlider()  
    
+0

Danke, ich weiß, dass mein addSlider() noch keine Auswirkungen hat, ich wollte es später mit der Channelbox verknüpfen (noch nicht sicher, wie ich das letzte bekommen soll) ein), aber zuerst wollte ich überprüfen, ob ich einen neuen Slider der Benutzeroberfläche für jedes Mal, wenn ich den Befehl ausführen kann Sie haben Recht, der Slider wird jedes Mal erstellt, nur nicht in meinem Fenster, nur das erste Mal, dass ich Drücke den Knopf, der Slider erscheint im richtigen Fenster, jedes zweite Mal ist woanders, was ich nicht sehen kann ... wie kann ich den Schieberegler im richtigen Fenster erstellen lassen? – gangarone

+0

Sie müssen den Namen des Layouts dort speichern, wo Sie es haben wollen, und 'mc.setParent()' verwenden, um es zu aktivieren, bevor Sie den neuen Schieberegler – theodox

+0

einfügen, der perfekt funktioniert! Danke! – gangarone

0

Sie sollen nicht durch Komma auf Ihrer Funktion Befehl setzen. Sie könnten versuchen, mc.evalDeferred ('addSlider() \ nsplitLoop()') zu verwenden. Sie können versuchen: außer: endlich:

Da ich dein Skript nicht testen kann, ist es schwer zu verstehen, was beide Ihre Funktionen tun sollten. Meiner Meinung nach ist es ein Problem der Leerlaufzeit und du solltest dir den Kopf über evalDepered Befehl kratzen.

def addSlider_splitLoop(): 
     addSlider() 
     splitLoop() 

    mc.button(label ='Combo' , command = addSlider_splitLoop) 
+0

Danke, Ich schaue mir das evalDevered an, aber ich bin mir nicht sicher, ob ich es in meinem Fall brauche.(übrigens habe ich die Frage bearbeitet und den vollständigen Code zum Testen hinzugefügt) – gangarone