Maya Python: commands.- Taste( ) mit UI übergeben von Variablen und eine Funktion aufrufen?
Zunächst alle, dies scheint ein großartiger Ort, um mehr zu erfahren über die Programmierung.
Ich habe eine schriftliche maya python script, wo beide Funktionen funktionieren, werde ich Schwierigkeiten haben, die UI-Taste zum aufrufen der superExtrude () - Funktion, obwohl.
Die erste Funktion übernimmt die geometrische mesh-Manipulationen und der zweite sollte produzieren die Benutzeroberfläche für die Benutzer-Eingänge:
import maya.cmds as cmds
def superExtrude(extrScale, extrDist):
"""Loops through a list of selected meshes and extrudes all of the mesh faces to produce a polygon frame, based on existing mesh tesselations"""
myObjectLt = cmds.ls(selection=True)
for i in range(len(myObjectLt)):
numFaces = cmds.polyEvaluate(face=True)
item = myObjectLt[i] + ".f[:]"
cmds.select(clear=True)
cmds.select(item, replace=True)
#extrude by scale
cmds.polyExtrudeFacet(constructionHistory=True, keepFacesTogether=False, localScaleX=extrScale, localScaleY=extrScale, localScaleZ=extrScale)
selFaces = cmds.ls(selection=True)
cmds.delete(selFaces)
#extrude by height
cmds.select(item, replace=True)
cmds.polyExtrudeFacet(constructionHistory=True, keepFacesTogether=True, localTranslateZ=extrDist)
def extrWindow():
"""Creates the user interface UI for the user input of the extrusion scale and height"""
windowID = "superExtrWindow"
if cmds.window(windowID, exists=True):
cmds.deleteUI(windowID)
cmds.window(windowID, title="SuperExtrude", sizeable=False, resizeToFitChildren=True)
cmds.rowColumnLayout(numberOfColumns=2, columnWidth=[(1,120),(2,120)], columnOffset=[1,"right",3])
cmds.text(label="Extrusion Scale:")
extrScaleVal = cmds.floatField(text=0.9)
cmds.text(label="Extrusion Height:")
extrDistVal = cmds.floatField(text=-0.3)
cmds.separator(height=10, style="none")
cmds.separator(height=10, style="none")
cmds.separator(height=10, style="none")
cmds.button(label="Apply", command=superExtrude(extrScaleVal, extrDistVal))
cmds.showWindow()
extrWindow()
Ich bin Recht neu in python und maya scripting, so dass jede Hilfe wäre sehr geschätzt werden. 🙂
- Einige Hintergrundinformationen über die verschiedenen Möglichkeiten zum aufrufen von Funktionen von UI-Objekte hier
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht sicher, ob dies die Antwort, die Sie wollen, aber was muss man wissen über den maya - "Befehle" - flags :
Wenn Sie wollen, um eine Funktion in einem button aufrufen, müssen Sie gehen in den Namen der Funktion ohne Argumente (z.B. : command = meinefunktion) (loszuwerden, die Ende Klammern "()" )
in Ihrer Funktion, müssen Sie ein "*args" weil der maya-Taste übergibt immer ein argument (ich glaube, es ist "Falsch") (zB : def meinefunktion(customArg1, customArg2, *args) )
Wenn Sie wollen, um Argumente in die signal-Taste, die Sie verwenden müssen, die teilweise die Funktion aus dem functools-Modul (from functools import partial) und verwenden Sie es wie diese:
commands.Taste( Befehl = teilweise(myFunction, arg1, arg2, kwarg1=Wert1, kwarg2=Wert2) )
Eine weitere Sache, über pymel und commands... es ist wohl eine nie endende Geschichte, aber pymel ist nicht allmächtig... Wenn Sie sich mit einer Vielzahl von Informationen (wie ein Ecken-Liste auf ein Gitter), pymel kann so etwas wie 40x langsamer als eine einfache maya-Befehle.
Es hat seine vor-und seine Nachteile... Wenn Sie gerade erst begonnen mit python, ich würde nicht empfehlen, um in pymel jetzt.
Holen Sie sich vertraut mit der syntax und die Befehle, und wenn Sie ok sind, wechseln Sie zu pymel (das ist sehr nützlich, wenn Sie den Umgang mit Objekten-Erstellung)
Hoffe, dass dies geholfen,
Cheers
Edit :
Basierend auf deinem ersten post, was Sie brauchen, um die änderung im code, damit es funktioniert ist :
Diese Zeile ruft
superExtrude
und weist Ihren Rückgabewert zucommand
. DasuperExtrude
nichts zurückgibt, wird die Schaltfläche effektiv hat eine commnand vonNone
.Du vielleicht gemeint haben
superExtrude
aufgerufen, wenn der button angeklickt wird, in diesem Fall sollten Sie wickeln Sie es in einen lambda-Ausdruck, um zu verhindern, rief sofort:St4rb0y
Zuerst, Ihre floatField Anrufe (Linien 33, 35) ein ungültiges flag verwendet wird, ist "text". Du meinst wohl für die Verwendung von 'Wert', so ändern sich beide Linien.
Zweitens, wenn der Bau UI Arten der Kontrolle, der "command" - flag sucht eine Zeichenfolge, so dass Sie wickeln Sie den Befehl und die Argumente in Anführungszeichen:
Ändern Sie diese drei Zeilen, und es sollten alle funktionieren.
Tipps:
Kommentar eine einzige Zeile code, verwenden Sie # anstelle umschließt die gesamte Zeile in dreifachen Anführungszeichen. Die Verwendung von dreifach-Anführungszeichen ist mehr nützlich für die Kommentare aus vielen Zeilen code.
Anderen Tipp für Steuer-Befehl-flags: definieren Sie eine string-variable zur übergabe von Befehlen und verwenden Sie die variable statt den string direkt. Dieser trick ist praktisch, wenn dynamische Steuerelemente, dh, Montage-Befehle, basierend auf Benutzer-Auswahl:
so schaltete ich alles um pymel das ist, was Sie sollten lernen, in. commands ist Müll.
nehmen Sie sich die Zeit, um Blick auf die Unterschiede zwischen dir und mir. scripts wie diese sind es, die Ihnen helfen, begonnen zu erhalten. wenn jede weitere Erklärung erforderlich ist, lassen Sie es mich wissen.
hierzu td einen gefallen und lernen pymel
pymel online-docs = http://download.autodesk.com/global/docs/maya2014/en_us/PyMel/