2016年3月8日火曜日

「配列は参照渡し」について

たとえば、

proc testCallByReference(
    int $value,                         // 値
    int $array[] )                      // 配列
/******************************************************************************
    参照渡しのテスト
 ******************************************************************************/
{
    $value=($value+1);
    $array[0]=($array[0]+1);
    
}


// main procedure.
{
    int $value;
    int $array[];
    $value=1;
    $array[0]=1;
    
    testCallByReference( $value,$array );
    print("\n-- 結果 --");
    print("\n   $value: "+$value);
    print("\n$array[0]: "+$array[0]);
    
}


こんなスクリプトで、通常のインテジャーと配列のインテジャーを引数にして
testCallByReferenceから帰ってくると、
$valueのほうは1のままで、$arrayは2になって返ってきます。


配列はプロシージャ間を行き来できるようになっています。
この特徴を利用して、再帰処理と組み合わせると、階層構造の解析などが楽に行えます。

まず HumanIK の Skeleton を作成した状態で、下のスクリプトを実行すると、

proc createHierarchyTrans(
    string $myname,
    string $CBR_names[],
    string $CBR_tx[],
    string $CBR_ty[],
    string $CBR_tz[] )
/******************************************************************************
    ジョイント名と座標を取得※再帰
 ******************************************************************************/
{
    $CBR_names[size($CBR_names)]=$myname;
    $CBR_tx[size($CBR_tx)]=`getAttr ($myname+".tx")`;
    $CBR_ty[size($CBR_ty)]=`getAttr ($myname+".ty")`;
    $CBR_tz[size($CBR_tz)]=`getAttr ($myname+".tz")`;
    
    string $childs[]=`listRelatives -c -typ "joint" $myname`;
    if(!`size $childs`) return;
    
    for( $child in $childs ) createHierarchyTrans( $child,$CBR_names,$CBR_tx,$CBR_ty,$CBR_tz );
    
}


// main procedure.
{
    string $hips[]=`ls -typ "joint" "*_Hips"`;
    
    string $names[];
    string $tx[];
    string $ty[];
    string $tz[];
    createHierarchyTrans( $hips[0],$names,$tx,$ty,$tz );
    
    
    int $size=size( $names );
    for( $i=0; $i<$size; $i++ ) print("\n"+$names[$i]+": "+$tx[$i]+", "+$ty[$i]+", "+$tx[$i]);
    
}


階層構造のジョイント名とローカル座標が表示されます。

通常、ひとつしか取得できない返値を複数持っているように振る舞えます。
無駄に global 変数を使わなくて済むということですね。


配列の寿命は普通の変数と扱いが違っているので、ループの中で使う場合などでは、意図しない配列になることがあるので注意が必要です。
特にスクリプトエディタ上では前回実行した内容が残っている場合があります。

2016年3月3日木曜日

スクリプトエディタで余り気にしていないであろう事

軽くスクリプティングする時に便利なスクリプトエディタ。
ココで宣言した変数がどうなっているか意識していない人が意外と多いのでは?


たとえば、スクリプトエディタで変数宣言をし、



グローバル変数の名前を返すenvコマンドを実行してみると、



宣言した変数が出てきます。



要は、スクリプトエディタで宣言した変数はグローバル宣言しなくてもグローバル変数になってしまうということです。
※プロシージャも同様。

スクリプトエディタを何回も実行する場合、初期化していないと意図しない結果になる場合があります。

コレを防ぐには、毎回初期化するか、MELの変数の寿命はブロックの範囲内ということで、波括弧で囲うことをします。

mayaを再起動して、さっきのスクリプトを波括弧で囲んでから実行。


その後envコマンドを実行してみると、



今回は宣言した変数が出てきません。

ただし配列の場合、特殊な挙動(参照渡し)をするので、コマンドのリザルトを宣言と同時に設定しないときには、
使う前に clear した方が安全です。

2016年3月1日火曜日

MayaLT購入

ライセンス体系が変わるとか、忙しかったりなどで放置状態だったMayaLT。

2月からサブスクリプションのみになるということで、Autodeskストアでようやく購入手続き。

とりあえず、期間1年、サポート無しで33000+税



購入後、体験版の期限切れだったMayaLTは、試用期間30日として復活。
ライセンス到着まではコレで過ごせと言う事らしい。



うわさのStingrayもダウンロードできるようだったのでインストール。
一緒にScaleformもインストールされていた。

Stingray は windows Aero が有効になっていないと起動しないっぽい。

どちらも基本英語でしかチュートリアルが無いし、本格的にいじろうとしたらluaを覚えないといけないのか?


Games Launcher というのもインストールされたが、これはアセットストアのツールのようだ。
streamみたいな。



mayaのメニューバーのヘルプからサイトへアクセスしようとしたら、なぜか

firefoxhtml shell open command

ホニャララというエラーが出て Firefox が開かなかったのだが、既定のブラウザへ再設定することで直った。



会社でも作ったようなものだったりも、いろいろと車輪の再発明しまくるか!


2016年2月9日火曜日

開いているファイルのフォルダを開く※秀丸編

秀丸マクロを使って、現在開いているファイルのフォルダを開くマクロ。

run "explorer.exe /n,/select," + " \"" + filename + "\"";


filenameがフルパスを取得するコマンドで、プログラム実行コマンドのrunでエクスプローラを実行。

これを[Ctrl]+0に当たるマクロ10へ登録。




※maya,Photoshopはこちら


ほかには、ファイル名を挿入するマクロや日付を挿入するマクロがあると便利。


insert basename2;



insert (year+"/"+month+"/"+day);



2016年2月2日火曜日

秀丸エディタ強調表示の覚書

スクリプトだけでなくASCII形式のファイルを読む時は、内容を把握しやすくするために強調表示を使用していますが、メモ帳のように白地に黒文字をモニタで見るとまぶしいので背景は黒に設定しています。


基本の配色

その他(O)>ファイルタイプ別の設定(C)...
    設定の対象(L)
    >デザイン
      場所の一覧(P)
に記載されている順番ではなくカテゴリ別に、使用している(チェックを入れている)項目を中心に。

    普通の文字:FFFFFF
    文字定数:FFFF00

    改行文字:808000
    タブ文字:808000
    EOF:808000

    全角空白:C0C0C0

    コメント:8080C0

    範囲選択:00FF00/800000
    マークした行:FFFF00(B)/800000
    検索文字列の強調:00FF40(B)/800000

    強調表示1:FFFF00(B)
    強調表示2:00FF40(B)
    強調表示3:FF00FF(B)
    強調表示4:FF0000(B)
    強調表示5:FF8000
    強調表示6:5BCAFF
    強調表示7:FF00FF
    強調表示8:FF0000

    行の強調表示1:000000(B)/F49C1C
    行の強調表示2:FFFF00(影)/000080
    行の強調表示3:FFFFFF/008080
    行の強調表示4:FFFFFF/800080

    特に強調表示1:000000(B)/808080
    特に強調表示2:000000(B)/FF0000
    特に強調表示3:000000(B)/00FF00
    特に強調表示4:000000(B)/FFFF00

    その他
    カーソル行:FFFF00「下線モード」
    カーソル行(IME ON時):00FF00



強調表示の使用用途・分類・内容

強調表示1
単語指定で
  • do,whileのような特殊ループ
  • non,nullのような特殊文字列
  • match,gmatchのような文字列コマンド

強調表示2
単語指定で
  • if,else,for,switch,case,defaultのような一般的なフロー制御
  • true,.y(ベクトル型のy要素)のような特殊文字列

強調表示3
正規表現で
  • ~Layoutのようなレイアウト制御のコマンド
単語指定で
  • optionVar,separator,setParentのようなレイアウト系のコマンド
  • .z(ベクトル型のz要素)のような特殊文字列

強調表示4
単語指定で
  • ;,break,continue,returnのような終了を示す単語
  • false,.x(ベクトル型のx要素)のような特殊文字列
  • global宣言

強調表示5
正規表現で
  • $~のような変数

強調表示6
単語指定で
  • window,showindow,windowPrefのようなウィンドウ関係のコマンド
  • 個人的にローカルプロシージャの先頭は_(アンダーバー)を付けるようにしているため、
    _~となる単語を正規表現で指定。

強調表示7
単語指定で
  • int,float,string,vector,matrix(,var)のような変数宣言
正規表現で
    -~のようなコマンドオプション

強調表示8
  • グローバルプロシージャやグローバル変数を指定
    ※これはコーディングルールとか決めていれば正規表現で対応。


行の強調は折りたたみの優先度みたいなのが有ったはずなのだが詳しく検証できていない。
長年使用していて下の順番に落ち着いた経緯があったような・・・
行の強調表示1
    文書ファイル向けに、見出しにする文字(■みたいな記号)を正規表現で指定

行の強調表示2
    MELではprocを単語指定で

行の強調表示3
    バッチファイルのラベル用に行頭コロンだったらを正規表現で指定

行の強調表示4
    グローバルプロシージャ宣言。行頭globalを正規表現で指定。
    javascriptなら行頭functionとか?


さらに特定の単語をピックアップして、特に強調表示にしています。
特に強調表示1
    特に使っていない

特に強調表示2
単語指定で
    error,warning,delete,deleteUI,catchのような危険性のあるもの

特に強調表示3
    flameLayoutとformLayoutのつづりが似ているので、
    認識しやすいようにformLayoutを単語指定で

特に強調表示4
単語指定で
    print,confirmDialog,alertのような出力系コマンド。


開くファイルによって、特定の単語を追加したり減らしたりしていきます。
で、上のような強調表示を設定しておくことで.melファイルを秀丸で開くとこうなります。

余りカラフルにしすぎると見ているだけで疲れるのでホドホドに。