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と変わらない、逆にタイピング数多くなっていると言うね。

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