AETemplate(Python版)

めも。

AETemplateのPython版記述。
Mayaインストール先の devkit\other\pymel\examples\AETemplates.py がサンプル。
コードを見た通り、pymelが使われている。

How to add custom attribute to AETemplate with python?
OpenMaya/src/mayaToCorona/mtco_devmodule/scripts/Corona/AETemplate/AECoronaSurfaceTemplate.py

別の実装を見ても分かる通り、pymel.core.ui.AETemplateを継承して基本になるクラスを定義。
※devkit内の実装には _applyLocalizationメソッドが入っていて、表示文字列のローカライズ対応も考慮してる。

このクラスを継承して、テンプレート実装を書いていく。
※devkit内の実装では テンプレート適用時の初期化処理と、アトリビュートエディタのUI実装が別クラスになっているけど、別にそんな必要はないらしい。AECoronaSurfaceTemplate.pyでは、UI実装とテンプレート適用時の初期化処理はひとつのクラス内で処理している。

テンプレートの初期化実装は、こんな感じ。
mel.beginScrollLayout ~ self.endScrollLayout メソッドまでが、mel版のAETemplateの「global proc AE~Template( string $nodeName )」というプロシージャ定義に対応。
LocalizedTemplate.__init__ メソッドは、ローカライズ文言の読み込み。
mel.AEswatchDisplay メソッドは、名前通りシェーダの系統の冒頭に表示される画像のスウォッチ表示のテンプレート呼び出し。

UI実装は、ノードによりけりになると思うので、参考になるのかいまいち不明。
お作法に従うなら、初期化処理で読んでいる buildbodyメソッドを __init__メソッドとは分けて書いておこう。ということくらいか。
※書き方はAETemplate(mel版)の書き方を覚えないと例が少なくて大変だと思う。melで覚えたら、Python側はそれに対応する形で書かれている感じ。

AETemplateの基礎

めも。

Intro to AETemplates
Google翻訳版

英語なんで、掻い摘んで列挙しておく。

AETemplateの基礎的なことが書かれている。

まず、最低限の定義内容。

上記のままだと、実際のノードを表示した場合に、アトリビュートが馬鹿みたいに大量に列挙されて非常に見づらい状態になる。
それを避けるには、必要なものに限って表示させる必要がある。

“transform”ノードタイプの場合の、基礎的な定義内容。

「stringAttr, enumAttr, numAttr」のコントロールを追加してみる。
※個々の項目名の項目が、アトリビュートエディタの冒頭に追加される。
※当たり前だけど、追加するアトリビュートが存在しなければ項目追加もされない。(例の場合、stringAttr, enumAttr, numAttrという名称のアトリビュートが存在する前提。)

追加部分をカスタマイズする方法の例。
※ stringAttrを “TXT:”という項目名に変更。
※ numAttrを “NUM:”という項目名に変更。

enumのコントロールのカスタマイズはやや複雑で、editorTemplate -callCustom フラグで動作を指定する必要がある。

対応するプロシージャは、こんな感じで。

 根本的には、ノードを自分で作った場合に威力を発揮する機能なので、まずはノードを作ってみないとピンとこない気がする。
 あとは、どうしてもビルトインでMayaのUIに既存ノードの編集を楽にする機能を盛り込みたい場合か…

 テンプレートの定義自体は、起動時にstartup処理の一環として読み込まれるものなので、定義を変更した場合は再起動しないとダメかも。
 (※melのrehashで再定義できれば…と思ったけど、どうもダメっぽい。)

そもそもAETemplateとは

 素朴な疑問というか、本当の初心者には「なんのことやら?」という部分。
 これを知るには「ノード」の概念を知る必要があります。(これについては、マヤ道!!を読むのも良いですね。)

 Mayaの管理している情報は、基本的にノード(Node)と呼ばれる情報の単位を持っています。
 名前、位置、向き、サイズ、色、形状…等々、Mayaが扱う情報はいろいろありますが、これらを利用するニーズに合わせた情報単位に構成したものをノードとして管理、使用します。
 例えば画面にポリゴンを表示する時も、transform&meshノードが作成されますし、ポリゴンもMayaで機械的に生成したものであれば、polyPlane, polySphere, polyBoxのように利用した機能に対応するノードが付随します。これらがノードです。

 AETemplateは、これらノードが保持している多数のアトリビュートのうち、ユーザーが編集に必要な要素をMayaのUI上で確認したり編集したりする為に必要な設定です。
 polyPlaneには、AEpolyPlaneTemplate.melというテンプレートがあります。
定義は、以下の通り。

 
 幅、高さ、分割数(幅・高さ)、UV生成の設定、texture要素の抑止、polyPrimitiveテンプレートの参照指定が入っています。
 ※polyPrimitiveテンプレートには、axis項目が定義されています。

 このように、ユーザがノード編集に必要な項目を定義するのがAETemplateです。
 この設定は melで書かれているので、ユーザー側でカスタマイズすることも出来ますし、新しく自分でノードを作成(pluginを用意)した場合にはその為の定義を新しく書くことも出来るようになっています。

AETemplateフォルダの .res.melファイル

めも。

startupフォルダにある、~.mel と ~.res.melの関係とか?【わかってないところアリ版】

要は、displayString コマンドがキモ。「m_AEtransformMain.kTransformAttributes」みたいな定義済名称をキーに、それに対応する項目名の表記を辞書式に取り出す為の仕組み。
uiRes 関数が定義されていて、実処理内からはこれで辞書から表示文字列を取り出す。

listHistoryは、基本的にDGノードの連なりを列挙するもの

 ヘルプには、小難しく「コンストラクション ヒストリがあるすべてのノードを返します。コンストラクション ヒストリは、クリエータとして定義されているノードの特定アトリビュートへの接続、および NURBS カーブ ノードのカーブなど、ノードのメイン データの結果から構成されます。」とか書かれていて、非常に判り辛い。。

 おおまかに、下記のように考えた方が良いのでは??(厳密さが必要になったら、いろいろあるとは思うけど)

DGは、ディペンデンシグラフ
※対義語的に、DAG(directed acyclic graph : 有向非循環グラフ)があって、要はTransformノードのこと。

 
 ちなみに、listHistoryは Transformノードのコネクションは追ってくれない。