明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: wzh

关于反应器的问题

  [复制链接]
发表于 2005-5-31 08:09:00 | 显示全部楼层
本帖最后由 作者 于 2005-5-31 9:59:19 编辑
  1.    你不需要一个实体一个实体地去选择,你可以全选,然后再原地不动MOVE。;;下列的反应器,就是做这事,还有很多改进空间(if (not COMEND_OSO)
  2.    (setq  COMEND_OSO
  3.    (vlr-editor-reactor
  4.        NIL
  5.        '((:vlr-commandended . COME_OSO))
  6.    )
  7.    )
  8. )(defun COME_OSO  (OBJREACTOR LSTCOMMAND / SS N)
  9.    (vl-load-com)
  10.    (if (and (= (car LSTCOMMAND) "MOVE")
  11.        (setq SS (ssget "P" '((0 . "LINE"))))
  12.            )
  13.        (progn
  14.            (setq N 0)
  15.            (repeat (sslength SS)
  16.   (vla-move (vlax-ename->vla-object (ssname SS N))
  17.        (vlax-3d-point '(0 0 0))
  18.        (vlax-3d-point '(0 0 0))
  19.   )
  20.   (setq N (1+ N))
  21.            )
  22.        )
  23.    )
  24. )
;;临时反应器才是正确的使用方向,不要迷信永久反应器(虽然我两种都用);;很多人都在找永久反应器要如何写才完美,我也只写了一个不太完美的程序;;程序(tr01.vlx档);;1.执行指令:tr01;;2.图档存档后再打开可自动加载tr01.vlx(程序与图档要在相同目录);;3.不论如何操作,应不会有你说的情况;;4.程序如何写---不要问我(我也还在找寻完美程序中……)  

本帖子中包含更多资源

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

x
发表于 2005-6-1 10:29:00 | 显示全部楼层
龙龙仔说得对,临时反应器才是正确的使用方向,当然现在只讨论对象反应器。目前发现用普通的删除命令(erase)删除一个含永久对象反应器的物体时,是删不掉图档中反应器框架的。比如新建一个窗口,用含对象反应器的程序画了10个图形,若每个图形包含一个反应器,那此时图形中就有10个对象反应器,用(cdar (vlr-reactors :vlr-object-reactor))函数查询可得到验证。紧接着又把这10个图形用erase命令删除,图形中空无一物,此时再用(cdar (vlr-reactors :vlr-object-reactor))函数查询,能发现那10个对象反应器仍然存在,其各自链接的对象就是刚被删除的10个物体。这样的图形即使保存后再打开,这10个反应器残余框架仍然存在,且在图形打开时提示警告:被删除的对象恢复为NULL。而临时反应器则不要紧,因它顶多只是在当时的图档中留下“残骸”,保存后再次打开就消失了。当然如用专用的工具删除那10个图形,也可做到彻底删除。但这种操作方式不实际。 还有,试图在物体的回调函数中删除该物体自身的反应器是行不通的,因程序在执行回调函数时,始终处于反应器结构之内,它不可能删除自己赖以生存的容器。 再则,如果用“全局编辑反应器”来监控所有AutoCAD命令,即用:vlr-commandWillStart事件来辨别每次发出的命令是否为erase,如果是,则判断被删除的物体是否含有对象反应器,如含有,则删除该反应器,如此的开销是不是太大了?而且该方案能否实施,尚未知。 综上所述,临时反应器安全实用,永久反应器使用时要多加小心,才不会留下垃圾。
发表于 2005-6-1 12:45:00 | 显示全部楼层
hhc发表于2005-5-29 21:27:00看了上面的讨论我正有一个问题,这几天在编对象反应器,遇到了一个问题,就是用含反应器的程序画了若干个图形,当用自己的专用程序删除这个图形时,可做到彻底的...

1.但在图档中却留下了一个"反应器"?
=>据我以往观察所知,图档中"物件反应器"总是多一个! 2.那图档中该有多少这样的垃圾?
=>就那么一个!相信它不是垃圾,可能是反应器必须留下来的资料! 3.推想其原因是,当执行回调函数时,物件已被删除,而删除了的对象是不能被
访问和修改的,此时再想把它从反应器的链结中删除是不能成功的.
=>要是删除了的物件不能从反应器的链结中删除的话,就不可能只有一个! 4.解决的办法
=>你不是做了吗?用临时反应器!!
不解决也没有甚么关係!只是有时重开图档会多一些提示
"; 警告: 已删除的 VLA 物件回復成 NIL" ps:但我9楼贴子附的程序没有你们说的问题!还是有希望的...只是还有其他问题.... 8-)
发表于 2005-6-1 14:07:00 | 显示全部楼层
谢谢版主的答复!对于其中的“物件反应器总是多一个”,我有解释。当查询图面中所有的对象反应器时,(vlr-reactors :vlr-object-reactor)函数返回一个表,如果图形中只有一个反应器,其返回形式为'((:VLR-Object-Reactor #<VLR-Object-Reactor>)),是一个嵌套表,其内层表的第一个元素为反应器的类型,在此为:VLR-Object-Reactor ,即对象反应器,从第二个元素开始才是具体的对象反应器罗列,均以#开头,在此只有一个,若有多个,会列出相应个数的反应器,外观形式均为#<VLR-Object-Reactor>,但其内容是不同的,版主所说物件反应器总是多一个可能是这个原因。
发表于 2005-6-1 17:10:00 | 显示全部楼层
我说的就是#<VLR-Object-Reactor>,它有时会多一个or删除了所有永久物件反应器,它还是会留下一个
 楼主| 发表于 2005-6-2 16:14:00 | 显示全部楼层
龙版主,感谢您的帮助
我认为还是应该使用永久反应器,否则你画半张图,第二天接着画,怎么去恢复反应器?
使用永久反应器,必要时可以把它改为临时反应器,我把程序做了一点改动,
1.只有带反应器的实体移动时才执行(vla-move ss (vlax-3d-point '(0 0 0)) (vlax-3d-point '(0 0 0)))。
2.存盘后,若再次打开图形时,垃圾反应器没有了。
3.好像程序哪儿有点毛病,不知什么时候命令行就冒出点错误信息。
;---------------------------
(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)
(entupd cen)
)
;---------------------------
(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)
)
;-------------------
(if (not COMEND_OSO)
(setq COMEND_OSO (vlr-editor-reactor NIL '((:vlr-commandended . COME_OSO))))
)
(if (not ENDOUT)
(setq ENDOUT (vlr-dwg-reactor NIL '((:vlr-saveComplete . ENDOUT))))
)
(defun ENDOUT (OBJREACTOR1 LSTCOMMAND1 / ss tt x)
(mapcar
'(lambda (x)
(setq tt (handent (vlr-data x)))
(setq ss (car (vlr-owners x)))
(if (or (not ss) (not tt))
(progn
(vlr-pers-release x)
(vlr-remove x)
)
)
)
(cdr (car (vlr-reactors :vlr-object-reactor)))
)
) (defun COME_OSO (OBJREACTOR LSTCOMMAND / ss tt x)
(if (= (car LSTCOMMAND) "MOVE")
(mapcar
'(lambda (x)
(setq tt (handent (vlr-data x)))
(setq ss (car (vlr-owners x)))
(if (and ss tt)
(vla-move ss (vlax-3d-point '(0 0 0)) (vlax-3d-point '(0 0 0)))
(progn
(vlr-pers-release x)
(vlr-remove x)
)
)
)
(cdr (car (vlr-reactors :vlr-object-reactor)))
)
)
)
发表于 2005-6-2 17:13:00 | 显示全部楼层

毛病:

1. 永久反应器删除再U,UNDO,REDO,OOPS---可能会失去反应器

2. 圆被删除了,移动线会找不到圆(我程序也有这个错误,当然那很好改正)

3. :vlr-savecomplete??------那他后面的程序还有用吗?

4. 致命缺点,你的程序有与别的反应器程序一起用吗?试与我的程序用看看!

(增加,删除,存档再打开…..多试一些步骤,你的反应器可能就失效了)

 楼主| 发表于 2005-6-9 08:48:00 | 显示全部楼层
我在使用反应器时又遇到这样一个问题,就是当我将图中的圆删除后,如果用MOVE命令移动直线,则(SetQ cen (HandEnt (VLR-Data reactor-object)))会返回<图元名: 7ef7a008>,可当你在监视窗口中要打开时,则出现不存在的图元的错误信息,理解不了,既然实体已经被删除,为什么不返回nil呢?
发表于 2005-6-9 12:46:00 | 显示全部楼层
;;实体已经被删除[但还在资料库(图档)内], UNDO / ENTDEL / OOPS / REDO不就回来了吗? (if (entget (setq CEN (handent (vlr-data REACTOR-OBJECT))))
;;....
;;....
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-22 14:29 , Processed in 0.144752 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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