返回

文章详情

浏览器中的 LibreCAD

Hacker News2026年7月2日 01:00

2026年6月29日发布 · 2026年7月1日更新 我时不时需要快速草拟一个2D图纸,比如平面图。我不是CAD用户,也不想为了画五条线和一个圆圈而安装一个CAD软件。免费的选择都是桌面应用程序:你下载某个东西,安装它,启动它,然后在本地工作。当你在自己桌子前时,这很不错,但已经是2026年,不能直接打开一个标签页来画画,尤其是不需要登录,这让人感觉有点傻。我以前从未使用过 LibreCAD,也没有听说过它,我也不是它的目标用户。我只想要一个快速草图工具。因此,我没有尝试另一个桌面安装,而是想:找一个开源应用程序,并通过在 OpenCode 中简单提示 GLM-5.2 将其移植到 WebAssembly。值得指出的是,整个过程非常无痛且“简单”,但这仅仅是多亏了 Qt 团队的巨大努力,他们似乎在非常认真地投资于 Wasm 支持,以及整个 Wasm 生态系统,此时看起来确实相当成熟。这件事情的结果就在这个模型能做到的边缘,但在一些指导下它最终工作了。原生视觉支持和一些计算机使用能力将大大帮助模型自主调试问题,而 GLM-5.2 缺乏这种能力。结果如下:整个应用程序(不是查看器, 也不是子集)编译为 WebAssembly,并在这个网站上直接运行。点击就能加载(来源:github.com/magik6k/LibreCAD-Web):启动 LibreCAD → 首次加载大约为 18 MB 压缩(Brotli)。之后你的浏览器会缓存它。需要支持最新版本的基于 Chromium 的浏览器(Chrome 或 Edge 137 以上)——这个移植依赖于 WebAssembly JSPI,而 Firefox 和 Safari 尚未发布。下面将进一步解释原因。内容完全由 LLM 编写,但它在技术上看起来基本准确,就像这个应用程序在浏览器中大致运行,但在仔细检查下可能包含严重错误。这纯粹是一个 FAFO 风格的无努力项目,你还期待什么?它是什么 LibreCAD 是一个免费的、GPL 许可的 2D CAD 应用程序。它能读写 DXF 和 DWG 文件,支持图层、块、尺寸、填充以及你对 2D CAD 工具的所有期望。它在 C++ 上构建,基于 Qt,自 QCad 时代以来就存在。这个移植通过 Emscripten 和 Qt 的官方 WebAssembly 平台支持,编译相同的 C++ 源代码为 WebAssembly。没有 JavaScript 的重实现,没有网页原生的分支,没有服务器端渲染——真正的桌面应用程序在你的浏览器标签中运行。它是如何做到的 前 90% 是机械性工作:建立工具链,编译,启动 GUI,连接文件。最后 10%——使模态对话框真正工作——是有趣的问题所在,也迫使整个工具链重建。这是诚实的版本。工具链和编译 一个带有 Ubuntu 24.04、Emscripten 和 Qt 的 Docker 镜像。完整的 LibreCAD 源代码通过 Qt 的 qt.toolchain.cmake 编译并链接为 .wasm 文件(原始的 Emscripten 工具链文件会导致 find_package(Qt6) 失败)。仅限桌面的启动路径——CLI 参数解析、启动画面、首次运行对话框、版本检查网络——都用 #ifndef Q_OS_WASM 保护,因此桌面构建未受影响。启动 GUI Qt for WebAssembly 通过 WebGL 渲染并通过其平台插件传递浏览器事件。主窗口启动,工具栏和浮动窗口出现,画布接收鼠标和键盘输入。到目前为止,一切都很好。困难的部分:嵌套对话框和 exec() LibreCAD 是一个正规的桌面应用程序,而桌面应用程序会不断重新进入事件循环:QDialog::exec() 会阻塞,直到你关闭对话框,组合框下拉菜单会自己转动一个循环,从首选项对话框打开的颜色选择器会在其上嵌套另一个循环。在 web 上,你不能阻塞主线程——没有办法“在这里等待”,而不会冻结页面。因此 exec() 根本不会返回。Emscripten 的解决方案是 Asyncify:它重写二进制文件,以便阻塞调用可以回到浏览器并在稍后恢复。Qt 支持它,而大多数 Qt-WASM 应用程序都使用它。它有效——仅针对一个级别。Asyncify 只能在同一时间挂起一个调用深度。因此,对话框打开得很好,但一旦你在该对话框内点击组合框,或者从应用程序首选项打开颜色选择器,第二次挂起就无处可去,整个应用程序就会卡住。对于一个首选项全是下拉菜单和颜色按钮的 CAD 程序,这不是一个粗糙的边缘,而是无法使用。解决方法是 JSPI(WebAssembly JavaScript Promise Integration):一种本机浏览器挂起机制,与 Asyncify 不同,可以任意嵌套。Qt 6.9 可以针对它进行开发(-device-option QT_EMSCRIPTEN_ASYNCIFY=2),但这需要本机 WebAssembly 异常(-fwasm-exceptions),而预构建的 Qt 包不包括这两者。因此,移植现在从源代码为 WebAssembly 构建 Qt 6.9,并启用 JSPI + Wasm 异常。这暴露出真正的难题。JSPI 仅允许 WebAssembly 堆栈挂起,如果它是在...

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡