/*////////// SCRIPT: 2EdgeVerts v1.0 //////////*/ /*////////// WRITTEN BY: Branko Zivkovic //////////*/ /*////////// EMAIL: barigazy@hotmail.com //////////*/ macroScript EPolyTwoEdgeVerts category:"bgaTools" buttontext:"2EdgeVerts" tooltip:"Two Edge Verts" ( on IsEnabled return (selection.count == 1 and isKindOf selection[1] Editable_Poly) on IsVisible return (selection.count == 1 and isKindOf selection[1] Editable_Poly) on execute do ( try (destroyDialog ::roll2evs) catch() rollout roll2evs "2EdgeVerts" ( local nec, twoedgevert = #(), vertweight = #(), selectedverts = #(), object, gvue = polyop.getVertsUsingEdge local setvs = polyop.setVertSelection, getvs = polyop.getVertSelection, geuv = polyOp.getEdgesUsingVert, getVert = polyop.getVert button btn_analyze "analyze" pos:[5,5] width:50 height:16 tooltip:"Analyze geometry" button btn_clean "remove" pos:[60,5] width:50 height:16 tooltip:"Remove verts" spinner spn_tresh "threshold: " pos:[5,25] fieldwidth:41 range:[0,100,10] fn isepolynode node = isValidNode node and isKindOf node Editable_Poly fn entersubobjmode = ( if GetCommandPanelTaskMode != #modify do SetCommandPanelTaskMode #modify if subobjectlevel != 1 do subobjectlevel = 1 ) fn collectVertsData node = ( local verts = #{1..node.numverts}, vector = #() for v in verts where (edge = geuv node v as array).count == 2 do ( append twoedgevert v ; vpos = getVert node v for i = 1 to edge.count do (vector[i] = normalize(getVert node (((gvue node edge[i]) - #{v}) as array)[1] - vpos)) append vertweight (length (vector[1]+vector[2])) ) ) fn sortVerts node trash:spn_tresh.value = ( if twoedgevert.count > 0 do ( selectedverts = #() for i = 1 to twoedgevert.count where vertweight[i] <= (trash / 50) do append selectedverts twoedgevert[i] setvs node selectedverts ; redrawViews() ) ) fn init2EdgeVerts ev nd = ( local nodes = for a in nd where (node = getAnimByHandle a).isselected collect node if nodes.count != 1 or not (isValidNode nodes[1] and isKindOf nodes[1] Editable_Poly) then ( print "Works Only On A Editable Poly Object!" clearSelection() ; for ctrl in roll2evs.controls do ctrl.enabled = off ) else ( for ctrl in roll2evs.controls do ctrl.enabled = off roll2evs.controls[1].enabled = on ) ) on roll2evs open do ( nec = nodeEventCallback mouseup:on delay:1000 selectionChanged:init2EdgeVerts if selection.count == 1 and isepolynode (object = selection[1]) then ( collectVertsData object ; entersubobjmode() ; sortVerts object btn_analyze.enabled = off ; btn_clean.enabled = spn_tresh.enabled = on ) else (for ctrl in roll2evs.controls do ctrl.enabled = off ; clearSelection()) ) on btn_analyze pressed do if selection.count == 1 and isepolynode (object = selection[1]) do ( collectVertsData object ; entersubobjmode() ; sortVerts object btn_analyze.enabled = off ; btn_clean.enabled = spn_tresh.enabled = on ) on roll2evs close do (nec = undefined ; gc light:on) on spn_tresh changed val do (sortVerts object trash:val) on spn_tresh buttondown do if isepolynode object do ( if object.isSelected == off do select object ; entersubobjmode() ) on btn_clean pressed do with undo "Remove Verts" on ( entersubobjmode() ; if not (getvs object).isEmpty do (object.EditablePoly.Remove() ; redrawViews()) ) ) createDialog roll2evs 115 45 style:#(#style_titlebar, #style_sysmenu, #style_toolwindow) ) )