> **本文回答**：vjcad 文件操作分五类：① 服务端（`OPENFROMSERVER / SAVESERVER`）；② 本地缓存（`OPENFROMLOCAL / SAVELOCAL`，IndexedDB）；③ 本地下载（`QSAVE / SAVEAS`，下载 WASM 压缩的 `.vcad`；`OPEN` 可打开 `.vcad / .webcad`）；④ DWG 转换（`IMPORTDWG / EXPORTDWG`，需服务端）；⑤ 图片导出（`EXPORTPNG`，纯前端）。核心服务 = `DrawingManagerService`（服务端）+ `getLocalStorageService()`（本地）。

## 一、按子主题挑

| 想做的 | 子主题 |
|---|---|
| 从服务端打开 / 保存图纸 | [server](server.md) |
| 本地 IndexedDB 缓存 | [local](local.md) |
| `QSAVE / SAVEAS` 下载 `.vcad` | 见本页 §三 |
| 导入 / 导出 DWG | [dwg-import-export](dwg-import-export.md) |
| 导出 PNG / JPEG | [export-png](export-png.md) |
| 文档变更对比（Diff） | [diff](diff.md) |
| URL 参数自动打开图纸 | [url-params](url-params.md) |

## 二、文件格式速查

| 格式 | 说明 | 命令 |
|---|---|---|
| `.vcad` | WebCAD 文档的 WASM 压缩格式（内嵌 `_meta.serverSource` 等元数据） | `QSAVE / SAVEAS` 下载；`OPEN` 打开 |
| `.webcad` | 未压缩的 WebCAD 原生 JSON（`toDb()` 直接序列化） | `OPEN` 打开；手工导出见 §三 |
| `.dwg` | AutoCAD（需服务端转换） | `IMPORTDWG / EXPORTDWG` |
| `.dxf` | 图形交换（IMPORTDWG 兼容） | `IMPORTDWG` |
| `.png / .jpg` | 视图截图（纯前端） | `EXPORTPNG` |

MCP 参考：`vjcad/doc/file/index.md`、`vjcad/doc/file/file-operations.md`。

## 三、`QSAVE / SAVEAS` 下载（最简单）

```js
// 当前文件名（自动加时间戳）快速保存，浏览器下载 <名>.vcad
await Engine.editor.executerWithOp('QSAVE');

// 弹出对话框另存（同样下载 .vcad）
await Engine.editor.executerWithOp('SAVEAS');
```

`QSAVE / SAVEAS` 下载的是 `compressWebcadToVcad()` 压缩后的 **`.vcad`**，文档有 `serverSource` 时还内嵌 `_meta.serverSource`（mapid/version/lastPatchId/原始基准等），以便再打开后继续增量保存到服务端。

手工导出未压缩 `.webcad`（JSON，`OPEN` 也能打开，但**不等价于 QSAVE**：无压缩、无 `_meta`、不清除文档修改标记）：

```js
const data = Engine.currentDoc.toDb();
const json = JSON.stringify(data, null, 2);
const blob = new Blob([json], { type: 'application/json' });
const url  = URL.createObjectURL(blob);
const a    = document.createElement('a');
a.href = url;
a.download = (Engine.currentDoc.name || 'untitled') + '.webcad';
a.click();
URL.revokeObjectURL(url);
```

MCP 参考：`vjcad/doc/file/file-operations.md`、`vjcad/example/file/05qsave.js`、`06saveas.js`。

## 四、心智模型

```
┌─────────────────────────────────────────────────┐
│  Engine.currentDoc                              │
│   └─ .toDb() / .fromDb() ↔ webcadJson           │
└─────────────────────────────────────────────────┘
        │                       │
        ▼                       ▼
 ┌─────────────┐         ┌──────────────┐
 │ DrawingMgrSvc│         │ LocalStorageSvc │
 │  服务端 JSON   │         │  IndexedDB    │
 └─────────────┘         └──────────────┘
        │                       │
        ▼                       ▼
 ┌─────────────┐         ┌──────────────┐
 │  服务端 DB    │         │  浏览器本地    │
 └─────────────┘         └──────────────┘
```

## 五、命令快捷键

当前版本**未绑定文件快捷键**：`Ctrl + S` 只拦截浏览器默认的"保存网页"（`preventDefault`），不执行任何命令；`Ctrl + O` / `Ctrl + Shift + S` 无处理。文件菜单里 `SAVELOCAL` 旁显示的 "Ctrl+S" 只是标签，并未实际绑定。需要快捷键请自行监听 `keydown` 调 `Engine.editor.executerWithOp('QSAVE')` 等。

MCP 参考：`vjcad/doc/file/file-operations.md`（其中的快捷键表与实际实现不符，以上表为准）。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/file/index.md`、`vjcad/doc/file/file-operations.md`
- 示例：`vjcad/example/file/01openfromserver.js` ~ `10diff.js`
