CADmium: chương trình CAD local-first cho trình duyệt
(mattferraro.dev)CADmium: chương trình CAD local-first hoạt động trong trình duyệt
21 tháng 5, 2024
Chúng tôi đang phát triển một chương trình CAD mã nguồn mở mới. Dự án đã tiến triển khá nhiều, nhưng chúng tôi cần sự giúp đỡ của các bạn. Nếu muốn tham gia dự án này, hãy tham gia Discord!
Cần những gì?
Những thứ cần có để tạo ra một chương trình CAD tham số 3D:
- bộ giải ràng buộc 2D
- kernel B-rep
- bộ theo dõi lịch sử
- giao diện người dùng 3D
- định dạng tệp
Hãy nói về từng mục!
Bộ giải ràng buộc 2D
Bộ giải ràng buộc 2D có nhiệm vụ giữ cho các đường thẳng song song hoặc vuông góc, hoặc đảm bảo hai đường tròn có cùng bán kính, v.v.
- Cách tiếp cận thông thường là gom mọi ẩn số vào một vector lớn
x, biểu diễn mọi ràng buộc thành các phương trình tuyến tính, rồi lắp ghép chúng thành phương trình ma trận lớnMx = b. - Về mặt lý thuyết, chỉ cần lấy nghịch đảo
Mlà xong.x = M^-1 b - Trên thực tế, cần rất nhiều tối ưu hóa. Nhưng cách tiếp cận này có nhược điểm.
- Chỉ có thể lấy nghịch đảo khi
Mlà ma trận vuông. - Nếu có quá nhiều ràng buộc thì
Msẽ quá lớn và cách tiếp cận này thất bại. - Nếu có quá ít ràng buộc thì có thể xử lý bằng cách chèn giả định, nhưng điều đó có thể không khớp với kỳ vọng của người thiết kế.
- Khi có nhiều ẩn số, việc giải phương trình ma trận này trở nên rất chậm.
- Chỉ có thể lấy nghịch đảo khi
Cách tiếp cận thay thế:
- Mô hình hóa bài toán như một trình mô phỏng vật lý 2D:
- Mỗi điểm có khối lượng
mvà vận tốcv. - Mỗi ràng buộc là một lò xo tác dụng lực
Flên các điểm được nối. - Lực ma sát tỉ lệ với vận tốc.
- Chạy mô phỏng tiến lên với bước thời gian nhỏ
dtvà lặp lại cho đến khi hội tụ.
- Mỗi điểm có khối lượng
- Cách tiếp cận này tạo ra nhiều thay đổi nhỏ để đưa thế năng của lò xo về 0.
- Ở mỗi bước thời gian, thời gian chạy tỉ lệ tuyến tính với số lò xo và số ẩn số.
- Cách tiếp cận này rất phù hợp để song song hóa nên trên thực tế có thể rất nhanh.
- Bài toán ràng buộc thừa không phàn nàn về việc ràng buộc thừa: hệ nhất quán được giải bình thường, còn với hệ không nhất quán thì các lò xo sẽ thỏa hiệp.
- Bài toán thiếu ràng buộc sẽ không bay ra vô cực mà tìm đến cấu hình hợp lệ gần nhất.
- Cách tiếp cận này có thể hỗ trợ các ràng buộc bất đẳng thức.
Kernel B-rep
Trong CAD cơ khí, người dùng phải có khả năng tương tác trực tiếp với các cạnh và mặt của chi tiết.
- Mọi chương trình CAD tham số đều biểu diễn trực tiếp biên của chi tiết dưới dạng cấu trúc dữ liệu.
- Một khối lập phương được biểu diễn thành một khối rắn gồm 6 mặt, mỗi mặt có 4 cạnh, mỗi cạnh có 2 điểm. Cách tiếp cận này được gọi là biểu diễn biên (B-rep).
- Với bề mặt cong, có thể dùng bề mặt NURBS, một dạng tổng quát của spline, để vừa có khả năng kiểm soát nghệ thuật với hình dạng tự do vừa biểu diễn chính xác các đường conic.
- Biểu diễn hình học theo cách này đã khó, và còn khó hơn nữa khi cố triển khai các phép toán Boolean như hợp, giao và hiệu.
- Thư viện xử lý dữ liệu này và thực hiện các phép toán Boolean được gọi là kernel B-rep, và cực kỳ khó để tạo ra.
Thị trường CAD hiện nay:
- Các công ty CAD lớn đều đã tự viết kernel B-rep riêng của mình, và phải mất hàng chục năm.
- Kernel B-rep quan trọng nhất là Parasolid, nền tảng cho nhiều sản phẩm công nghiệp.
- Trong thị trường CAD mã nguồn mở, OpenCascade là kernel B-rep phổ biến duy nhất.
Kernel B-rep mã nguồn mở mới:
- Một kernel B-rep mã nguồn mở mới tên là Truck đang được phát triển.
- Nó được viết bằng Rust, mang lại các lợi thế như bảo đảm an toàn bộ nhớ, dễ song song hóa và hỗ trợ biên dịch sang WebAssembly.
- Truck nhỏ gọn, nhẹ, hỗ trợ đọc/ghi tệp .step, tam giác hóa bề mặt, hỗ trợ NURBS, và các phép giao/hợp/hiệu trên khối rắn.
Bộ theo dõi lịch sử
Chương trình CAD tham số lưu lại lịch sử tính năng của thiết kế.
- Chi tiết được hoàn thiện thông qua các thao tác như sketch, extrude, revolve, v.v.
- "Tham số" nghĩa là bạn có thể quay lại một bước trước đó, sửa đổi, rồi phát lại các tính năng để thu được một chi tiết hơi khác.
- Có thể tham số hóa mô hình thông qua việc đưa biến vào.
Cách tiếp cận để giải quyết tính mong manh của CAD tham số:
- Chiến lược mô hình hóa bền vững (RMS): một tập quy tắc để thiết kế chi tiết.
- Thêm lịch sử tính năng vào sketch: có thể áp dụng ý tưởng RMS cho một sketch đơn lẻ bằng cách lưu và hiển thị các tính năng sketch trong cây tính năng.
- Ghi mọi sự kiện người dùng vào một log chỉ-ghi-thêm để cung cấp khả năng hoàn tác/làm lại không giới hạn.
Giao diện người dùng 3D
Tôi rất thích ý tưởng chạy CAD trong trình duyệt.
- Onshape chạy trong trình duyệt, nhưng thực ra nó chạy trên các instance đám mây có GPU của AWS.
- CADmium dùng Truck được biên dịch sang WebAssembly để mọi thứ có thể chạy trong trình duyệt. Đây là một ứng dụng local-first.
Ngăn xếp công nghệ:
- Three.js: viewport 3D
- Svelte: quản lý trạng thái/tính phản ứng
- Threlte: cầu nối giữa Svelte và Three.js
- truyền thông điệp giữa UI và kernel B-rep
- Electron: chạy cục bộ
- các công nghệ tiêu chuẩn khác: Typescript, TailwindCSS, Vite, v.v.
Định dạng tệp
CADmium dùng JSON cho mọi thứ.
- Log thao tác gồm các dòng JSON.
- Hỗ trợ xuất chi tiết đã thiết kế sang định dạng trao đổi đơn giản hơn.
- Ví dụ:
{ "steps": [ { "type": "sketch", "id": "Sketch-01", "data": { ... } }, { "type": "extrude", "id": "Extrude-01", "data": { "distance": "10mm", "sketch": "Sketch-01", "faces": [0], "type": "new" } } ] } - Có thể chuyển đổi sang .step hoặc .stl bằng giao diện dòng lệnh (CLI) của CADmium:
$ CADmium export my_part.cadmium --format stl
Kết luận
Không rõ ý tưởng nào được nhắc tới ở đây sẽ thành công và ý tưởng nào sẽ thất bại, nhưng ở đâu đó trong không gian này có cơ hội để một đội nhỏ tạo ra tác động lớn đến ngành sản xuất.
Những sự giúp đỡ cần thiết:
- Lập trình Rust (cải tiến chung)
- Hình học tính toán (vá cho Truck)
- Hỗ trợ Three.js (bộ điều khiển camera mới, ánh sáng tốt hơn, hậu xử lý)
- Tìm cơ hội tài trợ hoặc nhà bảo trợ giàu có
Những thứ hiện chưa bàn đến nhưng muốn quay lại sau này:
- Vốn đầu tư mạo hiểm
- Tạo toolpath (CAM)
- Phân tích phần tử hữu hạn (FEA)
Nếu thấy ý tưởng này thú vị, hãy tham gia máy chủ Discord của CADmium để trò chuyện!
Ý kiến của GN⁺
- Ưu điểm của Rust: Rust rất phù hợp cho các dự án mã nguồn mở nhờ an toàn bộ nhớ và dễ song song hóa. Điều này sẽ giúp ích lớn cho việc nâng cao độ ổn định và hiệu năng của CADmium.
- Ứng dụng của WebAssembly: Việc dùng WebAssembly để thực hiện trực tiếp công việc CAD trong trình duyệt là rất đột phá. Điều này cho phép tiếp tục làm việc ngay cả trong môi trường có kết nối Internet không ổn định.
- Đơn giản hóa định dạng tệp: Định dạng tệp dùng JSON rất dễ hiểu và hữu ích vì có thể chỉnh sửa trực tiếp bằng trình soạn thảo văn bản. Điều này giúp cộng tác và quản lý phiên bản dễ dàng hơn.
- Tầm quan trọng của lịch sử tính năng: Cung cấp khả năng hoàn tác/làm lại không giới hạn thông qua lịch sử tính năng có thể cải thiện đáng kể trải nghiệm người dùng. Nó giúp dễ dàng sửa các sai sót trong quá trình thiết kế.
- Sức mạnh của cộng đồng mã nguồn mở: Các dự án mã nguồn mở có thể phát triển nhanh nhờ sự tham gia và đóng góp của cộng đồng. CADmium cũng có thể tiến xa hơn nhờ sự tham gia của nhiều nhà phát triển và người dùng.
Chưa có bình luận nào.