> **本文回答**：vjcad 事件系统 = `Engine.eventManager`（即 `CadEventManager.getInstance()`） + `CadEvents` 枚举。命名规范 = `-ing` 前置可取消 / `-ed` 后置不可取消 / `-Changed` 状态变更。常用事件分实体、文档、命令、图层、选择、视图、块、协作、UI 等大类。**枚举里约一半事件当前版本没有派发点**（订阅永不触发），见第三节"未派发"清单。

## 一、按子主题挑

| 想做的 | 子主题 |
|---|---|
| 监听 / 取消 / 暂停事件、查询监听器 | [listen](listen.md) |
| 实体类事件（Adding/Added/Modified/Erasing/Erased） | [entity-events](entity-events.md) |
| 文档类事件（Creating/Created/Modified/Switched 可用；Opening/Opened/Saving/Saved/Closing/Closed 未派发） | [document-events](document-events.md) |
| 命令类事件（CommandStarting/Started/Ended；Cancelled 未派发） | [command-events](command-events.md) |
| PLINE / SPLINE 等交互式命令的事件时序 | [pline-timing](pline-timing.md) |

## 二、最小用法

```js
import { Engine, CadEvents } from 'vjcad';

Engine.eventManager.on(CadEvents.EntityAdded, (args) => {
  console.log('实体已添加:', args.entity.type, 'id=', args.entity.id);
});

Engine.eventManager.on(CadEvents.SelectionChanged, (args) => {
  console.log('选择变化:', args.currentSelection.length, '个实体');
});

// DocumentSaving 不派发；阻止保存要在命令层拦截
Engine.eventManager.on(CadEvents.CommandStarting, (args) => {
  if (['QSAVE', 'SAVEAS', 'SAVESERVER', 'SAVELOCAL'].includes(args.commandName)
      && Engine.getEntities(e => e.isAlive).length === 0) {
    args.cancel = true;        // 阻止保存
  }
});
```

MCP 参考：`vjcad/doc/event/index.md`、`vjcad/doc/event/event-usage.md`。

## 三、事件大类速查

| 类别 | 当前版本会派发 | 枚举里有但**未派发**（订阅永不触发） |
|---|---|---|
| 文档 | `DocumentCreating/Created/Modified/Switched` | `DocumentOpening/Opened/Closing/Closed/Saving/Saved` |
| 实体 | `EntityAdding/Added`、`EntitiesAdding/Added`、`EntitiesErasing/Erased`、`EntityModified` | `EntityErasing/EntityErased`（删除只发批量版） |
| 命令 | `CommandStarting/Started/Ended` | `CommandCancelled`（Esc 退出同样只发 `CommandEnded`） |
| 图层 | `LayerAdding/Added/Deleting/Deleted`、`CurrentLayerChanged` | `LayerModified` |
| 选择 | `SelectionChanged/Cleared` | — |
| 视图 | `ViewZoomed/Regenerated` | `ViewPanned` |
| 块 | — | `BlockAdding/Added/Deleting/Deleted/Modified` |
| 协作 / 同步 | — | `DocumentUploading/Uploaded/Downloading/Downloaded/SyncStatusChanged` |
| 本地存储 | — | `DocumentCaching/Cached/Restoring/Restored/CacheCleared` |
| 分支 / Patch | — | `Branch*`、`Patch*` |
| 冲突 | — | `ConflictDetected/Resolving/Resolved/Skipped` |
| 输入 | `PointerDown/Move/Up/Cancel` | `KeyDown/KeyUp/Wheel` |
| 插件 | `PluginLoading/Loaded/Activating/Activated/Deactivating/Deactivated/Unloading/Unloaded/Error` | — |
| 右键菜单 | `ContextMenuOpening/Opened` | `ContextMenuItemClicked` |
| UI | `RibbonConfigChanged` | — |
| 撤销栈 | `UndoStackChanged`（[undo/description](../undo/description.md)） | — |

> "会派发"一列以发布包 `vjcad-lib.umd.js` 中实际 `emit(CadEvents.*)` 的成员为准；其余成员只出现在枚举定义里。阻止保存/关闭在命令层用 `CommandStarting` 拦截 `QSAVE/SAVEAS/SAVESERVER/SAVELOCAL/CLOSE`；阻止删除用 `EntitiesErasing`。

MCP 参考：`vjcad/doc/event/event-types.md`。

## 四、命名规范

| 后缀 | 含义 | 可取消 |
|---|---|---|
| `-ing` | 操作前 | 是（设 `args.cancel = true`） |
| `-ed` | 操作后 | 否 |
| `-Changed` | 状态变化后 | 否 |

MCP 参考：`vjcad/doc/event/event-types.md`。


## 参考（官方文档 MCP）

- 文档：`vjcad/doc/event/index.md`、`vjcad/doc/event/event-types.md`、`vjcad/doc/event/event-usage.md`
- 示例：`vjcad/example/event/01entityadded.js` ~ `06plinepoints.js`
