- µcad es un lenguaje de programación para CAD de código abierto implementado en Rust, y un sistema de geometría basado en texto que permite definir bocetos 2D y objetos 3D con código y exportarlos como STL y SVG
- En el centro del lenguaje están los objetos geométricos paramétricos, con una estructura que combina formas básicas mediante operaciones booleanas para crear figuras complejas y renderizarlas en formatos para impresión 3D y mecanizado CNC
- Usa un sistema de tipos estático y literales Quantity basados en unidades para definir modelos con valores como
50mm, 10°, 50%, y ofrece un sistema de tipos que construye árboles de modelos geométricos con el tipo Models
- Mediante módulos, funciones, el workbench
part, la sintaxis use, bibliotecas estándar como std::geo2d y std::geo3d, y la función std::import para traer datos TOML, permite crear código de diseño reutilizable y modelado basado en datos
- Es un proyecto que puede servir de referencia para quienes buscan un flujo de trabajo CAD programático, y además incluye ejemplos, documentación y material de live coding
Resumen de µcad
- µcad es un lenguaje de programación CAD open source para definir y generar bocetos 2D y objetos 3D con código
- Su concepto central es el modelado geométrico paramétrico
- Permite combinar formas básicas para crear figuras complejas y renderizar el resultado como STL y SVG para usarlo en impresión 3D o trabajos CNC
Diseño del lenguaje y forma de modelado
- µcad es un lenguaje de modelado paramétrico que organiza la estructura del modelo alrededor de definiciones geométricas con parámetros
- Las formas se declaran con código, y es posible generar múltiples variantes solo cambiando los parámetros
- Compone
Sphere, Cube, Cylinder y otros elementos mediante combinaciones booleanas, y genera formas 3D a través de revolución (revolve), arreglos y transformaciones
- A través de ejemplos como
CsgCube, Spirograph, Gears y Dome, muestra distintos patrones de modelado, incluyendo generación 3D basada en bocetos 2D, estructuras repetitivas y perfiles de engranes
Sistema de tipos y literales con unidades
- µcad usa un sistema de tipos estático y las variables funcionan como inmutables
- Con el tipo Quantity se pueden usar directamente unidades como
mm, ° y % al construir modelos
- Notaciones como
10°, 4m² y 50% pueden usarse tal cual como parámetros del modelo
- El tipo Models es una estructura que representa el árbol de modelos geométricos y encapsula la estructura de nodos de un modelo CAD basado en código
Sistema de módulos y biblioteca estándar
- Con una organización modular que aprovecha
mod, use, fn y part, es posible dividir diseños grandes en varias unidades de código
- Bibliotecas estándar como
std::geo2d, std::geo3d, std::math y std::ops brindan soporte para operaciones geométricas, matemáticas, matrices y construcción de bocetos
part se usa como unidad para crear y transformar bocetos y partes 3D
Importación de datos y depuración
- Con
std::import se pueden traer parámetros desde archivos TOML y aplicarlos al modelo
- Es una forma sencilla de inyectar en el modelo especificaciones de piezas prefabricadas, entre otras cosas
- También se pueden validar los valores importados con
std::debug::assert_eq y similares
Toolchain e instalación
- Incluye la herramienta CLI basada en Rust
microcad-cli para ejecutar y renderizar modelos
- Se instala con
cargo install microcad-cli
- Actualmente está en etapa alfa y se siguen agregando funciones
microcad-viewer permite visualizar los resultados renderizados
- El desarrollo del repositorio se lleva a cabo en codeberg.org y la distribución se hace a través de crates.io
Ejemplos y material de live coding
- En el blog oficial hay disponibles varios ejemplos como Spirograph, Lego Bricks, Gears y Dome
- Ofrecen casos de uso de CAD programático, como generación de perfiles de engranes, modelado de espirógrafos y creación de estructuras tipo domo
- Todos los ejemplos se ofrecen junto con su código y videos de live coding, lo que permite entender paso a paso cómo se usa el lenguaje
Estado del proyecto
- El proyecto está en una etapa temprana y sigue expandiéndose
- Se está organizando de forma sistemática todo el lenguaje a través del trabajo de documentación de “The µcad book”
1 comentarios
Comentarios en Hacker News
Hay que eliminar la mención de LEGO del sitio web y de los ejemplos
LEGO es muy estricto con la protección de marca registrada y no quiere que terceros usen su nombre
Les preocupa que la marca se vulgarice y pierda sus derechos marcarios
Artículo relacionado: "Lego sues Dutch firm over anti-terror blocks using name and shape" (enlace de archive)
Estaría bien mostrar de inmediato en la portada un ejemplo simple de código y el sketch generado
He estado escribiendo CAD basado en representación de fronteras (BREP) con zoo y su lenguaje KCL
µcad parece tener el mismo objetivo
Personalmente, me gusta más el enfoque de pipeline de KCL
Pero me molesta que zoo fuerce un kernel solo en la nube, lo que genera mucha dependencia del proveedor
Todavía no está claro cómo resuelve µcad este problema
µcad está basado en Manifold, así que está más centrado en mesh y es distinto de KCL, que se basa en brep
KCL también puede ampliarse con otros kernels
Lo mejor de OpenSCAD es que, al guardar el código, puedes ver el resultado de inmediato en la vista 3D
Me pregunto si en ucad también es posible un flujo de trabajo con esa inmediatez
Es una forma de dibujar rápido en una pantalla 2D sin calcular intersecciones 3D reales
OpenSCAD abstrajo esta estructura como un AST para poder enviarla a distintos motores como OpenCSG, CGAL, Manifold, etc.
En teoría, cualquier CAD podría implementarlo, pero la dificultad de implementación es alta
He usado OpenSCAD y CadQuery, pero me resultaron incómodos por las limitaciones de la UI y del kernel
Comparados con Onshape o Fusion 360, les faltan funciones
FreeCAD también ha mejorado mucho, pero todavía sigue siendo difícil de usar para usuarios de nivel básico e intermedio
Ojalá algún día el CAD de código abierto se convierta en una alternativa de verdad
También existen proyectos que prueban kernels nuevos, como Fornjot
Este proyecto no tiene un solver de restricciones (Constraint), o al menos no hay planes documentados al respecto
Me gustaría evitar tener que mantener manualmente funciones trigonométricas para restricciones simples
Es una lástima que no exista una versión que se pueda ejecutar directamente en un entorno de notebook web, como el tutorial de Lego brick
Estaría bien algo que se pueda probar sin instalación, como el curso rápido de SCAD de MachineBlocks
Me pregunto si esto está más cerca de ser un reemplazo de AutoCAD
También quisiera saber si tiene compatibilidad de formatos de archivo para poder importarlo en Revit y similares
Es un proyecto realmente interesante
Como programador al que no le gusta trabajar con CAD a mano, este enfoque me parece mucho más intuitivo
Aun así, viendo el ejemplo de engranajes, parece que para entender las primitivas básicas de la biblioteca habría que leer la documentación con atención
Si la comunidad crece, imagino que se agregarán más formas
Estaba buscando un lenguaje CAD que soportara bien la repetición (iteration)
Mientras diseñaba mi casa, pensé que sería genial poder automatizar los detalles de construcción de muros con código basado en loops
Pero si no hay bucles
for, ese tipo de trabajo se vuelve demasiado difícil, así que al final lo dejé