overview
本文回答:vjcad 事件系统 =
Engine.eventManager(即CadEventManager.getInstance()) +CadEvents枚举。命名规范 =-ing前置可取消 /-ed后置不可取消 /-Changed状态变更。常用事件分实体、文档、命令、图层、选择、视图、块、协作、UI 等大类。枚举里约一半事件当前版本没有派发点(订阅永不触发),见第三节"未派发"清单。
一、按子主题挑
| 想做的 | 子主题 |
|---|---|
| 监听 / 取消 / 暂停事件、查询监听器 | listen |
| 实体类事件(Adding/Added/Modified/Erasing/Erased) | entity-events |
| 文档类事件(Creating/Created/Modified/Switched 可用;Opening/Opened/Saving/Saved/Closing/Closed 未派发) | document-events |
| 命令类事件(CommandStarting/Started/Ended;Cancelled 未派发) | command-events |
| PLINE / SPLINE 等交互式命令的事件时序 | pline-timing |
二、最小用法
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) |
— |
"会派发"一列以发布包
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