2017-07-29 1 views
0

Je veux supprimer tous les objets dupliqués d'une scène, je veux trouver les doublons en comparant le polycount de tous les objets.Supprimer les doublons (même polycount) Maxscript

Lorsque j'ai trouvé le polycount de chaque objet, je veux regrouper tous les objets ayant le même polycount et supprimer tous sauf un d'entre eux. Devrait être simple, j'ai du mal à construire un tableau avec tous les objets en double si ...

Mon code ne génère aucune erreur mais n'ajoute aucun objet au tableau # (duplicata). Mon code détermine le polycount pour tous les objets et le place dans le tableau 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 

Toute aide sera grandement appréciée, merci!

Répondre

0

Plusieurs façons de peler un chat. Notez que le test des flottants pour l'égalité (ce que vous faites lorsque vous comparez les ratios de taille de la boîte englobante est plutôt risqué (voir par exemple comparing float values si vous souhaitez conserver cette vérification.) Le regroupement par taille peut être effectué comme ceci:

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) 
    ) 
) 

Le tableau objsPartitioned contiendra alors des objets regroupés par nombre de faces.

+0

Merci beaucoup pour votre réponse! Je suis d'accord que la comparaison des flotteurs est assez risqué (je ne pensais pas à ce sujet avant de lire votre réponse). vertex comparaison count serait une meilleure option (puisque le nombre de vertex est une valeur entière), essayera et modifiera votre script pour comparer aussi le nombre de vertex des objs – Maarten

+0

J'ai réussi à modifier le script de telle sorte qu'il vérifie si les deux polycount et vertcount sont égaux :) – Maarten