質問:
エッジ選択にフィルタ処理を行って、「エッジ選択要素」のような、接続されたエッジを含む配列を作成したいと考えています。2 つの配列のエッジは決して接続されません。 つまり、頂点を共有しません。
回答:
次の疑似コードは、実行可能な手段を記述したものです。
-
現在のエッジ選択を取得し、主選択配列に入れます。
-
未接続のエッジ選択を入れる空の配列を作成します。
-
(A) 新しい空の配列をサブ配列としてこの配列に追加します。
-
現在のサブ配列のインデックスを書き留めます。
-
主選択配列から、最初のエッジを取得します。
-
このエッジを主選択配列から削除して、未接続の選択配列の現在のサブ配列へ追加します。
-
新しいサブ配列のエッジごとに、次の手順を行います。
-
エッジを定義しているそれぞれの頂点を取得します。
-
2 つの頂点それぞれについて、そのエッジを取得します。 これにより、現在のエッジで使用されている頂点を共有した隣接エッジがすべて得られます。
-
隣接エッジをループ処理して、主選択配列に表示されているかどうかを調べます。
-
エッジが主選択配列に存在する場合は、そのエッジを主選択配列から削除して、現在のサブ配列に追加します。
-
サブ配列のすべてのエッジを確認し終えたら、ループを終了します。
-
この時点ですべてのエッジが接続していれば、主配列は空になります。空でなければ、既に収集した選択に接続していないエッジが存在することになります。
-
新しい空のサブ配列を、コレクション配列に追加します。
-
(A) から繰り返します。
この関数は、主配列にエッジが残っていない場合に使用できるようになります。
これにより、未接続のエッジ選択と同数のサブ配列が作成されます。
次の関数は、MAXScript コードに擬似コードを実装します。
スクリプト:
|
fn getEPolyUnconnectedEdgesSelections thePoly =
(
-- エッジ選択を取得します。
mainSelection = (polyOp.getEdgeSelection thePoly) as array
-- 選択「要素」を使って、整数の配列でサブ配列を収集します。
unconnectedSelections = #()
-- 主選択配列が空になるまで繰り返します。
while mainSelection.count > 0 do
(
-- 空のサブ配列を追加します。
append unconnectedSelections #()
現在のサブ配列のインデックスを書き留めます
currentSelCount = unconnectedSelections.count
主選択配列からサブ配列に最初のエッジを追加します。
append unconnectedSelections[currentSelCount] mainSelection[1]
そして、主選択配列から最初のエッジを削除します。
deleteItem mainSelection 1
整数のカウンタ。
cnt = 0
-- サブ配列で、カウンタの数がエッジよりも少ない場合は、
while cnt < unconnectedSelections[currentSelCount].count do
(
cnt += 1--カウンタに 1 を加算します。
-- 現在のサブ配列内の現在のエッジの頂点を取得します。
currentEdgeVerts = (polyOp.GetVertsUsingEdge thePoly unconnectedSelections[currentSelCount][cnt]) as array
neigborEdges = #()-- 整数の配列で隣接エッジを収集します。
-- 現在のエッジのすべての頂点に対して、
for v in currentEdgeVerts do
-- その頂点のエッジを隣接するエッジの配列に追加します。
join neigborEdges ((polyOp.GetEdgesUsingVert thePoly v) as array)
-- 隣接エッジそれぞれに対して、
for edge in neigborEdges do
(
-- エッジが主選択配列にあるかどうかを確認します。
checkInSelection = findItem mainSelection edge
-- ある場合、
if checkInSelection > 0 do
(
-- 主選択配列から、エッジを削除します。
deleteItem mainSelection checkInSelection
-- そして、そのエッジをサブ配列に追加します。
append unconnectedSelections[currentSelCount] edge
)--if 終了
)--エッジ ループを終了します。
)--while cnt を終了します。
)--while mainSelection.count を終了します。
-- 最後に、接続されたエッジのサブ配列を含む配列が返されます。
unconnectedSelections
)--fn 終了
getEPolyUnconnectedEdgesSelections $Box01--関数を呼び出します。
|