【Maya Python】スクリプトの中身を噛み砕く3 ~List unknownPlugins編


#この記事の目的
自作ツールの中身を一つ一つ確認しながら理解を深め、今後のツール開発に役立てます。
下記シリーズの続きです。1,2と重複する部分は省略します。

- [【Maya Python】スクリプトの中身を噛み砕く1 ~カメラスピードエディタ編](https://qiita.com/elloneil/items/56591ab00c2a9b66ce2a)
- [【Maya Python】スクリプトの中身を噛み砕く2 ~list Notes編](https://qiita.com/elloneil/items/b84d39767760086f48a7)


#ツール概要
シーンに保存されているプラグイン読み込み情報を削除します。
妙にファイル読み込みに時間がかかる場合試してみてください。

プラグイン情報をリストしチェックを入れた情報のみ削除します。
![listUnknownPlugins.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507736/8ec0800c-8568-540e-0d8d-8aa5fbb4e459.gif)


#コード全文
```python
# -*- 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__()
		
		layout = QtWidgets.QGridLayout(self)

		label = QtWidgets.QLabel(
			u'不明なプラグインのリストです。\n'\
			u'チェックを入れたプラグインを削除します。')
		layout.addWidget(label, 0, 0)
		
		treeView = TreeView()
		layout.addWidget(treeView, 1, 0, 1, 2)
		
		self.standardItemModel = StandardItemModel()
		treeView.setModel(self.standardItemModel)
		
		button = QtWidgets.QPushButton('Refresh')
		button.clicked.connect(self.refresh)
		layout.addWidget(button, 2, 0)
		
		button = QtWidgets.QPushButton('Remove')
		# ボタンのバックグラウンドカラーを変更
		button.setStyleSheet("background-color: red")
		button.clicked.connect(self.remove)
		layout.addWidget(button, 2, 1)
		
		self.refresh()
		
	# Refreshボタンの動作
	def refresh(self):
		self.standardItemModel.removeRows(0, self.standardItemModel.rowCount())
		
		# unknownPluginをリスト
		unknownPluginList = cmds.unknownPlugin(q=True,list=True)

		# unknownPluginがなければFalseを返す
		if not unknownPluginList:
			return False
		
		# アイテムにunknownPluginを追加
		for name in unknownPluginList:
			self.standardItemModel.appendItem(name)

		return True

	# Removeボタンの動作
	def remove(self):
		# rowカウントを取得
		count = self.standardItemModel.rowCount()

		# rowカウント分繰り返す
		for num in range(count):
			# チェック状態と名前を取得
			(check,name) = self.standardItemModel.rowData(num)

			# チェックされていればunknownPluginを消す
			if check:
				cmds.unknownPlugin(name,remove=True)
				print (u'deleted %s\n'%(name)),
		
		# リスト内容を更新
		self.refresh()
		
		
class TreeView(QtWidgets.QTreeView):
	def __init__(self):
		super(TreeView, self).__init__()		
		self.setSelectionMode(QtWidgets.QTreeView.ExtendedSelection)
		self.setAlternatingRowColors(True)
		# ソートできるように変更
		self.setSortingEnabled(True)

		
class StandardItemModel(QtGui.QStandardItemModel):
	def __init__(self):
		super(StandardItemModel, self).__init__(0, 1)
		self.setHeaderData(0, QtCore.Qt.Horizontal, 'Plugin Name')
	
	def appendItem(self, name):		
		standardItem = QtGui.QStandardItem()
		standardItem.setText(str(name))
		standardItem.setEditable(False)
		# チェック項目を追加
		standardItem.setCheckable(True)
		# チェック状態にする
		standardItem.setCheckState(QtCore.Qt.Checked)
		
		self.appendRow([standardItem])
	
	def rowData(self, index):
		check = self.item(index, 0).checkState()
		name  = self.item(index, 0).text()
				
		return (check,name)	


class MainWindow(MayaQWidgetBaseMixin, QtWidgets.QMainWindow):
	def __init__(self):
		super(MainWindow, self).__init__()

		self.setWindowTitle('List Unknown Plugins')
		self.resize(430, 260)

		widget = Widget()
		self.setCentralWidget(widget)


def main():
	window = MainWindow()
	window.show()
	
if __name__ == "__main__":
	main()

```

#詳細をみていく

###プログラム途中の改行
```python
		label = QtWidgets.QLabel(
			u'不明なプラグインのリストです。\n'\
			u'チェックを入れたプラグインを削除します。')
```
長いプログラムを改行する場合は`'`で閉じ、最後に`\`を入れる。次に行の開始には`u`をつける。

###ボタンの色を変える
```python
		# ボタンのバックグラウンドカラーを変更
		button.setStyleSheet("background-color: red")
```
ボタンの色を赤に変更。他にも枠を変えたり色々できる模様。
今回は消す動作の注意喚起の意味も込めて赤に設定。
>[Qt Style Sheets Examples](https://doc.qt.io/qt-5/stylesheet-examples.html)

###Removeボタンの動作

```python
	# Removeボタンの動作
	def remove(self):
		# rowカウントを取得
		count = self.standardItemModel.rowCount()

		# rowカウント分繰り返す
		for num in range(count):
			# チェック状態と名前を取得
			(check,name) = self.standardItemModel.rowData(num)

			# チェックされていればunknownPluginを消す
			if check:
				cmds.unknownPlugin(name,remove=True)
				print (u'deleted %s\n'%(name)),
		
		# リスト内容を更新
		self.refresh()
```

rowの数を取得し、`range`を使い、カウントアップ処理します。
countが5の場合、`range(count)`は`0,1,2,3,4`となり、各row番号から`check,name`を取得します。
checkがTrueならプラグイン情報を削除し、プリントします。

一通り処理したら`self.refresh`でunknownPluginを再取得、リスト内容を更新します。

###アイテムにチェック項目を追加する
```python
		# チェック項目を追加
		standardItem.setCheckable(True)
		# チェック状態にする
		standardItem.setCheckState(QtCore.Qt.Checked)
```

アイテムにチェック項目を追加して、チェックできるようにします。
`QStandardItemModel`はアイテムごとにチェックボックスを追加できたり便利ですね。


#おわりに
今回は下記で作成したスクリプトの流用、一部改変で作成しました。
このようにPySideでUIを作っておけば中身は一部変更のみで様々なスクリプトが作れるようになります。
MayaでPythonスクリプトを作る際は、ぜひPySideでUIを作成してみてください。


- [【Maya Python】スクリプトの中身を噛み砕く1 ~カメラスピードエディタ編](https://qiita.com/elloneil/items/56591ab00c2a9b66ce2a)
- [【Maya Python】スクリプトの中身を噛み砕く2 ~list Notes編](https://qiita.com/elloneil/items/b84d39767760086f48a7)