2020年7月6日月曜日

自作ツールをドッキングさせる。その4

最後に scriptedPanel について。
このコマンド自体はドッキングと関係ないのですが、いろいろ調べている時に目についたので、ついでに紹介してみようと思います。


まず、このscriptedPanelコマンドを使う前に、scriptedPanelTypeコマンドで、コールバックを設定する必要があります。そこもふまえて、サンプルコードにはこんなのが載っています。
// This second example shows how to use the saveState and copyState callbacks.
// saveStateCallback enables a panel to restore its state from a saved scene file.
// copyStateCallback enables a 'tear off copy' of a panel to copy its state from the original.
// print statements have been left in as an instructional aid - you would remove these in a
//    real use case.

global proc meCreateCallback(string $panelName) {
// Create callback: create the editor.
print( "create " + $panelName + "\n" );
    string $me = $panelName + "_me";
    $me = `modelEditor -unParent $me`;
    modelEditor -e -da "smoothShaded" -wos 1 $me;
}

global proc meInitCallback(string $panelName) {
// Init callback: allow re-initialisation (not used here).
print( "init " + $panelName + "\n" );
}

global proc meAddCallback(string $panelName) {
// Add callback: add editor into a panel layout.
// In this example we add a formLayout and two buttons,
// allowing the user to change the "wireframe on shaded" mode of the viewer.
print( "add " + $panelName + "\n" );
    string $me = $panelName + "_me";
    string $layout = `formLayout`;
    modelEditor -e -parent $layout $me;
    string $cmd = "modelEditor -e -wos 1 " + $me;
    string $wos1 = `button -parent $layout -label "WOS 1" -c $cmd`;
    $cmd = "modelEditor -e -wos 0 " + $me;
    string $wos0 = `button -parent $layout -label "WOS 0" -c $cmd`;
    formLayout -e -af $wos1 "top" 0 -af $wos1 "left" 0 $layout;
    formLayout -e -af $wos0 "left" 0 -ac $wos0 "top" 0 $wos1 $layout;
    formLayout -e -af $me "top" 0 -af $me "bottom" 0 -ac $me "left" 5 $wos1 -af $me "right" 0 $layout;
}

global proc meRemoveCallback(string $panelName) {
// Remove callback: unparent the editor from the layout.
print( "remove " + $panelName + "\n" );
    string $me = $panelName + "_me";
    modelEditor -e -unParent $me;
}

global proc meDeleteCallback(string $panelName) {
// Delete callback: delete the editor.
print( "delete " + $panelName + "\n" );
    string $me = $panelName + "_me";
    deleteUI $me;
}

global proc string meSaveStateCallback(string $panelName) {
// Save state callback: return a MEL command string that will restore the state of a recreated panel.
print( "save state " + $panelName + "\n" );
    string $me = $panelName + "_me";
    int $wos = `modelEditor -q -wos $me`;
    return "modelEditor -e -wos " + $wos + " " + $me;
}

global proc meCopyStateCallback(string $panelName, string $newPanelName) {
// Copy state callback: copy the editor's state to the new instance of the panel type.
print( "copy state " + $panelName + ", " + $newPanelName + "\n" );
    string $me = $panelName + "_me";
    string $newMe = $newPanelName + "_me";
    int $wos = `modelEditor -q -wos $me`;
    modelEditor -e -wos $wos $newMe;
}

// Create the scripted panel type.
string $spType = `
scriptedPanelType
    -ccb meCreateCallback
    -icb meInitCallback
    -acb meAddCallback
    -rcb meRemoveCallback
    -dcb meDeleteCallback
    -scb meSaveStateCallback
    -ocb meCopyStateCallback
    meSpType
`;
print( "type is " + $spType + "\n" );
// As a test, create a window containing an instance of our new panel type.
// This panel will then be selectable from the Panels menu of any other panel.
// You can also create new instances of the scripted panel type via the Panel Editor,
// which again is available from the Panels menu of all panels.
window;

string $form = `formLayout`;
string $p = `scriptedPanel -type $spType -label "test panel"`;
formLayout -e -af $p "top" 0 -af $p "bottom" 0 -af $p "left" 0 -af $p "right" 0 $form;
showWindow;

スクリプトエディタで実行すると、こんなウィンドウが2つ出てきます。

最初の方の global procは、70行目からの scriptedPanelTypeで宣言しているコールバック用です。
88行目の scriptedPanelコマンドで、scriptedPanelTypeを配置していますね。
配置と同時に、scriptedPanelTypeの-acbフラグで指定された meAddCallbackが実行され、スライダーやラジオボタンが作られます。

で、次のコードを実行するとウィンドウの内容が入れ替わります。
scriptedPanel -e -unParent sampleScriptedPanel;
scriptedPanel -e -parent "sampleWin2|frm" sampleScriptedPanel;


元に戻すには、こんなコード。
scriptedPanel -e -unParent sampleScriptedPanel;
scriptedPanel -e -parent "sampleWin|frm" sampleScriptedPanel;

かなり手軽に入れ替えられ、コールバックを設定すれば、初期化や設定値の保存、レイアウトの保存などいろいろなことが出来ます。まぁ、windowコマンドやdockControlコマンドでも可能ですが、コマンドヘルプを読むと、それらよりも細かく設定できる感じ。

レイアウトを作成するのは、createCallbackではなく addCallback のプロシージャというのが少しややこしいかも。

サンプルだけでは分かりづらいので、実際使っているmayaのエディタを参考にするのが手っ取り早いのかもしれません。
いろいろソースを見た感じでは、hyperShadePanel.melを解析するのが一番参考になりました。

複雑なので、実際使ってツールを作ることは無いかもしれないです。

0 件のコメント:

コメントを投稿