2017年3月30日木曜日

warningとerrorにオプションが新設されたみたい

なんか、warningerror に新しいオプションが追加されたようです。

まずは通常の動作。

上のように、スクリプトエディタの History でエラー時ライン番号を表示する設定をしている場合に、下のスクリプトを実行すると、

global proc assert()
{
    warning "warning:hogehoge";
    error "error:hogehoge";
    print "hogehoge";
}




こんな風に、スクリプトのパスと行番号に続いてメッセージが表示されます。

で、このスクリプトパスと行番号を出さないようにする為に、今まではひと手間かけていました。

こんな感じ。
global proc assert2()
{
    int $buf=`commandEcho -q -ln`;
    commandEcho -ln off;
    
    warning "warning:hogehoge";
    catch(`error "error:hogehoge"`);
    
    commandEcho -ln $buf;
    print "hogehoge";
    
}



commandEcho というのが Line number in errors のこと。
3行目でバッファリングしておいて一旦オフにします。
error コマンドでスクリプトが停止してしまわないように catch も使用しています。
コレを実行すると Line number in errors にチェックが入っていても、スクリプトパスと行番号が表示されなくなります。

catch のおかげで print コマンドも実行されていますね。
ま、意外と面倒です。

で、warningerror に新しく追加されたオプション。
-noContext(-n) 警告メッセージにコンテキスト情報を出さないようにできるらしい。
これを使ってみます。

global proc assert3()
{
    warning -noContext "warning:hogehoge";
    error -noContext "error:hogehoge";
    print "hogehoge";
    
}



その結果、

commandEcho の操作をしなくても行番号が表示されなくなりました!
さすがに error コマンドはスクリプトが止まってしまうので catch は使用しないと駄目ですが、便利かも。



2017年3月28日火曜日

回転順序を文字列で指定する

リグを組んでいる時、けっこう回転順序を変更したりするのですが、指定方法が数値なんですよね~。
いちいちアトリビュートを変更してログから調べたりするのは面倒です。
なので"zxy"みたいな文字列で変更するスクリプトを作成します。

trySetRotateOrder.mel
global proc trySetRotateOrder(
    string $node,                       // ノード名
    string $order )                     // 回転順序
{
    if(!`attributeExists "ro" $node`) return;
    $order=tolower( $order );
    
    int $ro;
    switch( $order )
    {
    case "xyz": $ro=0; break;
    case "yzx": $ro=1; break;
    case "zxy": $ro=2; break;
    case "xzy": $ro=3; break;
    case "yxz": $ro=4; break;
    case "zyx": $ro=5; break;
    default: $ro=-1; break;
    }
    if( $ro<0 ) return;
    
    evalEcho("setAttr "+$node+".rotateOrder "+$ro);
    
}


ノード名と回転順序を渡すと指定した回転順序を設定します。

6行目で小文字に変えているので大文字を渡すなどしても問題ないはず。

ノードに rotateOrder のアトリビュートが無かったり、回転順序が "xyz","yzx","zxy","xzy","yxz","zyx" 意外だと無反応です。

21行目の evalEcho は普通に eval で良いかも・・・。


2017年3月23日木曜日

Doxygenでローカルプロシージャを隠す

Doxygenの特殊コマンドを眺めていてローカルプロシージャを隠せそうなコマンドを見つけたのでテスト。

ローカルプロシージャを使っているMELのサンプルは、カーブポイントの座標を表示するのスクリプトを使ってみます。

使うコマンドは@private
保護レベルをサポートしていない言語向けのコマンドらしいです。

proc string _round(
       int $digit,                      //!< 区切る桁数
    string $mode,                       //!< 出力モード
     float $value )                     //!< 区切る値
/**************************************************************************//**
    @private
    @brief 指定の桁数で四捨五入する。
    @return 四捨五入  [string型] を返す。
 ******************************************************************************/
{
    float $mlt=pow( 10, $digit );

tryPrintCurvePointPositions.melから抜粋

こんな感じで、隠したいプロシージャに記述しておくと、
こんな風に、出力されたドキュメントには _round() のローカルプロシージャが表示されなくなります。
このコマンドが書かれているブロック単位で消してくれるようですね。


で、リファクタリングなんかする場合にはローカルプロシージャも確認したくなるので、そんな時には Export - Build EXTRACT_PRIVATE にチェックを入れて出力します。

すると今度は、こんな感じでローカルプロシージャも見えるようになります。

この _round の詳解を見てみると・・・
[private]のアイコンが追加されています。
なかなか良いんじゃないでしょうか。

このほかに @defgroup と @{ @} を使った方法も試してみましたが、こちらは挙動が安定しないみたいで出力結果が安定しませんでした。

余計なことせず @private を使うのが手っ取り早いようです。


2017年3月16日木曜日

uiConfigrationScriptNodeを無効化する

uiConfigrationScriptNode を作らせないようなスクリプトとか作らない方法とかを記事にしてみたりもしましたが、九条バリアは余裕で突破されてしまいます。FAQです。


なので最近はもっぱら積極的防衛に切りかえています。

まず、uiConfigrationScriptNode というのは当たり前ですがScriptNodeの一種です。
で、File Open ダイアログの右側を見てみると General Options に、こんなチェックボックスがあります。

初期状態ではココにチェックが入っていて、スクリプトノードを実行するようになっているのです。その為 uiConfigrationScriptNodeに記述されているスクリプトが実行されてしまう訳なのですね。チェックを外せば uiConfigrationScriptNode に何が書かれていようとも実行されないと云う案配。

平和な日常を獲得できたかに思えますが、ひとつ問題がっ!

mayaが常時保存しているスクリプトノードに sceneConfigrationScriptNode というものが存在します。これが何かというと、タイムスライダーのレンジを復旧させるコマンドが記述されているスクリプトノードなのです。
Execute script nodesを無効にするとタイムスライダーのレンジが復旧されなくなってしまうのですわ。アニメータとして、これはかなりの痛手です。

 uiConfigrationScriptNode は実行させたくないけど sceneConfigurationScriptNode は動作して欲しいアンビバレントな心境。

ここは、sceneConfigurationScriptNode を復帰させるスクリプトで回避しようと思います。

global proc tryRecoverSceneConfiguration()
{
    string $scNode[]=`ls -typ "script" "*sceneConfigurationScriptNode*"`;
    if( 1==`size $scNode` )
    {
        string $cmd=`scriptNode -q -bs $scNode[0]`;
        if(""!=$cmd) evalEcho( $cmd );
        
    }
    
}

referenceしていた場合、sceneConfigurationScriptNodeが複数リストされてしまうので、カレントシーンのスクリプトノードだけを拾うようにするのがミソ。

単体実行でも良いですが、maya 起動時に
scriptJob -event "SceneOpened" tryRecoverSceneConfiguration;

とすることで使い勝手が良くなります。