CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2022 开发者帮助

更改通知和网络评估

2024-5-18 18:50| 发布者: admin| 查看: 111| 评论: 0|原作者: admin|来自: AutoCAD

更改通知和网络评估

仅当明确请求时,才会执行操作评估。AutoCAD 在每个命令的开头和结尾、文档锁定模式更改时以及拖动每个拖动样本期间,都显式请求评估数据库的顶级网络。客户端代码也可以显式请求评估,但通常这不是必需的。

虽然可以通过调用子网络的 AcDbAssocAction::evaluate() 方法显式计算子网络或单个操作,但最好始终通过调用 AcDbAssocManager::evaluateTopLevelNetwork() 来评估数据库的顶级网络。对整个顶层网络的评估保证了所有需要评估的行动都得到评估。始终评估数据库的整个顶级网络不会造成性能损失,即使它包含许多子网络和许多操作。

由于这些更改,更改通知和网络评估之间存在分离。

修改附加了依赖项的对象时,将发生以下通知序列:

  • 附加到对象的每个依赖项都会检查对象更改是否与该依赖项相关。如果没有,什么都不会发生。如果是,依赖项会将其 AcDbAssocStatus 更改为 kChangedDirectlyAssocStatus。
  • 依赖项通知拥有依赖项的操作。该操作会将其自己的 AcDbAssocStatus 更改为 kChangedDirectlyAssocStatus。
  • 该操作会通知所属网络。网络将自己的 AcDbAssocStatus 更改为 kChangedDirectlyAssocStatus。这一直持续到顶层网络。
  • 不会自动进行网络评估。

通过调用 AcDbAssocAction::evaluate() 请求网络评估时,将发生以下事件序列:

  • 首先,获取需要计算的所有操作的传递闭包,并将所有此类额外收集的依赖项和操作的 AcDbAssocStatus 更改为 kChangedTransitivelyAssocStatus 或 kChangedNoDifferenceAssocStatus。
  • 通过对已标记为评估的所有操作调用 AcDbAssocAction::getDependentActionsToEvaluate() 方法,直到无法收集更多操作,才能获得传递闭包。AcDbAssocAction::getDependentActionsToEvaluate() 的默认实现基于操作依赖项,但客户端代码可以通过重写 AcDbAssocActionBody::getDependentActionsToEvaluateOverride() 方法来提供自己的实现。
  • AcDbAssocAction::evaluationPriority() 对已收集用于评估的所有操作调用。
  • 通过调用其 AcDbAssocAction::evaluate() 方法评估具有最高评估优先级的操作。
  • 这将调用操作的 AcDbAssocActionBody::evaluateOverride() 方法实现的操作的自定义评估算法。最后,此自定义算法需要将操作状态设置为 kIsUpToDateAssocStatus 或 kFailedToEvaluateAssocStatus,具体取决于操作是否认为其执行成功。它还需要调用 evaluateDependencies() 来评估拥有的依赖项,这会更新它们的缓存并将其状态设置为 kIsUpToDateAssocStatus。
  • 评估一个操作可能会取消对其他操作的评估。评估具有最高评估优先级的下一个操作。
  • 此过程一直持续到评估所有操作为止。
  • 如果无法评估任何操作,则选择具有最高评估优先级的操作并强制评估,即使其评估优先级表明无法评估。对一个操作的这种强制评估可能会阻止其他操作被评估,例如,通过打破僵局。

父主题:

  1. 关联框架

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1   苏公网安备32011402011833)

GMT+8, 2025-3-14 07:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部