第5回勉強会のスクリプトについて
こんばんは、柳村です。
先日の勉強会でのスクリプトの解説での補足をさせていただきます。

上記画像はPerl(スクリプト言語)で書いた、
以前このブログでご紹介させて頂きましたテクスチャのリニア化(逆補正)スクリプトの
ソース(左)と解説(右)です。
青文字が変数。
緑文字が関数
橙文字がコマンドです。
コマンドについては、スクリプト&コマンドというPDFヘルプに詳しく書かれていますので
そちらをご参考ください。
ここでは、P.324のsceneserviceのコマンドを使用しています。
modoはすべての機能に対してコマンドが発行されていますので、
ユーティリティのコマンドヒストリーですべての操作のコマンドを調べることができます。
(人間が操作したときに発行されたコマンドが履歴に残ります。)
しかしスクリプトを書く際にシーン内にアイテムが何個存在するかや、
選択されているアイテムは一体何なのか?など、
問い合わせたい場合があります。
その場合はLXQ関数を使用して問い合わせることになるのですが、
こういうスクリプト用のコマンドは、スクリプト&コマンドというPDFに記載されています。
スクリプト用のコマンドと申しましたが、このコマンドもmodoのコマンドへ直接入力して
実行させることもできます。
たとへば、4行目の"query sceneservice item.N ? All"はシーン内のアイテム数を取得するコマンドですが、modo内で実行させた結果が以下です。

modo起動後、まっさらのシーンで実行した結果です。
ご覧のとおり、初期状態ですでに16個のアイテムがシーンには存在しています。(=16 value)
これは、全タイプの数(メッシュもマテリアルもライトもカメラも全部含めて)ということになります。
また、これらのアイテムには、0から順番にIDが与えられています。
6行目の"query sceneservice item.type ? [$i]"は
IDが[$i]番のアイテムのタイプを問い合わせています。
※コマンドの中にスクリプトの変数を使用する際は変数を[ ]で囲む必要があります。
5行目のfor文で繰り返し処理を行う際に変数$iに0をセットして
4行目で変数$iaに代入したシーン内の全アイテム数回($i < $ia)繰り返し処理を行わせていますが、
(6行目から16行目までか繰り返しの内容です。)
1回繰り返すごとに$iを1増やすという指定をしていますので($i++)
この$iは0からアイテム数の数値まで増えていくことになります。
ですので、6行目の"query sceneservice item.type ? [$i]"の$iというのは
アイテムのIDを指定していることになります。
modoのコマンドヒストリーで試しに query sceneservice item.type ? 0 と入力して実行してみてください。
これは、ID 0番のアイテムのタイプを取得して来なさいというコマンドになります。
おそらく、答えはmeshと返ってくるはずです。
このように、問い合わせて、判定して、もし・・・だったらどうする。と言う分岐をして
スクリプトを組み立てていきます。
Perlの書式(ルール)については、あちらこちらに解説サイトがありますが、
変数とfor文とif文を知っていると、色々スクリプトを書くことができると思います。
また、変数への数値の代入には = でいいのですが、
if文の評価をする場合は = ではなくて eq もしくは == とする必要があります。
勉強会で解説するのを忘れておりました・・・。
手作業ではメンドクサイ作業もスクリプトをチョコチョコっと書く事で作業の簡略化につながります。
皆さんも一度トライされてみてはいかがでしょうか。
先日の勉強会でのスクリプトの解説での補足をさせていただきます。

上記画像はPerl(スクリプト言語)で書いた、
以前このブログでご紹介させて頂きましたテクスチャのリニア化(逆補正)スクリプトの
ソース(左)と解説(右)です。
青文字が変数。
緑文字が関数
橙文字がコマンドです。
コマンドについては、スクリプト&コマンドというPDFヘルプに詳しく書かれていますので
そちらをご参考ください。
ここでは、P.324のsceneserviceのコマンドを使用しています。
modoはすべての機能に対してコマンドが発行されていますので、
ユーティリティのコマンドヒストリーですべての操作のコマンドを調べることができます。
(人間が操作したときに発行されたコマンドが履歴に残ります。)
しかしスクリプトを書く際にシーン内にアイテムが何個存在するかや、
選択されているアイテムは一体何なのか?など、
問い合わせたい場合があります。
その場合はLXQ関数を使用して問い合わせることになるのですが、
こういうスクリプト用のコマンドは、スクリプト&コマンドというPDFに記載されています。
スクリプト用のコマンドと申しましたが、このコマンドもmodoのコマンドへ直接入力して
実行させることもできます。
たとへば、4行目の"query sceneservice item.N ? All"はシーン内のアイテム数を取得するコマンドですが、modo内で実行させた結果が以下です。

modo起動後、まっさらのシーンで実行した結果です。
ご覧のとおり、初期状態ですでに16個のアイテムがシーンには存在しています。(=16 value)
これは、全タイプの数(メッシュもマテリアルもライトもカメラも全部含めて)ということになります。
また、これらのアイテムには、0から順番にIDが与えられています。
6行目の"query sceneservice item.type ? [$i]"は
IDが[$i]番のアイテムのタイプを問い合わせています。
※コマンドの中にスクリプトの変数を使用する際は変数を[ ]で囲む必要があります。
5行目のfor文で繰り返し処理を行う際に変数$iに0をセットして
4行目で変数$iaに代入したシーン内の全アイテム数回($i < $ia)繰り返し処理を行わせていますが、
(6行目から16行目までか繰り返しの内容です。)
1回繰り返すごとに$iを1増やすという指定をしていますので($i++)
この$iは0からアイテム数の数値まで増えていくことになります。
ですので、6行目の"query sceneservice item.type ? [$i]"の$iというのは
アイテムのIDを指定していることになります。
modoのコマンドヒストリーで試しに query sceneservice item.type ? 0 と入力して実行してみてください。
これは、ID 0番のアイテムのタイプを取得して来なさいというコマンドになります。
おそらく、答えはmeshと返ってくるはずです。
このように、問い合わせて、判定して、もし・・・だったらどうする。と言う分岐をして
スクリプトを組み立てていきます。
Perlの書式(ルール)については、あちらこちらに解説サイトがありますが、
変数とfor文とif文を知っていると、色々スクリプトを書くことができると思います。
また、変数への数値の代入には = でいいのですが、
if文の評価をする場合は = ではなくて eq もしくは == とする必要があります。
勉強会で解説するのを忘れておりました・・・。
手作業ではメンドクサイ作業もスクリプトをチョコチョコっと書く事で作業の簡略化につながります。
皆さんも一度トライされてみてはいかがでしょうか。
スクリプト情報ありがとうございます。
返信削除質問ですが以前、日比さんが東京のセミナーででやっていた頂点数に応じて正確なパイにするのスクリプト(??)って可能なんでしょうか?
http://www.ustream.tv/recorded/10211332
hibiさんのセミナーではそれぞれの頂点数に応じてスケールを合わせるマクロを登録されていたと思います。
返信削除スクリプトでもできなくはないと思いますが。。。
最初の一歩が踏み出せるかどうかなんで、modo内でこういうふうにコマンド吐いてるんですよって見せてもらえただけですごく敷居が低くなりました。これからはpythonかなって思っていたのですが、大規模なプラグイン開発ではないし国内で情報が多いperlでいいかなと。
返信削除tsukuさん、こんにちは。
返信削除スクリプトにご興味を持っていただけてなりよりです。
pythonはライブラリを読込まないといけないとか、
ブロックをインデントで制御するとか・・・。
さらにLuaはもっとクセがあって、数値と文字列が明確に区別されていないようですし、なによりインデックスが1から始まるというのが、気持ち悪いです(笑)
その点、Perlはキッチリ(ルールーが厳しい)していますので私はPerlを使用しています。これからスクリプトを初めて書こうと思われる方にはPerlが扱いやすいかな?と思います。