2011/09/22

スクリプトライブラリ

仕事でよく使うだろースクリプト第3段です。

と、今回は、趣向がちょっと違いまして、みなさんは、自前のスクリプトや、ダウンロードしたものなどは、どうやって使っていますか?

普通に、フォルダ分けして、Explorerからドラッグ&ドロップでしょうか。
はたまた、シェルフを作ってボタン化している人もいるでしょう。
わざわざ、プラグインにメニュー登録して、メニューを追加している人もいるかも知れません。

それを一挙に解決出来るかも。というプラグインです。

コンセプトは

「オレのスクリプトライブラリ」

です。
初めてアドオン作りました。

addonをドラッグ&ドロップします
まずは、アドオンをダウンロードしてください。

ScriptLibrary_1_1.xsiaddon

その後、ダウンロードしたファイルを、Softimageにドラッグ&ドロップします。






初期の状態のScript Libraryメニュー
すると、メニュー上部に「Script Library」メニューが追加されました。

About Script LibraryをクリックするとHelpが表示されます。








Preferenceでルートパスを変更
このままでは、まったく使い物にならないので、Preferenceを変更します。

Preferences -> Custom -> ScriptLibrary

を選択して、スクリプトが入っているルートフォルダを設定します。


フォルダ階層と同期します
するとExplorerのフォルダ階層とメニューが同期して、そこからスクリプトファイルを実行出来るようになっちゃいます。

ちなみに、ヘルプなどのhtmlや、txtファイルも実行でき、Netviewで見ることが出来ます。

今現在対応しているファイルは

vbs, js, py, pys, html, htm, txt

の7種類が実行出来ます。
それ以外の拡張子は、メニューに登録されますが、実行出来ません。

要望があったら、バージョンアップします。

About Script Libraryも覗いてみてくださいね。

ではでは、ご活用ください。

(◉◞౪◟◉`)チャオ

2011/09/19

サブディビジョングループを作成する

タイトルを逆引きにしますた。
探しにくかったですね・・・。ごめんなさい。

さて、今日のアップは、サブディビジョングループを登録するです。
これも良く使うよなー。
サブディビレベルに応じて、グループ分けは良くしますよね?
あれ、しませんか。そうですか。

オブジェクトを選択して、実行するタイプのスクリプトです。


#---------------------------------------------------
app=Application;log=app.LogMessage;sel=app.Selection
import win32com.client
from win32com.client import constants as c
from win32com.client import Dispatch as d
#---------------------------------------------------
def CreateSubDivGroup(oObj):
log("%s,%s"%(oObj.FullName,oObj.Type))
# ポリゴンじゃないならメソッドを抜ける
if(oObj.Type != c.siPolyMeshType): return
# オブジェクトのサビディビジョンレンダーレベルを取得
iLvl = oObj.Properties("Geometry Approximation").Parameters("gapproxmordrsl").Value
# オブジェクトのモデルを取得
oMdl = oObj.Model
# オブジェクトがすでにサブディビジョングループに登録されているか調べる
oGrp = oMdl.Groups("sbdv_%02d"%iLvl)
# 登録されていなかったら
if not oGrp:
# 属するモデルにグループを作成
oGrp = oMdl.AddGroup(None,"sbdv_%02d"%iLvl)
# ジオメトリアプロクシメーションプロパティを作成
oProp = oGrp.AddProperty("GeomApprox")
# グループのサブディビジョンレンダーレベルをオブジェクトの値にエクスプレッションでセットする
oProp.Parameters("gapproxmordrsl").AddExpression("%s"%iLvl)
# オブジェクトをグループにメンバ登録
oGrp.AddMember(oObj)

# 選択したものが属するモデルに、サブディビジョングループを作成し登録
map(CreateSubDivGroup, sel)



今回のポイントは、目的のタイプのオブジェクトじゃなかったら、メソッドを抜ける。です。

if(oObj.Type != c.siPolyMeshType): return

ポリメッシュタイプ以外だったら、returnによってメソッドを抜けることが出来ます。
エラー処理のひとつです。

サブディビジョングループを登録
オブジェクトを選んで実行するとこんな感じに仕上がります。
レベルは、いくつでも大丈夫です。100を超えると数字がそろわなくなるくらいですか(そんなの作ることは無いですが)

あとは、グループに新しくサビディビプロパティを作るので、Discontinuityがデフォルトに戻ってしまうというのが、注意しなくてはならない所。
ディスプレイスもそうですね。

で。
2011から気づいたバグなのですが、グループにプロパティをセットして、オブジェクトを登録したのち、グループを消すと、元のオブジェクトに付いていたプロパティが見えなくなってしまう問題があります。
実は本体は存在するようです。その証拠に、一度保存して、読み込み直すと元通りになってます。
そんなに問題ではないように思いますが、ハマる人はハマるバグです。
今日試しましたが、2012でも同じ挙動なので、直ってませんでした。

お気をつけ。

ラヴXSI (◞≼●≽◟◞౪◟◞≼●≽◟)

2011/09/18

Render Archiveメモ

ほとんど使われる事がないRender Archive自分用メモ。

Render_Archive

Export---------------------------

Export時にライトも適用されてしまう模様。
なので、ライトは消去してからExport。
ライトのみもArchive可能。

素材分けは、パスを使用するのではなく、FrameBufferを使用する。

Motion Vectorの設定は、パス設定を見に行くので、作成時に注意。
Pass Rendering -> on
Scene Motion Blur Setting -> end of frame
shutter -> 0

Rendering------------------------

Rendering Scene構築の際、Instanceを各Passごとに設定
ICETree内で、Cacheをbtyなどで一度取り、他のPassはPointPositionのみReadし、StandinをそれぞれSet Instance Geometryで、セットする。
↑はズレル事がある。原因不明。

FrameBufferで一発出しが無難。

デフォーマのウェイト値割り当てを入れ替える

仕事中に良く使ったなーというスクリプトを続々アップしようと思いますた。
取っておいてもしょうがないし。

てなわけで、第一段は、デフォーマのウェイト値割り当てを入れ替えるスクリプトです。
うんうん、良く使う。
デフォルトで、搭載されていても、おかしくないと思うんですけどね。


#---------------------------------------------------
# デフォーマのウェイト値を入れ替えるスクリプト
# Envelopeされているオブジェクトを選択しスクリプトを実行
# その後、入れ替えるデフォーマを元、先の順にピックします。
#---------------------------------------------------
app=Application;log=app.LogMessage;sel=app.Selection
import win32com.client
from win32com.client import constants as c
from win32com.client.dynamic import Dispatch as d
#---------------------------------------------------
# チェンジ元のオブジェクトを取得
oBtn,oMdf,oElmSrc = app.PickElement("","Pick Source","Pick Source")
if not oElmSrc:raise
# チェンジ先のオブジェクトを取得
oBtn,oMdf,oElmTgt = app.PickElement("","Pick Target","Pick Target")
if not oElmTgt:raise
if sel.Count==0:raise

for oObj in sel:
    # 新しくデフォーマをEnvelopeへ登録
    app.ApplyFlexEnv(oObj.FullName+";"+oElmTgt.FullName, "", 0)
    # Envelopeを取得
    oEnv = oObj.Envelopes(0)
    # EnvelopeのWeight値を取得
    # 内包表記を使用して、タプルをリストへ変換
    lWgt = [list(t) for t in oEnv.Weights.Array]
    # チェンジ元、先、それぞれのデフォーマは
    # 何番目に登録されたオフジェクトかを調べる
    for i,oDfm in enumerate(oEnv.Deformers):
        if oElmSrc.FullName == oDfm.FullName:
            iSrc = i
            log(i)
        elif oElmTgt.FullName == oDfm.FullName:
            iTgt = i
            log(i)
    # デフォーマのウェイト値を入れ替える
    lWgt[iSrc],lWgt[iTgt] = lWgt[iTgt],lWgt[iSrc]
    # ウェイト値をセットする
    oEnv.Weights.Array = lWgt



ここでのスクリプトのポイントは、ウェイト値の取得です。
Pythonのタプルは編集が出来ないので、編集が出来るリストへ変換します。

lWgt = [list(t) for t in oEnv.Weights.Array]

2次元配列のタプルを、2次元配列のリストへ変換します。
これで、編集可能ってわけです。

多次元タプルを、全てリスト化するメソッドを今度書いてみようかな。

Perforce: 複数のワークスペースを更新するバッチ

batを叩けば全部更新。 @echo off set P4PORT=x.x.x.x:xxxx set P4USER=user set P4PASSWD=password echo %P4PORT% echo %P4USER% echo %P4PASSWD% echo %P4PAS...