Vertiefen Sie Ihr Verständnis, während Sie den Inhalt Ihrer eigenen Werkzeuge einzeln überprüfen, und verwenden Sie sie für die zukünftige Werkzeugentwicklung. Verstehe gründlich, dass ich durchgemacht habe, weil ich bis jetzt mit Kopieren und Einfügen gearbeitet habe. Ich schreibe ein Skript auf die gleiche Weise und es funktioniert irgendwie, also hoffe ich, dass es Menschen hilft, die am Ende mit.
Verlangsamt die Bewegungsgeschwindigkeit der Kamera in Maya und ermöglicht die Feineinstellung der Kamera. Maya-Kameras bewegen sich manchmal etwas schneller, was bei heikler Kameraarbeit etwas ärgerlich sein kann. Normalerweise wird es mit den Werkzeugeinstellungen angepasst, aber es ist schwierig zu verwenden, da es Einstellungen für jedes Kamerawerkzeug gibt, also habe ich es vereinheitlicht. Drehen Sie das Einstellrad nach links, um die Geschwindigkeit zu verlangsamen, und drehen Sie es nach rechts, um die Geschwindigkeit zu erhöhen. Sie können zwischen den Kamera-Tools wechseln.
** Betriebsumgebung: Maya2019.3, Maya2020.1 ** Da ich Pyside2 verwende, wird es nicht vor 2016 funktionieren.
cameraSpeedEditor.py
# -*- coding: utf-8 -*-
from maya.app.general.mayaMixin import MayaQWidgetBaseMixin
from PySide2 import QtWidgets
from PySide2.QtCore import Qt
from maya import cmds
class Widget(QtWidgets.QWidget):
def __init__(self):
#Rufen Sie die übergeordnete Methode auf
super(Widget, self).__init__()
#Rasterlayout platzieren
layout = QtWidgets.QGridLayout(self)
#Beschreibungsetikett
labelWidget = QtWidgets.QLabel(u'Passen Sie die Geschwindigkeit der Kamera an\n\n ← langsame Einstellung der Kamerageschwindigkeit →')
labelWidget.setAlignment(Qt.AlignCenter)
layout.addWidget(labelWidget,0,0,1,-1)
#Widget wählen
self.camDial = QtWidgets.QDial()
self.camDial.setRange(0, 100)
self.camDial.setValue(50)
self.camDial.setNotchesVisible(True)
self.camDial.sliderReleased.connect(self.setCamSpeed)
layout.addWidget(self.camDial,1,0,1,-1)
#Überprüfen Sie den Super-Slow-Modus
self.checkWidget = QtWidgets.QCheckBox(u'Super langsam')
self.checkWidget.setChecked(False)
self.checkWidget.stateChanged.connect(self.setCamSpeed)
layout.addWidget(self.checkWidget,2,0)
#Kombinationsfeld für das Kamera-Tool
setCamLabel = QtWidgets.QLabel('set Camera tool:')
setCamLabel.setAlignment(Qt.AlignRight)
layout.addWidget(setCamLabel,3,0)
selCamItem = QtWidgets.QComboBox(self)
selCamItem.addItem('tumble')
selCamItem.addItem('track')
selCamItem.addItem('dolly')
selCamItem.addItem('boxZoomSuper')
selCamItem.addItem('roll')
selCamItem.addItem('yawPitch')
selCamItem.activated[str].connect(self.setTool)
layout.addWidget(selCamItem,3,1)
#Reset-Knopf
resetButton = QtWidgets.QPushButton(u'zurücksetzen')
resetButton.clicked.connect(self.resetCamSpeed)
layout.addWidget(resetButton,4,0,1,-1)
#Kamerageschwindigkeit eingestellt
def setCamSpeed(self):
#Geschwindigkeitszahlen berechnen
value = float(self.camDial.value()) **3*0.0000072+0.1
if self.checkWidget.isChecked():
value = value /10
#Stellen Sie den berechneten Wert ein
cmds.tumbleCtx( 'tumbleContext' ,e=True ,ts=value)
cmds.trackCtx( 'trackContext' ,e=True ,ts=value)
cmds.dollyCtx( 'dollyContext' ,e=True ,s =value)
cmds.boxZoomCtx('boxZoomContext' ,e=True ,zs=value)
cmds.rollCtx( 'rollContext' ,e=True ,rs=value)
cmds.orbitCtx( 'azimuthElevationContext' ,e=True ,orbitScale=value)
cmds.orbitCtx( 'yawPitchContext' ,e=True ,orbitScale=value)
#Zeigen Sie, was Sie eingestellt haben
print ( '# Camera speed is '+str(value)+' !\n'),
#Kamera-Toolset
def setTool(self, selectTool):
cmds.setToolTo('%sContext' %(selectTool))
print ( 'Set %s Tool !\n' %(selectTool)),
#Kamerageschwindigkeit zurückgesetzt
def resetCamSpeed(self):
#Setzen Sie den Wert jeder Kamera auf den Standardwert zurück
cmds.tumbleCtx( 'tumbleContext' ,e=True ,ts=1)
cmds.trackCtx( 'trackContext' ,e=True ,ts=1)
cmds.dollyCtx( 'dollyContext' ,e=True ,s =1)
cmds.boxZoomCtx('boxZoomContext' ,e=True ,zs=1)
cmds.rollCtx( 'rollContext' ,e=True ,rs=1)
cmds.orbitCtx( 'azimuthElevationContext' ,e=True ,orbitScale=1)
cmds.orbitCtx( 'yawPitchContext' ,e=True ,orbitScale=1)
self.camDial.setValue(50)
self.checkWidget.setChecked(False)
print ( '# Camera speed is Default !\n'),
class MainWindow(MayaQWidgetBaseMixin, QtWidgets.QMainWindow):
def __init__(self):
#Rufen Sie die übergeordnete Methode auf
super(MainWindow, self).__init__()
#Geben Sie den Namen und die Größe des Fensters an
self.setWindowTitle('Camera Speed editor')
self.resize(200, 250)
#Instanz-Widget und im Fenster platzieren
widget = Widget()
self.setCentralWidget(widget)
def closeEvent(self, event):
#Führen Sie bei geschlossenem Fenster ein Zurücksetzen der Kamerageschwindigkeit durch
widget = Widget()
widget.resetCamSpeed()
def main():
#Anzeigefenster
window = MainWindow()
window.show()
#Verarbeitung beim Aufruf von main
if __name__ == "__main__":
main()
Von hier aus möchte ich erklären, wie jeder Code von Anfang an funktioniert, während ich mich selbst verstehe.
# -*- coding: utf-8 -*-
Wenn Sie im Code Japanisch verwenden, sollten Sie es eingeben. Siehe hier für Details. In Python3 scheint es eher veraltet zu sein. Maya ist immer noch 2.7, also werde ich es für alle Fälle hinzufügen.
Name des Zeichencodes "Are" am Anfang des Satzes in Python (so etwas wie UTF-8)
from maya.app.general.mayaMixin import MayaQWidgetBaseMixin
from PySide2 import QtWidgets
from PySide2.QtCore import Qt
from maya import cmds
Importieren Sie jede zu verwendende Bibliothek. Python hat viele Bibliotheken, so dass Sie verschiedene Dinge tun können, indem Sie es verwenden. Ich denke, es ist einer der Vorteile der Verwendung von Python anstelle von MEL.
from 〇〇 import △△
bedeutet, △△ in 〇〇 zu bringen.
Die Funktion jeder Bibliothek.
** MayaQWidgetBaseMixin **: Wird verwendet, um die Eltern-Kind-Beziehung des Fensters festzulegen
** QtWidgets, Qt **: PySide, UI-bezogene Funktionen
** cmds **: Maya-Befehl
Die 4. Zeile "von Maya Import Cmds" ist eine Referenz von Maya, Es wird als "import maya.cmds as cmds" beschrieben. Ich mache das, weil es schöner ist, sie alle zu haben. Was Sie tun, ist wahrscheinlich das gleiche.
class Widget(QtWidgets.QWidget):
def __init__(self):
#Rufen Sie die übergeordnete Methode auf
super(Widget, self).__init__()
...
class。 Die Erklärung der Klasse ist hier gebrochen. Bitte verstehe es im Buch, da es kompliziert ist. Der Ort, an dem ich am meisten gestolpert bin, als ich Python gemacht habe. Ich frage mich, ob ich mich daran gewöhnen sollte, während ich es benutze.
Ich dachte auch, dass ich mich selbst studiere, Es wird empfohlen, das Buch zu lesen, da nur Online-Artikel beschränkt sind. Persönlich [Einführung in O'Reilly Japan Python3](https://www.amazon.co.jp/%E5%85%A5%E9%96%80-Python-3-Bill-Lubanovic/dp/4873117380/ref = sr_1_1? __ mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & dchild = 1 & keywords =% E5% 85% A5% E9% 96% 80python3 & qid = 1598490946 & sr = 8-1 ) Ist sehr leicht zu verstehen. Ich lese immer noch. Ich denke, es ist für Anfänger bis Fortgeschrittene.
[Einführung in O'Reilly Japan Python3](https://www.amazon.co.jp/%E5%85%A5%E9%96%80-Python-3-Bill-Lubanovic/dp/4873117380/ref=sr_1_1? __mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & dchild = 1 & keywords =% E5% 85% A5% E9% 96% 80python3 & qid = 1598490946 & sr = 8-1) [Abbildung] Was ist Objektorientierung? (Bedeutung der Klassenmethodeninstanz)
class Widget(QtWidgets.QWidget):
Inerit ** QtWidgets.QWidget ** aus der Bibliothek in ** Widget ** importiert. Es ist so, als würden Sie sich darauf vorbereiten, die Basis von PySide2 für sich selbst anzupassen.
def __init__(self):
__init__
Spezielle Methode. Initialisieren Sie den Teil, der beim Erstellen der Instanz zuerst aufgerufen wird.
Sie werden es am häufigsten sehen, wenn Sie sich den Code der Klasse ansehen.
self
Erstes Argument.
Es funktioniert für andere als für sich selbst, aber gemäß Konvention wird immer ** self ** verwendet.
Diese Regeln sind im Dokument *** PEP 8 *** zusammengefasst.
Wenn Sie selbst online lernen, können Sie diese Regeln möglicherweise nicht erreichen und Ihre eigenen Regeln erstellen (Selbstdisziplin).
Python selbst und init verstehen Was ist Python selbst? Erläuterung der Verwendung und Vorsichtsmaßnahmen Grundlegendes zu [Python-Codierungsstandards] PEP8
#Rufen Sie die übergeordnete Methode auf
super(Widget, self).__init__()
Eine weitere verwirrende Beschreibung. Ich habe es zuerst nicht verstanden, aber es ist nichts, wenn ich es verstehe.
Erben Sie ** QtWidgets.QWidget ** an ** Widget **,
Wenn Sie eine Initialisierungsmethode mit __init__
erstellen, wird die Initialisierungsmethode des übergeordneten Elements (QtWidgets.QWidget) nicht aufgerufen.
Geben Sie diese Beschreibung ein und rufen Sie die übergeordnete Initialisierungsmethode auf.
Übrigens war diese Beschreibung in der Python2-Serie notwendig, aber in 3 Serien ist super () .__ init __ ()
gut. einfach.
Ich frage mich, wann Maya zu 3 Serien wechseln wird. ..
[Python] Klassenvererbung (super) Verwendung der Super () - Funktion von Python
Um besser zu verstehen, was die Klasse tut, wollen wir veranschaulichen, was los ist. 2. Importieren Sie PySide2.QtWidgets aus 7. Erben Sie das importierte QtWidgets QWidget mit dem Namen Widget 8. Erstellen Sie eine Initialisierungsmethode mit der Widget-Klasse 10. Rufen Sie die Initialisierungsmethode des importierten QtWidgets.QWidget auf 13 oder höher Erstellen Sie ein UI-Layout und Funktionen
Da es immer noch viele Charaktere gibt, habe ich eine einfache Illustration gemacht. Auf diese Weise können Sie eine (mit Maya vertraute) Instanzkopie der ursprünglichen Entwurfszeichnung erstellen und die Arme, Beine und Farben überschreiben (überschreiben), um die gewünschte Form zu erhalten. Wenn Sie es also mit "init" überschreiben, wird das Original "init" nicht aufgerufen, daher benötigen Sie "super".
Nun, die Erklärung der Klasse ist lang geworden, aber ich werde von nun an endlich die Benutzeroberfläche erstellen.
#Rasterlayout platzieren
layout = QtWidgets.QGridLayout(self)
Erstellen Sie QGridLayout. Schaltflächen und Beschriftungen werden in diesem Rasterlayout platziert.
#Beschreibungsetikett
labelWidget = QtWidgets.QLabel(u'Passen Sie die Geschwindigkeit der Kamera an\n\n ← langsame Einstellung der Kamerageschwindigkeit →')
Dem Rasterlayout wurden Beschriftungen hinzugefügt.
Wenn Sie Japanisch wie "u'character" verwenden, stellen Sie ** u ** voran.
Sie können eine neue Zeile mit \ n
beginnen.
labelWidget.setAlignment(Qt.AlignCenter)
Platzieren Sie das erstellte Etiketten-Widget in der Mitte.
layout.addWidget(labelWidget,0,0,1,-1)
Beschriftungs-Widget-Rasterlayout 0. Zeile, 0. Spalte, 1. Zeilenlänge, ** - 1 Spaltenlänge ** Wenn Sie es vom angegebenen Speicherort bis zum Ende verwenden möchten, verwenden Sie ** -1 **.
Auf diese Weise kann festgelegt werden, von welcher Position in der Zeile oder Spalte aus wie lange es dauert.
#Widget wählen
self.camDial = QtWidgets.QDial()
self.camDial.setRange(0, 100)
self.camDial.setValue(50)
self.camDial.setNotchesVisible(True)
self.camDial.sliderReleased.connect(self.setCamSpeed)
layout.addWidget(self.camDial,1,0,1,-1)
Erstellen Sie ein Wähl-Widget.
Dieses Mal werden "self.camDial" und "self" hinzugefügt, da ich den numerischen Wert von einer anderen Stelle abrufen möchte.
Geben Sie den Bereich von 0 bis 100 an. Der Standardwert wurde auf 50 geändert. Fügen Sie mit setNotchesVisible
eine Skala hinzu.
Mit self.camDial.sliderReleased.connect (self.setCamSpeed)
,
Stellen Sie self.setCamSpeed
ein, das ausgeführt werden soll, wenn die Maustaste losgelassen wird.
#Überprüfen Sie den Super-Slow-Modus
self.checkWidget = QtWidgets.QCheckBox(u'Super langsam')
self.checkWidget.setChecked(False)
self.checkWidget.stateChanged.connect(self.setCamSpeed)
layout.addWidget(self.checkWidget,2,0)
Erstellen Sie ein Scheck-Widget. Geben Sie an, dass die Standardeinstellung deaktiviert ist und dass "self.setCamSpeed" ausgeführt wird, wenn der aktivierte Status geändert wird. Das Layout ist in der 2. Zeile und 0. Spalte angeordnet. Wenn beide Längen 1 sind, können Sie es leer lassen.
#Kombinationsfeld für das Kamera-Tool
setCamLabel = QtWidgets.QLabel('set Camera tool:')
setCamLabel.setAlignment(Qt.AlignRight)
layout.addWidget(setCamLabel,3,0)
selCamItem = QtWidgets.QComboBox(self)
selCamItem.addItem('tumble')
selCamItem.addItem('track')
selCamItem.addItem('dolly')
selCamItem.addItem('boxZoomSuper')
selCamItem.addItem('roll')
selCamItem.addItem('yawPitch')
selCamItem.activated[str].connect(self.setTool)
layout.addWidget(selCamItem,3,1)
selCamItem = QtWidgets.QComboBox (self)
Erstellen Sie ein Kombinationsfeld.
Fügen Sie mit addItem
mehrere Kamera-Tool-Elemente hinzu. Ich möchte den Namen so verwenden, wie er ist, damit er der Beschreibung von Mayas Kamera-Tool entspricht.
selCamItem.activated [str] .connect (self.setTool)
Wenn sich die Aktivität ändert
Führen Sie dies aus, indem Sie ** string ** von addItem an self.setTool
übergeben.
#Reset-Knopf
resetButton = QtWidgets.QPushButton(u'zurücksetzen')
resetButton.clicked.connect(self.resetCamSpeed)
layout.addWidget(resetButton,4,0,1,-1)
Zurücksetzen-Schaltfläche erstellen. Stellen Sie die Betriebseinstellungen und das Layout auf die gleiche Weise wie andere ein.
Damit ist die Erstellung der Benutzeroberfläche abgeschlossen.
Erstellen Sie den Operationsinhalt von ** ~ .connect **, der beim Erstellen der Benutzeroberfläche angezeigt wurde.
#Kamerageschwindigkeit eingestellt
def setCamSpeed(self):
#Geschwindigkeitszahlen berechnen
value = float(self.camDial.value()) **3*0.0000072+0.1
if self.checkWidget.isChecked():
value = value /10
#Stellen Sie den berechneten Wert ein
cmds.tumbleCtx( 'tumbleContext' ,e=True ,ts=value)
cmds.trackCtx( 'trackContext' ,e=True ,ts=value)
cmds.dollyCtx( 'dollyContext' ,e=True ,s =value)
cmds.boxZoomCtx('boxZoomContext' ,e=True ,zs=value)
cmds.rollCtx( 'rollContext' ,e=True ,rs=value)
cmds.orbitCtx( 'azimuthElevationContext' ,e=True ,orbitScale=value)
cmds.orbitCtx( 'yawPitchContext' ,e=True ,orbitScale=value)
#Zeigen Sie, was Sie eingestellt haben
print ( '# Camera speed is '+str(value)+' !\n'),
Holen Sie sich den Status des Wähl- und Kontrollkästchens. Reflektieren Sie den berechneten Wert in jedem Kamera-Tool.
value = float (self.camDial.value ()) ** 3 * 0.0000072 + 0.1
Vom Wählwert zum Kamerageschwindigkeitswert konvertieren.
Warum ist es so eine seltsame Formel, aber als ich sie so einstellte, dass sie genau richtig funktionierte, wurde es so.
if ~
reduziert den ** Wert ** auf 1/10, wenn der super langsame Modus aktiviert ist.
# Stellen Sie den berechneten Wert unten ein
Reflektieren Sie den berechneten Wert im Wert jedes Kamera-Tools
Der Grund, warum viel Rand verschwendet wird, besteht darin, die Zeilen auszurichten und die Sichtbarkeit zu verbessern.
Es scheint, dass PEP8 nicht empfohlen wird, aber ich wage es, es zu ignorieren. Wie ist es eigentlich
print ('hogehoge'),
Die letzten **, (Komma) ** werden zur Anzeige in Mayas Befehlszeile hinzugefügt.
Weil Warnungen farbig und etwas überwältigend sind.
Im Moment ist es ein Rätsel, warum es in der Kommandozeile mit einem Komma angezeigt werden kann. Ich frage mich, ob es eine Maya-Spezifikation ist.
#Kamera-Toolset
def setTool(self, selectTool):
cmds.setToolTo('%sContext' %(selectTool))
print ( 'Set %s Tool !\n' %(selectTool)),
** [str] ** empfangen von selCamItem.activated [str] .connect (self.setTool)
,
cmds.setToolTo ('% sContext'% (selectTool))
Wechseln Sie mit diesem Befehl.
% s ersetzt% (Honyara)
Beispiel:
'%sContext' %('tumble')
→ 'tumbleContext'
#Kamerageschwindigkeit zurückgesetzt
def resetCamSpeed(self):
#Setzen Sie den Wert jeder Kamera auf den Standardwert zurück
cmds.tumbleCtx( 'tumbleContext' ,e=True ,ts=1)
cmds.trackCtx( 'trackContext' ,e=True ,ts=1)
cmds.dollyCtx( 'dollyContext' ,e=True ,s =1)
cmds.boxZoomCtx('boxZoomContext' ,e=True ,zs=1)
cmds.rollCtx( 'rollContext' ,e=True ,rs=1)
cmds.orbitCtx( 'azimuthElevationContext' ,e=True ,orbitScale=1)
cmds.orbitCtx( 'yawPitchContext' ,e=True ,orbitScale=1)
self.camDial.setValue(50)
self.checkWidget.setChecked(False)
print ( '# Camera speed is Default !\n'),
Stellen Sie die Standardeinstellungen der Kamera und der Benutzeroberfläche wieder her.
Mit dem oben genannten wurde der Vorgang beim Bedienen des Widgets erstellt.
class MainWindow(MayaQWidgetBaseMixin, QtWidgets.QMainWindow):
def __init__(self):
#Rufen Sie die übergeordnete Methode auf
super(MainWindow, self).__init__()
#Geben Sie den Namen und die Größe des Fensters an
self.setWindowTitle('Camera Speed editor')
self.resize(200, 250)
#Instanz-Widget und im Fenster platzieren
widget = Widget()
self.setCentralWidget(widget)
Vererbung von ** MayaQWidgetBaseMixin ** und ** QtWidgets.QMainWindow ** ** MayaQWidgetBaseMixin ** ist eine Funktion, die verhindert, dass das Fenster unter das Hauptfenster von Maya fällt. Früher habe ich Shiboken usw. verwendet, aber es fühlt sich gut an, viel einfacher zu sein.
Neu! Eltern-Kind-Beziehung des Maya-Fensters MayaQWidgetBaseMixin!
Geben Sie den Fenstertitel und die Fenstergröße an. Platzieren Sie den zuvor hergestellten Jet in der Mitte des Fensters.
def closeEvent(self, event):
#Führen Sie bei geschlossenem Fenster ein Zurücksetzen der Kamerageschwindigkeit durch
widget = Widget()
widget.resetCamSpeed()
Setzen Sie die Kamerageschwindigkeit zurück, wenn das Fenster geschlossen ist.
Sie können def closeEvent (self, event):
verwenden, um zusätzliches Verhalten hinzuzufügen, wenn das Fenster geschlossen wird.
Jetzt haben Sie die Benutzeroberfläche und die Hauptfunktionen erstellt.
def main():
#Anzeigefenster
window = MainWindow()
window.show()
Wenn Sie main () und den Befehl drücken, wird ein Fenster angezeigt und Sie können das Programm ausführen.
#Verarbeitung beim Aufruf von main
if __name__ == "__main__":
main()
Dies ist auch eine magische Sache. Führen Sie das Programm beim Importieren nicht aus. Wenn Sie den gesamten Code kopieren, in den Skripteditor einfügen und ausführen, wird das Programm gestartet.
Zuerst dachte ich, es geht darum, Notizen zu schreiben, aber es ist ziemlich lang geworden. Wenn ich etwas hinzufüge, das ich beim Schreiben an bestimmten Stellen nicht verstehe, ist es so.
Es scheint gut für mich, einen solchen Artikel jedes Mal zu hinterlassen, wenn ich ein Werkzeug schreibe. Schließlich denke ich, dass man lernen kann, indem man unterrichtet → versucht → lehrt.
Es mag viele Orte geben, die nicht erreichbar sind, aber bitte vergib mir. Ich würde mich freuen, wenn Sie mir sagen könnten, ob es Fehler gibt.
Unten ist der Site-Link, den ich als Referenz verwendet habe.
Name des Zeichencodes "Are" am Anfang des Satzes in Python (so etwas wie UTF-8) Einführung in Python-Module und Importe von [Abbildung] Was ist Objektorientierung? (Bedeutung der Klassenmethodeninstanz) Python selbst und init verstehen Was ist Python selbst? Erläuterung der Verwendung und Vorsichtsmaßnahmen Grundlegendes zu [Python-Codierungsstandards] PEP8 [Python] Class Inheritance (super) Verwendung der Super () - Funktion von Python Neu! Eltern-Kind-Beziehung des Maya-Fensters MayaQWidgetBaseMixin! [Python] if name == Was ist '__ main__':?
Recommended Posts