- µcad là ngôn ngữ lập trình dành cho CAD mã nguồn mở được triển khai bằng Rust, đồng thời là hệ thống hình học dựa trên văn bản cho phép định nghĩa phác thảo 2D và đối tượng 3D bằng mã rồi xuất ra STL·SVG
- Ở trung tâm của ngôn ngữ là các đối tượng hình học tham số, với cấu trúc kết hợp các hình cơ bản bằng phép toán boolean để tạo ra hình dạng phức tạp và render sang định dạng dùng cho in 3D·gia công CNC
- Sử dụng hệ thống kiểu tĩnh và literal Quantity dựa trên đơn vị để định nghĩa mô hình bằng các giá trị như
50mm, 10°, 50%, đồng thời cung cấp hệ kiểu với kiểu Models để xây dựng cây mô hình hình học
- Thông qua module·hàm·workbench
part·câu lệnh use, thư viện chuẩn như std::geo2d·std::geo3d và tính năng std::import để nhập dữ liệu TOML, µcad hỗ trợ xây dựng mã thiết kế có thể tái sử dụng và mô hình hóa dựa trên dữ liệu
- Đây là dự án đáng tham khảo cho những người muốn workflow CAD theo hướng lập trình, đi kèm ví dụ·tài liệu·tài liệu live coding
Tổng quan về µcad
- µcad là ngôn ngữ lập trình CAD mã nguồn mở dùng để định nghĩa và tạo phác thảo 2D cùng đối tượng 3D bằng mã
- Khái niệm trung tâm là mô hình hóa hình học tham số
- Có thể kết hợp các hình cơ bản để tạo hình dạng phức tạp, rồi render kết quả ra STL·SVG để dùng cho in 3D hoặc công việc CNC
Thiết kế ngôn ngữ và cách mô hình hóa
- µcad là ngôn ngữ mô hình hóa tham số xây dựng cấu trúc mô hình xoay quanh các định nghĩa hình học có tham số
- Hình dạng được khai báo bằng mã, và có thể tạo nhiều biến thể chỉ bằng cách thay đổi tham số
- Kết hợp
Sphere, Cube, Cylinder bằng phép boolean, đồng thời tạo hình 3D thông qua revolve, mảng lặp và biến đổi
- Thông qua các ví dụ như
CsgCube, Spirograph, Gears, Dome, ngôn ngữ này trình bày nhiều pattern mô hình hóa như tạo 3D từ phác thảo 2D, tạo cấu trúc lặp và biên dạng bánh răng
Hệ thống kiểu và literal đơn vị
- µcad sử dụng hệ thống kiểu tĩnh và biến hoạt động theo hướng bất biến
- Thông qua kiểu Quantity, có thể dùng trực tiếp các đơn vị
mm, °, % để cấu thành mô hình
- Các biểu diễn như
10°·4m²·50% có thể được dùng nguyên dạng làm tham số mô hình
- Kiểu Models là cấu trúc biểu diễn cây mô hình hình học, chứa cấu trúc node của mô hình CAD dựa trên mã
Hệ thống module và thư viện chuẩn
- Với cấu trúc module dùng
mod, use, fn, part, có thể tách một thiết kế lớn thành nhiều đơn vị mã
- Thư viện chuẩn như
std::geo2d, std::geo3d, std::math, std::ops hỗ trợ phép toán hình học·toán học·ma trận·xây dựng sketch
part được dùng như đơn vị để tạo và biến đổi sketch·part 3D
Nhập dữ liệu và gỡ lỗi
- Với
std::import, có thể lấy tham số từ tệp TOML và áp dụng vào mô hình
- Đây là cách dễ dàng đưa các quy cách linh kiện có sẵn vào mô hình
- Có thể kiểm chứng các giá trị đã nhập bằng
std::debug::assert_eq v.v.
Toolchain và cài đặt
- Chạy và render mô hình bằng công cụ CLI nền Rust
microcad-cli
- Cài đặt bằng
cargo install microcad-cli
- Hiện đang ở giai đoạn alpha và liên tục được bổ sung tính năng
- Có thể trực quan hóa kết quả render thông qua
microcad-viewer
- Kho lưu trữ được phát triển trên codeberg.org và phân phối qua crates.io
Ví dụ và tài liệu live coding
- Nhiều ví dụ như Spirograph, Lego Bricks, Gears, Dome được công bố trên blog chính thức
- Cung cấp các trường hợp ứng dụng CAD lập trình như tạo biên dạng bánh răng, mô hình hóa spirograph, tạo cấu trúc mái vòm
- Tất cả ví dụ đều được cung cấp cùng mã và video live coding, giúp người dùng nắm cách sử dụng ngôn ngữ theo từng bước
Trạng thái dự án
- Dự án vẫn ở giai đoạn đầu và đang tiếp tục được mở rộng
- Công việc tài liệu hóa “The µcad book” đang được tiến hành để hệ thống hóa toàn bộ ngôn ngữ
1 bình luận
Ý kiến trên Hacker News
Cần gỡ bỏ việc nhắc đến LEGO khỏi website và các ví dụ
LEGO rất nghiêm khắc trong việc bảo vệ thương hiệu, và không muốn bên thứ ba sử dụng tên này
Vì họ lo ngại thương hiệu sẽ trở thành danh từ chung và làm mất quyền nhãn hiệu
Bài liên quan: "Lego sues Dutch firm over anti-terror blocks using name and shape" (liên kết archive)
Sẽ rất tốt nếu ngay màn hình đầu của trang chủ có thể hiển thị một ví dụ mã đơn giản cùng bản phác thảo được tạo ra
Tôi đã dùng zoo và ngôn ngữ KCL của họ để viết CAD dựa trên boundary representation (BREP)
Có vẻ µcad cũng nhắm đến cùng mục tiêu
Cá nhân tôi thích cách tiếp cận pipeline của KCL hơn
Tuy vậy, tôi không hài lòng vì zoo ép dùng kernel chỉ chạy trên cloud, khiến vendor lock-in rất nặng
Hiện vẫn chưa rõ µcad giải quyết vấn đề này như thế nào
µcad dựa trên Manifold nên thiên về mesh, khác với KCL vốn dựa trên brep
KCL cũng có thể mở rộng sang các kernel khác
Điểm hay nhất của OpenSCAD là sau khi lưu mã, bạn có thể xem ngay kết quả trong chế độ xem 3D
Tôi muốn biết liệu ucad có hỗ trợ kiểu workflow tức thời như vậy không
Đây là cách vẽ nhanh lên màn hình 2D mà không cần tính toán giao cắt 3D thực sự
OpenSCAD đã trừu tượng hóa cấu trúc này bằng AST để có thể gửi sang nhiều engine như OpenCSG, CGAL, Manifold, v.v.
Về lý thuyết có thể triển khai bất kỳ CAD nào, nhưng độ khó triển khai rất cao
Tôi đã dùng OpenSCAD và CadQuery nhưng thấy bất tiện vì các ràng buộc của UI và kernel
So với Onshape hay Fusion 360 thì thiếu nhiều tính năng
FreeCAD cũng đã tiến bộ nhiều, nhưng với người mới đến trung cấp thì vẫn còn khó dùng
Tôi hy vọng CAD mã nguồn mở rồi sẽ trở thành một lựa chọn thay thế thật sự
Cũng có những dự án thử kernel mới như Fornjot
Dự án này không có constraint solver, hoặc ít nhất là chưa có kế hoạch nào được tài liệu hóa
Tôi muốn tránh phải tự duy trì từng công thức lượng giác chỉ để xử lý các ràng buộc đơn giản
Hơi tiếc là không có phiên bản chạy trực tiếp trong môi trường notebook trên web như hướng dẫn Lego brick
Sẽ hay hơn nếu có dạng trải nghiệm không cần cài đặt như SCAD crash course của MachineBlocks
Tôi tò mò không biết cái này có gần với một giải pháp thay thế AutoCAD hay không
Cũng muốn biết nó có khả năng tương thích định dạng tệp để nhập vào Revit v.v. hay không
Đây thực sự là một dự án rất thú vị
Với một lập trình viên ghét phải thao tác CAD bằng tay như tôi, cách tiếp cận này trực quan hơn nhiều
Tuy vậy, nhìn vào ví dụ bánh răng thì có vẻ để hiểu được các primitive cơ bản của thư viện, vẫn phải đọc tài liệu khá kỹ
Khi cộng đồng lớn hơn, có lẽ sẽ có thêm nhiều hình dạng hơn
Tôi đã tìm một ngôn ngữ CAD hỗ trợ tốt cho lặp (iteration)
Khi thiết kế nhà ở riêng, tôi từng nghĩ sẽ rất hay nếu có thể tự động hóa chi tiết thi công tường bằng mã dựa trên vòng lặp
Nhưng nếu không có vòng lặp for thì những việc như vậy quá khó, nên cuối cùng tôi đã bỏ cuộc