Tres quejas distintas que suenan igual
Los slicers rechazan modelos por motivos que no tienen nada que ver entre sí y los describen todos con el mismo lenguaje, y por eso la misma solución no deja de fallar. Conviene separarlos, porque cada uno tiene una causa y un remedio distintos.
Superficie no cerrada significa que la superficie tiene borde: en algún sitio hay una arista con un triángulo a un lado y nada al otro. La superficie no encierra un volumen, así que el slicer no puede distinguir dentro de fuera y no tiene nada que rellenar. Esto es lo que la gente llama un agujero.
Non-manifold es otro fallo distinto. Aquí no hay hueco, pero hay alguna arista compartida por tres o más caras: un tabique interno que dejó una operación booleana, dos sólidos fusionados por una cara, una aleta de grosor cero. En una arista así la pregunta «¿qué lado es el interior?» no tiene una sola respuesta, y el slicer no puede seguir la superficie a través de ella.
Normales invertidas significa que el orden de los vértices está mal. Cada triángulo enumera sus esquinas en un orden que define qué cara mira hacia fuera. Cuando triángulos vecinos no se ponen de acuerdo, la superficie tiene parches del revés; cuando el modelo entero está enrollado al revés, es cerrado y manifold y aun así no se puede imprimir, porque el slicer intentará imprimir todo excepto tu objeto.
Por qué el número del mensaje de error no es un código de error
Un slicer que informa de «6106 non-manifold edges» no te está dando un código que buscar. Está contando. Seis mil de esas aristas serán normalmente una sola costura donde se juntaron dos mitades de un modelo sin fusionarlas, y la pregunta útil no es cuántas aristas están mal sino cuántos sitios distintos forman. Agrupar las aristas en racimos conectados suele convertir un número de cinco cifras en tres o cuatro localizaciones, cada una revisable y corregible en un par de minutos.
Cómo se hace aquí la comprobación
El archivo se parsea a una lista plana de triángulos y después se sueldan los vértices: las coordenadas que caen en el mismo punto dentro de una tolerancia derivada del propio tamaño del modelo se colapsan en un único vértice compartido. Este paso es obligatorio, no una optimización. El STL no tiene el concepto de vértice compartido (dos triángulos que se encuentran en una arista simplemente repiten las mismas coordenadas), así que antes de soldar no existe el concepto de vecino y todas las aristas del archivo parecen borde.
Con la malla ya soldada se cuenta cada arista. Una arista usada por exactamente dos caras es normal. Una usada una sola vez es arista de borde, y encadenar aristas de borde una tras otra produce los anillos que son los agujeros de verdad. Una arista usada tres o más veces es non-manifold; esas se agrupan por vértices compartidos en las regiones que ocupan. El sentido de giro se comprueba a la vez: en una superficie coherente, las dos caras que se encuentran en una arista la recorren en sentidos opuestos, así que cualquier arista recorrida dos veces en el mismo sentido delata un vecino invertido.
El volumen sale de sumar tetraedros con signo entre cada triángulo y el origen. La magnitud es el volumen encerrado, útil para estimar material; lo interesante es el signo, porque una superficie cerrada con volumen negativo está enrollada del revés.
Lo que aquí no se hace, a propósito
No se reportan autointersecciones. Detectar cada par de triángulos que se cruzan es cuadrático en el número de triángulos si no hay un índice espacial, y en un modelo lo bastante grande como para que importe bloquearía la pestaña durante minutos para producir una lista con la que nadie puede hacer nada. Tampoco se mide el grosor de pared: la respuesta depende de tu boquilla, de tu material y de la orientación en la bandeja, y un número dado sin saber eso es peor que ningún número.
No se repara nada. Tapar un agujero significa inventar superficie que nunca se modeló, y en una impresión decorativa eso da igual mientras que en una pieza funcional puede desplazar en silencio un taladro o una cara de encaje. Se informa de la posición y el tamaño de cada defecto para que la corrección se haga donde vive el diseño de verdad.