加入反应器的对象在回调函数里不能修改自身吗?
这是论坛的帖子,http://bbs.mjtd.com/thread-79647-1-3.html ,想解决11楼提出的问题,可是解决不了。翻了一下书,好像是如果一个对象被设定为反应器对象,则在回调函数里不能修改其自身。。。,也就是说,如果要修改标注的话,应该是由其他对象触发才行,那么,11楼的问题就是无解了?请高手指点迷津!
;;;;;;;;;;;;;;;;回调函数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun SD1 (notifier-object reactor-object parameter-list )
(VL-LOAD-COM)
(setq e2(vlax-vla-object->ename notifier-object));;;;;;;是否多余?也就是说回调函数的vla_e1可以直接用notifier-object代替
(setq vla_e1(vlax-ename->vla-object e2))
(setq bzmp(RTOS (vla-get-Measurement vla_e1)));;;;;;;;取得未修改过的原始测量值
(if (not(numberp(vl-string-search "~"bzmp )))
(setq bzmp(strcat (rtos (distofbzmp)2 0) "~" (rtos (+(distofbzmp) 20) 2 0)));;;;;;;;;;;;如果没被修改过的话对测量值处理
(progn
(setq bzmp(vla-get-TextOverride vla_e1 bzmp));;;;;;;;;;;;如果被修改过的话直接取标注文本
(setq bzmp(strcat (rtos (distofbzmp)2 0) "~" (rtos (+(distofbzmp) 20) 2 0)))
);progn
);if
(vla-put-TextOverride vla_e1 bzmp);;;;;;;;;;;BZMP已经取得更改后的标注文本
(vla-Update vla_e1);;;;;;;;;无法更新,若手动检验,出现“错误: Automation 错误。 对象正在通知”提示
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;主程序,标注对象加入反应器;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:sd(/ e1 rlt vrl)
(setq e1 (car (entsel"\n 选择要改变的标注:")))
(setq rlt (list(vlax-ename->vla-object e1)))
(setq vrl(vlr-pers(vlr-object-reactor rlt nil '((:vlr-modified . sd1)))))
(princ)
)
各位版主及高人,说句话吧! yjr111 发表于 2011-11-1 16:59 static/image/common/back.gif
各位版主及高人,说句话吧!
你认真思考一下就明白了,对象反应器触发是modified,你在反应器函数里修改对象后又触发了对象反应器,无穷无尽的循环触发,还能不出错吗! 本帖最后由 yjr111 于 2011-11-1 23:32 编辑
首先,向G版的点拨表示衷心感谢,希望论坛能有更多像G版一样热心的版主帮助我等初学!
现已明白单个反应器对象只能对自身的变化进行信息显示、查询。
花了一个晚上的时间,关于那个帖子里的标注反应器总算成功,现在发上源码和图片,对刚刚接触反应器的也许能有点帮助!
;;;;;;;;;;;;;;;;回调函数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun SD1 (notifier-object reactor-object parameter-list )
(VL-LOAD-COM)
(setq p10 (vla-get-startpoint notifier-object)
p11(vla-get-endpointnotifier-object)
bzmp1 (rtos (vla-get-lengthnotifier-object))
bzmp(RTOS (vla-get-Measurementrlt_dim)));;;;;;;;取得未修改过的原始测量值
(if (not(numberp(vl-string-search "~"bzmp )))
(setq bzmp(strcat (rtos (distofbzmp1)2 0) "~" (rtos (+(distofbzmp1) 20) 2 0)));;;;;;;;;;;;如果没被修改过的话对测量值处理
(progn
(setq bzmp(vla-get-TextOverride rlt_dim bzmp));;;;;;;;;;;;如果被修改过的话直接取标注文本
(setq bzmp(strcat (rtos (distofbzmp)2 0) "~" (rtos (+(distofbzmp) 20) 2 0)))
);progn
);if
(vla-put-TextOverriderlt_dim bzmp);;;;;;;;;;;BZMP已经取得更改后的标注文本
(vla-put-ExtLine1Point rlt_dimp10)
(vla-put-ExtLine2Pointrlt_dimp11)
(vla-Update (car rlt_dim))
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;主程序,标注对象加入反应器;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:sd(/ e1 rlt vrl)
(setq e1_line (car (entsel"\n 选择要改变的物体:"))
p1 (cdr(assoc 10 (entget e1_line)))
p2 (cdr(assoc 11 (entget e1_line)))
p3 (list(- (car p2)(car p1))(+ 20 (cadr p1)))
rlt_line (list(vlax-ename->vla-object e1_line)))
(command "dimaligned"p1 p2 p3)
(setq e1_dim (entlast)
rlt_dim (vlax-ename->vla-object e1_dim)
vrl(vlr-pers(vlr-object-reactor rlt_line nil '((:vlr-modified . sd1)))))
(princ)
)
我最近也在为这个问题而烦恼,你可以再加入对象修改已完成反应器,在修改完成后再判断刚束发过的是什么反应器,但这样做要是对象多的话会使整个CAD反应变慢,因为不论对象什么修改都会束发,关闭文档也会变得很慢,所以这不是最好的方法,如果楼主觉得无影响的话可以考虑试下。 你被G版误导了,并不是不能在反应器里修改自身,而是在修改反应器的回调函数时,对象已处于修改状态,你对它唯一能做的只有读取它的ID ,所以你要在修改已完成反应器里对它修改,修改前先禁用修改反应器和修改已完成反应器,等修改完成后再启用即可 。 学习了,修改的是rlt_dim,而不是notifier-object wwwliuyu 发表于 2011-11-2 10:16
你被G版误导了,并不是不能在反应器里修改自身,而是在修改反应器的回调函数时,对象已处于修改状态,你对 ...
醍醐灌顶啊,对反应器的理解又深入了一些。
页:
[1]