yslog

ゆるめに技術ブログかきます。Maya_Python

MayaAPIのすゝめ 第3稿

MayaAPIのすゝめ 第3稿

早くも3回めとなりましたMayaAPIのすゝめ、今回もAPIではなくPySideの話です。
※次回はAPIに戻ります!

引き続き、ツールとしての現実的な実行速度を確保していきます。

さて前回では遅いQTableWidgetをView_Modelに置き換えて高速化を図りました。

TableWidget比で17倍とかなりの高速化を果たしましたが、ハイレゾなモデルのスキンウェイトを取り扱うにはまだ心もとない感じです。

低速な原因はQStandardItemModelを利用していることでした。
標準的な入出力を幅広くサポートしているためツールとしては不要な計算もされているようです。
今回はもっとプリミティブなクラス、QAbstractTableModelで置き換えて高速化を進めて行きます。
QAbstractTableModelはデータ管理クラスとしてはそのままでは使えません。
作りたいUIの仕様に合わせてカスタマイズしていく必要があります。

AbstractTableModelの実装サンプル

いろいろとできることがあるのですが、今回は導入ということでウェイトエディタに必要最小限な形で実装しました。
のがこちら↓

QAbstractTableModel Sample

初見だと??ってなると思うので(なりました
一つづつメンバ関数を見てみましょう。

 

・__init__(self)

コンストラクタ。
受け取った引数をひとまずメンバ変数に格納しておきます。


・headerData(self)※オーバーライド

ヘッダーの色やテキストを設定します。

ロールがQt.DisplayRoleならテキストを返すことで表示文字列を指定。
Qt.BackgroundRoleやQt.ForegroundRoleならQColorを返してやることで色を変更できたりもします。

・rowCount(self)※オーバーライド

全体の行数を返しておきます

・columnCount(self)※オーバーライド

全体の列数を返しておきます

・data(self)※オーバーライド

ここが表示データのすべて。

インデックスとロールに応じて適宜値やQColor、アラインメント等を返してやります。

・setData(self)※オーバーライド

テーブルが入力編集されたときの挙動を設定。

UI側のクラスにデータ変更をお知らせするためにdataChangedシグナルを忘れず送出してあげましょう。

・flags(self)※オーバーライド

セルごとに編集可否、選択可否、有効無効を設定してやります。
空セルや選択させたくないセルを指定したい場合には条件分岐してやりましょう。

・get_data(self)

こちらは今回唯一オーバライドでない独自実装。

UI側からデータを取り出したいときに使ってます。

といった感じで基本実装完了。

ツールに組み込んだ形はこんな感じになってます。

Sample Editor 4 MayaAPI2.0 + QTableView + QAbstrac ...

 速度計測

さっそく速度計測してみましょう✧+(0゚・∀・) + wktk

今回も引き続きXSI男さん(3段階変身)にご協力いただきます。

f:id:ys_45:20190420222104p:plain

前回の計測ではXSI_男_Perfectでテーブル表示に約2.8秒ほどかかってしまってました。

f:id:ys_45:20190418220257p:plain

同じモデルで今回は

f:id:ys_45:20190420222727p:plain

なんと約7ms!!
StandardItemModel比で400倍ほど早くなりました!

QTableWidgetと比べると6800倍!
これは余裕でヒャッハーできるレベルです。

複雑な処理をしてない分SIWeightEditorよりもはやいですね。

データ取得~テーブル表示までで合計約0.18sec

SIWeightEditorでは約0.32secでした。

試しにXSI男Ultimet(約81500頂点)でも試してみましょう。

f:id:ys_45:20190420223232p:plain

なんとそれでも0.023sec!

データ取得と合わせても0.65secほどです。
これは勝つりましたね。

これで速度面の憂いは絶たれました。

次回はMayaAPIに戻り機能面の拡張をしていきます。
APIで問題になるのがUndoRedoの実装。
こちらはコマンドをプラグイン化し、UndoRedoする仕組みを構築してやる必要があります。
サンプルを例にウェイト値のUndoRedoのデータ管理方法について触れて行きたいと思います。

ではでは今回はこの辺で。