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 (◞≼●≽◟◞౪◟◞≼●≽◟)

2 件のコメント:

潤樹 さんのコメント...

ううむ、俺もほぼ同じスクリプトを持っています。2年くらい前に書いた。皆、考えることは同じか。

っていうか、俺の場合、よそからもらった汚いシーンデータの整理用ですw  サブDの管理がぐちゃぐちゃじゃねえかゴルァ 俺が整理したるわドルァ というw

garu さんのコメント...

ですね。同じですね。
汚いシーンデータは、ひとり仕事の頃、良く作ってました。
それはそれでいいんですけどね。

いまは、整理しないと落ち着かないですね。
それで時間がロスしているともいいますが。

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