[Maya Python] Crush den Inhalt des Skripts 2 ~ Liste Notizen

Zweck dieses Artikels

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.

Werkzeugübersicht

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.

listNotes.gif 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.

Vollständiger Code

# -*- 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()

Werkzeugkonstruktionszeichnung

listNotes.jpg

Es sieht aus wie das. Es ist leicht zu verstehen, wenn Sie eine Konstruktionszeichnung zeichnen, um die Funktionsweise des Werkzeugs zu verstehen.

Siehe Einzelheiten

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

Einstellungen für das Erscheinungsbild der Baumansicht (QTreeView)

		#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.

Hinweis zum Qt-Auswahlmodus

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.

ListNotes_TreeView.jpg Auf diese Weise legt QTreeView das Erscheinungsbild und Verhalten der Baumansicht fest.

Festlegen von Elementen in der Baumansicht (StockItemModel, QItemSelectionModel)

		#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

Initialisierung, Header-Einstellung (init)

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.

Stellen Sie den Vorgang beim Bearbeiten ein (setData)

	#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.

Abrufen von Knoten und Attributen aus der angegebenen Zeile (rowData)

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.

Element hinzufügen (appendItem)

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.

Eine Schaltfläche erstellen

		#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

	#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"

	#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

		#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.

abschließend

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.

Referenzliste

Recommended Posts

[Maya Python] Crush den Inhalt des Skripts 2 ~ Liste Notizen
[Maya Python] Crush den Inhalt des Skripts 3 ~ Liste unbekannter Plugins
[Maya Python] Zerquetsche den Inhalt des Skripts 1 ~ Camera Speed Editor
Vorlage des Python-Skripts zum Lesen des Inhalts der Datei
Informationen zur Grundlagenliste der Python-Grundlagen
Python-Skript, das den Inhalt zweier Verzeichnisse vergleicht
Notizen vom Anfang von Python 1 lernen
Notizen vom Anfang von Python 2 lernen
[Python] Ein Programm, das den Inhalt der Liste nach links dreht
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
[Python] Checklistenelemente alle, alle
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Der Inhalt des Python-Tutorials (Kapitel 5) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 4) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 2) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 8) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 1) ist in einem Aufzählungszeichen zusammengefasst.
Kopieren Sie die Liste in Python
Der Inhalt des Python-Tutorials (Kapitel 10) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 6) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 3) ist in einem Aufzählungszeichen zusammengefasst.
Liste der Python-Module
Python-Skript zum Abrufen einer Liste von Eingabebeispielen für den AtCoder-Wettbewerb
[Python] Ruft die Liste der im Modul definierten Klassen ab
Holen Sie sich den Rückkehrcode eines Python-Skripts von bat
Den Inhalt der Daten in Python nicht kennen
[Python] Ruft die Liste der ExifTags-Namen der Pillow-Bibliothek ab
[Python] Gibt alle Kombinationen von Elementen in der Liste aus
Auf dem Weg zum Ruhestand von Python2
[Python] Kopie einer mehrdimensionalen Liste
Über die Funktionen von Python
Simulation des Inhalts der Brieftasche
Die Kraft der Pandas: Python
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
Holen Sie sich die Anzahl der spezifischen Elemente in der Python-Liste
26.11.2015 Python> Funktionsliste des Moduls anzeigen> Mathematik importieren> Verzeichnis (Mathematik)
So verbinden Sie den Inhalt der Liste mit einer Zeichenfolge
Verarbeiten Sie den Inhalt der Datei der Reihe nach mit einem Shell-Skript
Die Geschichte von Python und die Geschichte von NaN
[Python] Der Stolperstein des Imports
Erster Python 3 ~ Der Beginn der Wiederholung ~
[Python] Zeigt nur die Elemente der Liste nebeneinander an [Vertikal, horizontal]
[Python, Ruby] Selen-Holen Sie sich Webseiteninhalte mit Webdriver
[Python] [Inhaltsverzeichnis Links] Python-Programmierung
pyenv-change die Python-Version von virtualenv
Geben Sie den Inhalt von ~ .xlsx im Ordner mit Python in HTML aus
Holen Sie sich den Skriptpfad in Python
[Python] Ermittelt den Rang der Werte in der Liste in aufsteigender / absteigender Reihenfolge
Siehe den Inhalt von Kumantic Segumantion
[Python] Die potenzielle Feldplanung von Python Robotics verstehen
Überprüfung der Grundlagen von Python (FizzBuzz)
Python Hinweis: Map - Machen Sie dasselbe für jedes Element der Liste
Erste Schritte mit Python3
Liste der Katastrophenfälle der Feuerwehr von Sapporo City [Python]
Lernen Sie die Grundlagen von Python ① Grundlegende Anfänger
Python> sys.path> Liste der Zeichenfolgen, die den Pfad für die Suche nach Modulen angeben
Erhalten Sie eine Liste der Ergebnisse der Parallelverarbeitung in Python mit Starmap