CADmium, un programa CAD local-first para el navegador
(mattferraro.dev)CADmium: un programa CAD local-first que funciona en el navegador
21 de mayo de 2024
Estamos desarrollando un nuevo programa CAD de código abierto. Hemos avanzado bastante, pero necesitamos su ayuda. Si quieren participar en este proyecto, ¡únanse al Discord!
¿Qué se necesita?
Cosas necesarias para crear un programa CAD paramétrico 3D:
- solucionador de restricciones 2D
- kernel B-rep
- rastreador de historial
- interfaz de usuario 3D
- formato de archivo
¡Hablemos de cada una!
Solucionador de restricciones 2D
El solucionador de restricciones 2D se encarga de mantener líneas paralelas o perpendiculares, o de hacer que dos círculos tengan el mismo radio, entre otras cosas.
- El enfoque habitual consiste en combinar todas las incógnitas en un gran vector
x, expresar todas las restricciones como ecuaciones lineales y ensamblarlas en una gran ecuación matricialMx = b. - En teoría, basta con invertir
M.x = M^-1 b - En la práctica, se necesitan muchas optimizaciones. Pero este enfoque tiene desventajas.
- Solo se puede invertir
Mcuando es una matriz cuadrada. - Si hay demasiadas restricciones,
Mse vuelve demasiado grande y el enfoque falla. - Si hay muy pocas restricciones, puede resolverse insertando suposiciones, pero eso puede no coincidir con lo que espera quien modela.
- Resolver esta ecuación matricial cuando hay muchas incógnitas se vuelve muy lento.
- Solo se puede invertir
Enfoque alternativo:
- Formular el problema como un simulador físico 2D:
- Cada punto tiene masa
my velocidadv. - Cada restricción es un resorte que aplica una fuerza
Fa los puntos conectados. - La fuerza de fricción es proporcional a la velocidad.
- La simulación avanza en pasos pequeños
dthasta converger.
- Cada punto tiene masa
- Este enfoque realiza muchos cambios pequeños para llevar la energía potencial de los resortes a 0.
- En cada paso temporal, el tiempo de ejecución es lineal respecto al número de resortes y de incógnitas.
- Este enfoque se presta bien a la paralelización, por lo que en la práctica puede ser muy rápido.
- Los problemas sobre restringidos no se quejan de estar sobre restringidos: los sistemas consistentes se resuelven normalmente, y en los inconsistentes los resortes llegan a un compromiso.
- Los problemas subrestringidos no salen disparados al infinito, sino que encuentran la configuración válida más cercana.
- Este enfoque puede admitir restricciones de desigualdad.
Kernel B-rep
En el CAD mecánico, el usuario debe poder interactuar directamente con los bordes y las caras de una pieza.
- Todos los programas CAD paramétricos representan directamente el límite de la pieza como una estructura de datos.
- Un cubo se representa como un sólido compuesto por 6 caras, cada cara con 4 bordes y cada borde con 2 puntos. A este enfoque se le llama representación de fronteras (B-rep).
- En el caso de superficies curvas, se usan superficies NURBS, una generalización de los splines, para ofrecer control artístico sobre formas libres y representar con exactitud las secciones cónicas.
- Representar geometría de esta manera es difícil, y se vuelve aún más difícil al intentar implementar operaciones booleanas como unión, intersección y diferencia.
- La biblioteca que procesa estos datos y realiza operaciones booleanas se llama kernel B-rep, y es muy difícil de construir.
Mercado actual del CAD:
- Las principales empresas de CAD escribieron cada una su propio kernel B-rep, y eso tomó décadas.
- El kernel B-rep más importante es Parasolid, que impulsa muchos productos industriales.
- En el mercado del CAD de código abierto, OpenCascade es el único kernel B-rep popular.
Nuevo kernel B-rep de código abierto:
- Se está desarrollando un nuevo kernel B-rep de código abierto llamado Truck.
- Está escrito en Rust, lo que ofrece ventajas como garantías de seguridad de memoria, facilidad para paralelizar y soporte para compilar a WebAssembly.
- Truck es pequeño y ligero, y admite lectura/escritura de archivos .step, triangulación de superficies, soporte para NURBS y operaciones de intersección/unión/diferencia de sólidos.
Rastreador de historial
Los programas CAD paramétricos guardan el historial de features del diseño.
- Una pieza se completa mediante operaciones como croquis, extrusión y revolución.
- “Paramétrico” significa que se puede volver a una etapa anterior, hacer cambios y luego reproducir las features para obtener una pieza ligeramente distinta.
- También se puede parametrizar un modelo mediante inyección de variables.
Enfoques para resolver la fragilidad del CAD paramétrico:
- Estrategia de modelado resiliente (RMS): un conjunto de reglas para diseñar piezas.
- Agregar historial de features a los croquis: guardar y mostrar las features de croquis en el árbol de features para poder aplicar la idea de RMS a un solo croquis.
- Registrar todos los eventos del usuario en un log append-only para ofrecer deshacer/rehacer ilimitado.
Interfaz de usuario 3D
Me gusta la idea de ejecutar CAD en el navegador.
- Onshape funciona en el navegador, pero en realidad se ejecuta en instancias en la nube de AWS con GPU.
- CADmium puede hacer todo en el navegador usando Truck compilado a WebAssembly. Es una app local-first.
Stack tecnológico:
- Three.js: viewport 3D
- Svelte: gestión de estado/reactividad
- Threlte: hace de puente entre Svelte y Three.js
- paso de mensajes entre la UI y el kernel B-rep
- Electron: ejecución local
- otras tecnologías estándar: Typescript, TailwindCSS, Vite, etc.
Formato de archivo
CADmium usa JSON para todo.
- El log de trabajo está compuesto por líneas JSON.
- Admite exportar la pieza diseñada a un formato de intercambio más simple.
- Ejemplo:
{ "steps": [ { "type": "sketch", "id": "Sketch-01", "data": { ... } }, { "type": "extrude", "id": "Extrude-01", "data": { "distance": "10mm", "sketch": "Sketch-01", "faces": [0], "type": "new" } } ] } - Se puede convertir a .step o .stl usando la interfaz de línea de comandos (CLI) de CADmium:
$ CADmium export my_part.cadmium --format stl
Conclusión
No sé cuáles de las ideas mencionadas aquí tendrán éxito y cuáles fracasarán, pero en algún lugar de este espacio hay una oportunidad para que un equipo pequeño tenga un gran impacto en la industria manufacturera.
Ayuda necesaria:
- programación en Rust (mejoras generales)
- geometría computacional (parches para Truck)
- ayuda con Three.js (nuevo controlador de cámara, mejor iluminación, posprocesado)
- encontrar oportunidades de subvención o patrocinadores adinerados
Cosas que no abordaré ahora, pero a las que quiero volver más adelante:
- capital de riesgo
- generación de toolpaths (CAM)
- análisis por elementos finitos (FEA)
Si esta idea les parece interesante, únanse al servidor de Discord de CADmium para conversar.
Opinión de GN⁺
- Ventajas de Rust: Rust es muy adecuado para proyectos de código abierto gracias a su seguridad de memoria y su facilidad para la paralelización. Esto será de gran ayuda para mejorar la estabilidad y el rendimiento de CADmium.
- Uso de WebAssembly: Poder realizar trabajo CAD directamente en el navegador usando WebAssembly es algo muy innovador. Esto permite seguir trabajando incluso en entornos con conexión a internet inestable.
- Simplificación del formato de archivo: Un formato de archivo basado en JSON es fácil de entender y muy útil porque puede editarse directamente en un editor de texto. Esto facilita la colaboración y el control de versiones.
- Importancia del historial de features: Ofrecer deshacer/rehacer ilimitado a través del historial de features puede mejorar mucho la experiencia de usuario. Permite corregir fácilmente errores durante el proceso de diseño.
- La fuerza de la comunidad open source: Los proyectos de código abierto pueden avanzar rápidamente gracias a la participación y contribución de la comunidad. CADmium también podrá desarrollarse más con la participación de muchos desarrolladores y usuarios.
Aún no hay comentarios.