1 pontos por GN⁺ 2024-05-22 | Ainda não há comentários. | Compartilhar no WhatsApp

CADmium: um programa CAD local-first que roda no navegador

21 de maio de 2024

Estamos desenvolvendo um novo programa CAD open source. Já avançamos bastante, mas precisamos da ajuda de vocês. Se quiser participar deste projeto, entre no Discord!

O que é necessário?

Coisas necessárias para criar um programa CAD paramétrico 3D:

  • solucionador de restrições 2D
  • kernel B-rep
  • rastreador de histórico
  • interface de usuário 3D
  • formato de arquivo

Vamos falar sobre cada item!

Solucionador de restrições 2D

Um solucionador de restrições 2D faz coisas como manter linhas paralelas ou perpendiculares, ou garantir que dois círculos tenham o mesmo raio.

  • A abordagem comum é combinar todas as incógnitas em um grande vetor x e expressar todas as restrições como equações lineares, montando uma grande equação matricial Mx = b.
  • Em teoria, basta inverter M. x = M^-1 b
  • Na prática, são necessárias muitas otimizações. Mas essa abordagem tem desvantagens.
    • Só é possível inverter M quando ela é uma matriz quadrada.
    • Se houver restrições demais, M fica grande demais e a abordagem falha.
    • Se houver restrições de menos, isso pode ser resolvido inserindo suposições, mas isso pode não corresponder ao que o modelador espera.
    • Resolver essa equação matricial com muitas incógnitas se torna muito lento.

Abordagem alternativa:

  • Formular o problema como um simulador de física 2D:
    • Cada ponto tem massa m e velocidade v.
    • Cada restrição é uma mola que aplica força F aos pontos conectados.
    • A força de atrito é proporcional à velocidade.
    • A simulação avança em pequenos passos dt até convergir.
  • Essa abordagem faz muitas pequenas mudanças para levar a energia potencial das molas a 0.
  • Em cada passo de tempo, o tempo de execução é linear em relação ao número de molas e ao número de incógnitas.
  • Essa abordagem é adequada para paralelização e, na prática, pode ser muito rápida.
  • Problemas com restrições excessivas não reclamam de restrições excessivas: sistemas consistentes são resolvidos normalmente, e em sistemas inconsistentes as molas chegam a um meio-termo.
  • Problemas com restrições insuficientes não saem voando para o infinito; encontram a configuração válida mais próxima.
  • Essa abordagem pode oferecer suporte a restrições de desigualdade.

Kernel B-rep

Em CAD mecânico, o usuário precisa interagir diretamente com as arestas e faces de uma peça.

  • Todo programa CAD paramétrico representa diretamente o contorno da peça como uma estrutura de dados.
  • Um cubo é representado como um sólido com 6 faces, cada face com 4 arestas, e cada aresta com 2 pontos. Essa abordagem é chamada de representação de contorno (B-rep).
  • No caso de superfícies curvas, usa-se superfícies NURBS, uma generalização de splines, para permitir controle artístico sobre formas livres e representação exata de seções cônicas.
  • Representar formas dessa maneira é difícil, e fica ainda mais difícil ao tentar implementar operações booleanas como união, interseção e diferença.
  • A biblioteca que lida com esses dados e executa operações booleanas é chamada de kernel B-rep, e é muito difícil de criar.

Mercado atual de CAD:

  • As principais empresas de CAD escreveram seus próprios kernels B-rep, e isso levou décadas.
  • O kernel B-rep mais importante é o Parasolid, que dá suporte a muitos produtos industriais.
  • No mercado de CAD open source, o OpenCascade é o único kernel B-rep popular.

Novo kernel B-rep open source:

  • Um novo kernel B-rep open source chamado Truck está em desenvolvimento.
  • Ele é escrito em Rust, o que traz vantagens como garantia de segurança de memória, facilidade de paralelização e suporte à compilação para WebAssembly.
  • O Truck é pequeno e leve, e oferece suporte para leitura/escrita de arquivos .step, triangulação de superfícies, suporte a NURBS e operações de interseção/união/diferença em sólidos.

Rastreador de histórico

Programas CAD paramétricos armazenam o histórico de recursos do projeto.

  • A peça é concluída por meio de operações como esboço, extrusão e revolução.
  • “Paramétrico” significa que é possível voltar a uma etapa anterior, modificá-la e reproduzir os recursos para obter uma peça ligeiramente diferente.
  • Também é possível parametrizar o modelo injetando variáveis.

Abordagens para lidar com a fragilidade do CAD paramétrico:

  • Estratégia de modelagem resiliente (RMS): um conjunto de regras para projetar peças.
  • Adicionar histórico de recursos aos esboços: armazenar e exibir recursos de esboço na árvore de recursos, permitindo aplicar a ideia de RMS a um único esboço.
  • Registrar todos os eventos do usuário em um log append-only para oferecer desfazer/refazer ilimitado.

Interface de usuário 3D

Gosto da ideia de rodar CAD no navegador.

  • O Onshape roda no navegador, mas na prática é executado em instâncias de nuvem da AWS com suporte a GPU.
  • O CADmium usa o Truck compilado para WebAssembly, o que permite fazer todo o trabalho no navegador. É um aplicativo local-first.

Stack técnica:

  • Three.js: viewport 3D
  • Svelte: gerenciamento de estado/reatividade
  • Threlte: ponte entre Svelte e Three.js
  • Troca de mensagens entre a UI e o kernel B-rep
  • Electron: execução local
  • Outras tecnologias padrão: Typescript, TailwindCSS, Vite etc.

Formato de arquivo

O CADmium usa JSON para tudo.

  • O log de operações é composto por linhas JSON.
  • Há suporte para exportar a peça projetada para um formato de intercâmbio mais simples.
  • Exemplo: { "steps": [ { "type": "sketch", "id": "Sketch-01", "data": { ... } }, { "type": "extrude", "id": "Extrude-01", "data": { "distance": "10mm", "sketch": "Sketch-01", "faces": [0], "type": "new" } } ] }
  • É possível converter para .step ou .stl usando a interface de linha de comando (CLI) do CADmium: $ CADmium export my_part.cadmium --format stl

Conclusão

Não sei quais das ideias mencionadas aqui vão dar certo e quais vão falhar, mas existe a oportunidade de uma pequena equipe, em algum lugar desse espaço, causar um grande impacto na indústria de manufatura.

Ajuda necessária:

  1. Programação em Rust (melhorias gerais)
  2. Geometria computacional (patches para o Truck)
  3. Ajuda com Three.js (novo controlador de câmera, melhor iluminação, pós-processamento)
  4. Encontrar oportunidades de subsídio ou patrocinadores ricos

Coisas que não vou abordar agora, mas que quero revisitar depois:

  1. Venture capital
  2. Geração de toolpath (CAM)
  3. Análise por elementos finitos (FEA)

Se essa ideia parece interessante, entre no servidor do Discord do CADmium para conversar!

Opinião do GN⁺

  1. Vantagens do Rust: Rust é muito adequado para projetos open source graças à sua segurança de memória e facilidade de paralelização. Isso deve ajudar bastante a aumentar a estabilidade e o desempenho do CADmium.
  2. Uso de WebAssembly: Usar WebAssembly para executar trabalho de CAD diretamente no navegador é algo muito inovador. Isso permite continuar trabalhando mesmo em ambientes com conexão de internet instável.
  3. Simplificação do formato de arquivo: Um formato de arquivo baseado em JSON é fácil de entender e muito útil, pois pode ser editado diretamente em um editor de texto. Isso facilita colaboração e controle de versão.
  4. Importância do histórico de recursos: Oferecer desfazer/refazer ilimitado por meio do histórico de recursos pode melhorar bastante a experiência do usuário. Isso permite corrigir erros no processo de projeto com facilidade.
  5. Força da comunidade open source: Projetos open source podem evoluir rapidamente com a participação e contribuição da comunidade. O CADmium também pode se desenvolver ainda mais com a participação de muitos desenvolvedores e usuários.

Ainda não há comentários.

Ainda não há comentários.