关于 Reactor 指南 (AutoLISP/ActiveX)
使用反应器时,您需要确保反应器遵循一系列准则,以确保在反应器的内部实现发生变化时,它们不会为您的应用产生不可预测的结果。
注意:AutoLISP 中的 ActiveX 支持仅限于 Windows。
您的反应堆应遵循以下准则:
- 不要依赖反应堆通知的顺序。
建议您不要依赖反应堆通知的顺序,但有少数例外。例如,OPEN 命令触发 、 、 和 事件。但是,它们可能不会按该顺序出现。唯一可以放心依赖的事件序列是 Begin 事件将发生在相应的 End 事件之前。BeginCommandBeginOpenEndOpenEndCommand
例如,总是发生在 之前,总是发生在 之前。如果由于将来引入新通知和重新排列现有通知而更改了序列,则依赖更复杂的序列可能会导致应用程序出现问题。commandWillStart()commandEnded()beginInsert()endInsert()
- 不要依赖通知之间的函数调用顺序。
不保证在某些通知之间调用某些函数。例如,当您收到有关对象 A 的通知时,仅意味着对象 A 已被擦除。如果您在 A 上收到通知,然后在 B 上收到通知,则意味着对象 A 和 B 都被擦除;它不能确保 B 在 A 之后被擦除。如果将应用程序与此详细级别绑定,则应用程序在将来的版本中中断的可能性非常高。与其依赖序列,不如依靠反应器来指示系统的状态。:vlr-erased:vlr-erased:vlr-erased
- 不要在 reactor 回调函数中使用任何交互函数(例如,不要使用 、 )。getpointentsel
尝试从 reactor 回调函数中执行交互式函数可能会导致严重问题,因为在触发事件时,AutoCAD 可能仍在处理命令。因此,请避免使用输入采集方法(如 、 和 )、以及选择集操作和命令函数。getpointentselgetkword
- 不要从事件处理程序中启动对话框。
对话框被视为交互式功能,可能会干扰AutoCAD的当前操作。但是,消息框和警报框不被视为交互式,可以安全地发出。
- 不要更新发出事件通知的对象。
调用回调函数时,导致对象触发回调函数的事件可能仍在进行中,并且 AutoCAD 仍在使用该对象。因此,不要尝试从同一对象的回调函数更新对象。但是,您可以安全地从触发事件的对象中读取信息。
例如,假设您有一个铺满瓷砖的地板,并且您将一个反应器连接到地板的边界。如果更改地板的大小,reactor 回调函数将自动添加或减去瓷砖以填充新区域。该函数将能够读取边界的新区域,但不能尝试对边界本身进行任何更改。
- 不要从回调函数执行任何将触发相同事件的操作。
如果在 reactor 回调函数中执行触发相同事件的操作,则将创建一个无限循环。例如,如果尝试从事件中打开图形,AutoCAD 将继续打开更多图形,直到达到打开图形的最大数量。BeginOpen
- 在设置反应器之前,请验证是否尚未设置反应器,否则最终可能会在同一事件上收到多个回调。
- 请记住,当AutoCAD显示模式对话框时,不会触发任何事件。
|