Удалить дубликаты (один и тот же полигон) Maxscript

Я хочу удалить все повторяющиеся объекты со сцены, я хочу найти дубликаты, сравнив количество полигонов всех объектов.

Когда я нашел количество полигонов каждого объекта, я хочу сгруппировать все объекты с одинаковым количеством полигонов вместе и удалить все, кроме одного. Должно быть просто, у меня возникли проблемы с созданием массива со всеми повторяющимися объектами в нем...

Мой код не выдает ошибок, но не добавляет объекты в массив #(дубликатов). Мой код определяет количество полигонов для всех объектов и помещает его в массив objs_info.

-- Remove object duplicates
clearselection()
select geometry
deselect helpers
objs = selection as array

objS_info = #()
objS_info2 = #()

dups = #()
for obj in objs do(

    obj_info = #()
    obj_dups = #()

    ConvertTo obj Editable_Poly
    PolyCount_src = polyop.getNumFaces obj
    --resetxform obj ; maxOps.CollapseNodeTo obj 1 true --reset Xform + collapse stack
    delta_x_src =  ((-1 * obj.min.x) + obj.max.x) 
    delta_z_src = ((-1 * obj.min.z) + obj.max.z)
    append obj_info PolyCount_src
    delta_ratio_src = delta_x_src/delta_z_src 
    for i in 1 to objs.count do(

        obj_dups = #()

        if objs[i] != obj do(
            ConvertTo obj Editable_Poly
            PolyCount = polyop.getNumFaces obj
            --resetxform obj ; maxOps.CollapseNodeTo obj 1 true --reset Xform + collapse stack
            delta_x =  ((-1 * obj.min.x) + obj.max.x) 
            delta_z = ((-1 * obj.min.z) + obj.max.z)
            delta_ratio = delta_x/delta_z 
            if(delta_ratio == delta_ratio_src and PolyCount == PolyCount_src) do(
                append obj_dups objs[i]
                )

            )
    )
append dups obj_dups
)

format "dups = % \n " obj_dups

Любая помощь будет принята с благодарностью, спасибо!


person Maarten -Monica for president    schedule 29.07.2017    source источник


Ответы (1)


Много способов содрать шкуру с кошки. Обратите внимание, что проверка плавающих элементов на равенство (то, что вы делаете при сравнении соотношений размеров ограничивающей рамки, довольно рискованно (см., например, сравнение плавающих значений, если вы хотите сохранить эту проверку). Группировка по размеру может быть выполнена, например, так:

objsByNumFaces = for obj in geometry where canConvertTo obj mesh collect
(
    local snapshot = snapshotAsMesh obj
    local data = dataPair obj:obj numFaces:snapshot.numFaces
    delete snapshot
    data
)

qsort objsByNumFaces (fn _ x y = x.numFaces - y.numFaces)

counter = 0
prevCount = -1
objsPartitioned = #()

for pair in objsByNumFaces do
(
    if pair.numFaces == prevCount then
        append objsPartitioned[objsPartitioned.count] pair.obj
    else
    (
        prevCount = pair.numFaces
        append objsPartitioned #(pair.obj)
    )
)

Затем массив objsPartitioned будет содержать объекты, сгруппированные по количеству граней.

person Swordslayer    schedule 30.07.2017
comment
Большое спасибо за ответ! Я согласен, что сравнивать поплавки довольно рискованно (я не думал об этом, пока не прочитал ваш ответ). Сравнение количества вершин было бы лучшим вариантом (поскольку количество вершин является целым числом), мы попытаемся изменить ваш скрипт, чтобы также сравнить количество вершин objs. - person Maarten -Monica for president; 31.07.2017
comment
Мне удалось изменить скрипт таким образом, чтобы он проверял, равны ли полигон и верткаун :) - person Maarten -Monica for president; 31.07.2017