четверг, 2 июня 2016 г.

Удаление лишних вершин на ребрах в Editable Poly.


Понадобилось почистить кирпичную кладку от "лишних вершин" после булевых операций:




Ссылки:
Vertex Cleaner
How do I remove mid-edge EPoly Vertices?
VGSelectBadVertices
111_selectBadVertices

   После исследования скриптов по ссылкам, стало понятно, что они немного не подходят для поставленной задачи.


   В скрипте ниже, по сути, тоже самое, только сбоку.
   Добавил возможность работать с группой объектов, чтобы не перещелкивать каждый в больших сценах и постарался немного ускорить. Скрипт работает только с Editable Poly объектами!:
tr - threshold = 0.7 подбирается опытным путем.


---------------------------------------------------------------------
try destroyDialog RemoveMiVertex catch()
--function
fn getMiVertexPoly obj tr = (   
    arrVertInd = #()
    for v in obj.verts  do (
        arEdge=(PolyOp.getEdgesUsingVert obj #(v.index)) as array
        if arEdge.count==2 do (
                edgeVerts = (polyop.getVertsUsingEdge obj arEdge) as array
                p1 = polyop.getVert obj edgeVerts[1]
                p2 = polyop.getVert obj edgeVerts[2]
                p3 = polyop.getVert obj edgeVerts[3]
                v1 = p1 - p2
                v2 = p2 - p3
                v3 = length (cross (normalize v1) (normalize v2))
                if v3 <= tr do append arrVertInd v.index
        )

    )
format "%; % - removed vertices\n" obj.name arrVertInd.count
arrVertInd
)   
--Interface
rollout RemoveMiVertex "RemoveMiVertex"
(   
spinner tresh "Threshold:" range:[0,100,0.7] type:#float width:120 align:#left --offset:[10,0] enabled:false --across:2
checkbox onlySel "Only select (don't remove)" checked:false align:#left --offset:[10,0]
button theGo "Remove" width:175 height:30  align:#left  --across:2
    on theGo pressed do(
    arSel = for i in selection where classOf i.baseobject == Editable_Poly collect i
   
    max modify mode--switch to modify panel  --set the base object as current level:   
        for obj in arSel do(
            select obj--select it
            modPanel.setCurrentObject obj.baseobject
            subObjectLevel = 1--set sub-*object level to vertex level
            polyOp.setVertSelection obj (getMiVertexPoly obj (tresh.value/100.0))
            update obj   
            --pick button "Remove"   
            if not onlySel.state do (
                    h = windows.getChildHWND #max "Remove"
                    hc=windows.getChildrenHwnd h[2]
                    UIAccessor.PressButton hc[1][1]  --button  "Fit"  
                )
            -----------------------
            subobjectLevel = 0
            update obj   
            )
    ) -- end on theGo pressed do
) --END rollout
createDialog RemoveMiVertex width:200
---------------------------------------------------------------------

Комментариев нет:

Отправить комментарий