<p>;;This file is designed to test how the vlr-copied event fires.<br/>;;The event calls the callback function once for each copy. In<br/>;;an array command, it would fire multiple times before the command<br/>;;is ended. To test the effects, load this function, draw<br/>;;an object, run the obs program and then run the array command.</p><p>;;D. C. Broad, Jr. (c) 2002<br/>;;Cost: 50% of the profits of using it. ;-)</p><p>;;Callback dummy<br/>(defun RPORT (A B C)<br/> (if(/= (CAR C) 0) ;FOR R2007<br/> (progn<br/> (princ "A:")<br/> (princ A)<br/> (princ "B:")<br/> (princ B)<br/> (princ "C:")<br/> (princ C)<br/> )<br/> )<br/> (princ)<br/>)</p><p>;;Clear all reactors to get baseline test.<br/>(vlr-remove-all)</p><p>;;Command to select the object to be tracked by<br/>;;the vlr-copied reactor<br/>(defun C:OBS (/ E O)<br/> (setq E (car (entsel)))<br/> (setq O (vlax-ename->vla-object E))<br/> (vlr-object-reactor<br/> (list O)<br/> "Data"<br/> '((:vlr-copied . RPORT))<br/> )<br/>)</p>
本帖最后由 作者 于 2007-7-29 17:11:49 编辑
再次请教版主,
以下两个问题
01.我试着取得复制后产生的物件,再将其加入成为反应器,
但却都没法完成,请问程序中哪里出错呢?
02.删除后若执行 UNDO 命令,所恢复的物件是否变成临时性反应器?
希望版主或是其他高手可以解答一下.
谢谢!
(VL-LOAD-COM)
(SETQ ACADOBJECT (VLAX-GET-ACAD-OBJECT))
(SETQ ACADDOCUMENT (VLA-GET-ACTIVEDOCUMENT ACADOBJECT))
(SETQ MSPACE (VLA-GET-MODELSPACE ACADDOCUMENT))
; 复制反应程序
(DEFUN AR_AE_RR_COPIED
(NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST /
AR_AE_RR_COPIED AR_AE_RR_MODIFIED BRK_VLA-NR-OBJ
BRK-VLA-RR-OBJ DXF05_LAS-OBJ DXF05_NN-OBJ DXF05_NR-OBJ
DXF05_RR-OBJ EN-AREA EN-AREA-M I LST NN NR-OBJ PTDT RE
RR-OBJ VLA-NR-OBJ VLA-RR-OBJ)
(PRINT "AR_AE_RR_COPIED,复制反应程序")
(IF (VLAX-READ-ENABLED-P NOTIFIER-OBJECT) ;;确定物件对象是否可读
(PROGN
(SETQ NR-OBJ (ENTLAST)) ;取出最后物件
(IF (= (AR_DXF 0 NR-OBJ) "LWPOLYLINE")
(PROGN
(SETQ VLA-NR-OBJ (VLAX-ENAME->VLA-OBJECT NR-OBJ)) ;转换为VLA
(SETQ PTDT (VLAX-CURVE-GETPOINTATPARAM NR-OBJ 0)) ;PL起点
(SETQ DXF05_NR-OBJ (VLA-GET-HANDLE VLA-NR-OBJ)) ;图元处理码
(SETQ BRK_VLA-NR-OBJ (LIST VLA-NR-OBJ)) ;串列VLA
; 建立复制物件后的反应器
(SETQ LST (CDR (CAR (VLR-REACTORS :VLR-Object-Reactor)))) ;取出反应器列表
(SETQ I 0)
(SETQ RE T)
(SETQ DXF05_LAS-OBJ (VLA-GET-HANDLE (CAR (VLR-OWNERS (LAST LST))))) ;最后一笔资料
(WHILE RE
(SETQ NN (VLR-OWNERS (NTH I LST)))
(SETQ DXF05_NN-OBJ (VLA-GET-HANDLE (CAR NN)))
(COND
((= DXF05_NR-OBJ DXF05_NN-OBJ)
(PRINT "相同资料 ") (PRINC (ITOA I))
(SETQ I (1+ I))
(SETQ RE T)
)
((AND (= DXF05_LAS-OBJ DXF05_NN-OBJ)
(= DXF05_NR-OBJ DXF05_NN-OBJ)
)
(PRINT "最后一笔资料 ") (PRINC (ITOA I))
(SETQ RE NIL)
)
((/= DXF05_NR-OBJ DXF05_NN-OBJ)
(SETQ EN-AREA (VLA-GET-AREA VLA-NR-OBJ)) ;取出面积
(SETQ EN-AREA-M (STRCAT (RTOS (/ EN-AREA 10000) 2 2) "㎡")) ;面积单位
(VL-CMDF "TEXT" PTDT 30 0 EN-AREA-M ) ;输出面积数值成文字
(SETQ RR-OBJ (ENTLAST))
(SETQ VLA-RR-OBJ (VLAX-ENAME->VLA-OBJECT RR-OBJ)) ;转换为VLA
(SETQ DXF05_RR-OBJ (VLA-GET-HANDLE VLA-RR-OBJ)) ;图元处理码
(SETQ BRK-VLA-RR-OBJ (LIST VLA-RR-OBJ)) ;串列VLA
(VLR-PERS ;;永久反应器
(VLR-OBJECT-REACTOR ;;物件反应器
BRK_VLA-NR-OBJ ;;NR_物件对象,LIST的VLA
DXF05_RR-OBJ ;;RR_编辑对象.图元处理码
'((:VLR-MODIFIED . AR_AE_RR_MODIFIED) ;编辑反应程序
(:VLR-COPIED . AR_AE_RR_COPIED) ;复制反应程序
(:VLR-ERASED . AR_AE_RR_ERASED) ;删除反应程序
)
))
(SETQ I (1+ I))
(SETQ RE NIL)
)
) ;_ 结束COND
) ;_ 结束WHILE
) ;_ 结束PROGN
) ;_ 结束IF
) ;_ 结束PROGN
) ;_ 结束IF
) ; DEFUN AR_AE_RR_COPIED
; 编辑反应程序
(DEFUN AR_AE_RR_MODIFIED
(NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST / EN-AREA EN-AREA-M RR-OBJ VLR-TX)
(PRINT "AR_AE_RR_MODIFIED,编辑反应程序")
(IF (VLAX-READ-ENABLED-P NOTIFIER-OBJECT) ;;确定物件对象是否可读
(PROGN
(SETQ RR-OBJ (HANDENT (VLR-DATA REACTOR-OBJECT))) ;;编辑对象,REACTOR-OBJECT
(SETQ VLR-RR-OBJ(VLAX-ENAME->VLA-OBJECT RR-OBJ))
(SETQ EN-AREA (VLA-GET-AREA NOTIFIER-OBJECT)) ;;物件对象,NOTIFIER-OBJECT
(SETQ EN-AREA-M (STRCAT (RTOS (/ EN-AREA 10000) 2 2) "㎡"))
(VLA-PUT-TEXTSTRING VLR-RR-OBJ EN-AREA-M)
) ;_ 结束PROGN
) ;_ 结束IF
) ;DEFUN AR_AE_RR_MODIFIED
; 删除反应程序
(DEFUN AR_AE_RR_ERASED (NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST / )
(PRINT "AR_AE_RR_ERASED,删除反应程序")
(FOREACH I (CDR (CAR (VLR-REACTORS :VLR-OBJECT-REACTOR)))
(IF (OR (VLAX-ERASED-P (CAR (VLR-OWNERS I)))
(VLAX-ERASED-P (VLAX-ENAME->VLA-OBJECT NOTIFIER-OBJECT))
)
(PROGN
(SETQ RR-OBJ (HANDENT (VLR-DATA REACTOR-OBJECT))) ;;编辑对象,REACTOR-OBJECT
(ENTDEL RR-OBJ)
(VLR-PERS-RELEASE I)
(VLR-REMOVE I)
) ;_ 结束PROGN
) ;_ 结束IF
)
) ;DEFUN AR_AE_RR_MODIFIED
; 删除没有物件对象者的反应器
(IF REMOVE_PERS_REACT
(PROGN
(FOREACH I (VLR-PERS-LIST)
(IF (NOT (VLR-OWNERS I))
(PROGN
(VLR-PERS-RELEASE I)
(VLR-REMOVE I)
) ;_ 结束PROGN
) ;_ 结束IF
) ;_ 结束FOREACH
) ;_ 结束PROGN
) ;_ 结束if
(defun AR_DXF (#code #ename)
(cdr (assoc #code (entget #ename)))
)
; 执行产生面积程序
(defun c:CRAREA ()
(prompt "\n**<面积反应器练习>**")
(SETQ NR-OBJ (CAR (ENTSEL "\n 选取物件:")))
(SETQ PTDT (VLAX-CURVE-GETPOINTATPARAM NR-OBJ 0)) ;PL起点
(SETQ VLA-NR-OBJ (VLAX-ENAME->VLA-OBJECT NR-OBJ)) ;转换为VLA
(SETQ DXF05_NR-OBJ (VLA-GET-HANDLE VLA-NR-OBJ)) ;图元处理码
(SETQ BRK_VLA-NR-OBJ (LIST VLA-NR-OBJ)) ;串列VLA
(SETQ EN-AREA (VLA-GET-AREA VLA-NR-OBJ)) ;取出面积
(SETQ EN-AREA-M (STRCAT (RTOS (/ EN-AREA 10000) 2 2) "㎡")) ;面积单位
(VL-CMDF "TEXT" PTDT 30 0 EN-AREA-M ) ;输出面积数值成文字
(SETQ RR-OBJ (ENTLAST)) ;;取得文字图元
(SETQ VLA-RR-OBJ (VLAX-ENAME->VLA-OBJECT RR-OBJ)) ;转换为VLA
(SETQ DXF05_RR-OBJ (VLA-GET-HANDLE VLA-RR-OBJ)) ;图元处理码
(SETQ BRK-VLA-RR-OBJ (LIST VLA-RR-OBJ)) ;串列VLA
; 建立反应器
(VLR-PERS ;;永久反应器
(VLR-OBJECT-REACTOR ;;物件反应器
BRK_VLA-NR-OBJ ;;NR_物件对象,LIST的VLA
DXF05_RR-OBJ ;;RR_编辑对象.图元处理码
'((:VLR-MODIFIED . AR_AE_RR_MODIFIED) ;编辑反应程序
(:VLR-COPIED . AR_AE_RR_COPIED) ;复制反应程序
(:VLR-ERASED . AR_AE_RR_ERASED) ;删除反应程序
)
))
(prin1))
你沒有把11樓的例子看懂,VLR-COPIED觸發時,實際物件其實還沒有生成呢!!慢慢研究吧!
<p>总算明白版主说是复制时并没有完成物件的产生,<br/>但该怎样在程式结束后取得物件,就又是一各问题了.</p><p>不知道版主可以说一下吗</p><p>谢谢</p><p>(DEFUN AR_AE_RR_COPIED<br/>(NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST / )<br/>(IF (/= (CAR PARAMETER-LIST) 0)<br/> (PROGN<br/>(PRINC PARAMETER-LIST)<br/>(PRINC (ENTGET (CAR PARAMETER-LIST)))<br/>) ;_ 结束PROGN<br/>) ;_ 结束IF<br/>)<br/></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman">Vlr-copied </font>的<font face="Times New Roman">3</font>個參數是甚麼<font face="Times New Roman">? </font>看想楚點<font face="Times New Roman">,</font>把它用表記錄起來</p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><font face="Times New Roman"><span style="mso-spacerun: yes;"> (defun AR_AE_RR_COPIED (NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST /)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><p><font face="Times New Roman"> </font></p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;">再用<font face="Times New Roman">vlr-commandended</font>反應器處理一下即可<font face="Times New Roman">(</font>把<font face="Times New Roman">copy </font>出來的物件加上反應器<font face="Times New Roman">) </font></p>
<p>我理解后改成如下:</p><p>1、先在主程序中创建COMMAND反应器</p><p>;;;Creat COMMAND reactor<br/>(defun Creat-Command-Reactor ()<br/> (if (not *CommandReactor*)<br/> (setq *CommandReactor*<br/> (vlr-pers<br/> (vlr-command-reactor<br/> nil<br/> '((:vlr-commandwillstart . CMD-Start)<br/> (:vlr-commandended . CMD-Ended)<br/> )<br/> )<br/> )<br/> );setq<br/> );if<br/>)</p><p><br/>2、定义复制回调函数</p><p>;;; 复制回调函数<br/>(DEFUN AR_AE_RR_COPIED (NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST / ent)<br/> (if (/= (car PARAMETER-LIST) 0) ;如果有拷贝(copy,array等方式)<br/> (PROGN<br/> (setq ent (car PARAMETER-LIST))<br/> (setq *ReactorCopy* (cons ent *ReactorCopy*)) ;设置拷贝指针变量<br/> (princ "\nAR_AE_RR_COPIED,复制反应程序") ;这句可以不要<br/> ) ;_ 结束PROGN<br/> ) ;_ 结束IF<br/>) ;_ 结束defun</p><p>;;;命令开始<br/>(defun CMD-start (reactor command-list /)<br/> (setq *ReactorCopy* nil) ;命令开始前清空拷贝指针<br/> (princ)<br/>)<br/>;;;命令结束<br/>(defun CMD-Ended (reactor command-list / pt0 obj area area-m rr-ent rr-obj)<br/> (if *ReactorCopy* <br/> (foreach n *ReactorCopy* ;对每份拷贝<br/> (SETQ pt0 (VLAX-CURVE-GETPOINTATPARAM n 0)) ;PL起点???<br/> (setq obj (vlax-ename->vla-object n))<br/> (SETQ area (vla-GET-AREA obj)) ;取出面积<br/> (SETQ area-m (STRCAT (RTOS (/ area 10000) 2 2) "㎡"));面积单位<br/> (make-text area-m pt0 3000) ;输出面积数值成文字<br/> ;建议不用command方式<br/> (SETQ RR-ent (ENTLAST)) ;取得文字图元<br/> (SETQ RR-OBJ (VLAX-ENAME->vla-OBJECT RR-ent)) ;转换为VLA<br/> ;;永久反应器<br/> (VLR-PERS<br/> ;;物件反应器<br/> (VLR-OBJECT-REACTOR<br/> ;;NR_物件对象,LIST的VLA<br/> (list obj)<br/> ;;RR_编辑对象<br/> (cons rr-obj area)<br/> '((:VLR-MODIFIED . AR_AE_RR_MODIFIED) ;编辑回调函数<br/> (:VLR-COPIED . AR_AE_RR_COPIED) ;复制回调函数<br/> (:VLR-ERASED . AR_AE_RR_ERASED) ;删除回调函数<br/> )<br/> )<br/> )<br/> )<br/> )<br/> (setq *ReactorCopy* nil) ;;命令结束后清空拷贝指针<br/> (princ)<br/>)</p>
<p>make-text 函數?? </p><p><strong><font face="Verdana" color="#da2549">highflybir 版主一看就懂了! 多寫些例子出來吧!</font></strong></p><p></p>
<p>对<font face="Verdana" color="#61b713"><strong>vken7az2p</strong><font color="#000000">的程序稍微做了一下改动。</font></font></p><p><font face="Verdana">建议不用handel作为vlr-owner,和data,而用其vla-object,在反应器的回调函数中尽量避免不用command来创建实体,而用vla方法或者entmake方法。</font></p><p><font face="Verdana">还有对这个程序最好能处理undo,erase,等情况,在文件被关闭时,注意清空一些无用的反应器。</font></p><p></p><p>make-text 函數是一个简单的用entmake创建文字的程序,参数三个,字符串,插入点,字高.</p><p></p>
<p><br/>谢谢 龙龙仔 版大 及 highflybir 版大,的指导.<br/>发现到了</p><p>01.在 :VLR-COMMANDENDED 状态中,不能使用 COMMAND 命令,而需使用其他命令来建立物件.<br/>如:<br/>(VL-LOAD-COM)<br/>(SETQ ACADOBJECT (VLAX-GET-ACAD-OBJECT))<br/>(SETQ ACADDOCUMENT (VLA-GET-ACTIVEDOCUMENT ACADOBJECT))<br/>(SETQ MSPACE (VLA-GET-MODELSPACE ACADDOCUMENT))<br/>...<br/>(VLA-AddText MSPACE EN-AREA-M (vlax-3d-point PTDT) 30) ;VBA<br/>...<br/>也是可以完成建立文字.</p><p>02.原来 :VLR-COPIED 的回传值,要把他 LIST 起来,<br/>(SETQ ENT (CAR PARAMETER-LIST)<br/> *REACTORCOPY* (CONS ENT *REACTORCOPY*)<br/>)<br/>只是变数的命名,带有 *R... 跟 REACTORCOPY 反应应该是没差异吧.</p><p>03.highflybir 版大提到,在文件被关闭时,注意清空一些无用的反应器。<br/>若是使用临时性反应器,是否变成在需要使用反应器时重新恢复关联即可,<br/>可以免去整理反应器资料库处理问题呢?</p><p>因为发现整理永久性反应器的资料库真是不好处理...<br/>尤其是遇到 只有一各物件对象 ,已经删除却能在资料库,<br/>不知道版大都怎样处理呢?</p><p>烦请各位指导一下<br/>谢谢</p>
收藏了! 谢谢!