请务必记住,事件只是提供有关 AutoCAD 中发生的状态或活动的信息。
尽管可以编写事件处理程序来响应这些事件,但在触发事件处理程序时,AutoCAD 通常处于处理命令的中间。因此,如果事件处理程序要与 AutoCAD 及其数据库一起提供安全操作,则它们可以执行的操作受到一些限制。
- 不要依赖事件的顺序。
编写事件处理程序时,不要依赖事件的顺序,这些事件的发生顺序与你认为的发生顺序完全相同。例如,如果发出 OPEN 命令,则将触发事件 、 、 和 。但是,它们可能不会按该顺序出现。唯一可以放心依赖的事件序列是 Begin 事件将发生在相应的 End 事件之前。在前面的示例中,事件可能按以下顺序触发:、、、BeginCommandBeginOpenEndOpenEndCommandBeginCommandBeginOpenEndCommandEndOpenBeginCommandEndCommandBeginOpenEndOpen
- 不要依赖操作顺序。
如果先删除 object1 然后删除 object2,请不要依赖将收到 object1 和 object2 的事件这一事实。您可以先收到 object2 的事件。ObjectErasedObjectErased
- 不要尝试从事件处理程序执行任何交互函数。
尝试从事件处理程序中执行交互式函数可能会导致严重问题,因为在触发事件时,AutoCAD 可能仍在处理命令。因此,应始终避免使用输入获取方法(如 、 、 等),以及事件处理程序中的选择集操作和方法。GetPointGetEntityGetKeywordSendCommand
- 不要从事件处理程序中启动对话框。
对话框被视为交互式功能,可能会干扰AutoCAD的当前操作。消息框和警报框不被视为交互式,可以安全地发出;但是,在事件处理程序中为 、 、 、 和 事件发出消息框会导致意外的排序。BeginModalEndModalActivateDeactivateBeginRightClick
- 可以将数据写入数据库中的任何对象,但发出事件的对象除外。
显然,导致事件触发的任何对象仍可打开以用于 AutoCAD 和当前正在进行的操作。因此,请避免将任何信息从同一对象的事件处理程序写入对象。但是,您可以安全地从触发事件的对象中读取信息。例如,假设您有一个充满瓷砖的地板,并且您创建了一个附加到地板边框的事件处理程序。如果更改地板的大小,事件处理程序将自动添加或减去磁贴以填充新区域。事件处理程序将能够读取边界的新区域,但不能尝试对边界本身进行任何更改。
- 不要从事件处理程序执行任何将触发同一事件的操作。
如果在触发同一事件的事件处理程序中执行相同的操作,则将创建一个无限循环。例如,切勿尝试从事件中打开图形,否则 AutoCAD 只会继续打开更多图形,直到达到打开图形的最大数量。BeginOpen
- 请记住,当AutoCAD显示模式对话框时,不会触发任何事件。
|