明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3382|回复: 18

关于反应器的问题

  [复制链接]
发表于 2005-5-25 12:01:00 | 显示全部楼层 |阅读模式
《Visual Lisp 从学会到用好》一书中有下面一段程序: ;---------------------------
(VL-Load-Com)
(Defun Line-C (notifier-object reactor-object parameter-list)
(SetQ cen (HandEnt (VLR-Data reactor-object)))
(SetQ len (VLAX-VLA-Object->EName notifier-object)
lel (EntGet len)
pt1 (Cdr (Assoc 10 lel))
pt2 (Cdr (Assoc 11 lel))
)
(SetQ cel (EntGet cen)
cel (Subst (VL-List* 10 pt2) (Assoc 10 cel) cel)
cel (Subst (VL-List* 40 (/ (Distance pt1 pt2) Pi 2))(Assoc 40 cel) cel)
)
(EntMod cel)
)
;---------------------------
(Defun C:TR01 ()
(SetQ pt1 (GetPoint "\n起点:")
pt2 (GetPoint pt1 "\n末点:")
)
(Command "line" pt1 pt2 "")
(SetQ len (EntLast))
(Command "circle" pt2 (/ (Distance pt1 pt2) Pi 2))
(SetQ chl (Cdr (Assoc 5 (EntGet (EntLast)))))
(SetQ rlt (Cons (VLAX-EName->VLA-Object len) '()))
(SetQ vrl (VLR-Pers (VLR-Object-Reactor rlt chl '((:vlr-modified . Line-C)))))
(PrinC "\n已建立的反应器有: ") (terpri) (PrinC (VLR-Reactors))
(PrinC)
)
选中直线移动,圆相应随之移动,但如果窗选两个实体(圆和直线)后再移动(MOVE),则圆的位置变了。 另外,在图纸的编辑过程中将圆删除了,而直线上却始终保留着反应器标志,不能去掉吗?
发表于 2005-5-25 12:47:00 | 显示全部楼层

1.窗选两个实体有先后顺序的关係,线先移动--反应器把圆更新,圆又移动了位置,与反应器无关

2.反应器标誌,当然可以去掉,反应器的技术重点也就是你说的这些问题上!

 楼主| 发表于 2005-5-26 10:30:00 | 显示全部楼层
关键问题是如何让圆心回到直线的端点,是否再为圆加一个对象反应器?
发表于 2005-5-26 12:29:00 | 显示全部楼层
是否再为圆加一个对象反应器?


=>你想加甚么反应器!小心会变成死循环!
 楼主| 发表于 2005-5-26 12:40:00 | 显示全部楼层
当圆被修改后(移动后)修改其圆心为直线端点
 楼主| 发表于 2005-5-27 07:13:00 | 显示全部楼层
(VL-Load-Com)
(Defun Line-C (notifier-object reactor-object parameter-list)
(SetQ cen (HandEnt (VLR-Data reactor-object)))
(SetQ len (VLAX-VLA-Object->EName notifier-object)
lel (EntGet len)
pt (Cdr (Assoc 11 lel))
)
(SetQ cel (EntGet cen)
cel (Subst (VL-List* 10 pt) (Assoc 10 cel) cel)
)
(EntMod cel)
)
(Defun Line-R (notifier1-object reactor1-object parameter-list)
(SetQ cen1 (VLAX-VLA-Object->EName notifier1-object))
(SetQ len1 (HandEnt (VLR-Data reactor1-object))
lel1 (EntGet len1)
pt1 (Cdr (Assoc 11 lel1))
)
(SetQ cel1 (EntGet cen1)
cel1 (Subst (VL-List* 10 pt1) (Assoc 10 cel1) cel1)
)
(EntMod cel1)
(prompt "\nend.")
) ;----------------------
(Defun C:TR ()
(SetQ pt1 (GetPoint "\n起点:")
pt2 (GetPoint pt1 "\n末点:")
)
(Command "line" pt1 pt2 "")
(SetQ rlt (Cons (VLAX-EName->VLA-Object (EntLast)) '()))
(SetQ ccc (Cdr (Assoc 5 (EntGet (EntLast)))))
(Command "circle" pt2 (/ (Distance pt1 pt2) Pi 2))
(SetQ rrr (Cons (VLAX-EName->VLA-Object (EntLast)) '()))
(SetQ chl (Cdr (Assoc 5 (EntGet (EntLast)))))
(SetQ vrl (VLR-Pers (VLR-Object-Reactor rlt chl '((:vlr-objectClosed . Line-C)))));modified
(SetQ lll (VLR-Pers (VLR-Object-Reactor rrr ccc '((:vlr-objectClosed . Line-R)))));modified
(PrinC "\n已建立的反应器有: ")(PrinC (VLR-Reactors))
(PrinC)
)
;------------------
上面的程序有问题吗?为什么(EntMod cel1)返回空,
我的目的是移动圆后,再将其返回原处。
发表于 2005-5-27 08:56:00 | 显示全部楼层

你违反了下列反应装置准则

请不要更新发出事件通知的物件。

此事件会导致物件触发可能仍在进行中的回覆函数,以及当回覆函数被启动时仍由 AutoCAD 使用中的物件。因此,请勿试图从同一个物件的回覆函数更新物件。不过,您可以从触发事件的物件中安全地读取资讯。例如,假设您的地板上铺满了地砖,然后您将反应装置贴到地板的边界。如果您更改了地板的尺寸,反应装置回覆函数将会自动增加或减少地砖来铺满新的区域。此函数将可读取边界的新区域,但无法尝试对边界本身进行任何变更。

回覆函数是一般的 AutoLISP 函数;它是使用 defun 定义的。不过,在回覆函数内可执行的作业有某些限制。您无法使用 command 函数呼叫 AutoCAD 指令。此外,若要存取图面物件,您必须使用 ActiveX 函数;在回覆函数内部不允许使用 entget entmod

(但某些情况下可用entget entmod …..)

发表于 2005-5-29 21:27:00 | 显示全部楼层
看了上面的讨论我正有一个问题,这几天在编对象反应器,遇到了一个问题,就是用含反应器的程序画了若干个图形,当用自己的专用程序删除这个图形时,可做到彻底的删除干净其中主要用到(vlr-owner-remove fan1 obj)函数;但当用erase命令删除时,图形是删掉了,但在图档中却留下了一个“反应器”,这用(vlr-reactors :vlr-object-reactor)函数查看就知道了,反应器的数目并没有减少,而我又想用永久反应器,如果总是删不掉,那图档中该有多少这样的垃圾,如果每次都用专用工具条删除带反应器的图形,又很别扭,不符合一般的操作习惯。


现在的情况是,可以在图形中建立一个反应器,在其回调函数点对表,形如(:vlr-modified . HuiDiao)中设置一个删除反应器的功能,当用erase命令删除该图形时,就会调用HuiDiao函数,企图删除反应器,但却删不掉,还是留下了一个反应器结构,查看其连接的对象,就是刚才被删除了的对象。推想其原因是,当执行回调函数时,对象已被删除,而删除了的对象是不能被访问和修改的,此时再想把它从反应器的链接中删除是不能成功的,从程序的外表看不出来,运行时没有任何错误报告。现在我只能暂时用临时反应器了,不知哪位高手有解决的办法,望不吝赐教。
发表于 2005-5-30 11:18:00 | 显示全部楼层
  1. 1.线移动就删除圆,再重建圆,当然这个圆就不是原来的,圆可能带很多资料(xdata,xrecord,ldata,reactor……),所以你再想想吧!2.我的看法,反正再单独移动一下线,圆就回来了…..reactor_object还有很多事件可以用吧!(但注意:UNDO,OOPS,REDO对物件的影嚮)
  2. 物件事件
  3. 名称                                         事件
  4. ---------------------------------------------
  5. :vlr-cancelled                 取消物件的修改。
  6. :vlr-copied                 物件已复製的。
  7. :vlr-erased                 已设定物件的删除旗标。
  8. :vlr-unerased                 已重设物件的删除旗标。
  9. :vlr-goodbye                 将要自记忆体删除物件。
  10. :vlr-openedForModify  将要修改的物件。
  11. :vlr-modified                 已修改的物件。如果修改已取消,
  12.                                                也会发出 :vlr-cancelled 及 :vlr-modifyUndone。
  13. :vlr-subObjModified  已修改物件的子图元。引发这个事件是为了聚合线顶点
  14.                                                或网面的修改及 blockReferences 所拥有的属性。
  15. :vlr-modifyUndone  物件的修改未完成。
  16. :vlr-modifiedXData  物件的延伸图元资料已修改。
  17. :vlr-unappended                 物件已自图面资料库分离。
  18. :vlr-reappended                 物件已重新附加到图面资料库。
  19. :vlr-objectClosed  物件的修改已完成。
复制代码
 楼主| 发表于 2005-5-30 22:26:00 | 显示全部楼层
我觉得最难以解决的是我在一张图纸中很多地方用到了反应器,这时每一个用到反应器的对象必须原地不动,否则图纸就乱了。


                                                 就是说,当整个图形在图框中布置不均匀时,我不敢用MOVE进行任何调整,因为我不可能一个实体一个实体地去选择,然后再MOVE。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-14 04:40 , Processed in 0.165615 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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