reactor / 反应器总览
vjcad 中"反应器"(Reactor)指的是 当一个实体(Owner)发生变化时,自动联动更新另一个实体(Reactor) 的机制。常用于关联标注、几何约束、参数化设计、智能符号等场景。
文档:
vjcad/doc/reactor/index.md、vjcad/doc/reactor/reactor-system.md示例:vjcad/example/reactor/01basic.js~05lifecycle.js
两条实现路径
| 路径 | 适用 | 关键 API |
|---|---|---|
| ① 基于事件 | 业务自定义联动 / 简单约束 / 统计监控 | Engine.eventManager.on(CadEvents.EntityModified, ...) |
| ② IEntityReactor 接口 | 内置标注关联 / 自定义"反应器实体" | IEntityReactor / ReactorEvent / Engine.reactorManager |
两条路径并不冲突:
- 业务联动一般走 ①,开发量小、适合在已有实体之间临时建立关系;
- 内置
LinearDimensionEnt等标注、以及希望被 DWG 持久化保存的关联,应使用 ②。
心智模型
flowchart LR
A[Owner 实体修改] -->|EntityModified 事件| B(事件监听 / 回调)
A -->|notifyOwnerChanged| C(IEntityReactor.onOwnerChanged)
B --> D[手动改 Reactor 实体]
C --> E[setReactorDirty -> updateFromOwners]
D --> F[Engine.regen]
E --> F
何时用 ① 何时用 ②
- 仅运行时联动、不需要保存到 DWG → ①
- 需要保存到文件、跨会话生效 → ②(标注/复杂自定义实体)
- 内置
LinearDimensionEnt.setSourceEntities(...)已经走 ② → 直接用,不要自己造
通用红旗
- 在
EntityModified事件里再修改实体属性会触发递归 → 用this.updating标志保护,见vjcad/example/reactor/04constraint.js - 多个反应器同时挂载时,要避免一个反应器创建的实体又触发自己 → 在事件回调里按
entity.type、layer、extData过滤 - 改完后必须
Engine.regen(),否则视图不刷新
子文档
- 事件型反应器写法 → event-based
- IEntityReactor 接口定义 → ireactor-interface
- 标注关联(最常用)→ dimension-association
- 几何约束实战 → constraint
参考(官方文档 MCP)
- 文档:
vjcad/doc/reactor/index.md、vjcad/doc/reactor/reactor-system.md - 示例:
vjcad/example/reactor/01basic.js~05lifecycle.js