i have absolutelly different numbers for your code…
that’s what i actually use:
(
unRegisterRedrawViewsCallback cbDrawOpenEdges
global RO_DISPLAY_UV_OE
global cbDrawOpenEdges
global cbSelectionChanged
local vertexPos = #()
local uvChannel = 1
local edgesColor = [0,255,0]
local edgeOffset = 0.03
local forceRedraw = false
local polyLine = gw.polyLine
fn cbDrawOpenEdges = (
gw.setTransform (Matrix3 1)
gw.setColor #line edgesColor
for j in vertexPos do polyLine j true
-- Needed in some Max versions or used dirvers
if forceRedraw do (
gw.enlargeUpdateRect #whole
gw.updateScreen()
)
)
fn cbSelectionChanged mForce:false = (
unRegisterRedrawViewsCallback cbDrawOpenEdges
if ($ != undefined) do (
setwaitcursor()
t1 = timeStamp()
m1 = heapfree
cGetMapFace = meshop.getMapFace
obj = snapshotasmesh selection[1]
allChannels = for j = 1 to meshop.getNumMaps obj where (meshop.getMapSupport obj j) collect j
RO_DISPLAY_UV_OE.ddl_channel.items = for j in allChannels collect j as string
if (mForce == false) do (
uvChannel = allChannels[1]
RO_DISPLAY_UV_OE.ddl_channel.selection = 1
)
numTFaces = meshop.getNumMapFaces obj uvChannel
numTVerts = meshop.getNumMapVerts obj uvChannel
emesh = trimesh()
setMesh emesh numverts:numTVerts numfaces:numTFaces
setMesh emesh faces:(for j = 1 to numTFaces collect (cGetMapFace obj uvChannel j))
objOpenEdges = meshop.getOpenEdges obj
meshOpenEdges = meshop.getOpenEdges emesh
delete emesh
sharedFaces = meshop.getFacesUsingEdge obj meshOpenEdges
foundEdges = #()
vertexPos = #()
for j in sharedFaces do (
objFaceVerts = getFace obj j
edge1 = j*3 - 2
edge2 = j*3 - 1
edge3 = j*3
v1Idx = objFaceVerts.x
v2Idx = objFaceVerts.y
v3Idx = objFaceVerts.z
v1 = getVert obj v1Idx
v2 = getVert obj v2Idx
v3 = getVert obj v3Idx
if meshOpenEdges[edge1] do (
found = findItem foundEdges [v1Idx, v2Idx]
if (found == 0) then (
append vertexPos #(v1,v2)
append foundEdges [v2Idx, v1Idx]
)else(
deleteitem foundEdges found
)
)
if meshOpenEdges[edge2] do (
found = findItem foundEdges [v2Idx, v3Idx]
if (found == 0) then (
append vertexPos #(v2,v3)
append foundEdges [v3Idx, v2Idx]
)else(
deleteitem foundEdges found
)
)
if meshOpenEdges[edge3] do (
found = findItem foundEdges [v3Idx, v1Idx]
if (found == 0) then (
append vertexPos #(v3,v1)
append foundEdges [v1Idx, v3Idx]
)else(
deleteitem foundEdges found
)
)
)
format "mesh >> open edges:% time:% memory:%
" vertexPos.count (timestamp() - t1) (m1 - heapfree)
registerRedrawViewsCallback cbDrawOpenEdges
delete obj
gc light:true
setArrowCursor()
)
forceCompleteRedraw()
)
try(destroyDialog RO_DISPLAY_UV_OE) catch()
rollout RO_DISPLAY_UV_OE "UV Open Edges" width:160 height:198
(
checkbutton bt_enable "Display UV Open Edges" pos:[8,8] width:144 height:32
dropdownList ddl_channel "UV Channel:" pos:[8,72] width:120 height:40 enabled:false
colorPicker cp1 "" pos:[131,90] width:21 height:21 enabled:true color:edgesColor modal:false
checkbox chk_redraw "Force Redraw" pos:[8,46] width:100 height:16 enabled:false
spinner spn_width "Edge Width:" pos:[8,120] width:120 height:16 range:[1,100,4] type:#integer fieldwidth:50
button bt_update "Update" pos:[8,160] width:144 height:28 enabled:false
fn destroy = (
callbacks.removeScripts #selectionSetChanged
unRegisterRedrawViewsCallback cbDrawOpenEdges
forceCompleteRedraw()
)
on RO_DISPLAY_UV_OE close do destroy()
on bt_enable changed arg do
(
bt_update.enabled = arg
ddl_channel.enabled = arg
chk_redraw.enabled = arg
destroy()
if (arg == true) do (
callbacks.addscript #selectionSetChanged "cbSelectionChanged()"
cbSelectionChanged()
)
)
on bt_update pressed do cbSelectionChanged()
on ddl_channel selected arg do (
uvChannel = (ddl_channel.selected as integer)
cbSelectionChanged mForce:true
)
on cp1 changed arg do edgesColor = arg
on spn_width changed arg do edgeOffset = (arg-1)/100.0
on chk_redraw changed arg do forceRedraw = arg
)
createDialog RO_DISPLAY_UV_OE
)
for your sample object i have:
with no turbosmooth it’s
mesh >> open edges:3920 time:165 memory:1275784L
with 1 turbosmooth iteration it’s
mesh >> open edges:7840 time:600 memory:3171480L