仕事中に良く使ったなーというスクリプトを続々アップしようと思いますた。
取っておいてもしょうがないし。
てなわけで、第一段は、デフォーマのウェイト値割り当てを入れ替えるスクリプトです。
うんうん、良く使う。
デフォルトで、搭載されていても、おかしくないと思うんですけどね。
#---------------------------------------------------
# デフォーマのウェイト値を入れ替えるスクリプト
# 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次元配列のリストへ変換します。
これで、編集可能ってわけです。
多次元タプルを、全てリスト化するメソッドを今度書いてみようかな。
取っておいてもしょうがないし。
てなわけで、第一段は、デフォーマのウェイト値割り当てを入れ替えるスクリプトです。
うんうん、良く使う。
デフォルトで、搭載されていても、おかしくないと思うんですけどね。
#---------------------------------------------------
# デフォーマのウェイト値を入れ替えるスクリプト
# 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次元配列のリストへ変換します。
これで、編集可能ってわけです。
多次元タプルを、全てリスト化するメソッドを今度書いてみようかな。
コメント