Reading PyMEL: ex01. ノード周り書いてみた
Reading PyMEL: 02. createFunctions
前回の記事で "import pymel.core as pm" はなぜ遅いのか? を書いたので、ここをもうちょっと深堀りしてみる。
pm.polyCube() みたいに、PyMEL はなぜ MEL コマンドを直接呼ぶことができて、しかも返り値を PyNode で受けとれるのか?
- PyMEL 経由でコマンドを叩くと何が起きるのか?
- newFuncWithReturnFunc
- createFunctions
- CmdCache
- コマンド名と maya.cmds 内の関数との紐付け
- MEL コマンドの実体
- DLL 遅延ロード
- stubFunc
- コマンドの引数と返り値の PyMEL-friendly にする
- wrappedCmd
Reading PyMEL: 01. PyNode
ふと思い立ってコードを読んでみることにした。
github.com
まずは pymel.core.PyNode から。
意外と複雑だし、ちゃんと読んだことのある人ってそんなに多くはないんじゃなかろうか。
- PyNode の機能
- シーン内オブジェクトへのアクセス
- ノードの作成
C#とPythonからC++を叩いてみる。
たとえば Unity と Maya の両方で同じロジックを使いたい場合、C# と Python で同じものを実装するのはとてもだるいので、C++ で書いてから共有できるようにしてみた。
GitHub - hal1932/DllExportTest
この手のことをやるときは基本的には SWIG で全然問題ないんだけど、あれはあれで面倒*1なので手動でやる方法を整理しておくのも悪くないとは思う。
- 仕組み
- C++
- DLLエクスポート宣言
- 関数の呼び出し規約
- クラス定義
- C#
- DLL のロードとアンロード
- 関数呼び出し
- 引数と戻り値
- コールバック関数
- メモリ領域のやりとり
- Python
- DLL のロードとアンロード
- 関数呼び出し
- 引数と戻り値
- コールバック関数の定義
- メモリ領域のやりとり
- スレッド周りの扱い
*1:例えば生成した Python モジュールを Maya で使いたい場合、mayapy を使って pyd を作ってやる必要があったりして無駄に汎用性を落とすことになる。ctypes 直叩きだと依存先に Maya が含まれないはずだからちょっとだけ嬉しい。
PySide ウィンドウに大量の画像を表示する
PySideのThread使って謎の異常終了で悩まされたので色々と調べ直した
— あんどうめぐみ@れみりあ (@fereria) 2019年8月18日
参照渡しィィィ!!!https://t.co/TB7JtgQc5G
そういや PySide でスレッド周りあんまやったことないなぁ……と思ってやってみた。
お題はアセットブラウザとかでよくあるサムネ画像の一覧表示。
おおよそ悪くないとこまでいけたので、主にパフォーマンス周りについてメモっておく。
コードはこちら → py3_test/thread_pool_test.py at master · hal1932/py3_test · GitHub
- 概要
- Thread と ThreadPool
- スレッド間の役割分担
- QImage と QPixmap
- 雑多な話題
Maya 用 PySide メインウィンドウの雛形。
ホリデープログラミング向けの Maya メインウィンドウの雛形を晒してみる。
ちょいちょい雑な実装もしてるけど、まぁそこはあくまで個人開発のテスト向け*1ってことで。
maya_test/maya.py at master · hal1932/maya_test · GitHub
- ライブラリコード
- findChildren() を使わない多重起動防止
- UI を動的に再構築するための一番楽な実装
- QApplication 生成ロジックの隠蔽
- QApplication の初期化と QMainWindow の初期化を分離
- ユーザーコードの例
*1:そもそも業務で実戦投入してるコードをこんなとこで晒すわけにはいかない。ほんとはそっちを出したいんだけど……。
PySide で多言語対応してみる。
maya_test/main_window.py at master · hal1932/maya_test · GitHub
そのうち必要になる気がするので手順をメモっておく。
- Qt Linguist のインストール
- 多言語対応の UI を組む
- pyside-lupdate
- 言語の反映
- 動的な言語切り替え