> **本文回答**：`Engine` 是 vjcad 的全局静态对象；提供文档访问（`currentDoc / pcanvas / undoManager / eventManager / editor / activeDocument / currentSpace / trans / view`）、系统变量（`CECOLOR / CLAYER / CELTSCALE / OSMODE / ORTHOMODE / GRIDMODE / OFFSETDIST`）、实体操作（`addEntities / eraseEntities`）、用户输入（`getPoint / getSelections / getReal / getInteger / getString / getKeyword`）、视图（`zoomExtents / zoomToEntities / regen`）以及命令调度（`editor.executerWithOp`）。

## 一、常用属性

```js
import { Engine } from 'vjcad';

Engine.pcanvas         // 画布控制器
Engine.currentDoc      // 当前文档
Engine.currentSpace    // 当前空间（doc.currentSpace 的快捷）
Engine.activeDocument  // 活动文档
Engine.undoManager     // 撤销管理器
Engine.eventManager    // 事件管理器
Engine.editor          // 编辑器（命令调度）
Engine.trans           // 坐标转换
Engine.view            // 视图组件（coordsBar、openDbDoc 等）
Engine.editor.contextMenu  // 右键菜单（挂在 editor 上，非 Engine 直属）
```

MCP 参考：`vjcad/doc/command/api-reference.md`、`vjcad/doc/guide/architecture.md`。

## 二、系统变量

```js
Engine.CECOLOR     // 当前绘图颜色（ACI 索引）
Engine.CELTSCALE   // 当前线型比例
Engine.currentDoc.CLAYER   // 当前图层名（⚠️ Engine.CLAYER 不存在；值是字符串）
Engine.OSMODE      // 对象捕捉模式
Engine.ORTHOMODE   // 正交模式（0/1，与 F8 状态栏按钮联动）
Engine.GRIDMODE    // 栅格显示（0/1，与 F7 联动）
Engine.OFFSETDIST  // 偏移距离
```

设置后状态栏按钮自动同步，例如 `Engine.ORTHOMODE = 1` 会让 `Engine.view.coordsBar.funcButtons.orthomodeButton.isOn === true`。MCP 参考：`vjcad/example/ui/08statusbar.js`、`vjcad/doc/guide/architecture.md`。

## 三、实体操作

```js
Engine.addEntities(entities)     // 推荐：自动记录撤销（勿再手动 added_undoMark）
Engine.eraseEntities(entities)   // 删除（自动 undo）
Engine.addEntities(entities, { recordUndo: false })    // 不记撤销（第二参 EntityOperationOptions）
Engine.eraseEntities(entities, { recordUndo: false })
```

MCP 参考：`vjcad/doc/command/api-reference.md`、`vjcad/doc/guide/architecture.md`。

## 四、用户输入

```js
Engine.getPoint(options)         // PointInputOptions
Engine.getSelections(options)    // SelectionInputOptions
Engine.getReal(options)          // RealInputOptions
Engine.getInteger(options)       // IntegerInputOptions
Engine.getString(options)        // StringInputOptions
Engine.getKeyword(options)       // KeywordInputOptions
```

详见 [input/](../input/overview.md)。

## 五、视图操作

```js
Engine.zoomExtents()                       // 缩放到全图
Engine.zoomToEntities([entity1, entity2])  // 缩放到指定实体
Engine.regen()                             // 局部重生成（已修改实体）
Engine.regen(true)                         // 完全重绘
```

`regen` / `redraw` / `render` 区别详见 [pcanvas](pcanvas.md)。

## 六、命令调度

```js
Engine.editor.executerWithOp('LINE')       // 等价用户输入 LINE 回车
Engine.editor.executerWithOp('CIRCLE')
```

注册命令 + 字符串脚本调度详见 [command/](../command/overview.md)。

## 七、撤销

```js
Engine.startUndoRecord('我的操作')
try {
  // 多步操作
} finally {
  Engine.endUndoRecord()
}
```

详见 [undo/](../undo/overview.md)。

## 反例

- 在 `await cadView.onLoad()` 之前调 `Engine.*`：`pcanvas` 得 `null`（`addEntities` 此时静默丢弃实体不报错），`editor/trans/view` 得 `undefined`，`currentDoc` 得**懒创建的孤儿文档**——唯独 `eventManager` 是真单例提前可用。细分见 [setup/onload-lifecycle](../setup/onload-lifecycle.md)。
- 大量循环里逐个 `Engine.regen()`：性能差，应批量改完后调一次 `Engine.regen()`。
- 把 `Engine.pcanvas.addEntity(ent)` 当 `Engine.addEntities(ent)` 用：前者**不会**自动记录撤销，需要自己 `Engine.undoManager.added_undoMark([ent])`。

## 参考（官方文档 MCP）

- 文档：`vjcad/doc/command/api-reference.md`、`vjcad/doc/guide/architecture.md`
- 示例：`vjcad/example/basic/02onload.js`、`vjcad/example/ui/08statusbar.js`
