--

--

コメント

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

04

14

コメント

FindChildrenの謎

FindChildrenメソッドを使っていて最近気づいた謎。
私はスクリプト書き始めてまだ1年そこらしか立ってないので、私が知らないだけかも知れませんが・・・。
たとえば、適当に2本のボーンを持つスケルトンを書いてから、そのChainRootを選択して以下のスクリプトを実行すると、
app = Application
oSel = app.Selection(0)
oChildren = oSel.FindChildren("","")
for oChild in oChildren:
  app.Logmessage(oChild) 

# INFO : bone
# INFO : bone1
# INFO : eff


とまあこんな感じに選択されたChainRootを含めずにその子を返してくれます

但し、FindChildren("","")の部分をFindChildren("*","")に書き換えると

app = Application
oSel = app.Selection(0)
oChildren = oSel.FindChildren("*","")
for oChild in oChildren:
  app.Logmessage(oChild) 

# INFO : root
# INFO : bone
# INFO : bone1
# INFO : eff


このように選択されたChainRootも帰ってきます。

ただ、この現象はFindChildrenの第二引数を指定しない場合に限られるようです。

元々FindChildrenは引数に指定したもので検索し、その検索に引っかかった親と子をコレクションに入れるものなので、選択した親が入っている方が正解なのですが・・・。(あえて親を含めないFindChildren2があるくらいですし)  

メソッド内部の処理の関係なんだとは思いますが、なんか不思議な仕様にプログラミング素人は感じる今日この頃でした。
スポンサーサイト

04

12

コメント

シーン内にあるカメラの切り替えスクリプト

シーン内に大量のカメラがあってそれを何度も確認しないとならない仕事をしていた際、いちいちビュー左上からカメラを切り替えるのが面倒すぎてブチ切れそうになったので書いたプラグインです。
特にメニュー追加とかは無いので、Pluginフォルダにぶち込んだ後、キーボードショートカット等に登録し、実行してください。

このプラグインは実行毎に選択ビューをシーン内の次のカメラへ切り替えます。(Top、Front、Right、UserなどのSceneRoot以下に無いカメラには切り替わりません。)

カメラの取得をFindChildrenメソッドを使用し、特に並び替などの処理を入れていないので、場合によっては意図しない順番にカメラが切り替わる可能性がありますのでご注意を。
この辺の切り替え順はそのうちまたこの仕様にキレそうになったら修正すると思います。

Change_To_The_Next_Camera

03

28

コメント

Pythonはじめました

最近JavaScriptから今人気のPythonへ乗り換えました。

とりあえずの感想としては、慣れるとPythonの方が素早くコードをかける気がします。(気がします。)

JavaScriptではfor文で選択した回数ループする処理を書くのに

for(var i = 0; i < Selection.Count; i++){
    Logmessage(oSel.Name);
}


ここまで書く必要がありましたが、Pythonだと

app = Application
log = app.Logmessage

for oSel in app.Selection:
    log(oSel.Name)


ApplicationとLogmessageを変数に予め入れておけば、for文ひとつが非常に楽に書けます。

JavaScript使ってたときの{ }のウザさから開放されました。(まあ、CとかC++とか書いてる人は無いと逆に不安になるかも知れませんが)

また、個人的に非常に大きかったのが、XSI内での多次元配列の取り扱いです。

Pythonにはlist型とtuple型と一般的にはこの二種類の配列の型があるのですが、これが結構使いやすい。

JavaScriptではXSI内の多次元配列オブジェクトを扱う場合、VBArray関数と.toArray()をつかって1次元配列に落とし込む必要がありました。

慣れてる人なら多次元配列を1次元配列に落とし込み、多重for文使ってアクセスするのも簡単でしょうけど、私みたいなニワカスクリプターはこれが面倒で仕方がありませんでした。

その点Pythonのlistやtupleは多次元配列を多次元配列のまま利用できるので非常に楽です。

ただ、Pythonに移るにあたっての注意点はいくつかあります。

まず、JavaScriptや、VBに比べてデータの型が結構厳しく厳密になってます。

JavaScrptやVBだと変数の中身がオブジェクト型でも自動でstring型に変換されたりしますが、Pythonだと蹴られたりします。

他には、JavaScriptだとfunctionを書く位置は、その自作関数を使う前でも後でもよかったりしますが、Pythonは必ず自作関数を宣言した後にしかその関数を使えません。

とまあ、最初はその辺り戸惑うことはあるかもしれませんが、注意すれば全然問題ない事が殆どです。

寧ろ、豊富なモジュールなど使いこなせれば非常に美味しそうな機能がたくさんっぽいので(使いこなせてませんがw)

皆さんもぜひPythonに乗り換えて快適なスクリプトライフを送ってみてください!(頑張って覚えますw)

03

21

コメント

パスの切れたテクスチャをPicturesフォルダから検索するスクリプト

最近スクリプト作業が多くなってきて、すっかり社内XSIスクリプターやってる気がします。

そんなことで、とりあえず小物スクリプト投下



テクスチャー管理の都合上製作途中でPicturesフォルダ内のテクスチャをフォルダ分けしたりして、
パスが変わった場合、パスの編集するのが面倒だったので書いたスクリプト。
実行するとImageSourceの名前からパスが切れているものを自動でPicturesフォルダの内を再帰検索し、
パスを置き換えます。
あと、フルパス嫌なので自動で相対パスにも置き換えます。
あくまでImageSourceの名前から検索するので、テクスチャの名前を変更するとダメですが・・・。

Find_Textures

06

20

コメント

スクリプトメモ02

XSIでツール作ってると、ツールのUIを構築することが結構あるかと思います。

スクリプトのレイアウト関係はjunkiさんのブログで友愛の記事を参考にすれば、すごく捗るかと思います。
もうjunkiさんのブログには足向けて眠れないくらい参考にさせてもらってます。まじリスペクト。

ただ、最近選択したオブジェクトのとあるN個あるプロパティ数パラメーターをUIにぶち込み、そのパラメーターからの値を実行する処理に反映させたいスプリクトを書く場面がありました。

レイアウトを宣言したカスタムプロパティのパラメーターは基本的にPPG.ScriptName.Valueでとってこれるんですが、パラメーターの数がN個の場合、ScriptNameを決めうちでとってこれない。

レイアウト構築用のカスタムプロパティを実体のある形式のカスタムプロパティにすれば、自分で決めたプロパティを取ってきて、中のパラメーターをループでアクセスすれば何の問題もないのですが、

無駄なものを極力残しておきたくないので、やっぱり XSIFactory.CreateObject ( "CustomProperty" ); こっちを主に使ってます。

そんでSDKと睨めっこした結果 PPG.Inspected; これに行き着きました。

PPG.Inspected;を使うとInspectされたプロパティのコレクションが帰ってきます。

XSIFactory.CreateObject ( "CustomProperty" );で作ったUIのパラメーターを弄るとSetValue("customparamset<ランダムな数値>.パラメーター名"以下略  ってログが記録されるかと思います。

その customparamset<ランダムな数値> を取得できるわけです。



これさえとってこれれば、とってきたUIのプロパティに.Parametersでプロパティ内のパラメーターコレクションを取得し、ループして、名前がわからないUI内のパラメーターにもアクセスして値をとってこれるわけです。

まあ、これより簡単なN個あるパラメーター取得の迂回方法ありそうだけど・・・・。

誰か知ってたら教えてください。

Designed by

Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。