2017-07-29 4 views
0

Ich möchte alle doppelten Objekte aus einer Szene entfernen, ich möchte die Duplikate durch den Vergleich Polycount aller Objekte finden.Delete Duplicates (selbe Polycount) Maxscript

Wenn ich den Polycount von jedem Objekt gefunden habe, möchte ich alle Objekte mit dem gleichen Polycount zusammen gruppieren und alle außer 1 davon löschen. Sollte einfach sein, ich habe Probleme beim Erstellen eines Arrays mit allen doppelten Objekten in ...

Mein Code löst keine Fehler, aber fügt keine Objekte zu # (Duplikate) Array. Mein Code bestimmt polycount für alle Objekte und fügt sie in das Array objs_info ein.

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

Jede Hilfe wird sehr geschätzt werden, danke!

Antwort

0

Viele Möglichkeiten, eine Katze zu häuten. Beachten Sie, dass die Prüfung auf Gleichheit schwimmt (was Sie tun, wenn die Begrenzungsrahmen Größenverhältnisse zu vergleichen ziemlich riskant ist (siehe zum Beispiel comparing float values, wenn Sie, dass der Check behalten wollen) Gruppierung durch die Größe kann beispielsweise wie folgt erfolgen:.

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

Die objsPartitioned Array wird dann Objekte durch die Anzahl der Gesichter gruppieren enthalten.

+0

Ihnen sehr für Ihre Antwort danken! ich bin damit einverstanden Schwimmern, dass Vergleich ziemlich riskant ist (ich nicht darüber nachdenken, bevor Sie Ihre Antwort zu lesen). Im Vergleich Vertex count wäre eine bessere Option (da die Anzahl der Scheitelpunkte ein ganzzahliger Wert ist), versuchen Sie, Ihr Skript so zu ändern, dass es auch die Anzahl der Scheitelpunkte von Objekten vergleicht – Maarten

+0

Ich habe es geschafft, Änderungen vorzunehmen das Skript so, dass es prüft, ob sowohl polycount als auch vertcount gleich sind :) – Maarten