> 不把原始圖紙交給對方,不綁雲端帳號,不裝 AutoCAD —— 一個瀏覽器、一個檔案,照樣能縮放、切圖層、量距離。
傳統分享 CAD 圖紙有兩個選擇:直接發 DWG/DXF 檔案,安全性堪憂;或者轉成 PDF,看起來方便但幾乎不能動手操作。這個「單檔案離線全功能 HTML 檢視器」就是一個折衷又聰明的辦法——既安全又好用,還能維持 CAD 的大部分操作體驗。
核心妙處很簡單:把圖紙資料和瀏覽器執行的工具全都打包在一個 HTML 檔案裡,收件人無需安裝 AutoCAD,也不用上網。你送出去的檔案就像裝了隱形盾牌,資料安全牢靠,不怕外洩。更棒的是,使用者還能平移、縮放、量測,甚至切換圖層,就像在 AutoCAD 裡探險一樣,但不能修改原圖,讓設計者的成果穩如泰山。
這樣一來,分享 CAD 圖紙就像發一張「萬能看圖卡」:誰收到都能看、量測、討論,但絕對不能亂改。對跨團隊、跨公司合作特別友善——安全、省心,還省去軟體安裝的麻煩。
總結一句話:這玩意兒讓 CAD 圖紙既「安全護身」,又「隨手可玩」,讓你在不丟靈魂(和版權)的情況下,輕鬆分享、討論和展示設計成果。

Demo:mlightcad.github.io/cad-viewer/…
做專案的人幾乎都經歷過這一幕:圖要給對方看,方式卻總在 洩密、難用、離不開網路 之間三選一。
你怎麼交 對方得到的真實體驗
直接發 DXF / DWG
完整圖紙資料對方能打開、能改、能複製 —— 圖層、塊、屬性、你沒畫出來的東西也可能都在裡面。保密是最大雷區。 往往還得裝一套 CAD。
匯出 PDF
一張「死」圖,發郵件、列印都省心,但 CAD 的靈魂沒了:不好按圖層開關、不好縮到某一類物件、量尺寸也彆扭。適合「看一眼」,不適合「對著圖幹活」。
雲端看圖 / 分享連結
瀏覽器裡的線上預覽圖紙上了別人的伺服器 —— 合規、稽核、客戶保密協議 先過一遍腦。對方還得 一直連網;工地地下室、飛機上、客戶內網隔離?連結還可能過期。
匯出 HTML 是 cad-viewer 非常獨特的招牌能力(業界少見,我們認真做的那種):
.html,腳本內聯進去,隨身碟、file://、內網靜態頁都能開,斷網照樣用。一句話定位:在「保密、離線、好用」三角裡找平衡點 —— 不是取代 AutoCAD,而是「把該看的圖,安全、體面地送到對方螢幕上」。
下面開始拆引擎蓋:這套東西在程式碼裡長什麼樣。
目標人話版
.html 搞定,不依賴後端,也不再把 DWG/DXF 塞進去AcEx 前綴AcDb 實體cad-viewer / cad-simple-viewer 裡打開圖,跑 chtml,把目前場景收成快照,再打包進 HTML。如果你已經用上 @mlightcad/cad-viewer 模組,照這樣做:
MlRibbonCommands.vue、MlMainMenu.vue,迷路別找我)。chtml(跟 sendStringToExecute('chtml') 是同一回事,鍵盤派友善)。xxx.html。名稱多半跟圖紙走,副檔名一定是 .html,不會突然變成 .exe(那就離譜了)。事項|人話
viewer-runtime.iife.js 安頓到靜態資源裡,見 第 6 章,不然匯出會跟你抱怨找不到 runtime。不愛點介面、偏愛黑框和游標閃爍?@mlightcad/cad-html-exporter-cli 奉陪 —— 背後 Playwright 開著 Chromium 偷偷幹和瀏覽器裡一樣的活,你只是看不見而已。
pnpm install
pnpm export:html:setup # 裝 Chromium,只要一次,別跳過
咒語|用途
pnpm export:html:build CLI + 用範例 minimal-line.dxf 輸出 tmp/minimal-line.htmlpnpm export:html:run -- <輸入> -o <輸出>:已 build 過?直接對你自己的圖下手pnpm export:html:setup:上面那條裝瀏覽器,忘了就再來摸魚試用:
pnpm export:html
# 瀏覽器打開 tmp/minimal-line.html,跟同事吹「看,一條線也能離線」
對自己的圖動刀:
pnpm export:html:run -- D:\drawings\plan.dwg -o D:\out\plan.html
pnpm export:html:run -- drawing.dxf -o drawing.html --locale zh --title "一層平面圖"
pnpm --filter @mlightcad/cad-html-exporter-cli build
pnpm exec cad-html-exporter path/to/file.dxf -o out/viewer.html
參數|說明
<input>:必填,.dxf 或 .dwg,別的副檔名會被拒絕-o, --output:輸出路徑;不寫就「同名換 .html」,懶人友善--locale:en / zh 等,嵌進離線頁--title:視窗標題 / 中繼資料,顯得專業export:html 會順手 build;只跑 export:html:run 的話,記得先 build 過至少一次。更囉嗦的見 packages/cad-html-exporter-cli/README.md。
姿勢|做法
file:// 也行;瀏覽器偶爾會囉嗦幾句安全提示,一般無視即可。不必裝 CAD、不必裝 Node、不必旁邊再蹲一個 viewer-runtime.iife.js —— 都焊在 HTML 裡了。
按鈕|用途
localStorage 幫你記數字會跟著匯出時的圖紙單位走。小數位怪怪的?回去在 匯出前 把原圖打開看清楚 —— 別怪 HTML,它只是個誠實的顯示器。匯出為 HTML 後的頁面中的測量功能還在進一步完善中,目前只支援距離測量。
要把「匯出 HTML」塞進自家產品前端的同學,坐穩了。
@mlightcad/cad-simple-viewer(裡頭已經勾著 @mlightcad/cad-html-exporter)。chtml(AcApExportHtmlCmd → AcApHtmlConvertor,名字拗口但好用)。匯出時會去 fetch viewer-runtime.iife.js 全文,再 焊進 HTML。預設找:
./viewer-runtime.iife.js
MlCadViewer / AcApDocManager.createInstance 可改:
htmlViewerRuntimeUrl?: string | URL // 例如 './assets/viewer-runtime.iife.js'
整合 checklist(打勾再上線,省得半夜被叫起來):
pnpm --filter @mlightcad/cad-html-exporter buildpackages/cad-html-exporter/dist/viewer-runtime.iife.js 複製到靜態目錄,路徑和 htmlViewerRuntimeUrl 對得上。抄作業:cad-simple-viewer-example / cad-viewer-example 的 vite.config.ts 裡 vite-plugin-static-copy。
手上已經有 AcExSnapshotV1?AcApHtmlConvertor.packSnapshot() 或直接呼叫 packHtml(snapshot, { viewerRuntime }),跳過場景收集,直接裝箱。
你看到的怪樣子八成是
htmlViewerRuntimeUrldata-i18n-text 保命<script>file:// 一直唸安全:瀏覽器的職業病,通常可繼續;確認是完整單檔案pnpm export:html:setup.dxf / .dwg;先 build CLI日常用法上面夠了;下面給要拆引擎的人。一章講完,不拆成九堂微課。
老辦法槽點
HTML 匯出:單檔案、不帶原始格式、能切層能測距 —— 在「保密、離線、好用」三角裡找個能坐的位子。不是 AutoCAD 殺手,是「體面地把圖送到對方螢幕上」。
做:
AcEx 前綴統一不做:
套件|用途
cad-html-exporter:快照、壓縮、抠幾何、packHtml、外殼、Runtimecad-simple-viewer:chtml、Builder、Convertorcad-viewer:Ribbon、htmlViewerRuntimeUrlcad-html-exporter-cli:Node + Playwright 批次處理three-renderer:批次物件型別,供收集器辨識產物重點:dist/viewer-runtime.iife.js —— 匯出時要 fetch 來內聯的那一坨。
CLI:Playwright 打開 dist-runner → exportCadToHtml() → 同一套 Builder + packHtml → 寫入磁碟。
AcExSnapshotV1:meta、圖層表、版面 + 批次、目前版面 id。<script id="mlcad-snapshot">;內聯 JS 前把 </script> 轉義,不然 HTML 會提前「劇終」。AcTrBatchedLine / AcTrBatchedMesh。textContent = …,用 data-i18n-text 那套,不然工具列會變成單行公告欄。