Help us understand the problem. What is going on with this article?

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

この記事の目的

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

ツール概要

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

プラグイン情報をリストしチェックを入れた情報のみ削除します。
listUnknownPlugins.gif

コード全文

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

詳細をみていく

プログラム途中の改行

        label = QtWidgets.QLabel(
            u'不明なプラグインのリストです。\n'\
            u'チェックを入れたプラグインを削除します。')

長いプログラムを改行する場合は'で閉じ、最後に\を入れる。次に行の開始にはuをつける。

ボタンの色を変える

        # ボタンのバックグラウンドカラーを変更
        button.setStyleSheet("background-color: red")

ボタンの色を赤に変更。他にも枠を変えたり色々できる模様。
今回は消す動作の注意喚起の意味も込めて赤に設定。

Qt Style Sheets Examples

Removeボタンの動作

    # 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を再取得、リスト内容を更新します。

アイテムにチェック項目を追加する

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

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

おわりに

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

elloneil
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした