明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1795|回复: 6

如何在一个对象反应器的回调函数中,禁用该反应器,也就是不让该反应器继续关注事件.

[复制链接]
发表于 2008-6-22 16:36 | 显示全部楼层 |阅读模式
如何在一个对象反应器的回调函数中,禁用该反应器,也就是不让该反应器继续关注事件...[br]问题是这样子的...
我有一个图框,也就是自己写的一个块,该图框呢,有一个比例尺,也就是该块的一个属性,我现在要实现的功能就是当我缩小或者放大该块参照后,这个块参照的属性(也就是比例尺)也马上随着比例尺的改变而改变,相关代码如下...
  1. (command "insert" "tk_room" (getpoint) 1.0 1.0 0) (setq cur_blk_ref (entlast))
  2.     (setq cur_reactor (vlr-object-reactor (list (vlax-ename->vla-object cur_blk_ref)) "tk_reactor"
  3.       '((:vlr-modified . taoyi:cb_mod))))
  4.     ;;;让反应器持久...
  5.     (vlr-pers cur_reactor)
  1. ;;;下面是定义的回调函数,用来响应修改事件...
  2. (defun taoyi:cb_mod(vla_obj vlr_obj par_lst / cur_xs new_scale)
  3.       (setq new_scale (vla-get-xscalefactor vla_obj))
  4.       ;;先禁用这个反应器...要不然会内部出错,
  5.       ;;;但出乎我的意料,结果是,禁用了,该反应器还是会继续监视:vlr-modified事件...      
  6.       (vlr-remove vlr_obj)   
  7.       ;;;当执行下面这个函数(该函数taoyi:mod_att没有问题)时,就会出现内存的错误,cad直接致命错误...
  8.       ;;;上面应该禁用反应器了,并且用vlr-added-p检查,确实为nil了,但是为什么修改是,还是会出错,实在不懂...
  9.       (taoyi:mod_att (vlax-vla-object->ename vla_obj) "att_blc" (strcat "1:" (rtos (* new_scale 200) 2 0)))      
  10.       ;;;再激活这个反应器...
  11.       (vlr-add vlr_obj)      
  12.       (princ "\n触发器反应,修改了比例尺..")
  13.       )
出现这个问题,我估计是监视的这个对象在修改块参照的属性时,又触发了这个:vlr-modified事件,所以致命错误...
我记得我以前实现这个功能了,好久没有用,不知道怎么搞了,想了两天,还是不行,还用过vlr-owner-remove函数去掉过监视的vla对象,还是不行,于是开始怀疑是不是在回调函数中不能vlr-remove反应器对象啊,唉,不知道以前是怎么搞的,应该不是用vlr-acdb-reactor添加的反应器...
请高手们帮我想想,我该怎么实现该功能,只要缩放,该图框(块参照)的比例尺(块参照的属性)就自动根据缩放比例变化,
是vlr-remove对象反应器呢,
还是用别的反应器类型...
 楼主| 发表于 2008-6-22 16:37 | 显示全部楼层
应该算是一个高级应用了,大家研究研究,可能我到死胡同了..
 楼主| 发表于 2008-6-22 19:03 | 显示全部楼层

大侠们,请赐教啊...

或者提示一下也行啊

发表于 2008-6-22 20:21 | 显示全部楼层

不要将反应器加在块中,用块属性修改触发会出现死循环,

可以将发应器加入块中一个属性作为触发,将其它属性回调反应器.

这个问题上次讨论过,我也调试过.

 楼主| 发表于 2008-6-22 20:40 | 显示全部楼层

谢谢,终于有人回答了,很想看看你的那篇文章...

你的回复中说,可以将反应器加入块的属性,我不知道是块的属性,还是块参照的属性,

我先试试吧,如果有问题,再请教,谢谢...

发表于 2008-6-24 17:11 | 显示全部楼层
 楼主| 发表于 2008-6-24 22:34 | 显示全部楼层

谢谢,昨天我自己找到了该文章,问题已经解决了,

在对象反应器的:vlr-modified事件的回调函数中记录下被修改的对象ename,并添加一个command-reactor,创建这个command-reactor时,设置data为刚才的ename,(vlr-command-reactor modified_ename '((:vlr-commandended . call_bk_cmdend)))设置这个command-reactor的:vlr-commandended事件的回调函数.

然后,在command-reactor的回调函数中,修改刚才记录的ename,再vlr-remove掉这个command-reactor

谢谢各位了,

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-28 01:41 , Processed in 0.164994 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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