myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

mCombine : Merge, Rename, ReParent

モデリングする時にオブジェクトを選択して、
マージして、
デフォルトのtolerance設定は大きすぎるので、tolerance設定を0.001とかにして、
UVやanimationを選択してコピー、
マージされたオブジェクトは別のオブジェクトになるので、元のオブジェクトを削除して、
いつもpolymshという名前になるので、リネームして、
polymshはrootに作成されるので、親子設定し直す
という単純な作業の繰り返しが多い。

面倒くさいからこの単純なスクリプトを作ってみました。
Mergeする時にToleranceは0.001 になります。アニメーションとマテリアルもコピーされます。

こいつは1ヶ月前に作ったスクリプトで初めてxsiaddonにパッケージにしてみました。
別にxsiaddonにする必要はないけど、インストールしやすいからこっちの方が良いかな。


mCombine
download

インストール方法:XSIのビューポートにドラッグ&ドロップ
バージョン対応:XSI5.11以上(5.11以前のバージョンでも動くかもしれない)

エクスプローラーの右クリックメニューに「m.Combine  Polygons」というコマンドが出てきます。
ビューポートの右クリックメニューにも出てきます。

Instructions: Drag &  Drop the xsiaddon to the XSI Viewport  (you can drag  &  drop directly from the link)
Versions: XSI  5.11 and later

After installed, you will find a command called [m.Combine Polygons] in the XSI Explorer's Right click menu.
It will also appear in the viewport's menu.




スクリプトのコード:


'VBS

DIM oObj, oObjname, oObjparent, polytempname, oRoot

'Polymsh だけのコレクション作成 (oColl)
Set oColl = CreateObject("XSI.Collection")
for each oItem in selection
if oItem.type = "polymsh" Then
oColl.Add oItem
End If
next

if oColl.count < 2 Then
LogMessage "You need to select at least 2 objects (polymsh)", siWarning
else

'最初に選択したオブジェクトを取得(オブジェクト0)
set oObj=oColl(0)

'そのオブジェクトの名と親をストリング化
sObjname = oColl(0).name
oObjparent = oColl(0).parent

'oCollの子を取得
Set oChildren = CreateObject("XSI.Collection")
for each item in oColl
if item.Children.Count <>0 then
for each child in item.Children
oChildren.Add child
next
end if
next

dim oMerged 'マージされるコレクション (コレクションになるので、index番号が必要)

ApplyGenOp "MeshMerge", , oColl, 3, siPersistentOperation, siKeepGenOpInputs, oMerged
TransferAllPropertiesAcrossGenOp oMerged & ".polymsh.mergemesh", oMerged, , True
CopyAnimationAcrossGenerator oMerged & ".polymsh.mergemesh", 0
SetValue oMerged & ".polymsh.mergemesh.inputreadregion", 0
SetValue oMerged & ".polymsh.mergemesh.tolerance", 0.001

'子オブジェクトをマージされたオブジェクトに移動。
if oChildren.Count <> 0 then
ParentObjects oChildren & "," & oMerged(0)
end if

'元のオブジェクト0の親はシーンルートじゃない場合、その親の下に移動。
if oObjparent<>"Scene_Root" then
ParentObjects oMerged(0) & "," & oObjparent
end if

DeleteGeneratorInputs oMerged & ".polymsh.mergemesh"
DeleteObj(oColl)
SelectObj(oMerged(0))

oMerged(0).name = sObjname
end if


古くて恥ずかしいコード:

VBScript

'Merges with 0.001 Tolerance
'Renames the merged obj with the first selected obj's name
'ReParent the merged obj with the first selected obj's parent

DIM oObj, oObjname, oObjparent, polytempname, oRoot
'最初に選択したオブジェクトをオブジェクトとして取得
set oObj=selection(0)
'そのオブジェクト名と親をストリング化
oObjname = selection(0).name
oObjparent = selection(0).parent
'オブジェクト名変更。デフォルト変えられないので、まずはpolymshを探す。
polytempname="polymsh"
set oRoot = ActiveProject.ActiveScene.Root
set Merged = oRoot.FindChild("polymsh")
if Application.ClassName( Merged ) <> "" then
'polymshが見つかった場合、polymsh1から99までリネームしようとする。
For i = 1 to 99
set Merged = oRoot.FindChild("polymsh" & i)
if Application.ClassName( Merged ) <> "" then
polytempname = "polymsh" & i + 1
End if
Next
End if
'マージされたオブジェクト名が決まったら、マージするだけ:
ApplyGenOp "MeshMerge", , selectionlist, 3, siPersistentOperation, siKeepGenOpInputs
TransferAllPropertiesAcrossGenOp polytempname & ".polymsh.mergemesh", polytempname, , True
CopyAnimationAcrossGenerator polytempname & ".polymsh.mergemesh", 0
SetValue polytempname & ".polymsh.mergemesh.inputreadregion", 0
SetValue polytempname & ".polymsh.mergemesh.tolerance", 0.001
DeleteGeneratorInputs polytempname & ".polymsh.mergemesh"
'↑これで元のオブジェクトが消されるので、oObj名はストリング化する必要がありました。
SetValue polytempname & ".Name", oObjname
'元のオブジェクトの親はシーンルートでなければ、その親の下に移動。
if oObjparent<>"Scene_Root" then
CopyPaste oObjname, , oObjparent, 1
end if



Comments

Post a comment


Only the blog author may view the comment.

Trackbacks

Trackbacks URL
http://myara.blog.fc2.com/tb.php/3-a02d55da
Use trackback on this entry.