> **本文回答**：`Engine.currentDoc` 是当前 `CadDocument`，包含 `layers / blocks / layouts / textStyles / dimensionStyles / linetypeDefinitions`；它的 `currentSpace`（也作 `Engine.currentSpace`）是当前空间（模型空间 / 图纸空间），`items` 是所有实体，`addEntities / erase` 是空间级操作。

## 一、文档结构

> 引自 `vjcad/doc/guide/architecture.md`：

```ts
class CadDocument {
  name: string;
  path: string;            // 文件路径（字段名是 path，不是 filePath）
  fileByte: any;
  isNewDocument: boolean;
  isReadOnly: boolean;
  DBMOD: number;           // 修改标记位
  STATE: any;

  layers: Layers;
  blocks: Blocks;
  layouts: Layouts;
  textStyles: TextStyles;
  dimensionStyles: DimStyles;   // 字段名是 dimensionStyles，不是 dimStyles
  images: Images;
  plotStyles: PlotStyles;
  linetypeDefinitions: any;     // 线型定义表
  serverSource?: any;           // 服务端来源信息（见 §五）

  // ⚠️ CadDocument 没有 save()/load()/newDocument() 方法，见 §四
}
```

MCP 参考：`vjcad/doc/guide/architecture.md`。

## 二、当前空间访问

```js
// 文档与空间
const doc = Engine.currentDoc;
const space = Engine.currentSpace;     // === doc.currentSpace
const cur  = doc.CLAYER;               // 当前图层

// 所有实体（含已删除！erase 是软删 isAlive=false，仍留在 items 里供 undo 恢复）
const allEntities = space.items;
const aliveOnly   = space.aliveItems;  // items.filter(e => e.isAlive)，只含存活实体

// 空间级操作
space.erase(entitiesArray);            // 删除（注意自己处理 undo）
space.addEntities(entitiesArray);     // 只入库 + 派发 EntitiesAdded：不记撤销、不刷新可选实体列表（新实体暂不可点选）
```

> `currentSpace.addEntities` 是底层入库：期间单实体 `EntityAdded` 被暂停丢弃，只发一次 `EntitiesAdded`，**不记 undo、不调 `refreshRemain`**。业务代码用 `Engine.addEntities(arr)`（逐个 `pcanvas.addEntity` 绘制 + 记一条撤销 + 刷新可选列表）。

MCP 参考：`vjcad/doc/command/api-reference.md`。

## 三、文档级 API（图层 / 块 / 文字样式...）

```js
const doc = Engine.currentDoc;

// 图层
doc.layers.has('我的图层');
doc.layers.add('我的图层', { color: 3, lineType: 'CONTINUOUS', layerOn: true, frozen: false });

// 文字样式
const ts = new TextStyle();
ts.name = '楷体样式';
ts.fontFileName = 'simkai';
doc.textStyles.add(ts);

// 遍历所有文字样式
doc.textStyles.items.forEach(s => {
  console.log(s.name, s.fontFileName, s.widthFactor, s.obliqueAngle);
});
```

MCP 参考：`vjcad/doc/guide/quick-start.md`（图层）、`vjcad/example/entity/text/04fonts.js`（文字样式）。

## 四、文档级保存 / 加载

```js
// CadDocument 无 save/load/newDocument 方法，真实路径：
await drawingManager.saveDrawing({ /* ISaveDrawingParams */ });  // 保存
await drawingManager.openDrawing({ /* IOpenDrawingParams */ });  // 打开
Engine.view.newDocument();                                       // 新建
```

> 实际工程多走 `DrawingManagerService.openDrawing(...)` + `Engine.view.openDbDoc(...)`，详见 [file/server](../file/server.md)。

## 五、`Engine.currentDoc.serverSource`（服务端来源信息）

打开服务端图纸后建议在 `Engine.currentDoc.serverSource` 上保留：

```js
Engine.currentDoc.serverSource = {
  type: 'imports',
  mapid: env.exampleMapId,
  version: 'v1',
  branchName: 'main',
  lastPatchId: openResult.latestPatchId || 'base'
};
```

之后保存命令可基于 `serverSource` 直接 `QSAVE`。Viewer 模式下示例里这一行被注释（不写入服务端）。MCP 参考：`vjcad/example/file/01openfromserver.js`、`vjcad/example/basic/04viewerremote.js`。

## 反例

- 把 `doc.layouts` 当 `space`：`layouts` 是布局集合，`space` 才是当前激活的模型空间或某个布局空间。
- 用 `space.addEntities(arr)` 代替 `Engine.addEntities`：实体已入库但**无法撤销**、新实体暂不可点选，视图也可能没更新（`Engine.addEntities` 会逐个立即绘制、记撤销并刷新可选列表）。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/guide/architecture.md`、`vjcad/doc/command/api-reference.md`、`vjcad/doc/guide/quick-start.md`
- 示例：`vjcad/example/entity/text/04fonts.js`、`vjcad/example/file/01openfromserver.js`
