展示HN:LuaCAD – 使用Lua脚本化参数CAD

Hacker News Top 工具

摘要

LuaCAD是一个可脚本化的CAD工具,使用Lua进行参数化2D和3D建模,基于Rust引擎构建,支持多种导出格式和CSG操作。

LuaCAD使用Lua而非OpenSCAD语言建模实体,支持CSG的运算符重载(`a + b`、`a - b`、`a * b`)。<p>它附带了一个CLI和一个桌面应用程序,包括一个预览区域和一个文本编辑器。<p>我一直很喜欢OpenSCAD,但不幸的是SCAD语言本身相当拼凑,是一个设计非常糟糕的编程语言。<p>LuaCAD吸取了OpenSCAD的所有优点,并结合了最好的脚本语言之一。它现在已完全取代了我使用的OpenSCAD,我认为它在所有用例中都提供了比OpenSCAD更好的体验。我很乐意听到任何LuaCAD不应完全取代OpenSCAD的理由!<p>它完全开源,您可以在以下位置找到仓库:<a href="https:&#x2F;&#x2F;github.com&#x2F;ad-si&#x2F;LuaCAD" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;ad-si&#x2F;LuaCAD</a><p>技术栈:<p>- 它是用Rust实现的,使用mlua(<a href="https:&#x2F;&#x2F;github.com&#x2F;mlua-rs&#x2F;mlua" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;mlua-rs&#x2F;mlua</a>)来执行Lua代码。<p>- 使用OpenCSG(<a href="https:&#x2F;&#x2F;opencsg.org" rel="nofollow">https:&#x2F;&#x2F;opencsg.org</a>)来快速正确地渲染3D模型(类似OpenSCAD)<p>- 使用Manifold(<a href="https:&#x2F;&#x2F;github.com&#x2F;elalish&#x2F;manifold" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;elalish&#x2F;manifold</a>)来创建流形三角网格<p>- 原生支持所有BOSL2函数(即用Rust实现以提高性能)
查看原文
查看缓存全文

缓存时间: 2026/08/14 18:30

# LuaCAD 源码:https://luacad.ad-si.com/ 使用 Lua 编写可脚本化的 CAD。用 Lua 编写参数化的 2D 和 3D 模型,并将其导出为 3MF、STL、OBJ、PLY、OFF、AMF 或 SCAD 格式,或直接渲染为 PNG 图像。LuaCAD 在 Rust 引擎中嵌入了 Lua 5.4,可直接(通过 [Manifold](https://github.com/elalish/manifold))执行 CSG(构造实体几何)运算,或生成 [OpenSCAD](https://www.openscad.org/) 代码以供外部渲染。 LuaCAD Studio 正在预览 MuSHR 赛车模型,这是一个由 490,802 个三角形组成的 43 个零件的组件,旁边是构建它的 Lua 脚本。 ## 为何选择 Lua? - 与 OpenSCAD 语言语法相似,但更优: - 功能更强大 - 表达更一致 - 性能更快 - 易于嵌入 - 支持运算符重载,可实现自然的 CSG 语法(`a + b`、`a - b`、`a * b`) - 已被 [LibreCAD](https://github.com/LibreCAD/LibreCAD_3) 和 [Autodesk Netfabb](https://help.autodesk.com/view/NETF/2025/ENU/?guid=GUID-93C06838-2623-4573-9BFB-B1EF4628AC4A) 等其他 CAD 软件采用。 ## 示例 #### LuaCAD 示例: ``` my_cube = cube { size = { 1, 2, 3 } } function my_sphere(radius) return sphere({ r = radius }):translate(5, 0, 0) end model = my_cube + my_sphere(2) render(model) ``` #### 等效的 OpenSCAD 代码: ``` module my_cube() { cube(size=[1,2,3]); } module my_sphere(radius) { translate([5,0,0]) sphere(r = radius); } union() { my_cube(); my_sphere(2); } ``` ## 快速开始 ``` cargo install luacad # 用于运行和转换 LuaCAD 脚本的命令行工具 cargo install luacad-studio # 带实时 3D 预览的图形桌面应用 ``` 或者从源码安装,需要 [Rust](https://www.rust-lang.org/tools/install) 环境: ``` git clone https://github.com/ad-si/LuaCAD.git cd LuaCAD make install ``` 这两个 crate 都内置了其 C/C++ 依赖项,因此无需安装系统库——但构建它们需要 C++ 编译器和 CMake。`luacad` 会构建 Manifold 和 Clipper2;`luacad-studio` 额外构建 [OpenCSG](http://www.opencsg.org/),这需要 OpenGL 开发头文件(在 Debian/Ubuntu 上:`libgl1-mesa-dev`、`libx11-dev`、`libxcb1-dev`、`libxkbcommon-dev`、`libxrandr-dev`、`libwayland-dev`)。 ### 命令行用法 ``` luacad convert model.lua output.3mf # 转换为 3MF 格式 luacad convert model.lua output.stl # 转换为 STL 格式 luacad convert model.lua output.scad # 导出为 OpenSCAD 格式 luacad watch model.lua output.3mf # 文件更改时重新构建 luacad render model.lua preview.png # 渲染为 PNG 图像 luacad info model.lua # 打印三角形数量和包围盒信息 luacad lint model.lua # 使用 selene 进行代码检查(也支持目录) luacad run model.lua # 执行(仅执行副作用) ``` `convert` 和 `watch` 根据输出文件扩展名推断格式;`--format` 可覆盖该设置,`--via-openscad` 会将导出操作交给已安装的 OpenSCAD 二进制文件执行,而不是使用 Manifold 构建网格。 ## BOSL2 支持 LuaCAD 完全支持 [Belfry OpenSCAD Library v2](https://github.com/BelfrySCAD/BOSL2/wiki),该库已在 LuaCAD 中重新实现。因此无需安装 OpenSCAD 或 BOSL2 即可渲染、预览并导出为网格: ``` bosl.cuboid { {40, 40, 40}, rounding = 2 } bosl.regular_prism { 5, r = 10, h = 25 } bosl.spur_gear { circ_pitch = 5, teeth = 20, thickness = 5 } ``` 导出为 `.scad` 格式时,仍会写入 BOSL2 调用代码,这使得导出的文件尽可能简洁。 ## 文本与导入 `text()` 将系统字体轮廓化为草图,`text3d()` 则一步完成挤压,使文本成为真正的几何体,而非 SCAD 输出: ``` render(text("LuaCAD", { size = 12, halign = "center" }):linear_extrude(2)) ``` `import()` 可读取 LuaCAD 支持的所有网格格式,并返回一个实体,可像任何基本体一样进行变换和组合;SVG 和 DXF 则返回 2D 草图,可直接进行挤压。 ## 支持的导出格式 - **SCAD ([https://en.wikipedia.org/wiki/OpenSCAD](https://en.wikipedia.org/wiki/OpenSCAD))** - OpenSCAD 格式 - **3MF ([https://en.wikipedia.org/wiki/3D_Manufacturing_Format](https://en.wikipedia.org/wiki/3D_Manufacturing_Format))** - 3D 制造格式 - **STL ([https://en.wikipedia.org/wiki/STL_(file_format)](https://en.wikipedia.org/wiki/STL_(file_format)))** - 用于 3D 打印的标准三角形语言格式 - **OBJ ([https://en.wikipedia.org/wiki/Wavefront_.obj_file](https://en.wikipedia.org/wiki/Wavefront_.obj_file))** - Wavefront 3D 对象格式 - **PLY ([https://en.wikipedia.org/wiki/PLY_(file_format)](https://en.wikipedia.org/wiki/PLY_(file_format)))** - 多边形文件格式 - **OFF ([https://en.wikipedia.org/wiki/OFF_(file_format)](https://en.wikipedia.org/wiki/OFF_(file_format)))** - 对象文件格式 - **AMF ([https://en.wikipedia.org/wiki/Additive_manufacturing_file_format](https://en.wikipedia.org/wiki/Additive_manufacturing_file_format))** - 增材制造文件格式 脚本返回的每个值都会成为其独立的 3MF 对象,因此切片软件会将它们加载为可独立移动的部件。使用 `:name(...)` 进行标签标记可控制它们在对象列表中的显示方式。其他格式无法表示独立对象,因此会将所有内容合并为单个网格。

相似文章

CADAM

Product Hunt

CADAM 是一个类似于 Tinkercad 的 AI 驱动 CAD 工具,已在 Product Hunt 上发布。

发布 HN:Adam (YC W25) —— 开源 AI CAD

Hacker News Top

Adam (YC W25) 推出 CADAM,这是一款开源 Web 应用,可利用 AI 通过自然语言或图像生成 3D CAD 模型,并提供参数化控制和导出选项。

GenCAD

Hacker News Top

GenCAD 引入了一种图像条件模型,该模型利用 transformers 和扩散先验生成完整的参数化 CAD 命令历史,从而实现从图像中进行精确且可修改的 3D 建模。

浏览器中的LibreCAD

Hacker News Top

一位开发者借助大型语言模型,将开源2D CAD应用LibreCAD移植到浏览器中运行,使用了WebAssembly和Qt的WebAssembly支持。