明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3261|回复: 7

加入反应器的对象在回调函数里不能修改自身吗?

[复制链接]
发表于 2011-11-1 13:24:38 | 显示全部楼层 |阅读模式
这是论坛的帖子,http://bbs.mjtd.com/thread-79647-1-3.html ,想解决11楼提出的问题,可是解决不了。
翻了一下书,好像是如果一个对象被设定为反应器对象,则在回调函数里不能修改其自身。。。,也就是说,如果要修改标注的话,应该是由其他对象触发才行,那么,11楼的问题就是无解了?请高手指点迷津!
  1. ;;;;;;;;;;;;;;;;回调函数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  2. (defun SD1 (notifier-object reactor-object parameter-list )
  3.           (VL-LOAD-COM)
  4.           (setq e2(vlax-vla-object->ename notifier-object));;;;;;;是否多余?也就是说回调函数的vla_e1可以直接用notifier-object代替
  5.           (setq vla_e1(vlax-ename->vla-object e2))
  6.          (setq bzmp(RTOS (vla-get-Measurement vla_e1)));;;;;;;;取得未修改过的原始测量值
  7.            
  8.           (if (not(numberp(vl-string-search "~"  bzmp )))
  9.      (setq bzmp(strcat (rtos (distof  bzmp)  2 0) "~" (rtos (+(distof  bzmp) 20) 2 0)));;;;;;;;;;;;如果没被修改过的话对测量值处理
  10.      (progn
  11.      (setq bzmp(vla-get-TextOverride vla_e1 bzmp));;;;;;;;;;;;如果被修改过的话直接取标注文本
  12.      (setq bzmp(strcat (rtos (distof  bzmp)  2 0) "~" (rtos (+(distof  bzmp) 20) 2 0)))
  13.      );progn
  14.       );if
  15.      (vla-put-TextOverride vla_e1 bzmp);;;;;;;;;;;BZMP已经取得更改后的标注文本
  16.      (vla-Update vla_e1);;;;;;;;;无法更新,若手动检验,出现“错误: Automation 错误。 对象正在通知”提示
  17.     (princ)
  18.   )

  19. ;;;;;;;;;;;;;;;;;;;;;;主程序,标注对象加入反应器;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  20. (defun c:sd(/ e1 rlt vrl)
  21.   (setq e1 (car (entsel"\n 选择要改变的标注:")))
  22.   (setq rlt (list(vlax-ename->vla-object e1)))
  23.   (setq vrl(vlr-pers(vlr-object-reactor rlt nil '((:vlr-modified . sd1)))))
  24.   
  25.   (princ)
  26.   )

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2011-11-1 16:59:38 | 显示全部楼层
各位版主及高人,说句话吧!
发表于 2011-11-1 20:13:38 | 显示全部楼层
yjr111 发表于 2011-11-1 16:59
各位版主及高人,说句话吧!

你认真思考一下就明白了,对象反应器触发是modified,你在反应器函数里修改对象后又触发了对象反应器,无穷无尽的循环触发,还能不出错吗!

评分

参与人数 1明经币 +1 金钱 +10 收起 理由
yjr111 + 1 + 10 谢谢指点!

查看全部评分

 楼主| 发表于 2011-11-1 22:55:52 | 显示全部楼层
本帖最后由 yjr111 于 2011-11-1 23:32 编辑

首先,向G版的点拨表示衷心感谢,希望论坛能有更多像G版一样热心的版主帮助我等初学!
现已明白单个反应器对象只能对自身的变化进行信息显示、查询。
花了一个晚上的时间,关于那个帖子里的标注反应器总算成功,现在发上源码和图片,对刚刚接触反应器的也许能有点帮助!

  1. ;;;;;;;;;;;;;;;;回调函数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  2. (defun SD1 (notifier-object reactor-object parameter-list )
  3.           (VL-LOAD-COM)
  4.           (setq p10 (vla-get-startpoint notifier-object)
  5.                    p11(vla-get-endpoint  notifier-object)
  6.                   bzmp1 (rtos (vla-get-length  notifier-object))
  7.                   bzmp(RTOS (vla-get-Measurement  rlt_dim)));;;;;;;;取得未修改过的原始测量值
  8.            (if (not(numberp(vl-string-search "~"  bzmp )))
  9.      (setq bzmp(strcat (rtos (distof  bzmp1)  2 0) "~" (rtos (+(distof  bzmp1) 20) 2 0)));;;;;;;;;;;;如果没被修改过的话对测量值处理
  10.      (progn
  11.      (setq bzmp(vla-get-TextOverride rlt_dim bzmp));;;;;;;;;;;;如果被修改过的话直接取标注文本
  12.      (setq bzmp(strcat (rtos (distof  bzmp)  2 0) "~" (rtos (+(distof  bzmp) 20) 2 0)))
  13.      );progn
  14.       );if
  15.      (vla-put-TextOverride  rlt_dim bzmp);;;;;;;;;;;BZMP已经取得更改后的标注文本
  16.       (vla-put-ExtLine1Point rlt_dim  p10)
  17.       (vla-put-ExtLine2Point  rlt_dim  p11)
  18.      (vla-Update (car rlt_dim))
  19.     (princ)
  20.   )

  21. ;;;;;;;;;;;;;;;;;;;;;;主程序,标注对象加入反应器;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  22. (defun c:sd(/ e1 rlt vrl)
  23.   (setq e1_line (car (entsel"\n 选择要改变的物体:"))
  24.            p1 (cdr(assoc 10 (entget e1_line)))
  25.            p2 (cdr(assoc 11 (entget e1_line)))
  26.            p3 (list(- (car p2)(car p1))(+ 20 (cadr p1)))
  27.           rlt_line (list(vlax-ename->vla-object e1_line)))
  28.   (command "dimaligned"  p1 p2 p3)
  29.   (setq e1_dim (entlast)
  30.            rlt_dim (vlax-ename->vla-object e1_dim)
  31.            vrl(vlr-pers(vlr-object-reactor rlt_line nil '((:vlr-modified . sd1)))))
  32.   (princ)
  33.   )



本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
crazylsp + 1 赞一个!

查看全部评分

发表于 2011-11-1 23:08:06 | 显示全部楼层
我最近也在为这个问题而烦恼,你可以再加入对象修改已完成反应器,在修改完成后再判断刚束发过的是什么反应器,但这样做要是对象多的话会使整个CAD反应变慢,因为不论对象什么修改都会束发,关闭文档也会变得很慢,所以这不是最好的方法,如果楼主觉得无影响的话可以考虑试下。

评分

参与人数 1明经币 +1 收起 理由
crazylsp + 1 赞一个!

查看全部评分

发表于 2011-11-2 10:16:31 | 显示全部楼层
你被G版误导了,并不是不能在反应器里修改自身,而是在修改反应器的回调函数时,对象已处于修改状态,你对它唯一能做的只有读取它的ID ,所以你要在修改已完成反应器里对它修改,修改前先禁用修改反应器和修改已完成反应器,等修改完成后再启用即可 。
发表于 2013-1-17 10:35:17 | 显示全部楼层
学习了,修改的是rlt_dim,而不是notifier-object
发表于 2022-9-12 11:17:16 | 显示全部楼层
wwwliuyu 发表于 2011-11-2 10:16
你被G版误导了,并不是不能在反应器里修改自身,而是在修改反应器的回调函数时,对象已处于修改状态,你对 ...

醍醐灌顶啊,对反应器的理解又深入了一些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-15 12:49 , Processed in 0.293616 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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