← Blog

Modelos 3D duplicados por contenido, no nombre

'Por contenido' significa dos cosas: hash idéntico (deduplicación) o similitud geométrica (búsqueda CAD). Cuál necesitas y qué hace PrintStash.

guíaorganizaciónflujo de trabajo

Detrás de “por contenido” se esconden dos trabajos distintos, y la herramienta que necesitas depende de cuál de los dos tengas en mente.

Si te refieres a copias idénticas byte a byte, el mismo archivo metido en tres carpetas con tres nombres, el hash lo responde de forma exacta y barata. Para una biblioteca que mantienes, la versión útil de eso es una herramienta que calcula el hash a la entrada, de modo que el duplicado nunca llega a ser una segunda entrada: PrintStash lo hace en cada subida y en cada escaneo de carpeta compartida, y Printventory lo hace como catalogador de escritorio. Para una limpieza puntual de una carpeta normal de la que vas a borrar, rmlint, jdupes o Czkawka son herramientas del tamaño adecuado.

Si te refieres a la misma forma guardada con bytes distintos, una reexportación desde CAD, un reescalado, una copia ASCII de un STL binario, entonces ningún hash te va a ayudar. Eso es búsqueda por similitud geométrica, y es una categoría de producto CAD y PLM que se vende a fabricantes, no algo que el mundo de la impresión 3D autoalojada ofrezca hoy. PrintStash hace el primer trabajo y no el segundo.

Qué significa en realidad “por contenido”

Un hash es una respuesta de sí o no sobre los bytes. Dos archivos producen el mismo sha256 o no lo producen, y ninguna cantidad de renombrados ni de cambios de carpeta altera eso. Es la comprobación fiable más barata que puedes ejecutar, y es lo que hace en realidad casi cualquier herramienta que anuncia detección de duplicados basada en contenido.

El problema es que una persona que mira dos archivos los llama el mismo modelo en casos donde los bytes difieren. Todos estos producen hashes distintos:

  • la misma malla exportada una vez como STL ASCII y otra como STL binario;
  • una reexportación desde CAD después de cualquier cambio, por pequeño que sea;
  • la misma geometría guardada como STL independiente y dentro de un proyecto 3MF;
  • una copia reescalada, reparada o decimada.

Emparejar esas cosas significa comparar la geometría, que es un problema distinto y mucho más difícil. Necesitas una descripción de la forma que sobreviva a la traslación, la rotación, el escalado y el remallado, y después una manera de ordenar toda una biblioteca frente a esa descripción en lugar de buscar una clave fija. Por eso las dos funciones rara vez salen en la misma herramienta: una es una consulta de diccionario y la otra necesita un índice construido para consultas de vecino más cercano.

Por qué el nombre del archivo es la clave equivocada

Una carpeta de descargas acumula el mismo modelo con varios nombres. bracket.stl, bracket (1).stl y bracket_v2_FINAL.stl pueden ser tres copias de una malla, o tres mallas realmente distintas, y los nombres no te dicen cuál de las dos cosas es. El fallo funciona también en el otro sentido. El mismo STL bajado de Printables en marzo y sacado del ZIP de un amigo en julio puede estar en dos carpetas de proyecto, con dos nombres sin relación y contenido idéntico.

Ordenar por tamaño acota el problema y sigue equivocándose: dos mallas distintas exportadas desde el mismo archivo CAD suelen quedar a unos pocos bytes la una de la otra. Un hash del contenido completo es la única comprobación barata que da una respuesta definitiva.

Copias exactas, a la entrada

PrintStash calcula un sha256 en streaming sobre cada archivo durante la ingesta y deduplica contra lo que ya está almacenado. Sube el mismo STL dos veces y obtienes un modelo, no dos. Reenviar un archivo idéntico por la API no hace nada, en lugar de crear una segunda copia, lo que importa cuando un hook de posprocesado del slicer se dispara dos veces.

Los volúmenes compartidos aplican la misma regla a archivos que nunca subiste. Apunta PrintStash a una carpeta local o de un NAS y un escaneo calcula el hash de cada archivo compatible en su sitio, dejando los bytes donde están. Cuando dos archivos en carpetas distintas tienen contenido idéntico, se indexan como dos archivos enlazados bajo un único modelo y no como dos modelos. Borra uno de ellos del disco y el siguiente escaneo manda a la basura solo esa entrada de archivo, mientras el modelo sobrevive hasta que desaparece la última copia. Eliminar un modelo o un volumen nunca borra los bytes de origen de la carpeta.

Un límite, dicho sin adornos: PrintStash no tiene ninguna pantalla que liste parejas de duplicados para que las vayas repasando. La deduplicación ocurre en el momento de indexar, así que los duplicados aparecen como un único modelo que lleva más de un archivo enlazado, nunca como un informe que revisas. Esa es la forma correcta cuando el objetivo es una biblioteca limpia, y la equivocada cuando el objetivo es recuperar espacio en disco en un NAS, que es trabajo para las herramientas de sistema de archivos de más abajo.

El primer escaneo de un archivo histórico grande calcula el hash y parsea todos los archivos compatibles, así que empieza por una subcarpeta representativa antes de apuntarlo a diez años de descargas. La guía de volúmenes compartidos tiene las reglas de escaneo y de seguridad completas.

Recuperar espacio en una carpeta normal

Cuando no hay biblioteca de por medio y el objetivo es borrar archivos redundantes de un disco, las herramientas Unix clásicas son del tamaño adecuado. fdupes, jdupes y rmlint agrupan archivos por contenido y te dejan revisar antes de borrar. Czkawka hace lo mismo con interfaz gráfica, encontrando duplicados por nombre, tamaño o hash, y añade modos difusos para imágenes, vídeo y música. Su núcleo y su CLI tienen licencia MIT, y las interfaces Krokiet y Cedinia son GPL-3.0.

La limitación no está en el emparejamiento, está en la revisión. Estas herramientas te entregan una lista de rutas. Decides a partir de /mnt/tank/models/misc/thing.stl y nada más si esa copia es redundante, sin previsualización y sin saber a cuál apunta tu perfil de laminado. Eso funciona con unas decenas de coincidencias y se vuelve desagradable con unos miles. La guía de carpetas y metadatos cubre dónde encajan esas herramientas en un flujo de carpetas normales.

Printventory, que es gratuito y funciona tanto como aplicación de escritorio como en Docker, cierra ese hueco concreto: encuentra duplicados por hash de contenido y luego te deja comparar las coincidencias con miniaturas, así que eliges entre imágenes en lugar de entre rutas. Es una buena respuesta cuando quieres una lista revisable de duplicados que borrar y no quieres montar un servidor.

Misma forma, bytes distintos: quién hace eso de verdad

La búsqueda por similitud geométrica existe y funciona, pero creció en la industria, donde un ingeniero que va a modelar un soporte nuevo quiere saber si la empresa ya tiene uno. 3DPartFinder indexa datos CAD nativos a través de Catia, Creo, Inventor, NX, Solid Edge, Solidworks y TopSolid, y los busca usando un modelo 3D aproximado como consulta. Symge hace lo mismo con planos 2D y piezas 3D a la vez, dirigido a ingenieros de fabricación con archivos CAD grandes. Los dos se venden a empresas con precio a consulta, con un formulario de demostración donde debería estar el botón de descarga, y ninguno está construido alrededor de una carpeta de STL.

Connecter aparece en casi cualquier búsqueda sobre esto, así que merece una descripción precisa. Es un gestor de activos para Windows orientado a bibliotecas visuales y de archviz, gratuito para uso local, y su buscador de duplicados compara las propiedades que marques: nombre de archivo, extensión, tamaño y, opcionalmente, contenido, con comparación píxel a píxel para activos de imagen. Eso es minucioso para una biblioteca de 3ds Max, pero sigue siendo comparación de archivos y no de mallas, y los formatos de impresión 3D quedan fuera de lo que persigue.

Lo más cercano a este terreno es Modelist, un catalogador de escritorio para Mac, Windows y Linux que ejecuta a la vez coincidencia exacta byte a byte, comparación por nombre y tamaño parecidos, y hash perceptual, así que marcará algunas copias renombradas y recodificadas que un hash puro se pierde. El emparejamiento difuso trae falsos positivos consigo, así que cada coincidencia sigue necesitando una mirada humana. Es gratuito hasta 50 archivos, con una licencia de pago único de 20 € para la versión mayor actual.

Para una biblioteca doméstica eso deja un hueco incómodo. Los duplicados exactos están resueltos varias veces, mientras que el emparejamiento de geometría casi duplicada no está disponible en nada que instalarías al lado de tu slicer.

Lo más parecido a una comprobación de geometría en PrintStash

PrintStash parsea cada malla en la ingesta y guarda las dimensiones de la caja envolvente, el volumen y el número de triángulos. Las dimensiones se ven sobre el visor, el volumen y los triángulos aparecen bajo la geometría de la malla en la vista de detalle del modelo cuando activas esos campos en las preferencias de visualización, y todos salen en la exportación de metadatos de Ajustes → Resumen, como JSON o como CSV con una fila por archivo almacenado, incluido su sha256.

Esa exportación es un sustituto manual utilizable de la búsqueda que PrintStash no tiene. Abre el CSV en una hoja de cálculo y ordena por triangle_count, y las recodificaciones de una misma malla quedan alineadas: convertir un STL binario a ASCII cambia todos los bytes y mantiene idénticos el número de triángulos y las dimensiones. Ordena por volume_mm3 y las copias reescaladas se agrupan de forma aproximada, ya que un escalado uniforme cambia el volumen con el cubo del factor. No es búsqueda por similitud y te dará coincidencias casuales, porque dos mallas sin relación pueden compartir el número de triángulos. Sí reduce unos miles de archivos a un puñado de parejas que vale la pena abrir.

Dos huecos que conviene conocer antes de confiar en esto. Las mallas por encima del límite de carga configurado se omiten en lugar de parsearse, así que sus columnas de geometría quedan vacías, y el volumen es de mejor esfuerzo: una malla que no es hermética deja ese campo en blanco mientras las dimensiones y el número de triángulos sí llegan. La guía de usuario cubre qué incluye la exportación y qué deja fuera a propósito.

Un orden de trabajo que funciona

  1. Indexa en lugar de mover. Añade la carpeta como volumen compartido para que nada se copie y las rutas de tu slicer sigan funcionando.
  2. Deja que el primer escaneo termine en una subcarpeta pequeña, y después añade el resto.
  3. Busca modelos que lleven más de un archivo enlazado. Esas son tus copias idénticas byte a byte, ya agrupadas en una sola entrada.
  4. Exporta el CSV y ordena por número de triángulos y por volumen para encontrar los casi duplicados que el hash no podía ver. Trata cada grupo como una pregunta, no como una respuesta.
  5. Abre la previsualización antes de borrar nada del disco. Dos archivos con nombres parecidos hasta la confusión pueden contener mallas distintas.
  6. Borra del sistema de archivos de forma deliberada y vuelve a escanear. PrintStash manda a la basura la entrada del archivo que desapareció y mantiene el modelo mientras quede otra copia.

Si estás adoptando un archivo histórico grande en lugar de limpiar uno pequeño, organizar miles de archivos STL cubre la migración más amplia, y replicar una carpeta de un NAS cubre los detalles de montaje y planificación.

Preguntas que surgen

¿“Por contenido” significa los bytes o la forma?

En la práctica casi siempre significa los bytes. Cuando un gestor de archivos, una utilidad de deduplicación o una biblioteca de modelos dice que encuentra duplicados por contenido en lugar de por nombre, está calculando el hash del archivo y agrupando hashes iguales, lo que es exacto para copias idénticas y ciego a todo lo demás. Comparar la forma es una técnica aparte, normalmente llamada búsqueda por similitud geométrica o de forma, y necesita una descripción de la malla independiente de la rotación y la escala, no un resumen del archivo. Las dos lecturas de la pregunta son legítimas, así que decide cuál es de verdad tu problema de biblioteca antes de elegir herramienta.

¿Puede PrintStash encontrar un modelo que se reexportó o se reescaló?

No. La deduplicación es sha256 sobre los bytes del archivo, así que una reexportación, un reescalado, una reparación o una conversión entre STL ASCII y binario llega como un modelo aparte. Nada en PrintStash compara una malla con otra. La solución más cercana es la exportación de metadatos: ordena el CSV por número de triángulos y por volumen e inspecciona los grupos a mano, ya que una copia recodificada de una malla mantiene los dos números y una copia reescalada mantiene su número de triángulos.

¿Qué herramientas comparan la geometría en sí?

Los productos de búsqueda de piezas CAD. 3DPartFinder se integra con Catia, Creo, Inventor, NX, Solid Edge, Solidworks y TopSolid y encuentra piezas duplicadas y parecidas a partir de un diseño existente o de un modelo aproximado, y Symge busca planos 2D y piezas 3D por forma para ingenieros de fabricación. Los dos son comerciales, con precio a consulta, y están construidos alrededor de repositorios CAD y PLM en lugar de carpetas de STL. En el lado aficionado nada hace comparación real de geometría hoy; Modelist es lo que más se acerca al combinar coincidencia exacta byte a byte con comparación por nombre, tamaño y hash perceptual, lo que pilla algunas copias renombradas y recodificadas sin comparar nunca mallas.

¿Encuentra duplicados dentro de archivos ZIP?

No. Un ZIP que está en una carpeta vigilada no es un formato compatible, así que un escaneo no lo abre y su contenido nunca se hashea. Desde la v0.11.1, una captura por URL llega como importación pendiente donde puedes elegir qué entradas de un archivo comprimido extraer antes de la ingesta, y los archivos extraídos se hashean como cualquier otro. Para limpiar un pack descargado de camino a la biblioteca, importa el archivo y deja que el hash se coma cualquier cosa que ya tengas: limpiar un pack de STL descargado.

¿Puedo quedarme con la versión de más calidad?

Si dos archivos son idénticos byte a byte no hay una versión mejor, solo una ubicación mejor, y PrintStash ya los trata como un modelo. Cuando la diferencia es real, como una malla reparada o una reexportación más limpia, los hashes difieren y los dos llegan como modelos separados. Borra de la biblioteca el que no quieras. Si venía de un volumen compartido, los bytes de origen se quedan en disco hasta que los elimines allí.

¿En qué se diferencia esto de Czkawka o dupeGuru?

Son trabajos distintos. Czkawka y dupeGuru escanean cualquier sistema de archivos y son la mejor opción cuando el objetivo es recuperar espacio en disco en toda una unidad. dupeGuru ofrece emparejamiento difuso de nombres, comparación de contenido y un modo difuso de imágenes, y ninguna de las dos sabe nada de impresión 3D. PrintStash no es un limpiador de disco. Deduplica como efecto secundario de construir una biblioteca que además guarda metadatos de laminado, revisiones de G-code y resultados de impresión. Usa la utilidad para la unidad, usa la biblioteca para los modelos que de verdad imprimes.

Fuentes