2011/09/18

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

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

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


#---------------------------------------------------
# デフォーマのウェイト値を入れ替えるスクリプト
# 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次元配列のリストへ変換します。
これで、編集可能ってわけです。

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

0 件のコメント:

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...