CADmium: Ein Local-First-CAD-Programm für den Browser
(mattferraro.dev)CADmium: Ein Local-First-CAD-Programm, das im Browser läuft
- Mai 2024
Wir entwickeln ein neues Open-Source-CAD-Programm. Es ist schon ziemlich weit fortgeschritten, aber wir brauchen eure Hilfe. Wenn ihr bei diesem Projekt mitmachen möchtet, tretet bitte dem Discord bei!
Was wird benötigt?
Dinge, die man braucht, um ein parametrisches 3D-CAD-Programm zu bauen:
- 2D-Constraint-Solver
- B-rep-Kernel
- History-Tracker
- 3D-Benutzeroberfläche
- Dateiformat
Lassen Sie uns über jeden Punkt sprechen!
2D-Constraint-Solver
Ein 2D-Constraint-Solver sorgt zum Beispiel dafür, dass Linien parallel oder senkrecht bleiben oder dass zwei Kreise denselben Radius haben.
- Der übliche Ansatz besteht darin, alle Unbekannten zu einem großen Vektor
xzusammenzufassen, alle Constraints als lineare Gleichungen auszudrücken und sie zu einer großen MatrixgleichungMx = bzusammenzusetzen. - Theoretisch reicht es dann,
Mzu invertieren.x = M^-1 b - In der Praxis sind viele Optimierungen nötig. Dieser Ansatz hat jedoch Nachteile.
- Man kann nur dann eine Inverse bilden, wenn
Meine quadratische Matrix ist. - Wenn es zu viele Constraints gibt, wird
Mzu groß und der Ansatz scheitert. - Wenn es zu wenige Constraints gibt, kann man das durch das Einfügen von Annahmen lösen, aber das entspricht möglicherweise nicht den Erwartungen des Modellierers.
- Diese Matrixgleichung zu lösen wird bei vielen Unbekannten sehr langsam.
- Man kann nur dann eine Inverse bilden, wenn
Ein alternativer Ansatz:
- Das Problem als 2D-Physiksimulation formulieren:
- Jeder Punkt hat eine Masse
mund eine Geschwindigkeitv. - Jedes Constraint ist eine Feder, die auf die verbundenen Punkte eine Kraft
Fausübt. - Die Reibungskraft ist proportional zur Geschwindigkeit.
- Die Simulation wird in kleinen Schritten
dtvorwärts ausgeführt und wiederholt, bis sie konvergiert.
- Jeder Punkt hat eine Masse
- Dieser Ansatz macht viele kleine Änderungen und bringt die potenzielle Energie der Federn auf 0.
- Die Laufzeit pro Zeitschritt ist linear proportional zur Anzahl der Federn und der Unbekannten.
- Dieser Ansatz eignet sich gut zur Parallelisierung und kann in der Praxis sehr schnell sein.
- Überbestimmte Constraint-Probleme beschweren sich nicht über Überbestimmung: Konsistente Systeme werden normal gelöst, und in inkonsistenten Systemen gehen die Federn einen Kompromiss ein.
- Unterbestimmte Constraint-Probleme fliegen nicht ins Unendliche davon, sondern finden die nächstgelegene gültige Konfiguration.
- Dieser Ansatz kann Ungleichungs-Constraints unterstützen.
B-rep-Kernel
Im Mechanical CAD müssen Benutzer direkt mit den Kanten und Flächen eines Bauteils interagieren können.
- Alle parametrischen CAD-Programme stellen die Begrenzung eines Bauteils direkt als Datenstruktur dar.
- Ein Würfel wird als Solid mit 6 Flächen dargestellt, jede Fläche mit 4 Kanten und jede Kante mit 2 Punkten. Dieser Ansatz heißt Boundary Representation (B-rep).
- Für gekrümmte Flächen werden NURBS-Oberflächen verwendet, eine Verallgemeinerung von Splines, die künstlerische Kontrolle über Freiformen und eine exakte Darstellung von Kegelschnitten ermöglichen.
- Geometrie auf diese Weise darzustellen ist schwierig, und noch schwieriger wird es, wenn man versucht, boolesche Operationen wie Vereinigung, Schnittmenge und Differenz zu implementieren.
- Eine Bibliothek, die diese Daten verarbeitet und boolesche Operationen ausführt, nennt man B-rep-Kernel, und sie ist sehr schwer zu bauen.
Der aktuelle CAD-Markt:
- Große CAD-Unternehmen haben jeweils ihren eigenen B-rep-Kernel geschrieben, und das hat Jahrzehnte gedauert.
- Der wichtigste B-rep-Kernel ist Parasolid, der viele Industrieprodukte antreibt.
- Im Open-Source-CAD-Markt ist OpenCascade der einzige populäre B-rep-Kernel.
Ein neuer Open-Source-B-rep-Kernel:
- Ein neuer Open-Source-B-rep-Kernel namens Truck wird entwickelt.
- Er ist in Rust geschrieben, was Vorteile wie garantierte Memory Safety, einfache Parallelisierung und Unterstützung für die Kompilierung nach WebAssembly bietet.
- Truck ist klein und leichtgewichtig und unterstützt das Lesen/Schreiben von .step-Dateien, Surface Triangulation, NURBS sowie Schnitt-/Vereinigungs-/Differenz-Operationen auf Solids.
History-Tracker
Parametrische CAD-Programme speichern die Feature-Historie eines Entwurfs.
- Ein Bauteil wird durch Arbeitsschritte wie Sketch, Extrude und Revolve fertiggestellt.
- „Parametrisch“ bedeutet, dass man zu einem früheren Schritt zurückkehren, Änderungen vornehmen und die Features erneut abspielen kann, um ein leicht anderes Bauteil zu erhalten.
- Über das Einspeisen von Variablen kann man ein Modell parametrisieren.
Ansätze zur Lösung der Fragilität parametrischer CAD-Systeme:
- Resilient Modeling Strategy (RMS): ein Regelwerk zum Entwerfen von Bauteilen.
- Der Sketch um eine Feature-Historie erweitern: Sketch-Features können im Feature-Tree gespeichert und angezeigt werden, sodass sich die RMS-Idee auf einen einzelnen Sketch anwenden lässt.
- Alle Benutzerereignisse in einem Append-only-Log aufzeichnen, um unbegrenztes Undo/Redo bereitzustellen.
3D-Benutzeroberfläche
Die Idee, CAD im Browser laufen zu lassen, gefällt mir.
- Onshape läuft im Browser, tatsächlich aber auf GPU-beschleunigten Cloud-Instanzen in AWS.
- CADmium kann mit nach WebAssembly kompiliertem Truck alles im Browser erledigen. Es ist eine Local-First-App.
Technologie-Stack:
- Three.js: 3D-Viewport
- Svelte: State Management/Reaktivität
- Threlte: Brücke zwischen Svelte und Three.js
- Message Passing zwischen UI und B-rep-Kernel
- Electron: lokale Ausführung
- Weitere Standardtechnologien: Typescript, TailwindCSS, Vite usw.
Dateiformat
CADmium verwendet für alles JSON.
- Das Operationslog besteht aus JSON-Zeilen.
- Export des entworfenen Bauteils in ein einfacheres Austauschformat wird unterstützt.
- Beispiel:
{ "steps": [ { "type": "sketch", "id": "Sketch-01", "data": { ... } }, { "type": "extrude", "id": "Extrude-01", "data": { "distance": "10mm", "sketch": "Sketch-01", "faces": [0], "type": "new" } } ] } - Mit der CADmium Command Line Interface (CLI) kann in .step oder .stl konvertiert werden:
$ CADmium export my_part.cadmium --format stl
Fazit
Ich weiß nicht, welche der hier genannten Ideen erfolgreich sein werden und welche scheitern, aber irgendwo in diesem Bereich gibt es für ein kleines Team die Chance, die Fertigungsindustrie stark zu beeinflussen.
Benötigte Hilfe:
- Rust-Programmierung (allgemeine Verbesserungen)
- Computergestützte Geometrie (Truck-Patches)
- Hilfe bei Three.js (neuer Camera Controller, bessere Beleuchtung, Post-Processing)
- Fördermöglichkeiten oder wohlhabende Sponsoren finden
Dinge, die jetzt nicht behandelt werden, auf die ich aber später zurückkommen möchte:
- Venture Capital
- Toolpath-Generierung (CAM)
- Finite-Elemente-Analyse (FEA)
Wenn euch diese Idee interessant erscheint, tretet dem CADmium-Discord-Server bei und diskutiert mit!
Meinung von GN⁺
- Vorteile von Rust: Rust eignet sich dank Memory Safety und einfacher Parallelisierung hervorragend für Open-Source-Projekte. Das dürfte der Stabilität und Performance von CADmium sehr helfen.
- Einsatz von WebAssembly: CAD-Arbeit direkt im Browser per WebAssembly auszuführen, ist sehr innovativ. Dadurch kann man auch in Umgebungen mit instabiler Internetverbindung weiterarbeiten.
- Vereinfachung des Dateiformats: Ein auf JSON basierendes Dateiformat ist leicht verständlich und sehr nützlich, weil es sich direkt im Texteditor bearbeiten lässt. Das erleichtert Zusammenarbeit und Versionsverwaltung.
- Wichtigkeit der Feature-Historie: Unbegrenztes Undo/Redo über die Feature-Historie kann die User Experience deutlich verbessern. Fehler im Entwurfsprozess lassen sich dadurch leicht korrigieren.
- Die Stärke der Open-Source-Community: Open-Source-Projekte können sich durch Beteiligung und Beiträge der Community schnell weiterentwickeln. Auch CADmium kann durch die Mitwirkung vieler Entwickler und Nutzer weiter wachsen.
Noch keine Kommentare.