this is pretty easy to do, we can simply convert every edge in the ordered edge group to verts and add them to the vert group if they are not in it yet like this function does:
fn convertEdgesToVerts obj edgeGroup =
(
local vertsGroup = #()
for i in edgeGroup do (
local verts = (polyop.getVertsUsingEdge obj i) as array
for j in verts do
appendIfUnique vertsGroup j
)
vertsGroup
)
and the complete example with debugging for both the edges and verts is here:
(
fn getEdgeNeighbors obj i edgesMask:#{} vertMask:#{} =
(
local verts = polyop.getVertsUsingEdge obj i
verts -= vertMask
local neighbors = polyop.getEdgesUsingVert obj verts
neighbors[i] = off
neighbors * edgesMask
)
struct s_TreeNode
(
index,
Children = #(),
fn getChildren obj &edgesMask:#{} &vertsMask:#{} =
(
edgesMask[index] = off
local neighbors = getEdgeNeighbors obj index edgesMask:edgesMask vertMask:vertsMask
local NeighborTreeNodes = for i in neighbors collect s_TreeNode index:i
for i in polyop.getVertsUsingEdge obj index do
vertsMask[i] = on
for i in neighbors where edgesMask[i] do
(
local Child = s_TreeNode index:i
Child.getChildren obj edgesMask:&edgesMask vertsMask:&vertsMask
append Children Child
)
),
fn getGroup =
(
local edgeGroup = #(index)
for Child in Children do
join edgeGroup (Child.getGroup())
edgeGroup
)
)
fn getContinuousEdgeGroups obj =
(
local edgesMask = polyop.getEdgeSelection obj
local selectedEdges = edgesMask as array
local continuousEdgeGroups = #()
for i in selectedEdges where edgesMask[i] do
(
local newGroup = #{}
local frontier = #(i)
while frontier.count > 0 do
(
local current = frontier[1]
deleteItem frontier 1
edgesMask[current] = off
newGroup[current] = on
local neighbors = (getEdgeNeighbors obj current edgesMask:edgesMask) as array
for j in neighbors do
appendIfUnique frontier j
)
append continuousEdgeGroups newGroup
)
continuousEdgeGroups
)
fn getOrderedEdgeGroups obj continuousEdgeGroups =
(
local orderedEdgeGroups = #()
for edgeGroupMas in continuousEdgeGroups do
(
local ends = #()
local edgeGroup = edgeGroupMas as array
for i in edgeGroup do
(
local isEndEdge = false
local verts = polyop.getVertsUsingEdge obj i
for j in verts do
(
local neighbors = polyop.getEdgesUsingVert obj j
neighbors *= edgeGroupMas
if neighbors.numberSet == 1 then
exit with isEndEdge = true
)
if isEndEdge then
append ends i
)
local Root = s_TreeNode index:(if ends.count > 0 then ends[1] else edgeGroup[1])
Root.getChildren obj edgesMask:edgeGroupMas
append orderedEdgeGroups (Root.getGroup())
)
orderedEdgeGroups
)
fn convertEdgesToVerts obj edgeGroup =
(
local vertsGroup = #()
for i in edgeGroup do (
local verts = (polyop.getVertsUsingEdge obj i) as array
for j in verts do
appendIfUnique vertsGroup j
)
vertsGroup
)
fn visualizeEdgeGroup obj edgeGroup radius:0.1 =
(
for i = 1 to edgeGroup.count do
(
local verts = (polyop.getVertsUsingEdge obj edgeGroup[i]) as array
local faces = (polyop.getFacesUsingEdge obj edgeGroup[i]) as array
local v1 = polyop.getVert obj verts[1]
local v2 = polyop.getVert obj verts[2]
local x = normalize (v2 - v1)
local y = [0,0,0]
for j in faces do
y += polyop.getFaceNormal obj j
local z = normalize (cross x y)
y = normalize (cross z x)
local m = matrix3 x y z ((v1 + v2) / 2)
local c = cylinder radius:radius wirecolor:red height:(distance v1 v2) pos:v1 dir:x
Text text:(i as string) wirecolor:red size:((distance v1 v2) / 2) transform:m
)
)
fn visualizeVertGroup obj vertGroup radius:0.2 =
(
for i = 1 to vertGroup.count do
(
local faces = (polyop.getFacesUsingVert obj vertGroup[i]) as array
local v = polyop.getVert obj vertGroup[i]
local n = [0,0,0]
for j in faces do
n += polyop.getFaceNormal obj j
n = normalize n
local s = sphere radius:radius wirecolor:blue pos:v dir:n
local t = Text text:(i as string) wirecolor:blue size:(radius * 50.) pos:v dir:n
t.transform = PreRotateX t.transform 90
)
)
local debugMode = true
if selection.count == 1 and classof $ == Editable_Poly then
(
local obj = $
local continuousEdgeGroups = getContinuousEdgeGroups obj
local orderedEdgeGroups = getOrderedEdgeGroups obj continuousEdgeGroups
if debugMode == true then
for g in orderedEdgeGroups do
visualizeEdgeGroup obj g
local orderedVertGroups = for g in orderedEdgeGroups collect convertEdgesToVerts obj g
if debugMode == true then
for g in orderedVertGroups do
visualizeVertGroup obj g
)
)