myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

SI | 唐突にスクリプト。

このスクリプトと記事のタイトルに困ってるので・・・とりあえず、唐突にスクリプト!

この記事はスクリプトを書く人にしか役に立たないかもしれません。

簡単なスクリプトの作り方に参考になればと思います。


Twitterでこの問題が出てきました。

528234844.png


問題: Cエッジが AB と繋がっていません。

目的: Cエッジ を ABエッジ に繋ぐこと。


出来るだけ時間を掛けたくないから、コマンドが残りそうなやり方で手動でやって、ログからコピペーって感じでやります。
俺の適当なスクリプトはだいたいここから始まります。


まずは、エッジにポイントを適当に入れます。SplitEdgeで。

'VBS log :
SplitEdge "cube.edge[7]", 46.4000419501174, False, False, siImmediateOperation

次は、出来たポイントを選んで、フィルターポイント。
ターゲットを選択されていないポイントにして、
距離をマックス、2に。

'VBS log:
SelectGeometryComponents "cube.pnt[10,LAST]"
ApplyTopoOp "FilterPoints", "cube.pnt[10,LAST]", siUnspecified, siImmediateOperation

たら~ん。出来ました!

よし、これをスクリプトにしちゃいましょう!

SplitEdge  は output arguments を使うので、VBSで書いたほうが楽ですね。
XSIが使う言語の中では Output arguments は VBS しか対応していません。
なので、JScriptとかでどうやってこの新しいポイントを取得することを考えるより、VBSで書いちゃったほうが良い。

この Split Edge は 新しいポイントのインデックスを Output argument  で出してくれるから VBS で書くと便利です。

では、コードを書き始めよう:

'エッジを取得
set sel = selection(0).subcomponent
set subcol = sel.componentcollection

'そのエッジの親オブジェクトを取得
set oObj = sel.parent3dobject

'仮のポイントコレクションを用意する
set oPoints = oObj.ActivePrimitive.Geometry.CreateSubComponent(siVertexCluster)

'選択したエッジをループして、
for each edge in subcol

'エッジのインデックスを取っておこう
idx = edge.index

'エッジをスプリット
'50 は エッジの50% (真ん中)にポイントを作るという意味です。
'最後のpointidxはポイントIDです。例のOutput Argument
SplitEdge oObj & ".edge[" & idx & "]", 50, false, false, siPersistentOperation, pointidx

'このpointidxをさっき作っておいたポイントコレクションに入れましょう
oPoints.Addelement pointidx

next

'これでエッジにポイントが2つが出来て、その新しいポイントのIDもゲットしました。
'この新しいポイントにフィルターポイントをかけて、近いポイントに合体させましょう。
ApplyTopoOp "FilterPoints", oPoints, siUnspecified, siPersistentOperation

'↓ ターゲットを選択されていないポイントに変えるオプション
SetValue oObj & ".polymsh.filterpointsbydistancesop.autogrouptype", 2

'↓ 距離です。2でマックス!
SetValue oObj & ".polymsh.filterpointsbydistancesop.distance", 2



出来上がり!

これでたてのエッジ(左と右の)を 選択して、実行するとCエッジがつながります。


これに更にselection ループの中に入れると、複数のオブジェクトもいっぺんに出来るようになります。


for each item in selection

   set sel = item.subcomponent

   などなどなど

next



変数を宣言してないけど、ループはあんまりしないスクリプトなので大丈夫だです。
ループが多いスクリプトの場合は変数を宣言し忘れずにね!


残りはその穴を埋めることですね。

まぁ、それは簡単です。
RCTools か JPolygon Healerを使えば良いだけですね。

JPolygon Healerは VBS なので、そのコードを盗んで上のコードと合体すればワンクリックで出来ますね。
そこまでやる気ないんで、これで。