2016年12月22日木曜日

ノードのアトリビュート名を調べる。

セッターやゲッター使うときにアトリビュートの名称を調べるのがなかなか大変。
使っていくうちに覚えたりはするのですが、しばらく経つと忘れたりするし、ロング名じゃなくてショート名が使いたかったりすることも有ります。

手っ取り早く調べるなら、スクリプトエディタの"Echo All Commands"にチェックを入れて、アトリビュートエディタを操作したログで確認するとか。
スライダー操作のものは分からなかったりしますけどね。

他にはシーンをASCIIで保存して、調べるとか。


どちらも面倒な事には違いがないので、調べるMELを組んでしまいます。


global proc tryGetAttrName(
    string $node,
    string $sea )
{
    string $attrs[] =`listAttr $node`;
    string $sAttrs[]=`listAttr -sn $node`;
    
    string $lowSea=tolower( $sea );
    string $lowAttr;
    print("\n--- "+$node+" ---------\n");
    int $i=0;
    for( $attr in $attrs )
    {
        $lowAttr=tolower( $attr );
        if( ""==$lowSea
         || `gmatch $lowAttr ("*"+$sea+"*")` )
        {
            print($attr+": "+$sAttrs[$i]+"\n");
            
        }
        
        $i++;
        
    }
    print("\n-----------------------\n");
    
}



ノード名とざっくりとしたアトリビュート名を渡せば、「ロング名」:「ショート名」がスクリプトエディタのログに表示されます。


たとえば

tryGetAttrName( "locator1","disp" );

とするとロングのアトリビュート名に"disp"が含まれるものが表示されます。


ほかには、

tryGetAttrName( "locator1","" );

みたいに調べたいアトリビュート名を""にすると全てのアトリビュート名が表示されます。

2016年12月18日日曜日

アウトライナーのノードに色を付ける

会社では最近までmaya2014を使用していたので気が付かなかったのですが、Attribute Editor の Display フレームに見慣れないアトリビュートが追加されていることに気が付きました。


Outliner Color で色を指定して、


Use Outliner Color のチェックを入れると・・・



Outliner 上のノードの色が変わります。
Shapeノードにも色が付けれるけれど、ふつう Outliner は Transformノードしか表示していないと思うので Shape の色を変えても、ほぼ意味なしですね。


Hidden In Outliner を使えばノード自体を消すこともできるみたいです。
Constrain とかを Outliner から消せるので便利かも。


Outliner の Display にも関連メニューが追加されていて、有効無効が切り替えられるようです。


ただ、この機能、アトリビュートエディタで編集すると maya の負荷によって色が変わったり変わらなかったりするみたいです。
設定しても、色が保存されなかったり。

なので、スクリプトで制御する方が安全。

設定するアトリビュートは、useOutlinerColor と outlinerColor ショートネームは uocol と oclr です。

global proc outlineColor()
{
    string $jnts[]=`ls -typ "joint"`;
    for( $jnt in $jnts )
    {
        setAttr ($jnt+".uocol") 1;
        setAttr ($jnt+".oclr") 0 1 1;
        
    }
    
    string $lcts[]=`ls -typ "locator"`;
    for( $lct in $lcts )
    {
        string $pLct[]=`listRelatives -p $lct`;
        setAttr ($pLct[0]+".uocol") 1;
        setAttr ($pLct[0]+".oclr") 1 1 0;
        
    }
    
}



transform ノードである joint は、リストして直接変えればよいですが、shape ノードである locator なんかは、親の transform を調べてソレを変更する必要があります。


2016年12月12日月曜日

Photoshopのjsxを更新するバッチ

Photoshopスクリプトを作成しているときバージョン管理を行いたい。
スクリプトを作る場合には当然欲しくなります。

でも Photoshopの Presets\Scripts を直接リポジトリに登録するとなると色々面倒。
とりあえず別のところをSVNへコミットしておいてバッチファイルでコピーするのが妥当かな?


まずは、コピーするとき.jsxファイルがバラバラになっていると Presets\Scripts のなかもグチャグチャになるので、スクリプトごとにフォルダへまとめてソレをコピーする感じにしようと思います。
このことを前提にバッチを組んでいるので要注意。

で、バッチファイル。
@title %~nx0
@prompt %~n0$G

:: コピーするフォルダ名
set SCRIPT=hoge

:: Adobe フォルダがあるか調べる
@set ADOBE_PATH=%ProgramFiles%\Adobe\
@if not exist "%ADOBE_PATH%" goto :errAdobe

:: Photoshop フォルダを探す
@set SRC_FOLDER=%~dp0%SCRIPT%
@for /f "delims=*" %%F in ('dir /b "%ADOBE_PATH%" ^| find "Photoshop"') do call :copyAction "%%F"
@goto :endProcess



::------------------------------------------------------------------------------
:copyAction
    @set DST_FOLDER=%ADOBE_PATH%%~1\Presets\scripts\%SCRIPT%\
    @if not exist "%DST_FOLDER%" md "%DST_FOLDER%"
    
    xcopy "%SRC_FOLDER%" "%DST_FOLDER%" /s /y
    @exit /b



:errAdobe
    @echo Adobe のフォルダが見つかりません
    @goto :endProcess



:endProcess
    @pause



単にコピーするだけでは芸がないので、どんなバージョンのPhotoshopにも対応してみました。
ポイントは3箇所。

13行目でdelimsを設定しないとスペースで分割されてしまうのでダミーの文字を指定して分割されないようにしています。
同じく13行目、セット内でdirをfindへパイプするために ^| とエスケープさせています。
20行目callで渡された値はスペースで分割されないようダブルクォーテーション付きで渡されているので%~を使ってダブルクォーテーションを省いています。

たぶんコレでいけるはず。

2016年12月7日水曜日

Photoshopのスクリプトからexeを実行したい

Photoshopの話しが続きますが・・・。

表題の通り、jsxからexeを実行したいのです。

ファイルオブジェクトにexecute()メソッドがあることはある。
ただし、引数を渡せないときた。
しかも、渡す引数は実行するたびに変わる可能性があるのです。


こんな時どうするか?
jsxからバッチファイルを作るしかないじゃないですか!


function createBatchFile( arg )
{
 const CR = String.fromCharCode(13);
 const BATCH_FILE = new File(Folder.temp+"/hogehoge.bat");
 
 var command;
 switch( arg )
 {
 case 0: command = "echo \"hoge\""; break;
 case 1: command = "echo \"hogehoge\""; break;
 }
 
 BATCH_FILE.open("w");
 // 書き込み開始
 BATCH_FILE.write("@echo off"+CR);
 BATCH_FILE.write(command+CR);
 BATCH_FILE.write("pause"+CR);
 // 書き込み終了
 BATCH_FILE.close();
 
 // バッチ実行
 BATCH_FILE.execute();
 
}

createBatchFile( 0 );
createBatchFile( 1 );


3行目のfromCharCode(13)っていうのは改行コード。
4行目のFolder.tempでPhotoshopが使用するテンポラリフォルダを取得できるので、そこへ間借りさせてもらい"hogehoge.bat"を指定しています。
7行目のswitchで記入する文字列を分岐。この部分で実際に実行するexeを指定するわけです。
13行目でファイルを開き15行目からバッチファイルに記述です。

最後、22行目でバッチの実行。

すると2回関数を呼んでいるので、DOS窓が2つ出てくるはず。


execute自体は実行終了を待ってくれないので連続実行は危険極まりない。

2016年12月5日月曜日

Photoshopで表示されているレイヤーセット名を取得する

テクスチャとか作っているとレイヤーセットが増えてきますよね~。
カラーバリエーションとか模様違いとか。

出力するときに「ファイル名+レイヤーセット名」みたいにすると便利そうです。
今画面に表示されているレイヤーセットの名称を調べようとした時、どうするのか?


単純にレイヤーセットをリスト化して、最初に出てきた可視レイヤーセット名を取得すれば良いような気がします。

getLayerSetName = function()
{
    var lsObj = activeDocument.layerSets;
    
    var result = "";
    for( i=0; i<lsObj.length; i++ ){
        if( lsObj[i].visible ) {
            result = lsObj[i].name;
            break;
            
        }
        
    }
    
    return result;
    
}


これだけだったら話は早いのですが、斜め上の行動をする人が居るのが世の常。


こんな感じでレイヤーモードと透明度で色味調整しているファイルがあるかもしれない!
ま、スクリプト側からは注意喚起することくらいできないんですけど・・・。
目的はレイヤーセット名の取得なので無視します。


ちなみに、レイヤーの取得方法は3種類。
activeDocument.artLayers レイヤーのみ
activeDocument.layerSets レイヤーセットのみ
activeDocument.layers    レイヤーとレイヤーセット

このうちactiveDocument.layersから各レイヤーのblendMode,fillOpacity,opacity,visibleなんかの状況から分岐処理させるとかかな。


レイヤーカンプ使った出力スクリプトが公式で有るからソレ使えよみたいな感じですが、
テクスチャ作成途中の段階でレイヤーカンプ作るとレイヤーカンプは壊れ易いので無理。

そもそも3Dデザイナーのフォトショッパーってレイヤーカンプの存在知らなかったりするし。

2016年12月2日金曜日

Photoshopにスクリプトを登録してみる覚書

Photoshop用の自作スクリプトをメインメニューのファイル(F) > スクリプト(R)
の欄に表示させるには、Photoshopのインストール先の Presets\Scripts へ.jsxファイル
をコピーします。

たとえば hogehoge.jsx というのを作成しコピーした場合

ファイル名で登録されました。

よくあるパターンとして、メインになる処理を hogeCore.jsx にまとめて、引数だけ変えた
呼び出し用スクリプト hogeA.jsx と hogeB.jsx を作って登録したいと思った時、普通に
Presets\Scripts へコピーすると・・・



3つとも表示されてしまいます。

hogeCore はメニューに出したくない場合はどうすればよいか?


Presets\Scripts の中を見てみると、~Scripts Only みたいなフォルダが見つかります。
試しに"hoge Scripts Only"とフォルダを作成し、そこへ hogeCore.jsx を移動します。
すると、



hogeCore.jsx がメニューに表示されなくなりました。



次に、呼び出しファイルから処理ファイルを呼び出すスクリプトの書き方。

function main()
{
    const SELF = File( $.fileName );
    
    $.evalFile( SELF.path+"/hoge Scripts Only/hogeCore.jsx" );
    
    var ret = hogeCore();
    alert ( ret );
    
}

main();


function hogeCore()
{
    alert ("hogehoge");
    return 0;
    
}



$.fileName で自分のファイル名をフルパスで取れます。
$.evalFile() は、指定されたファイルを読み込む処理。
ここで hogeA.jsxと同じ階層の hoge Scripts Only フォルダ内に在る(はずの)hogeCore.jsx
を読み込んでいます。

こうすることで hogeCore.jsx の hogeCore() が実行可能になります。


メニューから hogeA を実行すると、

まず hogeCore.jsx のアラートが表示され、


hogeCore の返り値がアラートされます。


2016年11月24日木曜日

Freeze Transformations その2

今回もまた、おもむろにspaceLocatorを作成して適当に移動・回転・拡縮します。

で、Modify から Freeze Transfomations を実行。



ピボットが原点へ移動し、Translate は shape の Local Position に変化。
rotateとscaleが何処へ行ったかは謎です。


ロケータのフリーズで注意しないといけないのは、階層構造になった時。


こんな感じに階層構造になっていた場合、子の locator2 ほうをフリーズすると、


ピボットが親の位置に移動しますが、親の locator1 をフリーズすると、


子の locator2 のピボットも原点に移動してしまいます。
せっかく階層に配置したのにフリーズかけてしまいグチャグチャみたいな事になりがち・・・。

Reset Transfomations と Freeze Transfomations を間違えたのか、酷い構造のデータを見た事があります。
自分ではこんなデータを作らないように注意しときたいですね。


ただ、このフリーズ機能、アニメーションさせる前限定の機能。
アトリビュートにアニメカーブが接続されているとフリーズ実行時に

// Error: Freeze Transform was not applied because locator1.scaleX has incoming connection. //

みたいな事になります。

2016年11月14日月曜日

Freeze Transformationsその1

なんかチャネルボックスの数値がゼロになるような機能です。

まずは、選択オブジェクトのピボットが見えるよう設定を変更します。


初期状態では Off になっているので On に。
これで選択したオブジェクトのピボットが表示されるようになります。
リガーであれば表示させておくことをオススメ。

ピボットの見た目はこんなん。



おもむろにpolyCubeを作成して適当に移動・回転・拡縮します。


変形が分かりやすいようにlocalAxisを表示しています。
※メインメニューの Display -> Transform Display -> Local Rotation Axes

こんな感じのオブジェクトに Freeze Transform を実行するとこうなります。


この機能が実行されるコマンドは makeIdentity というもの。
メニュー名と一致していないのですがコマンド名から大体の処理内容が予想できますね。

フリーズ前のこんなマトリクスが
-----------------------------
x: 0.1440 -0.0708 -1.1282 0
y: 0.3970  1.1363 -0.0206 0
z: 0.8128 -0.2818  0.1214 0
t: 1.1656  2.5396  0.0000 1
-----------------------------

フリーズ後、このようになります。
------------
x: 1 0 0 0
y: 0 1 0 0
z: 0 0 1 0
t: 0 0 0 1
------------

オブジェクトのマトリクスが単位行列になってしまいました。


バインドする場合は、更に Reset Transform を実行します。


すると、ピボットが原点に移動したように見えます。
※実際は親オブジェクト基準の位置になります。

こうしておかないと、エンジンによってはピボットの差を加味してくれない場合があるので、
頂点が想定の位置とズレてくる事があります。


ちなみに、フリーズする前にリセットを行うと・・・

トランスフォームの変形がリセットされるだけなので、順番は重要。
なんとなく使ってもらわれると困る機能の一つです。


2016年10月31日月曜日

たまに変な事をしているLocatorを見つけることがある

簡単に作れるセレクターとしてロケータを使っていたりする場合を見かけますが、
たまに変な事をしてあるものを見かけます。

こんな感じの。


一見すると、赤のロケータも青のロケータも同じように見えますが、チャネルボックスを見てみると


赤の方はトランスフォームのスケールを使っています。
データ的には、青のようにシェイプノードのローカルスケールをいじるのが正解。

こういったデータを作る人はmayaのDAG階層についての理解が浅いのかなと・・・。
大抵、ポリゴンメッシュとかもフリーズせずにバインドするクチです。

ま、映像系であれば特に問題ないのでしょうが、ゲームエンジンなんかに喰わせる場合は中々厄介。


マトリクスを調べてみると青い方は
------------
x: 1 0 0 0
y: 0 1 0 0
z: 0 0 1 0
t: 4 0 0 1
------------
当然ふつうです。
※t:が4 0 0 1なのは+x軸にオフセットしてあるから。


赤い方は
-------------
x:  2 0 0 0
y:  0 2 0 0
z:  0 0 2 0
t: -4 0 0 1
------------
※t:が-4 0 0 1なのは-x軸にオフセットしてあるから。

と回転行列部分の3行3列が変化しています。
コレが曲者。

子階層なんかがあった場合、スケールが伝播していくので更に面倒に。
見た目では判断しにくいのでチェックが大変。


2016年10月17日月曜日

uiConfigurationScriptNode

maya2017になりUI周りが大幅に変更されたので、少しはマシになっているかと淡い期待を抱きつつ
uiConfigurationScriptNodeを調査。

結果は全く変わっていなかった・・・。


とりあえず、サンプルファイルを作るためpolyCubeを作成。


uiConfigurationScriptNodeの有るファイルと無いファイルを作成します。

このノードは、
Preferences Interface - UI Elements
Panel Configrations にある
When saving:□ Save panel layouts with file
のチェックを入れると保存時に作られます。
初期値はON。



ファイルサイズはuiConfigurationScriptNodeの有る方が80KBほど大きいですね。



.mltファイルはバイナリファイルですが、秀丸で開くとLayoutコマンドがガッツリ記述されています。


上は最初ら辺の一部で、ここから2000行ほど続きます。
これが80KBの正体。

ファイルサイズがデカくなるだけならまだ良いのですが、このノードの有るファイルを開くとmayaに色々と不都合をもたらすので厄介です。


2016年10月12日水曜日

Photoshopの動作が重いっ!

ここ半年ほど、家のPhotoshopがなんだか遅い。
ツールの切り替えやペインティング、ありとあらゆる動作でワンテンポ待たされる感じ。

環境設定などでGPUの設定やメモリーの設定なんかを変更してみたりしましたが、なんの変化もなし。
Photoshopは、あまり頻繁に使用していなかったので遅いのを我慢して使っていましたが、無事解決。

ちょっと前にjsxをいじっていた時に、ScriptListenerをインストールして、ログ出力を有効にしたまま
実行していました。

ま、しょうもない原因ですね。
ワンテンポ待たされていたのはログを書き込んでいたせいだったと・・・。

ScriptListenerをアンインストールした現在は快適に動作していますわ。



2016年9月26日月曜日

maya2017LTのGraph Editorに不具合?

2017からインターフェイスが大幅に変更されたmayaですが、新機能になかなかの不具合を発見。
ま、けっこう構成が古い自作PCなのでしかたがないのですが・・・。

まず、mayaLTの実行環境

 OS:windows7
GPU:AMD Radeon HD 7800 Series

maya2017LT はupdate1が当たっています。
ちなみに2017から更新方法がService Pack や Extensionではなくupdateとして随時提供されるようです。


GraphEditorは2017で大幅な機能強化が行われているようで、そのテストをしようとしていた時のこと、
アニメカーブがいきなり表示されなくなりました。


表示一発目は、ちゃんと表示されます。



アトリビュートを選択し、アニメカーブをフィルタしようとすると・・・


カーブが表示されなくなりました。
この状態はmayaを再起動するまで治りません
オブジェクトを切り替えたりundoをしたりしても表示されなくなるようです。

インターフェイスを変えたついでにアニメカーブの描画方法も変わったのでしょうかね。

Radeon使っている段階で推奨外なのですがね。

viewport2.0も挙動が怪しいし・・・。

巷で言われている奇数(2011,2013,2015)バージョン使ってはいけない説が発動です。



とりあえず、このままでは何もできないので回避策を探します。

2016LTのGraph Editorは問題なく使えていたので、最悪バージョンまき戻すかまで考えましたが、
さすが、天下のAUTODESK。
こんなこともあろうかと、Graph EditorにはClassicモードが存在するようです。

Classicにするには、preferencesSettings-AnimationにあるGraph Editor UIでClassicを選択します。


見た目が以前の物になってアニメカーブの再描画も問題なく行われます。


これで2017を使っていけそうです。

2016年9月5日月曜日

MAYA2017LTをインストール

MAYA2017LTをインストールしてみました。

インストールには約9GBの空き容量が必要。
Setup.exeとダウンロードする圧縮データが4.5GB、インストールされたバイナリーが4.5GB。

Cドライブの空きが残り少ないというのに・・・。


とりあえず2016LTと共存させておいています。
そのうち2016LTは削除する予定。


2016と2017の目立った違いは、メインウィンドウのレイアウト関連。

2016ではツール ボックスの下にクイック レイアウト ボタンとして存在していたものが


2017ではメインメニューのWindowsにWorkspacesとして新設。


このメニューでレイアウトを変更するとメニューセットやシェルフも変更される。
なかなか便利なのでは?

今まで.melファイルを編集しなければいけなかったドッキングの無効化もメニューに追加されています。


で、元の部分はクイック レイアウト/アウトライナ ボタン というものに変更。


見た目はあんまり変わっていないですが、これがなかなか厄介。

2017のレイアウト変更は、2016みたいにpaneLayoutの分割方法を変えてペインにパネルを適用するのではなく、メインウィンドウにパネルウィンドウをドッキングさせている感じなので、上3つのレイアウトボタンをクリックても変化が起きるのはモデルビューだけ・・・。

4つ目のボタンはアウトライナーウィンドウを表示させる専用ボタン。

クセが強い!


いまさら気づいたのだけれど、LTで作れるマテリアルってPhongだけらしい。
ま、スペキュラーの設定できないlambertなんか各種エンジンでは扱わないし・・・。

けれどもノードは有効のようでcreateNode "lambert"とすれば作成は可能。
ただしplace2dTexture や shadingEngin なんかは自分で接続する必要がある。

2016年7月26日火曜日

sourceのアレコレ

sourceについていくつか。

mayaの再起動をしないとsourceできない(ことはない)

mayaが起動している最中に.melファイルを追加した場合、mayaを再起動をしないとsource しても

// Error: Line 1.18: Cannot find file "hogehoge.mel" for source statement. // 

と、追加した.melファイルは見つからないようなエラーが出てしまいますが、コマンドラインで

rehash

を実行するとMELのスクリプトパスをチェックするので、新しいファイルが読み取られsource 
実行できるようになります。

ただし、global procの引数の量や型を変えた場合、sourcerehashを行っても更新されないので、
こういったケースの場合には再起動が必要です。

けっきょくは再起動するんかーいっ!


ファイル名の前にパスを付けるとスクリプトパス以外のフォルダも読み込める

たとえば、Dドライブのhogeフォルダにhoge.melがある場合、

source "d:/hoge/hoge.mel";

と絶対パスの指定が可能。自分は有効な手段を見出せていないですが、使い方はあなた次第。

本来の使い方と思しき、相対パスも可能。
MAYA_SCRIPT_PATH の中にサブフォルダを掘り、リグ関係のスクリプトをまとめるとします。
そんな場合、

source "RIG/tryRigCreaterCore.mel";

とすることでコンパイルが可能。
"../"でさかのぼることも出来ます。

もちろん/(スラッシュ)ではなく\(バックスラッシュ・円マーク)も使えますが、エスケープ
しないといけないので、スラッシュのほうが無難でしょう。


source した.melファイル内にsourceが記述されていると不安定になる

最悪mayaがクラッシュ

ループ処理の中にsource を使ったプロシージャが含まれていると、スクリプトのコンバートが
終了する前に呼び出してしまいmayaが強制終了してしまうことがあります。
乱用は要注意。



2016年7月14日木曜日

プロシージャのオブジェクト風表記。その2

mayaが.melファイル内のグローバルプロシージャを認識するタイミングは、起動時。
みたいな事でしたが、ここでも注意する事がひとつ。


起動時に行うスクリプトのコンバートでは、ファイル名と同じグローバルプロシージャまでしかコンバートされません。

なので、GUIなんかのコールバックはメインプロシージャの後ろに書くと初回エラーが出ます。
ボタンを押した瞬間にとか。
これは、AUTODESK AREA JAPAN の記事でも書かれていました。

とりあえずファイル名と同じ名前のメインプロシージャは最後に書いとけと言う事ですか。



前振りが長かったですが、本題。

.melファイルをクラスっぽく作成しようとした場合、メインプロシージャが無いのでコンバートされない問題が出てきます。
その場合の対処方法。

まずは、コンソールアプリで、引数が必要なプログラムがヘルプのエラー出力を出すみたいに、
メインプロシージャでグローバルプロシージャのリストをプリントする方法。

グローバルプロシージャを全部書きだすのは面倒ではある。
ま、空のプロシージャでも良いんですけど・・・。


このほかには、source を使用する方法もあります。
指定した.melファイルの内容全てをコンパイルするので、ファイル内の全てのグローバルプロシージャへアクセスする事ができるようになります。
なかなか便利な命令です。

デバッグ中は、シェルフに

{
    source "スクリプト名.mel";
    メインプロシージャ;

}

を追加しておくと重宝します。


本題みじかっ!


2016年7月12日火曜日

プロシージャのオブジェクト風表記。その1

プロシージャ名として使える文字に .(ドット)が有ることは意外と盲点。

けっこう前にAUTODESK AREA JAPAN の記事で読んでからは偶に使っていたりしますが、
記事に足りない Tips が有るので補足(みたいなこと)。

まず、MEL でローカルにスコープされたプロシージャを前方に参照することは許可されていません。
ローカルにスコープされたプロシージャの定義は、これらを呼び出す前に出現させる必要があります。

な・・・何を言ってるのか わからねーと思うが
おれも何をされたのかわからなかった・・・

頭がどうにかなりそうだった・・・


要は、呼び出されるローカルプロシージャは、呼び出す行よりも前に記述されていないといけない
という事です。
たとえば、

proc string _getHoge()
{
    return "hoge";
    
}


global proc printHoge()
{
    print(`_getHoge`+"\n");
    
}


は大丈夫ですが、

global proc printHoge()
{
    print(`_getHoge`+"\n");
    
}


proc string _getHoge()
{
    return "hoge";
    
}


となっていると、呼び出しているprint(`_getHoge`+"\n");よりも後ろに
_getHoge()を定義しているために、

// Error: file: ~~/scripts/printHoge.mel line 3: Cannot find procedure "_getHoge". //

と出て止まります。

記事には、1度実行すると解消されると云うような事が書かれていると思いますが、ローカル
プロシージャには通用しません。

結構このルールに嵌って全てをグローバルプロシージャにしてしまい、オーバーライドでバグっ!
をやってしまうようです。


で、mayaが.melファイル内のグローバルプロシージャを認識するタイミングですが、
起動時、MAYA_SCRIPT_PATH に配置されている.melファイルを手当たり次第にコンバート
(コンパイル)し、ファイル名と同じグローバルプロシージャが見つかった時にメモリへ
常駐します。

ここでもまた注意する事が有るのですが、長くなったので次回に続く。

2016年6月15日水曜日

TortoiceSVNで設定しておきたいこと

バックアップバッチ作ったけどやっぱ不便ですね。
なので、TortoiceSVN をインストールしました。

サンプルコードのテストなんかをする場合には、簡単に復帰できるので便利です。
時代は Git なのでしょうけども・・・。


とりあえず個人で使用するだけなので、外部ストレージにリポジトリを作成し、fttpプロトコルで使用中。
ファイルロックの同期が怪しいらしいので複数人で使用する場合には、サーバー立ててhttpやhttpsを使うのが良いみたいです。


インストール時、svn.exeをインストールすることをオススメします。
tortoiceProc.exeよりも取得できる情報が格段に上がり、バッチから色々出来て捗ります。

忘れた場合は、コントロールパネルプログラムのアンインストールから、TortoiseSVNを選択し、変更を実行するとセットアップウィザードが立ち上がるので、Modify から command line client tools のチェックを入れて Next>
※windows7の場合



仕事で使う場合なんかは、インストール後、設定に *.mayaSwatches*.swatch を追加しておくのが良いと思います。
環境によっては、こいつら隠しファイルになっているので、ゴミをコミットすることになりかねません。



大抵、新規加入のルーキー様がコミットあそばされるので、見つけた場合には魅上照ばりに
削除、削除、削除です。


2016年6月10日金曜日

hIkノードは自動キーが利かない

だいぶ前に、humanIk のノードがリグに使えるんじゃないかと書きましたが、なんと、
humanIk のノードは自動キーをオンにしていてもキーが打たれないらしい。


では、本家の humanIk はどうなっているか確認してみると・・・。

自動キー、利いているんですね~。


ノードをたどっていくと、怪しいノードを発見。



ジョブで監視して、この keyingGroup ノードに登録されているアトリビュートへキーを
打っている様子。


自前のリグにhikノードを使いたい場合は、keyingGroupを設定し、且つ監視するスクリプトを
実行させないといけない。

手間が掛かるので使えませんな。



調べていて気づいたのだけれど、mayaLTにはキャラクターセットが無かった・・・。
ま、キャラクターセットなんてほとんど使わないから良いんだけど。


しかし、Extension 3 で追加された「Quick Rig」がスゴイ!

2016年5月30日月曜日

アニメカーブからタイムレンジを復元させる

中間ファイル、ま、FBXの事なんですけど、アニメの入っているファイルをインポートしても
タイムレンジがプリファレンスのまま変化しない。
そもそも、アニメーションを中間ファイルで管理しようとするのが問題なんですけど・・・。

地味に面倒です。


そこで、アニメーションカーブを調べて、タイムレンジを復元するスクリプトを作成してみました。


global proc string tryRestoreTimeRange()
{
    float $min;
    float $max;
    
    string $aniCrvs[]=`ls -typ "animCurve"`;
    if(!`size $aniCrvs`) return "";
    
    int $isFirst=1;
    for( $aniCrv in $aniCrvs )
    {
        int $kc=`keyframe -q -kc $aniCrv`;
        
        float $tmpMin[]=`keyframe -in 0 -q $aniCrv`;
        float $tmpMax[]=`keyframe -in ($kc-1) -q $aniCrv`;
        
        if( $isFirst )
        {
            $isFirst=0;
            $min=$tmpMin[0];
            $max=$tmpMax[0];
            
        }
        
        
        if( $tmpMin[0]<$min ) $min=$tmpMin[0];
        if( $max<$tmpMax[0] ) $max=$tmpMax[0];
        
    }
    
    eval("playbackOptions -min "+$min+" -max "+$max+" -ast "+$min+" -aet "+$max);
    
    return ($min+":"+$max);
    
}



アニメカーブノードをリストアップしてキーフレームの先頭と末尾の最小、最大を取るだけ。

もう少し賢くしたい感じはする。


2016年5月24日火曜日

window作成のための雛形

ツール用のウィンドウを作成する時の雛形。

毎回似た感じになるのに、_buildWindow()の引数やdeleteUIの位置とかで悩むため、
汎用性のこともちょっとを考えて作成。

proc _setupMainLayout(
    string $parent )
{
    setParent $parent;
    
    //------------------------------------------------------------------------------
    // コントローラの追加・編集はここから
    columnLayout;
        button;
        button;
        button;
    
}


proc _setupWindow(
    string $window )
{
    if(`window -q -mb $window`)
    {
        string $menu0=`menu -l "File"`;
        string $menu1=`menu -l "Edit"`;
        string $help =`menu -l "Help" -hm true`;
        
    }
    
    int $w=320;
    int $h=160;
    //------------------------------------------------------------------------------
    string $mainForm=`formLayout`;
        string $mainLayout=`scrollLayout -w $w -h $h`;/** 希望のlayoutに変更 **/
    
    formLayout -e
        -af $mainLayout "top" 0
        -af $mainLayout "left" 0
        -af $mainLayout "right" 0
        -af $mainLayout "bottom" 0
        $mainForm;
    
    //------------------------------------------------------------------------------
    _setupMainLayout( $mainLayout );
    
    //------------------------------------------------------------------------------
    window -e -w $w -h $h $window;
    
}


proc _createWindow(
    string $toolName,
    string $window )
{
    string $title=`interToUI $toolName`;
    
    window
        -title $title
        //-toolbox true
        //-menuBar true
        //-sizeable false
        $window;
    
}


proc _buildToolWindow(
    string $toolName,
    string $window )
{
    if(`window -ex $window`)
    {
        deleteUI $window;/** for debug. **/
        //return;
        
    }
    
    _createWindow( $toolName,$window );
    _setupWindow( $window );
    
    //------------------------------------------------------------------------------
    // 必要ならジョブの追加
    //scriptJob -e "event" "script" -p $window;
    
}


global proc sampleUI()
{
    string $toolName="sampleUI";/** スクリプト名推奨 **/
    string $window=($toolName+"Window");
    
    _buildToolWindow( $toolName,$window );
    
    showWindow $window;
    
}



まず、88行目で$toolNameをスクリプト名に変更。


71行目はデバッグ中スクリプトがエラー停止し、次回実行時に

    Object's name 'sampleUIWindow' is not unique.

みたいなのを出さないようにするためのもの。
リリースする時はコメントアウトして、return;だけに変更。


81行目にwindowにアタッチしたいジョブを追加。
コレの位置が92行に追加するか迷う部分。
main procedureを簡素にするため_buildToolWindow()の中へ追加していくことに。


55行目からのwindowコマンドは使うオプションのみコメント外して使う。
-toolbox,-menuBar,-sizeable だいたいこの3つしか使っていない気がする。


window に menu を追加した場合、20行目のブロック内に menuItem を追加するプロシージャ追加。

31行目の layout の子にUIを追加していく。
buttonだけとかなら、ここで指定したwidth,height以下に window は小さくならないはず。


で、_setupMainLayout()が本体。



結構いじる場所が分散してしまった。

2016年4月21日木曜日

frameLayoutのオプション

frameLayout を使おうと思いヘルプを見てみたら、-borderStyle がサポートされなくなったらしい。

フラットデザインが流行ってるからか?
それとも、4Kでは数ピクセルは認識できないからか?

ま、使えない物は仕方がない。


更新情報に削除項目は見つからなかったが、かわりに -backgroundShade というのが追加されたというのを発見。

さっそくサンプルコードを書いて実行してみたところ・・・
なにも変化がない。


何か他のフラグも必要なのかと思い、いろいろ試してみた結果、
-labelVisible true の時にしか反応しないらしい。


左が -bgs false、右が -bgs true

最初、-borderVisible true の状態で見ていたので変化が分からなかったらしい。
Photoshop で色情報を調べたところ #444444#494949 に変化していました。

微妙すぎて分からんわ!


ちなみに、4月7日に更新された Extension 3 には -highlightColor というのも追加され、
これの使い方が全く不明・・・。

Extension 3 もパッチだと思ってインストールしたら 2016.5 と別バージョンだったという罠。

2016年4月19日火曜日

内分点の計算

骨にロール用のジョイントを追加したい場合に使用する公式、内分点について。

直線ABをm:nに分けると云うやつですね。


公式は、こんなんだけれど、どうスクリプトに起こすのか?
m:nっていうのが難所。

とりあえず図解。


これをm:nを使わずに表現したい。

計算する場合、たいていaとbは設定できます。
そのa-b間の特定の座標が知りたいわけなので、
こんな感じの図になりました。

コレを使って内分点の式を書き換えると、


これでスクリプトにする事ができそうな気がします。

引数は
  • 開始位置
  • 終了位置
  • 割合
の3つ。

global proc vector calcDividingPoint(
    vector $sp,                         // 開始位置
    vector $ep,                         // 終了位置
     float $rate )                      // 割合
{
    float $length=mag( $sp-$ep );
    float $m=$length * $rate;

    return ( ( ($length-$m) * $sp + $m * $ep ) / $length );

}


ま、ここで終わっても使えないことは無いのですが、よく見ると $length を掛けたり
割ったりしまくっています。

$rate そもそも百分率なので、$length でなく 1.0 とすれば良いわけです。
なので、

global proc vector calcDividingPoint(
    vector $sp,                         // 開始位置
    vector $ep,                         // 終了位置
     float $rate )                      // 割合
{
    return ( (1.0-$rate) * $sp + $rate * $ep );

}


これで十分。

ちなみに $rate に1以上を設定すると外分点になります。


2016年4月4日月曜日

バックアップ用バッチ

スクリプトフォルダをバックアップするバッチファイル。

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: mayaのスクリプトをバックアップする。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@echo off
set YYYYMMDD=%DATE:/=%
set HHMMSS=%TIME:~0,-3%
set HHMMSS=%HHMMSS::=%
set HHMMSS=%HHMMSS: =0%


set SOURCE=D:\maya
set BACKUP=D:\_backUpFolder


XCOPY "%SOURCE%\scripts" "%BACKUP%\scripts\%YYYYMMDD%_scripts" /S /I /Y


pause


12行目に scripts フォルダの「親」のパス。
13行目にコピー先のパス。

6~9行目は日付と時間を8桁の文字列にする部分。
これはよく使います。定型分みたいな感じ。


差分とか手軽に調べるならサブバージョンの方が良いかもなぁ・・・。

2016年3月24日木曜日

melファイルの改行コード

melスクリプトを作っていて、デバッグがてらエラーで止まったところのログを見ていたら
ちょっとした疑問がわいてきました。

サンプルスクリプトとして

global proc hogehoge()
{
 print("hogehoge")
 
 
}

と、わざとシンタックスエラーが出るようなスクリプトを作成して実行してみます。
ちなみに、3行目の行末にセミコロンが付いていません。

当然エラーが出て止まるのですが、矢印の部分。

改行してなくない?

ひょっとしてと思い、秀丸で改行コードをCRに変えてみたところ


エラーログが変わりました。

昔、fgetlineでcsvファイルを読みこんだとき、最後の語句に改行が余分にくっついて
難儀したのが役立った。

ということで、melファイルは改行コードにCRを使った方が良いみたいです。

でも、これだとメモ帳で開くと改行されないという罠。