[mel] scriptEditorから覚えるmel講座 その6 調べ方と書き方のコツなど。

とうとうパート6になってしまいました。
長すぎですね^ω^;;;;
前回 繰り返し について説明して 日本語でかかれた処理内容をMelに置き換えてみたのが

string $cvList[] = ??????;

for ($cv in $cvList){
$cv にクラスターを作る
ロケーターを作る
ロケーターを $cv の位置に合わせる
クラスターをロケータにポイントコンストレインする
}

こんな感じです。
今回はこの日本語になっているところをMelに翻訳して行きます。

まず、1行目の「CVをリスト」する という部分から。

答えを言ってしまえば、

select -r “curve1.cv[*]”;
string $cvList[] = ls -sl -fl

で、CurveのCVのを変数にいれることができます。
なーんだ、簡単じゃん って思うかもしれませんが 全く知らない状態でこの答えにたどり着くのはなかなか難しいです。

私自身、MelやらPythonやらでスクリプトを書く仕事をしていますが
「何を使ったら自分がやりたいことができるのか」分からないことだらけです。
じゃあどうすりゃいいの?今回は手順の中でやり方を書いてるけど 自分で別の何かを書きたくなったら
何もできなくなってしまうよ?

Answer
Google先生に聞いてみる 

素直にGoogle先生に聞きます。おそらくこれで半分以上は問題が解決します。
この時、日本語で処理を書いておく というのが非常に意味を持ちます。
何をしたいのかがきちんとまとまっていないと Google先生に訪ねようにも 何を聞いていのかわからないです。
が、処理が決まっていれば わりとそのままGoogle先生に聞いてみると答えがわかります。
試しに
【mel cv 選択】とGoogle先生に聞いてみてみましょう。
たぶん当ブログの逆引きだったり、ほかの解説サイトさんだったりが引っかかります。

この時のコツは、 ある程度単語で区切る とHit率があがります。
というわけで、さいしょの一行 CVをリストする は

string $curve = “curve1”;
select -r ($curve + “.cv[*]”);
string $cvList[] = ls -sl -fl;

こんな感じになりました。
1行目が ロケーターをくっつけたいカーブの名前です。
2行目で CVを選択します。

ここで、その4でかいた お約束 を見なおして見てください。
4 コマンド内で変数を使った足し算をするときは()で囲む と書いてありますが、
2行目は curve名の入った変数と  .[*] を足し算しています ので()で囲んで上げる必要があるわけですね。

.[*] の * というのは、すべて という意味があります。
これもある意味お約束みたいなものなので、脳みその端っこに入れておくと便利です。

選択したCVを ls コマンドでリストします。

こんなかんじで、日本語にして わからないところはGoogle先生!
というのがわりとよくあるスクリプト作業の手順です。

続いて、
繰り返しの中を書きます。
この部分は、一番はじめにつくったScriptEditorのログを使います。

[cpp]
select -r curve1.cv[0] ;
newCluster " -envelope 1";
spaceLocator -p 0 0 0;
select -r cluster1Handle ;
select -add locator1 ;
pointConstraint -offset 0 0 0 -weight 1;
select -r locator1_pointConstraint1 ;
delete;
select -r locator1 ;
select -add cluster1Handle ;
pointConstraint -offset 0 0 0 -weight 1;
[/cpp]

↑ が作ったログですが、これだとちょっとごちゃごちゃしているので 整理していきます。

[cpp]
for ($cv in $cvList){
select -r $cv;
string $cluster[] =newCluster " -envelope 1";
string $locator[] = spaceLocator -p 0 0 0;
string $const[] = pointConstraint -offset 0 0 0 -weight 1 $cluster[1] $locator[0];
delete $const;
pointConstraint -offset 0 0 0 -weight 1 $locator[0] $cluster[1];
}
[/cpp]

※ 少しコマンド間違ってたので修正

整理できました。
随分すっきりしました。

整理の仕方のコツ
1 クラスターやLocatorなど、作ったあとに 作ったノードを使って何かしたい場合は 変数にいれる
cluster も locator も 返り値が配列なので、配列型に入れてあげます。
帰ってくる値がなんなのか(配列・文字列・数字etc)は、コマンドリファレンスの 戻り値 と書かれている部分を確認します。
例) string[] なら 文字列型の配列

2 コンストレインのように select -> constraint となっているところは 1行にまとめる
コマンドの並び順は コマンド名 オプション 対象;
対象がかかれていない場合は、選択しているものに対してコマンドが適応されます。
手でやった場合は、select -> コマンドになっているので こういったところをまとめてあげるとすっきりします。
3 対象が変わるところは配列に
繰り返しのたびに変わる cv や、locator名、クラスターの名前部分は変数に置き換えます。

こんなかんじで、一気にコマンドになりました。
今回はものすごい勢いでかっ飛ばしたので ワケワカラン!! になってる人もいるかもしれません スイマセン…

特に後半は???かもしれませんが 治す前とあと で、何がどう変わってるのか よーく観察して 読んでみてください。はい。

次回 で終わりなはず。

コメントを残す

メールアドレスが公開されることはありません。


*