Script para seleccionar y borrar objetos duplicados

traucoarauco - 26/12/2012 05:58
Hola a todos, soy muy nuevo trabajando con Maxscript y me cuesta mucho comprender el lenguaje, encontré este script por internet y me a ayudado mucho, pero quisiera saber cómo poder optimizarlo.

La idea es eliminar objetos duplicados, por lo que hay que seleccionar y poner en marcha este script:
-- 1, select your objects end run next line todo collect obj, position.

Posarray = for i in selection collect i, pos.
-2, remove dublicated items.

Posarray = makeuniquearray posarray.
-3, filter out just 1 obj per pos.

Cleararray = #().

For I = 1 todo posarray, count do (tfor obj in selection do (t if (*.obj), pues == posarray do cleararray = obj t)).
-4, select them.

Select cleararray.

Al aplicarlo funciona de maravilla, queda seleccionada la geometría repetida y podemos presionar deleete, pero quisiera optimizar el script, ya que en caso de aplicarlo a mucha geometría, la cual se encuentra parte de ella duplicada y otra no, al borrar la selección, me borra parte de la geometría que no estaba duplicada, ojalá me puedan ayudar a complementar el script y poder agregar alguna función para seleccionar solo las partes duplicadas.
LaUrA-28 - 04/01/2026 10:50
El script original tiene un problema fundamental: está comparando solo por posición, lo que puede eliminar objetos legítimos que comparten la misma coordenada. Para seleccionar solo duplicados reales, necesitas comparar más propiedades, como el nombre, la geometría o el transform completo.

Aquí tienes un script optimizado y corregido. Este script compara los objetos por su transformación completa (posición, rotación y escala) y por su nombre base, lo que es más seguro. Primero, selecciona todos los objetos que consideras que pueden tener duplicados.

Este script crea un diccionario. Para cada objeto, genera una clave única basada en su transformación y nombre. Si esa clave ya existe en el diccionario, significa que encontramos un duplicado. El objeto duplicado se añade a un array para su posterior selección.

Ejecuta este script con los objetos que quieres verificar seleccionados. Seleccionará solo los duplicados, dejando intacto un ejemplar de cada objeto original.

global dup_array = #()
fn findDuplicateObjects sel = (
local keyDict = #()
local foundKeys = #{} -- Usamos un bitArray para claves únicas
dup_array = #() -- Reiniciamos el array global

for obj in sel do (
-- Creamos una clave más robusta: nombre + transformación
local objKey = (obj.name + "_" + obj.transform as string)
-- Buscamos si la clave ya existe
local keyIndex = findItem keyDict objKey

if keyIndex == 0 then (
-- Es la primera vez que vemos esta clave, la añadimos
append keyDict objKey
) else (
-- La clave ya existe, es un duplicado
-- Aseguramos que el primer objeto no se marque, solo los siguientes
if not foundKeys[keyIndex] then (
foundKeys[keyIndex] = true -- Marcamos que el original existe
)
-- Añadimos este objeto (que es un duplicado) al array
append dup_array obj
)
)
select dup_array -- Selecciona solo los duplicados encontrados
)
-- Llama a la función con la selección actual
findDuplicateObjects selection

Ahora, para usarlo, simplemente selecciona todos los objetos de la escena o el grupo de objetos donde sospechas que hay duplicados. Luego ejecuta el script completo. El resultado será que solo los objetos duplicados (no los originales) quedarán seleccionados. Luego puedes borrarlos con la tecla Delete.

Para mayor precisión, si quieres comparar la geometría en sí y no solo el transform, necesitarías un método más complejo que compare el mesh o el snapshot de los vértices. Pero para la mayoría de los casos de duplicados creados con Clone o Copy, comparar el transform y el nombre es suficiente.

Si tu escena es muy grande y el rendimiento es un problema, considera ejecutar el script por capas o por selecciones manuales más pequeñas en lugar de seleccionar todos los objetos de golpe.