找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2953|回复: 6

[分享] ARX程序的事件顺序

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-11 21:46:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
QQ截图20130911214559.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-9-11 21:59:57 | 显示全部楼层
打开图形2为什么要先执行kUnloadDwgMsg,再执行kLoadDwgMsg?
kUnloadDwgMsg是先发生卸载当前图形,然后再在新图形执行kLoadDwgMsg!那文档切换也是这样执行吧!

点评

上面那个图要理解好了,对写ARX程序很有帮助。 如果一个应用程序只是使用了通过ARX编程定义的命令,而没有和LISP的通信(也就是说,没有使用acedDefun()注册函数),那么应用程序能收到的消息只有: kInitAppMsg,  详情 回复 发表于 2013-9-11 22:13
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-9-11 22:13:44 | 显示全部楼层
Love-Lisp 发表于 2013-9-11 21:59
打开图形2为什么要先执行kUnloadDwgMsg,再执行kLoadDwgMsg?
kUnloadDwgMsg是先发生卸载当前图形,然后再在 ...

上面那个图要理解好了,对写ARX程序很有帮助。

如果一个应用程序只是使用了通过ARX编程定义的命令,而没有和LISP的通信(也就是说,没有使用acedDefun()注册函数),那么应用程序能收到的消息只有: kInitAppMsg,kLoadDwgMsg,kUnloadAppMsg,kDependencyMsg和kNoDependencyMsg。

应用程序只能在程序加载时候收到一次kLoadDwgMsg消息。除非应用程序使用了acedDefun()注册了LISP的外部函数;同时,应用程序也不会收到kUnloadDwgMsg,kInvkSubrMsg,kQuitMsg,kEndMsg,kSaveMsg,kCfgMsg等。

也就是说,acedDefun()只能写到 kLoadDwgMsg里面,不能写到kInitAppMsg里面。为什么? 就是上面的执行顺序,整个ACAD应用程序只留一套acedDefun()注册的函数,是在kLoadDwgMsg消息时候注册的,也就是打开一个新的图行。

也就是说,你必须在kUnloadDwgMsg里面写 acedUndef ()注销函数,因为打开一个新图,当前图先相应kUnloadDwgMsg消息,先卸载当前图注册的函数,然后再打开新的图后,在新图里面,相应kLoadDwgMsg,在新图里面重新注册函数。 通过看你acedDefun()里面的代码,变量I ,也就是函数码不管多少图,都是始终的从0开始。

如果你把undef写到kUnInitAppMsg里面,不写到kUnloadDwgMsg里面,那么你打开新图时候注册的函数就要冲突了(老图里面也有)。因为打开新图是不会发送 kUnInitAppMsg消息的。

另外,你的代码里面,注销注册命令的语句removeCmd不能写到kUnloadDwgMsg里面,要写到kUnInitAppMsg里面,注册的命令不是LISP外部函数,在所有打开的图形里面都有效。它只能在整个ACAD退出发送kInitAppMsg的时候,统一注销掉。而LISP外部函数只能存一套在当前图形中。


点评

哦!明白了!acedDefun注册Lisp命令只需在On_kLoadDwgMsg事件里注册,卸载也只需在On_kUnloadDwgMsg里进行! 在On_kInitAppMsg 事件里用acedRegCmds->addCommand注册CAD命令,卸载需在On_kUnloadAppMsg 里用acedReg  详情 回复 发表于 2013-9-11 22:26
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-9-11 22:26:33 | 显示全部楼层
XDSoft 发表于 2013-9-11 22:13
上面那个图要理解好了,对写ARX程序很有帮助。

如果一个应用程序只是使用了通过ARX编程定义的命令,而 ...

哦!明白了!acedDefun注册Lisp命令只需在On_kLoadDwgMsg事件里注册,卸载也只需在On_kUnloadDwgMsg里进行!
在On_kInitAppMsg 事件里用acedRegCmds->addCommand注册CAD命令,卸载需在On_kUnloadAppMsg 里用acedRegCmds->removeGroup进行卸载,对吧!

点评

对的, 如果应用程序加载时候已有一幅图形是打开的,程序会相继收到消息 kInitAppMsg和消息 kLoadDwgMsg 当绘图操作还在进行而应用程序卸载时候,AUTOCAD将相继发送消息kUnloadDwgMsg和消息kUnloadAppMsg。  详情 回复 发表于 2013-9-11 22:38
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-9-11 22:38:43 | 显示全部楼层
Love-Lisp 发表于 2013-9-11 22:26
哦!明白了!acedDefun注册Lisp命令只需在On_kLoadDwgMsg事件里注册,卸载也只需在On_kUnloadDwgMsg里进 ...

对的,

如果应用程序加载时候已有一幅图形是打开的,程序会相继收到消息 kInitAppMsg和消息 kLoadDwgMsg

当绘图操作还在进行而应用程序卸载时候,AUTOCAD将相继发送消息kUnloadDwgMsg和消息kUnloadAppMsg。

所有和LISP相关的,都要在DwgMsg 里面 注册资源和卸载资源
所有和应用程序相关的,都要在AppMsg 里面注册资源和卸载资源,应用程序相关的整个ACAD生命期都存在, LISP相关的在每个文档打开时候都重新注册资源。

kLoadDwgMsg 里面,可以做的事情有:执行和当前文档相关的初始化,此时用户还可以进行AUTOLISP函数的注册工作,以及初始化用户接口。除此以外,可能的操作还包括选择AUTOCAD所需的驱动程序以及查询AcEditorReactor事件,注意,该消息可能在程序执行期间发送多次,所以,如果用户不希望每次加载图形时候都执行这些操作,就不要在此处执行他们。

kUnloadDwgMsg里面,释放在kLoadDwgMsg里面注册的资源,注意不要释放不属于一个特定的绘图过程的资源;另外,也不要释放AcRx类及其命令等,因为他们在整个绘图期间都是有效的。

具体用的时候,像我们主要写ARX和LISP通信的程序,所以,所有全局变量什么等资源,都要在kLoadDwgMsg里面注册,在kUnloadDwgMsg里面释放,打开新图,重新注册。

点评

又涨知识了!  详情 回复 发表于 2013-9-11 22:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-9-11 22:47:28 | 显示全部楼层
XDSoft 发表于 2013-9-11 22:38
对的,

如果应用程序加载时候已有一幅图形是打开的,程序会相继收到消息 kInitAppMsg和消息 kLoadDwgM ...

又涨知识了!{:soso_e179:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 12:24 , Processed in 0.462679 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表