- µcad é uma linguagem de programação para CAD open source implementada em Rust, e um sistema de geometria baseado em texto que define esboços 2D e objetos 3D por código e os exporta para STL e SVG
- No centro da linguagem estão objetos geométricos paramétricos, com uma estrutura que combina formas básicas por operações booleanas para criar geometrias complexas e renderizá-las em formatos para impressão 3D e usinagem CNC
- Usa um sistema de tipos estático e literais Quantity baseados em unidades para definir modelos com valores como
50mm, 10°, 50%, além de oferecer uma hierarquia de tipos que organiza a árvore de modelos geométricos com o tipo Models
- Por meio de módulos, funções, o workbench
part, a sintaxe use, bibliotecas padrão como std::geo2d e std::geo3d, e o recurso std::import para importar dados TOML, permite compor código de projeto reutilizável e modelagem orientada a dados
- É um projeto que pode servir de referência para quem busca um fluxo de trabalho CAD programável, com exemplos, documentação e materiais de live coding disponíveis
Visão geral do µcad
- µcad é uma linguagem de programação CAD open source para definir e gerar esboços 2D e objetos 3D por código
- O conceito central é a modelagem geométrica paramétrica
- Combina formas básicas para criar geometrias complexas e renderiza o resultado em STL e SVG, permitindo uso em impressão 3D e trabalhos de CNC
Design da linguagem e forma de modelagem
- µcad é uma linguagem de modelagem paramétrica que organiza a estrutura do modelo em torno de definições geométricas com parâmetros
- As formas são declaradas em código, e várias variações podem ser geradas apenas alterando os parâmetros
- Compõe
Sphere, Cube, Cylinder etc. com combinações booleanas, e cria formas 3D por meio de revolve, arrays e transformações
- Com exemplos como
CsgCube, Spirograph, Gears e Dome, apresenta diversos padrões de modelagem, como geração 3D a partir de esboços 2D, criação de estruturas repetitivas e perfis de engrenagens
Sistema de tipos e literais com unidades
- µcad usa um sistema de tipos estático, e as variáveis funcionam como imutáveis
- Com o tipo Quantity, é possível usar diretamente unidades como
mm, ° e % na composição do modelo
- Notações como
10°, 4m² e 50% podem ser usadas diretamente como parâmetros do modelo
- O tipo Models é uma estrutura que representa a árvore de modelos geométricos e contém a estrutura de nós de um modelo CAD baseado em código
Sistema de módulos e biblioteca padrão
- Com uma composição modular usando
mod, use, fn e part, grandes projetos podem ser divididos em várias unidades de código
- Bibliotecas padrão como
std::geo2d, std::geo3d, std::math e std::ops oferecem suporte a operações geométricas, matemática, matrizes e composição de esboços
part é usado como unidade para criar e transformar esboços e peças 3D
Importação de dados e depuração
- Com
std::import, é possível importar parâmetros de arquivos TOML e aplicá-los ao modelo
- Uma forma de injetar facilmente no modelo especificações de peças prontas e similares
- Também é possível validar os valores importados com
std::debug::assert_eq e recursos afins
Cadeia de ferramentas e instalação
- Execução e renderização de modelos são feitas com a ferramenta de CLI em Rust
microcad-cli
- Instalação com
cargo install microcad-cli
- Atualmente está em estágio alfa, com recursos sendo adicionados continuamente
- O
microcad-viewer permite visualizar os resultados renderizados
- O desenvolvimento do repositório acontece em codeberg.org, com distribuição via crates.io
Exemplos e materiais de live coding
- Vários exemplos como Spirograph, Lego Bricks, Gears e Dome estão publicados no blog oficial
- Casos de uso de CAD programável incluem geração de perfis de engrenagens, modelagem de spirograph e criação de estruturas em domo
- Todos os exemplos são fornecidos com código e vídeos de live coding, permitindo entender gradualmente como a linguagem é usada
Estado do projeto
- O projeto ainda está em estágio inicial e segue em expansão
- A documentação “The µcad book” está sendo desenvolvida para sistematizar toda a linguagem
1 comentários
Comentários do Hacker News
É preciso remover a menção a LEGO do site e dos exemplos
A LEGO é muito rigorosa na proteção de marca registrada e não quer que terceiros usem o nome
Isso porque teme que a marca vire um nome genérico e perca seus direitos sobre ela
Artigo relacionado: "Lego sues Dutch firm over anti-terror blocks using name and shape" (link do archive)
Seria bom mostrar logo na primeira tela da página inicial um exemplo simples de código e o sketch gerado
Eu tenho escrito CAD baseado em boundary representation (BREP) usando o zoo e a linguagem KCL deles
O µcad parece ter o mesmo objetivo
Pessoalmente, gosto mais do estilo de pipeline do KCL
Mas minha reclamação com o zoo é que ele força um kernel só de nuvem, criando uma forte dependência de fornecedor
Ainda não está claro como o µcad resolve isso
O µcad é baseado em Manifold, então é mais centrado em malha, diferente do KCL, que é baseado em brep
O KCL também pode ser expandido para outros kernels
A melhor coisa do OpenSCAD é poder ver o resultado imediatamente na visualização 3D logo após salvar o código
Fico curioso se o ucad também permite esse tipo de fluxo de trabalho imediato
A ideia é desenhar rapidamente na tela 2D sem calcular de fato as interseções 3D
O OpenSCAD abstraiu essa estrutura como uma AST para poder enviar para vários motores, como OpenCSG, CGAL e Manifold
Em teoria, qualquer CAD poderia implementar isso, mas a dificuldade de implementação é alta
Já usei OpenSCAD e CadQuery, mas achei desconfortável por causa das limitações da UI e do kernel
Em comparação com Onshape ou Fusion 360, faltam recursos
O FreeCAD também melhorou bastante, mas ainda é difícil de usar para pessoas de nível iniciante a intermediário
Espero que algum dia o CAD open source se torne uma alternativa de verdade
Há também projetos como o Fornjot, que tentam novos kernels
Este projeto não tem um resolvedor de constraints ou pelo menos não há um plano documentado para isso
Eu gostaria de evitar manter trigonometria manualmente até para constraints simples
É uma pena que não exista uma versão que rode diretamente em um ambiente de notebook web, como no tutorial de Lego brick
Seria bom ter algo que desse para experimentar sem instalação, como o curso rápido de SCAD da MachineBlocks
Fico curioso se isso está mais próximo de ser um substituto do AutoCAD
Também queria saber se há compatibilidade de formatos de arquivo para importar em Revit e afins
É um projeto realmente interessante
Como programador que não gosta de mexer com CAD manualmente, essa abordagem parece muito mais intuitiva
Mas, olhando o exemplo de engrenagens, parece que é preciso ler a documentação com atenção para entender as primitivas básicas da biblioteca
Imagino que, conforme a comunidade crescer, mais formas serão adicionadas
Eu estava procurando uma linguagem de CAD com bom suporte a iteração
Ao projetar minha casa, pensei que seria ótimo automatizar os detalhes construtivos das paredes com código baseado em loops
Mas sem um
forloop, esse tipo de tarefa fica difícil demais, e no fim eu desisti