ON-BLOG

CGのこと、あれこれ書いてます。

Pyside勉強 その六

では次はもう少し実践を意識したツールを作ってみます。
前回のUIを意識して、リストに物を追加して
処理を行うものにします。
またボタンを追加して、リストに入っているものを
コンストレインレインを行う。といったツールにします。
細かい処理はいれないので、シンプルなものになるかな?

以下コード。

#-'''- coding: utf-8 -'''-
from PySide.QtCore import *
from PySide.QtGui import *
from maya.app.general import mayaMixin

class Ui_MainWindow(mayaMixin.MayaQWidgetBaseMixin,QDialog):

    def __init__(self, parent=None):
        super(Ui_MainWindow, self).__init__(parent)
        
        #全体のサイズ設定
        self.resize(500,400)

        #レイアウトを宣言
        #全体纏めるレイアウトAll_Layoutと、パーツまとめるレイアウトmain_layout
        self.All_Layout = QVBoxLayout()
        self.main_layout = QHBoxLayout()

        #左側のUI作成
        self.Source_0 = QPushButton("Add")
        self.Scroll_Sorce_List = QListWidget()
        self.Scroll_Sorce_List.resize(250,150)
        self.Left_layout = QVBoxLayout()
        self.Left_layout.addWidget(self.Source_0)
        self.Left_layout.addWidget(self.Scroll_Sorce_List)
        
        #右側のUI作成
        self.Source_1 = QPushButton("Add")
        self.Scroll_Sorce_List_02 = QListWidget()
        self.Scroll_Sorce_List_02.resize(250,150)
        self.Right_layout = QVBoxLayout()
        self.Right_layout.addWidget(self.Source_1)
        self.Right_layout.addWidget(self.Scroll_Sorce_List_02)
        
        #左右のパーツをメインレイアウトに追加
        self.main_layout.addLayout(self.Left_layout)
        self.main_layout.addLayout(self.Right_layout)
        #実行用のボタンを追加して、パーツをレイアウトに追加
        self.ExeButton = QPushButton("Exe")
        self.All_Layout.addLayout(self.main_layout)
        self.All_Layout.addWidget(self.ExeButton)
        #最後に大元のレイアウトに追加
        self.setLayout(self.All_Layout)
        
        self.Source_0.clicked.connect(self.Left_ADD)
        self.Source_1.clicked.connect(self.Right_ADD)
        self.ExeButton.clicked.connect(self.Exe)
        
    def Left_ADD(self):
        sel = cmds.ls(sl=True,type="transform")
        for i in sel:    
            self.Scroll_Sorce_List.addItem(i)

    def Right_ADD(self):
        sel = cmds.ls(sl=True,type="transform")
        for i in sel:
            self.Scroll_Sorce_List_02.addItem(i)
    
    def Exe(self):
        items = []
        items_02 = []                
        if not self.Scroll_Sorce_List.count() == self.Scroll_Sorce_List_02.count():
            print "Not Match"
        else:
            for index in xrange(self.Scroll_Sorce_List.count()):
                 items.append(self.Scroll_Sorce_List.item(index))
            for index in xrange(self.Scroll_Sorce_List_02.count()):
                 items_02.append(self.Scroll_Sorce_List_02.item(index))
            for i in xrange(len(items)):
                Left = items[i].text()
                Right = items_02[i].text()
                cmds.parentConstraint(Left,Right)


if __name__ == '__main__':
    form = Ui_MainWindow()
    form.show()

起動するとこんな感じ。
f:id:tommy_on:20190423215542p:plain

オブジェクトをAddボタンで足せます。
f:id:tommy_on:20190423215818p:plain

最後に下部のボタンを押すと、ペアレントコンストレイントが掛かります。
f:id:tommy_on:20190423215959p:plain

テコレになっていれば、複数も可能です。
逆にちぐはぐなリストだったら、エラーを返します。
チェックボックスとか付けると、リグなどに使えますね。
というか、これの拡張版を今使ってます。

さぁ。
細かく見ていくと、初期化部分の箇所から

self.resize(500,400)

この部分は、ウィンドウの全体サイズを指定しています。
XYとなるので、横500縦400のウィンドウサイズに変更しています。

self.All_Layout = QVBoxLayout()
 self.main_layout = QHBoxLayout()

コメントアウトにても記載していますが
All_Layoutが全体を縦で管理しているレイアウトで
main_layoutがパーツを纏めた横のレイアウトです。

イメージですが、こんな感じ。
f:id:tommy_on:20190423214536p:plain

図で見るとわかりやすいですね。

後は、図通りに追加するだけですね。
なので、次はボタン押したときの挙動の一部を…

self.Scroll_Sorce_List.addItem(i)
self.Scroll_Sorce_List_02.addItem(i)

変数iということは選択したものを
スクロールリストに追加するといった流れになります。
addItemって解りやすいっよね。

後は特に説明は入らない気がするので、割愛。

こんな感じで、PySideでUI組む流れになりました。
次は、Qtdesignerで作成されたUIをMAYAに持ち込んでみたいと思います。

以上です。