- µcad คือ ภาษาโปรแกรมสำหรับ CAD แบบโอเพนซอร์ส ที่พัฒนาด้วย Rust และเป็น ระบบเรขาคณิตแบบข้อความ ที่กำหนดสเก็ตช์ 2D และวัตถุ 3D ด้วยโค้ด แล้วส่งออกเป็น STL·SVG ได้
- หัวใจของภาษานี้คือ วัตถุเรขาคณิตเชิงพารามิเตอร์ โดยใช้การดำเนินการแบบบูลีนเพื่อประกอบรูปทรงพื้นฐานให้เป็นรูปทรงซับซ้อน และเรนเดอร์เป็นรูปแบบสำหรับงานพิมพ์ 3D·การกัด CNC
- ใช้ ระบบชนิดข้อมูลแบบสแตติกและลิเทอรัล Quantity ที่อิงหน่วย เพื่อกำหนดโมเดลด้วยค่าอย่าง
50mm, 10°, 50% และมีระบบชนิดข้อมูลที่ใช้ประกอบโครงสร้างต้นไม้ของโมเดลเรขาคณิตด้วยชนิด Models
- ผ่านฟีเจอร์อย่างโมดูล·ฟังก์ชัน·เวิร์กเบนช์
part·คำสั่ง use, ไลบรารีมาตรฐานอย่าง std::geo2d·std::geo3d และความสามารถ std::import สำหรับนำเข้าข้อมูล TOML จึงสามารถสร้าง โค้ดออกแบบที่นำกลับมาใช้ซ้ำได้และการทำโมเดลแบบขับเคลื่อนด้วยข้อมูล
- เป็นโครงการที่ผู้ใช้ซึ่งต้องการเวิร์กโฟลว์ CAD แบบโปรแกรมมิงสามารถใช้อ้างอิงได้ โดยมีตัวอย่าง·เอกสาร·สื่อไลฟ์โค้ดดิ้งให้พร้อม
ภาพรวมของ µcad
- µcad คือ ภาษาโปรแกรม CAD แบบโอเพนซอร์ส สำหรับกำหนดและสร้างสเก็ตช์ 2D และวัตถุ 3D ด้วยโค้ด
- แนวคิดหลักคือ การทำโมเดลเรขาคณิตเชิงพารามิเตอร์
- สามารถนำรูปทรงพื้นฐานมาประกอบเป็นรูปทรงซับซ้อน และเรนเดอร์ผลลัพธ์เป็น STL·SVG เพื่อนำไปใช้กับงานพิมพ์ 3D หรือการทำงาน CNC ได้
การออกแบบภาษาและวิธีการทำโมเดล
- µcad เป็น ภาษาสำหรับการทำโมเดลเชิงพารามิเตอร์ ที่จัดโครงสร้างโมเดลโดยยึดนิยามทางเรขาคณิตที่มีพารามิเตอร์เป็นศูนย์กลาง
- รูปทรงถูกประกาศด้วยโค้ด และสามารถสร้างรูปแบบแปรผันได้หลากหลายเพียงเปลี่ยนพารามิเตอร์
- ใช้การผสมแบบบูลีนของ
Sphere, Cube, Cylinder เป็นต้น และสร้างรูปทรง 3D ผ่านการหมุน (revolve)·การจัดเรียง·การแปลง
- มีตัวอย่างอย่าง
CsgCube·Spirograph·Gears·Dome ที่แสดงแพตเทิร์นการทำโมเดลหลากหลาย เช่น การสร้าง 3D จากสเก็ตช์ 2D, การสร้างโครงสร้างซ้ำ, โปรไฟล์เฟือง เป็นต้น
ระบบชนิดข้อมูลและลิเทอรัลหน่วย
- µcad ใช้ระบบชนิดข้อมูลแบบสแตติก และตัวแปรทำงานแบบไม่เปลี่ยนแปลงค่า
- ผ่านชนิด Quantity จึงสามารถใช้หน่วยอย่าง
mm, °, % ได้โดยตรงในการประกอบโมเดล
- สามารถใช้รูปแบบอย่าง
10°·4m²·50% เป็นพารามิเตอร์ของโมเดลได้ตามนั้นเลย
- ชนิด Models เป็นโครงสร้างสำหรับแสดงต้นไม้ของโมเดลเรขาคณิต โดยเก็บโครงสร้างโหนดของโมเดล CAD แบบโค้ด
ระบบโมดูลและไลบรารีมาตรฐาน
- ใช้
mod, use, fn, part ฯลฯ เพื่อจัดโครงสร้างโมดูล แยกงานออกแบบขนาดใหญ่ออกเป็นหลายหน่วยโค้ด
- ไลบรารีมาตรฐานอย่าง
std::geo2d, std::geo3d, std::math, std::ops รองรับการคำนวณเรขาคณิต·คณิตศาสตร์·เมทริกซ์·การประกอบสเก็ตช์
part ใช้เป็นหน่วยสำหรับสร้างและแปลงสเก็ตช์·พาร์ต 3D
การนำเข้าข้อมูลและการดีบัก
- ใช้
std::import เพื่อนำเข้าพารามิเตอร์จากไฟล์ TOML มาใช้กับโมเดล
- เป็นวิธีที่ช่วยใส่สเปกของชิ้นส่วนสำเร็จรูปเข้าไปในโมเดลได้อย่างง่ายดาย
- สามารถตรวจสอบค่าที่นำเข้าได้ด้วย
std::debug::assert_eq เป็นต้น
ทูลเชนและการติดตั้ง
- ใช้เครื่องมือ CLI บน Rust ชื่อ
microcad-cli สำหรับรันและเรนเดอร์โมเดล
- ติดตั้งด้วย
cargo install microcad-cli
- ขณะนี้ยังอยู่ในช่วงอัลฟาและมีการเพิ่มฟีเจอร์อย่างต่อเนื่อง
- สามารถดูผลการเรนเดอร์แบบภาพได้ผ่าน
microcad-viewer
- รีโพซิทอรีพัฒนาบน codeberg.org และเผยแพร่ผ่าน crates.io
ตัวอย่างและสื่อไลฟ์โค้ดดิ้ง
- มีการเผยแพร่ตัวอย่างหลากหลาย เช่น Spirograph, Lego Bricks, Gears, Dome บนบล็อกทางการ
- นำเสนอกรณีใช้งาน CAD แบบโปรแกรมมิง เช่น การสร้างโปรไฟล์เฟือง, การทำโมเดลสไปโรกราฟ, การสร้างโครงสร้างโดม
- ทุกตัวอย่างมาพร้อมโค้ดและวิดีโอไลฟ์โค้ดดิ้ง ทำให้เรียนรู้วิธีใช้ภาษาได้แบบเป็นขั้นเป็นตอน
สถานะของโครงการ
- โครงการยังอยู่ในระยะเริ่มต้นและกำลังขยายความสามารถต่อเนื่อง
- กำลังจัดระบบเอกสารของภาษาทั้งหมดผ่านงานเอกสาร “The µcad book”
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ควรลบการกล่าวถึง LEGO ออกจากเว็บไซต์และตัวอย่าง
LEGO เข้มงวดมากเรื่อง การคุ้มครองเครื่องหมายการค้า และไม่ต้องการให้บุคคลที่สามใช้ชื่อนี้
เพราะกังวลว่าแบรนด์จะกลายเป็นชื่อสามัญและเสี่ยงต่อการสูญเสียสิทธิในเครื่องหมายการค้า
บทความที่เกี่ยวข้อง: "Lego sues Dutch firm over anti-terror blocks using name and shape" (ลิงก์ archive)
น่าจะดีถ้าหน้าแรกของเว็บไซต์แสดง ตัวอย่างโค้ดสั้นๆ และสเก็ตช์ที่สร้างขึ้น ให้เห็นทันที
ฉันเคยใช้ zoo และภาษา KCL ของมันเพื่อเขียน CAD แบบอิง boundary representation (BREP)
ดูเหมือนว่า µcad ก็มีเป้าหมายเดียวกัน
โดยส่วนตัวฉันชอบ แนวทางแบบ pipeline ของ KCL มากกว่า
แต่สิ่งที่ไม่ชอบคือ zoo บังคับให้ใช้เคอร์เนลแบบคลาวด์เท่านั้น ทำให้เกิด vendor lock-in สูง
ยังไม่ชัดเจนว่า µcad แก้ปัญหานี้อย่างไร
µcad ใช้ Manifold จึงเป็นแนว เน้น mesh และต่างจาก KCL ที่เป็น brep
KCL ยังสามารถขยายไปใช้เคอร์เนลอื่นได้ด้วย
จุดที่ดีที่สุดของ OpenSCAD คือพอบันทึกโค้ดแล้วสามารถ ดูผลลัพธ์ใน 3D view ได้ทันที
เลยสงสัยว่า ucad จะรองรับเวิร์กโฟลว์ที่มีความฉับไวแบบนี้ได้หรือไม่
เป็นวิธีวาดลงบนหน้าจอ 2D อย่างรวดเร็วโดยไม่ต้องคำนวณจุดตัด 3D จริง
OpenSCAD ทำ abstraction โครงสร้างนี้ด้วย AST เพื่อส่งต่อไปยังเอนจินได้หลากหลาย เช่น OpenCSG, CGAL, Manifold เป็นต้น
ในทางทฤษฎี CAD อะไรก็ทำได้ แต่การลงมือทำจริงยากมาก
เคยใช้ทั้ง OpenSCAD และ CadQuery แต่รู้สึกไม่สะดวกเพราะ ข้อจำกัดของ UI และเคอร์เนล
เมื่อเทียบกับ Onshape หรือ Fusion 360 แล้วฟีเจอร์ยังน้อยกว่า
FreeCAD พัฒนาไปมากแล้ว แต่สำหรับผู้ใช้ระดับต้นถึงกลางก็ยังใช้งานยากอยู่
หวังว่าสักวันโอเพนซอร์ส CAD จะกลายเป็นทางเลือกที่ดีได้จริง
ยังมีโปรเจกต์อย่าง Fornjot ที่กำลังลองใช้เคอร์เนลแบบใหม่
โปรเจกต์นี้ไม่มี constraint solver หรืออย่างน้อยก็ยังไม่มีการบันทึกแผนเรื่องนี้ไว้ในเอกสาร
ฉันไม่อยากต้องคอยรักษาสมการตรีโกณมิติเองทั้งหมดเพื่อทำ constraint ง่ายๆ
น่าเสียดายที่ไม่มีเวอร์ชันที่รันได้ทันทีใน สภาพแวดล้อมแบบเว็บโน้ตบุ๊ก เหมือน บทช่วยสอน Lego brick
ถ้ามีรูปแบบที่ลองเล่นได้โดยไม่ต้องติดตั้งแบบ SCAD crash course ของ MachineBlocks ก็คงดี
สงสัยว่านี่ใกล้เคียงกับการเป็น ตัวแทน AutoCAD หรือไม่
และอยากรู้ด้วยว่ามี ความเข้ากันได้ของฟอร์แมตไฟล์ สำหรับนำเข้าไปใช้กับ Revit เป็นต้นหรือเปล่า
เป็นโปรเจกต์ที่น่าสนใจมาก
สำหรับโปรแกรมเมอร์ที่ไม่ชอบทำ CAD ด้วยมือแบบฉัน แนวทางนี้ เป็นธรรมชาติกว่า มาก
แต่พอดูตัวอย่าง gear แล้ว รู้สึกว่าถ้าจะเข้าใจ primitive พื้นฐานของไลบรารี คงต้องอ่านเอกสารละเอียดพอสมควร
ถ้าชุมชนใหญ่ขึ้นก็น่าจะมีรูปทรงให้ใช้เพิ่มอีกมาก
กำลังมองหาภาษา CAD ที่รองรับการทำซ้ำ (iteration) ได้ดีอยู่พอดี
ตอนออกแบบบ้านของตัวเอง ฉันเคยคิดว่าถ้าทำรายละเอียดการสร้างผนังให้เป็นอัตโนมัติด้วย โค้ดแบบลูป ได้ก็คงดี
แต่ถ้าไม่มี for loop งานแบบนี้ก็ยากเกินไป เลยสุดท้ายต้องล้มเลิก