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;

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

2017年2月27日月曜日

SVNの更新

SVNの更新をするとき、普通の人はフォルダを右クリックして、コンテキストメニューから更新していると思います。
こんな感じで。


で、毎日、何回も更新しているとフォルダを開いて右クリックするのが面倒になるわけです。

そこで、活躍するのが TortoiseProc.exe のショートカット。
まず、Tortoiseをインストールしたフォルダを開き、コンテキストメニュー「送る」から「デスクトップ(ショートカットを作成)」


作ったショートカットのプロパティを開いて、「リンク先(T):」にコマンドと更新するパスを追加します。
追加するのは
/command:update /path "更新するフォルダ"


これを、ツールバーやランチャーなんかに登録しておけばワンクリックで更新できます。

けれども、しばらくすると、登録されているファイルの数や容量の増加で更新に掛かる時間が長くなってきます。
4K時代の.psdファイルなんか100MB超えはザラですし・・・。
なので、自分の関係するフォルダのみ更新を掛けたくなってくるのです。

そんな時のための更新バッチを考察。
@echo off
title %~n0 %1

set TPROC="C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe"

:: ファイルをD&Dした場合
set PATH_LIST=%1
set COMMAND=%~x1
set COMMAND=%COMMAND:.=%

:: ファイルのD&Dが無かった場合
if ""=="%PATH_LIST%" set PATH_LIST=%~dpn0.update & set COMMAND=update
if not exist %PATH_LIST% echo "%PATH_LIST%" is Not Found. & pause & goto :EOF

:: 更新実行
for /f %%a in (%PATH_LIST%) do echo %COMMAND%: & echo "%%a" & %TPROC% /command:%COMMAND% /path:"%%a"


このバッチファイルと同じフォルダに、バッチファイルと同じ名前で拡張子が.updateというファイルに書かれているファイルやフォルダの更新を行います。

上のバッチファイル名だとtsvnExecution.updateですね。
で、.updateファイルの中身は
D:\myProjects\maya\scripts*D:\myProjects\batch

こんな感じでパスを*でつなげると更新ログが1つにまとまります。

複数行にすると行数分だけログウィンドウが出てきてしまうので要注意です。

追加機能としては、バッチファイルへドラッグアンドドロップするファイルの拡張子にTortoiseのコマンドを指定すれば、ソレを実行するようになっています。
lockとかremoveとかね。

2017年2月20日月曜日

mentalray削除

晴れて余所者としての公認をもらったmentalrayですが、まだまだ2017の普及率は低いらしく、知ってか知らずかmaya2016出身でmentalrayのロードを要求してくるファイルが多い感じです。

無料で付いていた時からmentalrayインストールしない派なので、Script Editorがwarningで汚くなるのがもうね、

mentalray nodeらはクソじゃ
撫で切りぞ
根切りぞ
mentalray nodeは、みなコろシじゃ


そんな感じで、mentalrayをシーンから排除するスクリプトを考えます。
というか、シーンを読み込んだ時のインストールされていない有償プラグインなんかの「不明なノード」のエラーを消すスクリプトですね。

一応、maya2014の時にも作ろうと挑戦したのですが、 そもそも不明なプラグインなので削除するべきノードタイプが拾えないという事で断念したのでした。
しかし、maya2016からなのか、そういうノードタイプを取得するためのコマンドが追加されたようなのでリベンジです。


使用するコマンドは、
unknownPlugin
unknownNode
もう既に、これで勝つる!感がハンパ無いですね。


今回はmentalrayを対象にしているので、Mayatomrを調べます。

{
    string $mr="Mayatomr";
    
    string $types[]=`unknownPlugin -q -nt $mr`;
    
    string $unknowns[]=`ls -typ "unknown"`;
    for($unknown in $unknowns)
    {
        if(`objExists $unknown`)
        {
            string $type=`unknownNode -q -rcn $unknown`;
            if(`stringArrayCount $type $types`) delete $unknown;
            
        }
        
    }
    
    unknownPlugin -r $mr;
    
}


6行目の ls では、関係ない unknown ノードもリスト化してしまうので、7行目から Mayatomr のノードである事を確認します。
9行目でノードの存在確認しているのは、delete すると関連しているDGノードも削除される場合があるので、保険として。
オーバーキルしないのが武士道。
※単に存在しないノードを消そうとするとerrorで止まるから。

最後、18行目でwarningの元凶、Mayatomr の requires を除去します。
unknownPlugin -r を実行すると requires を除去できるので、stereoCameraとか寝ボケて作ったようなのも気軽に削除できます。

ノードにロックをかけているTurtleみたいな変態プラグインも有るので、lockNode を組み込むのも良いかもしれません。
ためしにlockNodeを追加してから、Turtleを削除対象にしてスクリプトは知らせてみたけれど、上手くいったりいかなかったり不安定。
LTに由来するのか、処理の仕方がマズいのか・・・?

まだまだ改善の必要ありです。

----
これを改善したスクリプトはコチラです。


2017年2月13日月曜日

filePathを調べる

filePathを調べるための大まかな処理内容は

  1. ファイルコマンドでシーン名をクエリー。
  2. その文字列をスラッシュで分割。
  3. ファイル名の一つ前まで繋げる。

みたいな感じでしょうか。
で、MELにすると2つの書き方ができます。

まず、文字列の分割にstringToStringArrayコマンドを使う場合
{
    string $file=`file -q -sn`;
    
    string $temp[]=stringToStringArray( $file,"/" );
    
    string $path;
    for( $i=0; $i<(`size $temp`-1); $i++ ) $path+=($temp[$i]+"/");
    
    print("\n$path: "+$path+"\n");
    
}

そして、文字列の分割にtokenizeコマンドを使う場合
{
    string $file=`file -q -sn`;
    
    string $temp[];
    int $token=tokenize( $file,"/",$temp );
    
    string $path;
    for( $i=0; $i<($token-1); $i++ ) $path+=($temp[$i]+"/");
    
    print("\n$path: "+$path+"\n");
    
}

で、引っかかった部分は、stringToStringArrayコマンドを使った場合の、for 内の(`size $temp`-1)
JavaScriptなんかでは、パフォーマンス改善のテクニックで.lengthみたいなプロパティ参照を使わず.lengthを変数に代入した方がコストが下がるとかあったりしますが、sizeコマンドのコストはどのくらいなのだろうか?
ということです。
ま、コスト的に微々たる物なんでしょうけども・・・。
なんか気持ち悪い。
melのプロファイラなんかで見るとsizeコマンドの参照数が真っ赤になりそうではあるけれども。

そんなかんじで、forの中から(`size $temp`-1)を抜き出すと
    string $temp[]=stringToStringArray( $file,"/" );
    int $back=(`size $temp`-1);
    
    string $path;
    for( $i=0; $i<$back; $i++ ) $path+=($temp[$i]+"/");

みたいにtokenizeと変わらない、逆にタイピング数多くなっていると言うね。

気にしない人は気にしないようなどうでも良い話でした。


2017年1月20日金曜日

秀丸のtagsファイルを使用して楽をする

自前のMELプロシージャが増えてくると、どんなプロシージャが有って、どんなツヅリだったかを思い出すのも苦労しはじめます。
そのためのDoxygenだったりするのですが、タイピングするのがなかなか面倒くさい。


秀丸の単語補完を使用するために、辞書ファイルへ追加していくなんて方法もありますが、スクリプトファイルやMELプロシージャを追加するたびに辞書ファイルをいじるのもなんか、そいつはちょっと科学的じゃない。

なので、tagsファイルを使って楽をしたいと思います。

手順としては、

  1. ルールの作成
  2. tagsファイルの作成
  3. ダイレクトタグジャンプの指定
  4. 単語補完の検索対象を追加

最初だけ4まで行わないといけませんが、一度設定してしまえば定期的に2を実行するだけで良くなります。


1.ルールの作成

まず、tagsファイルを作成するには、抜き出すためのルール(強調表示用の設定ファイル)が必要なので準備します。
秀丸でファイルを新規作成し、
その他(O) -> ファイルタイプ別の設定(C)...
で、
デザイン - 強調表示
を選びます。

おもむろに[全削除(R)]をおこない、
^global proc
を追加します。





そしたら[保存(V)...]で"melTags用"などとして.hilightファイルに保存します。


ここで注意。
.hilightファイルを保存したら、この設定は必要ないので、必ず[キャンセル]で閉じます。

[OK]をクリックしてしまうと全削除が確定されてしまい元に戻すのに手間取ります。


2.tagsファイルの作成

その他(O) -> tagsファイルの作成(G)...

を選びます。


各設定は以下。


対象ファイル(N):には[...]から絶対パスも指定可能です。
ルール(R):は、1で作成した.hilightファイルを指定し、出力ファイル名は"_melTags"とでもします。

対象ファイルが上図のように*.melのワイルドカードのみだと、現在開いているファイルのパスを基準に検索がかかります。
出力ファイルも同じように現在開いているファイルのパスへ出力されるので、実行する際は注意が必要です。

出力ファイルは、なにげに絶対パスでも指定できるのでmelのみで使うのなら絶対パスにするのも良いでしょう。


3.ダイレクトタグジャンプの指定

その他(O) -> 動作環境(E)...
その他コマンド - tagsファイル
から、tagsファイル(T):
に2で出力した"_melTags"を絶対パスで指定します。


上図は例によりSVNに登録してあるフォルダですね。
ふつうならマイドキュ内のmaya\scriptsですかね。

ここもフルパスじゃないと開いているファイルのパスを基準にするので要注意。


4.単語補完の検索対象を追加

最後に、
その他(O) -> ファイルタイプ別の設定(C)...
その他 - 単語補完
から、単語補完の検索対象内[詳細(X)...]

で、追加の検索対象からtagsファイル(T)にチェックを入れます。


ココまで設定することで、単語補完にglobal procのプロシージャが指定できるようになります。




おまけ

tagsファイルを作成するときに、ファイル名をフルパスで出力(F) にチェックを入れたと思いますが、このおかげでダイレクトタグジャンプ([Ctrl]+[F10])が機能すると思います。

ダイレクトタグジャンプとは、なんぞや?みたいな感じだと思いますが、
たとえばgrepで検索をかけた結果から、ハイライトされている単語をダブルクリックすると該当箇所のファイルなんかが開いてくれますが、それと似たような事ができます。

単語補完でMELプロシージャを入力したら、プロシージャ名を選択して[Ctrl]+[F10]で.melファイルの該当箇所が開きます。
引数とか処理を確認するのに便利です。