Wir werden Ihr Verständnis vertiefen, während wir den Inhalt Ihrer eigenen Werkzeuge einzeln prüfen und für die zukünftige Werkzeugentwicklung verwenden. Ich verstehe sehr gut, 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. Diesmal sind PyQt, QTreeView und QStandardItemModel die wichtigsten.
Zeigt eine Liste der Notizen in der Szene an. Jeder Knoten hat ein Attribut namens Notes. Es gibt diese Funktion am unteren Rand des Attribut-Editors. Verwenden Sie sie? Wenn Sie hier eine Notiz hinterlassen, können Sie besser verstehen, was dieser Knoten tut. Ich benutze es oft, um Notizen für jeden Knoten in der Maya-Datei zu hinterlassen.
Ich konnte jedoch keine Möglichkeit finden, alle Notizen aufzulisten, und habe sie daher zu einem Werkzeug gemacht.
Zeigt alle Knoten in der Szene an, in denen Notizen verbleiben, z. B. ein GIF-Bild. Sie können Knoten auswählen und Notizen bearbeiten.
** Betriebsumgebung: Maya2019.3, Maya2020.1 ** Da ich Pyside2 verwende, wird es nicht vor 2016 funktionieren.
# -*- coding: utf-8 -*-
from maya.app.general.mayaMixin import MayaQWidgetBaseMixin
from PySide2 import QtWidgets, QtCore, QtGui
from maya import cmds
class Widget(QtWidgets.QWidget):
def __init__(self):
super(Widget, self).__init__()
#Rasterlayout erstellen
layout = QtWidgets.QGridLayout(self)
#Baumansicht hinzugefügt
treeView = TreeView()
layout.addWidget(treeView, 0, 0, 1, -1)
#Elementeinstellungen in der Baumansicht
self.stockItemModel = StockItemModel()
treeView.setModel(self.stockItemModel)
#Wählen Sie die Elementeinstellung in der Baumansicht
self.itemSelectionModel = QtCore.QItemSelectionModel(self.stockItemModel)
treeView.setSelectionModel(self.itemSelectionModel)
#Auswahlknopf
button = QtWidgets.QPushButton('Select')
button.clicked.connect(self.select)
layout.addWidget(button, 1, 0)
#Schaltfläche "Aktualisieren"
button = QtWidgets.QPushButton('Refresh')
button.clicked.connect(self.refresh)
layout.addWidget(button, 1, 1)
#Erstes Laden
self.refresh()
#Wählen Sie die Tastenbedienung
def select(self):
cmds.select(cl=True)
indexes = self.itemSelectionModel.selectedIndexes()
for index in indexes:
(node, notes) = self.stockItemModel.rowData(index.row())
cmds.select(node, noExpand=True ,add=True)
#Verhalten der Schaltfläche "Aktualisieren"
def refresh(self):
#Erstellen Sie ein leeres Wörterbuch
list = {}
#Holen Sie sich Attribute mit Notizen im Wörterbuch
for node in cmds.ls(allPaths=True):
if cmds.attributeQuery ('notes',node=node,exists=True):
list[node] = cmds.getAttr(node+'.notes')
#Leeren Sie das Artikelmodell
self.stockItemModel.removeRows(0, self.stockItemModel.rowCount())
#Fügen Sie Elemente aus dem abgerufenen Wörterbuch hinzu
for note in list:
self.stockItemModel.appendItem(note, list[note])
class TreeView(QtWidgets.QTreeView):
def __init__(self):
super(TreeView, self).__init__()
#Ändern Sie die Art der Auswahl (wie Excel)
self.setSelectionMode(QtWidgets.QTreeView.ExtendedSelection)
#Ändern Sie alternativ die Farbe der Zeilen in der Baumansicht
self.setAlternatingRowColors(True)
class StockItemModel(QtGui.QStandardItemModel):
def __init__(self):
super(StockItemModel, self).__init__(0, 2)
#Header-Einstellungen
self.setHeaderData(0, QtCore.Qt.Horizontal, 'Node Name')
self.setHeaderData(1, QtCore.Qt.Horizontal, 'Notes')
#Verhalten beim Bearbeiten
def setData(self, index, value, role=QtCore.Qt.EditRole):
if role:
#Bearbeiten Sie bearbeitete Daten
(node, attr) = self.rowData(index.row())
#Ändern Sie die Notes-Attribute
cmds.setAttr(node+'.notes', value, type='string')
#Bearbeiten Sie bearbeitete Elemente
self.item(index.row(), index.column()).setText(value)
#Erfolg melden
return True
#Knoten aus der angegebenen Zeile,Gibt attr zurück
def rowData(self, row):
#Holen Sie sich Knoten und Attribute
node = self.item(row, 0).text()
attr = self.item(row, 1).text()
return (node, attr)
#Fügen Sie einen Artikel hinzu
def appendItem(self, nodename, notes):
#Erstellen Sie einen Knoten, der nicht bearbeitet werden kann
nodeItem = QtGui.QStandardItem(nodename)
nodeItem.setEditable(False)
#Notizen können bearbeitet und erstellt werden
notesItem = QtGui.QStandardItem(notes)
notesItem.setEditable(True)
#Zeile hinzufügen
self.appendRow([nodeItem, notesItem])
class MainWindow(MayaQWidgetBaseMixin, QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle('List Notes')
self.resize(430, 260)
widget = Widget()
self.setCentralWidget(widget)
def main():
window = MainWindow()
window.show()
if __name__ == "__main__":
main()
Es sieht aus wie das. Es ist leicht zu verstehen, wenn Sie eine Konstruktionszeichnung zeichnen, um die Funktionsweise des Werkzeugs zu verstehen.
Siehe unten für den zuvor geschriebenen Teil. Ich werde über die neuen Artikel schreiben. [Maya Python] Crushing des Inhalts des Skripts 1 ~ Camera Speed Editor
#Baumansicht hinzugefügt
treeView = TreeView()
layout.addWidget(treeView, 0, 0, 1, -1)
Instanzieren Sie die TreeView () -Klasse und fügen Sie sie dem Rasterlayout hinzu. Das Anfangskapital des Klassennamens ist übrigens PEP8 Empfohlen. Der Klarheit halber unterscheide ich zwischen Klassennamen mit oberen Akronymen und Instanznamen mit unteren Akronymen.
Lassen Sie uns ein wenig springen, aber schauen Sie sich zuerst die TreeView-Klasse an.
class TreeView(QtWidgets.QTreeView):
def __init__(self):
super(TreeView, self).__init__()
#Ändern Sie die Art der Auswahl (wie Excel)
self.setSelectionMode(QtWidgets.QTreeView.ExtendedSelection)
#Ändern Sie alternativ die Farbe der Zeilen in der Baumansicht
self.setAlternatingRowColors(True)
Erben Sie QtWidgets.QTreeView in TreeView. Da es grundsätzlich so verwendet wird, wie es ist, gibt es nur wenige Override-Teile.
self.setSelectionMode(QtWidgets.QTreeView.ExtendedSelection)
Ändern Sie den Auswahlmodus.
Wenn Sie die Standardeinstellung beibehalten, können Sie nur eine auswählen. Ändern Sie sie daher so, dass Sie mehrere auswählen können. Mit "ExtendedSelection" können Sie fliegende Steine wie Excel auswählen.
self.setAlternatingRowColors(True)
Ändern Sie alternativ die Zeilenfarbe.
Eine solche Baumansicht wird mit zunehmender Menge schwer zu erkennen, daher ist es einfacher, sie mit einem Zebramuster zu sehen.
Auf diese Weise legt QTreeView das Erscheinungsbild und Verhalten der Baumansicht fest.
#Elementeinstellungen in der Baumansicht
self.stockItemModel = StockItemModel()
treeView.setModel(self.stockItemModel)
#Wählen Sie die Elementeinstellung in der Baumansicht
self.itemSelectionModel = QtCore.QItemSelectionModel(self.stockItemModel)
treeView.setSelectionModel(self.itemSelectionModel)
Instanzieren Sie die Klasse "StockItemModel ()" mit dem Namen "self.stockItemModel" Legen Sie das erstellte Element in der zuvor erstellten Baumansicht fest.
Verwenden Sie QtCore.QItemSelectionModel
und stellen Sie es so ein, dass Sie den Auswahlstatus von self.stockItemModel
erhalten.
Es ist nicht erforderlich, es zu erben und zu überschreiben. Verwenden Sie es daher als Instanz.
Setzen Sie "self.itemSelectionModel" auf "treeView" mit "setSelectionModel" als Auswahlmodell.
Schauen wir uns nun die Klasse "StockItemModel ()" an.
StockItemModel
class StockItemModel(QtGui.QStandardItemModel):
def __init__(self):
super(StockItemModel, self).__init__(0, 2)
#Header-Einstellungen
self.setHeaderData(0, QtCore.Qt.Horizontal, 'Node Name')
self.setHeaderData(1, QtCore.Qt.Horizontal, 'Notes')
Erben Sie "QStandarItemModel" als "StockItemModel". Stellen Sie den Header standardmäßig ein.
super(StockItemModel, self).__init__(0, 2)
Erstellen Sie bei der Initialisierung ein Elementmodell mit 0 Zeilen und 2 Spalten.
self.setHeaderData(0, QtCore.Qt.Horizontal, 'Node Name')
Erstellen Sie in Spalte 0 eine Kopfzeile mit dem Namen Knotenname.
self.setHeaderData(1, QtCore.Qt.Horizontal, 'Notes')
Erstellen Sie in der ersten Spalte eine Kopfzeile mit dem Namen Notes.
QtCore.Qt.Horizontal
ist die Ausrichtungseinstellung, hier ist es die Kopfzeile, geben Sie also die Horizontale an.
#Verhalten beim Bearbeiten
def setData(self, index, value, role=QtCore.Qt.EditRole):
if role:
#Bearbeiten Sie bearbeitete Daten
(node, attr) = self.rowData(index.row())
#Ändern Sie die Notes-Attribute
cmds.setAttr(node+'.notes', value, type='string')
#Bearbeiten Sie bearbeitete Elemente
self.item(index.row(), index.column()).setText(value)
#Erfolg melden
return True
Legen Sie fest, wie es sich beim Bearbeiten verhält.
index
gibt den bearbeiteten Speicherort an, value
gibt den bearbeiteten Inhalt an und role
gibt die Rolle an. Geben Sie das Format an, das für die Bearbeitung mit "QtCore.Qt.EditRole" geeignet ist.
Verwenden Sie aus der Zeile der bearbeiteten Daten die Klasse "rowData", um den Knoten "attr" abzurufen.
rowData
wird später beschrieben.
cmds.setAttr(node+'.notes', value, type='string')
Maya-Befehl. Reflektieren Sie die bearbeiteten Attribute auf dem Knoten.
self.item(index.row(), index.column()).setText(value)
Der bearbeitete Teil wird auch in den Elementen in der Baumansicht angezeigt.
Dies ist die Erklärung der rowData-Klasse, die zuvor veröffentlicht wurde.
#Knoten aus der angegebenen Zeile,Gibt attr zurück
def rowData(self, row):
#Holen Sie sich Knoten und Attribute
node = self.item(row, 0).text()
attr = self.item(row, 1).text()
return (node, attr)
Gibt den Wert als "node, attr" (Knotenname, Attributinhalt) aus der angegebenen Zeile zurück.
Die item
-Klasse kann Elemente von (Zeile, Spalte) abrufen.
Da es so wie es ist in Objektdaten konvertiert wird, wird es in eine Zeichenfolge mit ".text ()" konvertiert.
Erstellen Sie eine Funktion zum Hinzufügen von Elementen. Rufen Sie es danach über eine Schaltfläche oder ähnliches auf.
#Fügen Sie einen Artikel hinzu
def appendItem(self, nodename, notes):
#Erstellen Sie einen Knoten, der nicht bearbeitet werden kann
nodeItem = QtGui.QStandardItem(nodename)
nodeItem.setEditable(False)
#Notizen können bearbeitet und erstellt werden
notesItem = QtGui.QStandardItem(notes)
notesItem.setEditable(True)
#Zeile hinzufügen
self.appendRow([nodeItem, notesItem])
Fügen Sie ein Element aus dem Knotennamen Notes hinzu.
QtGui.QStandardItem (Knotenname)
Legt den Anzeigeinhalt des Elements fest.
Der Knoten "nodeItem.setEditable (False)" ist deaktiviert.
notesItem.setEditable (True)
Machen Sie Notizen bearbeitbar.
self.appendRow([nodeItem, notesItem])
Fügen Sie die Einstellungen der Zeile hinzu.
appendRow
ist eine Funktion von QStandardItemModel
.
Eine der Stärken von PySide ist, dass Sie diese Funktionen unverändert verwenden können.
#Auswahlknopf
button = QtWidgets.QPushButton('Select')
button.clicked.connect(self.select)
layout.addWidget(button, 1, 0)
#Schaltfläche "Aktualisieren"
button = QtWidgets.QPushButton('Refresh')
button.clicked.connect(self.refresh)
layout.addWidget(button, 1, 1)
Im Grunde ist es dasselbe wie Maya Python, das den Inhalt des Skripts 1 ~ Camera Speed Editor zerquetscht (https://qiita.com/elloneil/items/56591ab00c2a9b66ce2a). Schauen wir uns als nächstes den Inhalt der Schaltfläche an.
#Wählen Sie die Tastenbedienung
def select(self):
cmds.select(cl=True)
indexes = self.selItemModel.selectedIndexes()
for index in indexes:
(node, notes) = self.itemModel.rowData(index.row())
cmds.select(node, noExpand=True ,add=True)
cmds.select (cl = True)
Entfernt den aktuellen Auswahlstatus.
selectedIndexes ()
ist eine Funktion von QItemSelectionModel
, die eine Liste ausgewählter Indizes zurückgibt.
für Index in Indizes:
Wiederholen Sie dies für die ausgewählte Anzahl von Malen.
self.itemModel.rowData (index.row ())
Ruft den Knotennamen und die Notizen der ausgewählten Zeile ab.
Weitere Informationen finden Sie unter [Knoten und Attribut aus angegebener Zeile abrufen (rowData)](### Knoten und Attribut aus angegebener Zeile abrufen (rowData)).
cmds.select (node, noExpand = True, add = True)
Wählen Sie den erfassten Knoten zusätzlich aus.
Mit noExpand = True
können Sie einen Auswahlsatz anstelle eines Objekts im Auswahlsatz auswählen.
add = True
Wechseln Sie in den zusätzlichen Auswahlmodus.
#Verhalten der Schaltfläche "Aktualisieren"
def refresh(self):
#Erstellen Sie ein leeres Wörterbuch
list = {}
#Holen Sie sich Attribute mit Notizen im Wörterbuch
for node in cmds.ls(allPaths=True):
if cmds.attributeQuery ('notes',node=node,exists=True):
list[node] = cmds.getAttr(node+'.notes')
#Leeren Sie das Artikelmodell
self.stockItemModel.removeRows(0, self.stockItemModel.rowCount())
#Fügen Sie Elemente aus dem abgerufenen Wörterbuch hinzu
for note in list:
self.stockItemModel.appendItem(note, list[note])
for...
Listen Sie die Knoten mit Notizen im Wörterbuchformat auf.
self.stockItemModel.removeRows(0, self.stockItemModel.rowCount())
Löschen Sie aus der 0. Zeile in die Anzahl der Zeilen (self.stockItemModel.rowCount ()
).
self.stockItemModel.appendItem(note, list[note])
Fügen Sie Elemente aus dem abgerufenen Wörterbuch (Liste) hinzu.
Siehe das zuvor erstellte [Element hinzufügen (appendItem)](### Element hinzufügen (appendItem)).
#Erstes Laden
self.refresh()
Holen Sie sich Notizen, wenn Sie es das letzte Mal starten. Es hat das gleiche Verhalten wie [Aktualisieren](### Aktualisierungsschaltflächenverhalten), daher werden wir es wiederverwenden.
Diesmal gab es viele Beschreibungen von PyQt, aber es war ziemlich schwierig, Informationen online zu sammeln. Wenn die offizielle Dokumentation etwas leichter zu lesen ist. .. Aber ich habe das Gefühl, endlich ein wenig über die Verwendung von PySide gelernt zu haben.
Recommended Posts