« 動きを計算してアニメーションにしているオブジェクトの進行方向にZ軸を合わせるXPresso | トップページ | artist sideで10個のカメラを一気にレンダリングね… »

開いているポリゴンオブジェクトの外側のポリゴンを選択するC4Dユーザスクリプト

開いているポリゴンオブジェクトの外側のポリゴンを選択するユーザスクリプト…

Selectedgepolygon

外側のポリゴン?
こんな感じだね。

さて、外側のポリゴンを選択する事があるか?そんな事は抜きにして…

C.O.F.F.E.E.を理解している人ならば…

Selectedgepolygon_01

共有していないエッジを持つポリゴンを選択すれば完了。
C.O.F.F.E.E.はエッジに未対応だけど、ポリゴンを構成するポイント番号の並び…

例えば…

0:ポイント番号 56
1:ポイント番号 38
2:ポイント番号 42
3:ポイント番号 19

エッジの始点/終点
0⇔1:56⇔38
1⇔2:38⇔42
2⇔3:42⇔19
3⇔0:19⇔56

この4つ(三角ポリゴンなら3つ)並びを、他のポリゴンと1つでも共有しないポリゴンが外側のポリゴンだというわけだ…

面倒くさい事になる。処理もかなり遅くなる。
100枚の4角ポリゴンがあれば、
[100枚×自分以外の99枚×自分のエッジ4本×相手のエッジ4本]回
比較することになる。
1本のエッジを比較するにしても、エッジを構成する番号も0⇔1ならば、[0と1]と[1と0]と2回必要だ。相手も2回だから4回になる。

ポリゴン取得して…GetPolygons()
ポリゴン数取得して…GetPolygonCount()
選択状況取得して選択解除…GetPolygonSelection()…DeselectAll()
比較するポリゴンの数繰り返し…for()
比較するエッジの数繰り返し…for()
比較されるポリゴンを繰り返し…for()
同じポリゴンを比較しないif()continue
比較されるエッジを繰り返し…for()
比較して共有していればフラグを立てて比較されるエッジループを離脱…if()break
共通フラグが立っていれば比較されるポリゴンループを離脱…if()break
共有フラグが立っていれば比較するエッジループを離脱…if()break
共有フラグが立っていなければポリゴンを選択…Select()

最後にポリゴンの選択をオブジェクトに適用…SetPolygonSelection()

こんな感じかなぁ…細かいところは省いているけどね…

勘のいい人ならば、もう気付いていると思うが…

こんな事を難しく考える必要はないのだ…

1:ポリゴンを全て選択
2:選択範囲を縮小
3:全て反転(選択範囲の反転)

この3つで外側のポリゴンを選択できるのだ。

CommandCallかSendModelingCommandで可能だろう。

この方法だと、ポイントもエッジも可能だ。
でもエッジには、「アウトラインを選択」と言うツールが既に存在する。

では、ユーザスクリプトを作ってみよう。
では、メニューの状態から。

if(instanceof(op , PolygonObject))ENABLE=TRUE;
else ENABLE=FALSE;

これで、ポリゴンオブジェクト以外だとメニューにはグレー表示。

/*
開いたオブジェクトの外側のポリゴンを選択
2009.4.11
*/


if(!instanceof(op , PolygonObject))return;

CallCommand(12187);//ポリゴンモード
CallCommand(13323);//全てを選択
CallCommand(12559);//選択範囲を縮小
CallCommand(12479);//全て反転

ポリゴンオブジェクト以外が選択されているとメニューがグレー表示になりますが、スクリプトマネージャの実行ボタンで強制的に実行できるので、更にポリゴンオブジェクト以外を排除します。

CallCommandは、タイプしていません。
R9は、非対応なんですが、R11ではコマンドマネージャから「ドラッグ&ドロップ」で自動的に

CallCommand(xxxx);

と、コマンドID付でタイプされます。R10の対応は知りません。

これだけで、完成です。
ユーザスクリプトはC.O.F.F.E.E.を駆使しなくても、既存のツールの組み合わせで新しいツールを作ることができます。

今回のユーザスクリプトは、「SelectOutlinePolygon.ZIP」です。
スクリプトマネージャからインポートしてください。

1つの事に囚われ過ぎると、目の前にあっても最も簡単で最善な方法を見失う恐れがあるよね。

|

« 動きを計算してアニメーションにしているオブジェクトの進行方向にZ軸を合わせるXPresso | トップページ | artist sideで10個のカメラを一気にレンダリングね… »