仅当明确请求时,才会执行操作评估。AutoCAD 在每个命令的开头和结尾、文档锁定模式更改时以及拖动每个拖动样本期间显式请求评估数据库的顶级网络。客户端代码也可以显式请求评估,但通常这不是必需的。
尽管可以通过调用其 AcDbAssocAction::evaluate() 方法显式评估子网或单个操作,但最好始终通过调用 AcDbAssocManager::evaluateTopLevelNetwork() 来评估数据库的顶级网络。对整个顶级网络的评估保证了所有需要评估的操作都得到评估。始终评估数据库的整个顶级网络不会降低性能,即使它包含许多子网和许多操作。
由于这些更改,更改通知和网络评估之间存在分离。
修改附加了依赖项的对象时,将发生以下通知序列:
- 附加到对象的每个依赖项都会检查对象更改是否与该依赖项相关。如果没有,什么都不会发生。如果是,依赖项会将其 AcDbAssocStatus 更改为 kChangedDirectAssocStatus。
- 依赖项通知拥有依赖项的操作。该操作将其自己的 AcDbAssocStatus 更改为 kChangedDirectAssocStatus。
- 该操作会通知所属网络。网络将自己的 AcDbAssocStatus 更改为 kChangedDirectAssocStatus。这一直持续到顶级网络。
- 不会进行自动网络评估。
当通过调用 AcDbAssocAction::evaluate() 请求网络评估时,将发生以下事件序列:
- 一开始,获得所有需要评估的操作的传递闭包,并且所有此类额外收集的依赖项和操作的 AcDbAssocStatus 更改为 kChangedTransitivelyAssocStatus 或 kChangedNoDifferenceAssocStatus。
- 传递闭包是通过对已标记为评估的所有操作调用 AcDbAssocAction::getDependentActionsToEvaluate() 方法来获取的,直到无法收集更多操作。AcDbAssocAction::getDependentActionsToEvaluate() 的默认实现基于操作依赖项,但客户端代码可以通过重写 AcDbAssocActionBody::getDependentActionsToEvaluateOverride() 方法提供自己的实现。
- AcDbAssocAction::evaluationPriority() 对已收集用于评估的所有操作进行调用。
- 具有最高评估优先级的操作通过调用其 AcDbAssocAction::evaluate() 方法来评估。
- 这将调用由操作的 AcDbAssocActionBody::evaluateOverride() 方法实现的操作的自定义评估算法。最后,此自定义算法需要将操作状态设置为 kIsUpToDateAssocStatus 或 kFailedToEvaluateAssocStatus,具体取决于操作是否认为其执行成功。它还需要调用 evaluateDependencies() 来评估拥有的依赖项,这会更新它们的缓存并将其状态设置为 kIsUpToDateAssocStatus。
- 评估操作可能会取消阻止对其他操作的评估。将评估具有最高评估优先级的下一个操作。
- 此过程一直持续到评估完所有操作为止。
- 如果无法评估任何操作,则选择具有最高评估优先级的操作并强制对其进行评估,即使其评估优先级指示无法对其进行评估。对操作的这种强制评估可能会取消阻止评估其他操作,例如,通过打破死锁。
|