明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 龙龙仔

永久物件反應器例子

  [复制链接]
 楼主| 发表于 2007-7-25 17:17 | 显示全部楼层

;;This file is designed to test how the vlr-copied event fires.
;;The event calls the callback function once for each copy. In
;;an array command, it would fire multiple times before the command
;;is ended. To test the effects, load this function, draw
;;an object, run the obs program and then run the array command.

;;D. C. Broad, Jr. (c) 2002
;;Cost: 50% of the profits of using it. ;-)

;;Callback dummy
(defun RPORT (A B C)
  (if(/= (CAR C) 0) ;FOR R2007
    (progn
      (princ "A:")
      (princ A)
      (princ "B:")
      (princ B)
      (princ "C:")
      (princ C)
    )
  )
  (princ)
)

;;Clear all reactors to get baseline test.
(vlr-remove-all)

;;Command to select the object to be tracked by
;;the vlr-copied reactor
(defun C:OBS (/ E O)
  (setq E (car (entsel)))
  (setq O (vlax-ename->vla-object E))
  (vlr-object-reactor
    (list O)
    "Data"
    '((:vlr-copied . RPORT))
  )
)

发表于 2007-7-29 17:10 | 显示全部楼层
本帖最后由 作者 于 2007-7-29 17:11:49 编辑


再次请教版主,
以下两个问题
01.我试着取得复制后产生的物件,再将其加入成为反应器,
但却都没法完成,请问程序中哪里出错呢?
02.删除后若执行 UNDO 命令,所恢复的物件是否变成临时性反应器?
希望版主或是其他高手可以解答一下.
谢谢!
  1. (VL-LOAD-COM)
  2. (SETQ ACADOBJECT   (VLAX-GET-ACAD-OBJECT))
  3. (SETQ ACADDOCUMENT (VLA-GET-ACTIVEDOCUMENT ACADOBJECT))
  4. (SETQ MSPACE       (VLA-GET-MODELSPACE ACADDOCUMENT))
  5. ; 复制反应程序
  6. (DEFUN AR_AE_RR_COPIED
  7. (NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST /
  8. AR_AE_RR_COPIED AR_AE_RR_MODIFIED BRK_VLA-NR-OBJ
  9. BRK-VLA-RR-OBJ DXF05_LAS-OBJ DXF05_NN-OBJ DXF05_NR-OBJ
  10. DXF05_RR-OBJ EN-AREA EN-AREA-M I LST NN NR-OBJ PTDT RE
  11. RR-OBJ VLA-NR-OBJ VLA-RR-OBJ)
  12. (PRINT "AR_AE_RR_COPIED,复制反应程序")
  13. (IF (VLAX-READ-ENABLED-P NOTIFIER-OBJECT) ;;确定物件对象是否可读
  14. (PROGN
  15. (SETQ NR-OBJ (ENTLAST)) ;取出最后物件
  16. (IF (= (AR_DXF 0 NR-OBJ) "LWPOLYLINE")
  17. (PROGN
  18. (SETQ VLA-NR-OBJ (VLAX-ENAME->VLA-OBJECT NR-OBJ)) ;转换为VLA
  19. (SETQ PTDT (VLAX-CURVE-GETPOINTATPARAM NR-OBJ 0)) ;PL起点
  20. (SETQ DXF05_NR-OBJ (VLA-GET-HANDLE VLA-NR-OBJ)) ;图元处理码
  21. (SETQ BRK_VLA-NR-OBJ (LIST VLA-NR-OBJ)) ;串列VLA
  22. ; 建立复制物件后的反应器
  23. (SETQ LST (CDR (CAR (VLR-REACTORS :VLR-Object-Reactor)))) ;取出反应器列表
  24. (SETQ I 0)
  25. (SETQ RE T)
  26. (SETQ DXF05_LAS-OBJ (VLA-GET-HANDLE (CAR (VLR-OWNERS (LAST LST))))) ;最后一笔资料
  27. (WHILE RE
  28. (SETQ NN (VLR-OWNERS (NTH I LST)))
  29. (SETQ DXF05_NN-OBJ (VLA-GET-HANDLE (CAR NN)))
  30. (COND
  31. ((= DXF05_NR-OBJ DXF05_NN-OBJ)
  32. (PRINT "相同资料 ") (PRINC (ITOA I))
  33. (SETQ I (1+ I))
  34. (SETQ RE T)
  35. )
  36. ((AND (= DXF05_LAS-OBJ DXF05_NN-OBJ)
  37.       (= DXF05_NR-OBJ DXF05_NN-OBJ)
  38.       )
  39. (PRINT "最后一笔资料 ") (PRINC (ITOA I))
  40. (SETQ RE NIL)
  41. )
  42. ((/= DXF05_NR-OBJ DXF05_NN-OBJ)
  43. (SETQ EN-AREA (VLA-GET-AREA VLA-NR-OBJ)) ;取出面积
  44. (SETQ EN-AREA-M (STRCAT (RTOS (/ EN-AREA 10000) 2 2) "㎡")) ;面积单位
  45. (VL-CMDF "TEXT" PTDT 30 0 EN-AREA-M ) ;输出面积数值成文字
  46. (SETQ RR-OBJ (ENTLAST))
  47. (SETQ VLA-RR-OBJ (VLAX-ENAME->VLA-OBJECT RR-OBJ)) ;转换为VLA
  48. (SETQ DXF05_RR-OBJ (VLA-GET-HANDLE VLA-RR-OBJ)) ;图元处理码
  49. (SETQ BRK-VLA-RR-OBJ (LIST VLA-RR-OBJ)) ;串列VLA
  50. (VLR-PERS ;;永久反应器
  51. (VLR-OBJECT-REACTOR ;;物件反应器
  52. BRK_VLA-NR-OBJ ;;NR_物件对象,LIST的VLA
  53. DXF05_RR-OBJ   ;;RR_编辑对象.图元处理码
  54. '((:VLR-MODIFIED . AR_AE_RR_MODIFIED) ;编辑反应程序
  55.   (:VLR-COPIED . AR_AE_RR_COPIED) ;复制反应程序
  56.   (:VLR-ERASED . AR_AE_RR_ERASED) ;删除反应程序
  57.   )
  58. ))
  59. (SETQ I (1+ I))
  60. (SETQ RE NIL)
  61. )
  62. ) ;_ 结束COND
  63. ) ;_ 结束WHILE
  64. ) ;_ 结束PROGN
  65. ) ;_ 结束IF
  66. ) ;_ 结束PROGN
  67. ) ;_ 结束IF
  68. ) ; DEFUN AR_AE_RR_COPIED
  69. ; 编辑反应程序
  70. (DEFUN AR_AE_RR_MODIFIED
  71. (NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST / EN-AREA EN-AREA-M RR-OBJ VLR-TX)
  72. (PRINT "AR_AE_RR_MODIFIED,编辑反应程序")
  73. (IF (VLAX-READ-ENABLED-P NOTIFIER-OBJECT) ;;确定物件对象是否可读
  74. (PROGN
  75. (SETQ RR-OBJ (HANDENT (VLR-DATA REACTOR-OBJECT))) ;;编辑对象,REACTOR-OBJECT
  76. (SETQ VLR-RR-OBJ  (VLAX-ENAME->VLA-OBJECT RR-OBJ))
  77. (SETQ EN-AREA (VLA-GET-AREA NOTIFIER-OBJECT)) ;;物件对象,NOTIFIER-OBJECT
  78. (SETQ EN-AREA-M (STRCAT (RTOS (/ EN-AREA 10000) 2 2) "㎡"))
  79. (VLA-PUT-TEXTSTRING VLR-RR-OBJ EN-AREA-M)
  80. ) ;_ 结束PROGN
  81. ) ;_ 结束IF
  82. ) ;DEFUN AR_AE_RR_MODIFIED
  83. ; 删除反应程序
  84. (DEFUN AR_AE_RR_ERASED (NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST / )
  85. (PRINT "AR_AE_RR_ERASED,删除反应程序")
  86. (FOREACH I (CDR (CAR (VLR-REACTORS :VLR-OBJECT-REACTOR)))
  87. (IF (OR (VLAX-ERASED-P (CAR (VLR-OWNERS I)))
  88. (VLAX-ERASED-P (VLAX-ENAME->VLA-OBJECT NOTIFIER-OBJECT))
  89. )
  90. (PROGN
  91. (SETQ RR-OBJ (HANDENT (VLR-DATA REACTOR-OBJECT))) ;;编辑对象,REACTOR-OBJECT
  92. (ENTDEL RR-OBJ)
  93. (VLR-PERS-RELEASE I)
  94. (VLR-REMOVE I)
  95. ) ;_ 结束PROGN
  96. ) ;_ 结束IF
  97. )
  98. ) ;DEFUN AR_AE_RR_MODIFIED
  99. ; 删除没有物件对象者的反应器
  100. (IF REMOVE_PERS_REACT
  101. (PROGN
  102. (FOREACH I (VLR-PERS-LIST)
  103.   (IF (NOT (VLR-OWNERS I))
  104.     (PROGN
  105.       (VLR-PERS-RELEASE I)
  106.       (VLR-REMOVE I)
  107.     ) ;_ 结束PROGN
  108.   ) ;_ 结束IF
  109. ) ;_ 结束FOREACH
  110. ) ;_ 结束PROGN
  111. ) ;_ 结束if
  112. (defun AR_DXF (#code #ename)
  113. (cdr (assoc #code (entget #ename)))
  114. )
  115. ; 执行产生面积程序
  116. (defun c:CRAREA ()
  117. (prompt "\n**<面积反应器练习>**")
  118. (SETQ NR-OBJ (CAR (ENTSEL "\n 选取物件:")))
  119. (SETQ PTDT (VLAX-CURVE-GETPOINTATPARAM NR-OBJ 0)) ;PL起点
  120. (SETQ VLA-NR-OBJ (VLAX-ENAME->VLA-OBJECT NR-OBJ)) ;转换为VLA
  121. (SETQ DXF05_NR-OBJ (VLA-GET-HANDLE VLA-NR-OBJ)) ;图元处理码
  122. (SETQ BRK_VLA-NR-OBJ (LIST VLA-NR-OBJ)) ;串列VLA
  123. (SETQ EN-AREA (VLA-GET-AREA VLA-NR-OBJ)) ;取出面积
  124. (SETQ EN-AREA-M (STRCAT (RTOS (/ EN-AREA 10000) 2 2) "㎡")) ;面积单位
  125. (VL-CMDF "TEXT" PTDT 30 0 EN-AREA-M ) ;输出面积数值成文字
  126. (SETQ RR-OBJ (ENTLAST)) ;;取得文字图元
  127. (SETQ VLA-RR-OBJ (VLAX-ENAME->VLA-OBJECT RR-OBJ)) ;转换为VLA
  128. (SETQ DXF05_RR-OBJ (VLA-GET-HANDLE VLA-RR-OBJ)) ;图元处理码
  129. (SETQ BRK-VLA-RR-OBJ (LIST VLA-RR-OBJ)) ;串列VLA
  130. ; 建立反应器
  131. (VLR-PERS ;;永久反应器
  132. (VLR-OBJECT-REACTOR ;;物件反应器
  133. BRK_VLA-NR-OBJ ;;NR_物件对象,LIST的VLA
  134. DXF05_RR-OBJ   ;;RR_编辑对象.图元处理码
  135. '((:VLR-MODIFIED . AR_AE_RR_MODIFIED) ;编辑反应程序
  136.   (:VLR-COPIED . AR_AE_RR_COPIED) ;复制反应程序
  137.   (:VLR-ERASED . AR_AE_RR_ERASED) ;删除反应程序
  138.   )
  139. ))
  140. (prin1))
 楼主| 发表于 2007-7-30 12:54 | 显示全部楼层
你沒有把11樓的例子看懂,VLR-COPIED觸發時,實際物件其實還沒有生成呢!!  慢慢研究吧!
发表于 2007-7-30 22:22 | 显示全部楼层

总算明白版主说是复制时并没有完成物件的产生,
但该怎样在程式结束后取得物件,就又是一各问题了.

不知道版主可以说一下吗

谢谢

(DEFUN AR_AE_RR_COPIED
(NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST / )
(IF (/= (CAR PARAMETER-LIST) 0)
  (PROGN
(PRINC PARAMETER-LIST)
(PRINC (ENTGET (CAR PARAMETER-LIST)))
) ;_ 结束PROGN
) ;_ 结束IF
)

 楼主| 发表于 2007-7-31 07:58 | 显示全部楼层

Vlr-copied 3個參數是甚麼? 看想楚點,把它用表記錄起來

  (defun AR_AE_RR_COPIED (NOTIFIER-OBJECT REACTOR-OBJECT PARAMETER-LIST /)

 

再用vlr-commandended反應器處理一下即可(copy 出來的物件加上反應器)

发表于 2007-7-31 11:50 | 显示全部楼层

我理解后改成如下:

1、先在主程序中创建COMMAND反应器

;;;Creat COMMAND reactor
(defun Creat-Command-Reactor ()
  (if (not *CommandReactor*)
    (setq *CommandReactor*
    (vlr-pers
      (vlr-command-reactor
        nil
        '((:vlr-commandwillstart . CMD-Start)
   (:vlr-commandended . CMD-Ended)
        )
      )
    )
    );setq
  );if
)


2、定义复制回调函数

;;; 复制回调函数
(DEFUN AR_AE_RR_COPIED (NOTIFIER-OBJECT REACTOR-OBJECT ARAMETER-LIST / ent)
  (if (/= (car PARAMETER-LIST) 0)                          ;如果有拷贝(copy,array等方式)
    (PROGN
      (setq ent (car PARAMETER-LIST))
      (setq *ReactorCopy* (cons ent *ReactorCopy*))        ;设置拷贝指针变量
      (princ "\nAR_AE_RR_COPIED,复制反应程序")             ;这句可以不要
    ) ;_ 结束PROGN
  ) ;_ 结束IF
) ;_ 结束defun

;;;命令开始
(defun CMD-start (reactor command-list /)
  (setq *ReactorCopy* nil)                                 ;命令开始前清空拷贝指针
  (princ)
)
;;;命令结束
(defun CMD-Ended (reactor command-list / pt0 obj area area-m rr-ent rr-obj)
  (if *ReactorCopy*                                       
    (foreach n *ReactorCopy*                               ;对每份拷贝
      (SETQ pt0 (VLAX-CURVE-GETPOINTATPARAM n 0))          L起点???
      (setq obj (vlax-ename->vla-object n))
      (SETQ area (vla-GET-AREA obj))                    ;取出面积
      (SETQ area-m (STRCAT (RTOS (/ area 10000) 2 2) "㎡"));面积单位
      (make-text area-m pt0 3000)                    ;输出面积数值成文字
                                                           ;建议不用command方式
      (SETQ RR-ent (ENTLAST))                     ;取得文字图元
      (SETQ RR-OBJ (VLAX-ENAME->vla-OBJECT RR-ent))        ;转换为VLA
      ;;永久反应器
      (VLR-PERS
 ;;物件反应器
 (VLR-OBJECT-REACTOR
   ;;NR_物件对象,LIST的VLA
   (list obj)
   ;;RR_编辑对象
   (cons rr-obj area)
   '((:VLR-MODIFIED . AR_AE_RR_MODIFIED)            ;编辑回调函数
     (:VLR-COPIED . AR_AE_RR_COPIED)                ;复制回调函数
     (:VLR-ERASED . AR_AE_RR_ERASED)                ;删除回调函数
   )
 )
      )
    )
  )
  (setq *ReactorCopy* nil)                                 ;;命令结束后清空拷贝指针
  (princ)
)

 楼主| 发表于 2007-7-31 12:54 | 显示全部楼层

make-text  函數?? 

highflybir 版主一看就懂了! 多寫些例子出來吧!

发表于 2007-7-31 14:40 | 显示全部楼层

vken7az2p的程序稍微做了一下改动。

建议不用handel作为vlr-owner,和data,而用其vla-object,在反应器的回调函数中尽量避免不用command来创建实体,而用vla方法或者entmake方法。

还有对这个程序最好能处理undo,erase,等情况,在文件被关闭时,注意清空一些无用的反应器。

make-text  函數是一个简单的用entmake创建文字的程序,参数三个,字符串,插入点,字高.

本帖子中包含更多资源

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

x
发表于 2007-7-31 23:34 | 显示全部楼层


谢谢 龙龙仔 版大 及 highflybir 版大,的指导.
发现到了

01.在 :VLR-COMMANDENDED 状态中,不能使用 COMMAND 命令,而需使用其他命令来建立物件.
如:
(VL-LOAD-COM)
(SETQ ACADOBJECT   (VLAX-GET-ACAD-OBJECT))
(SETQ ACADDOCUMENT (VLA-GET-ACTIVEDOCUMENT ACADOBJECT))
(SETQ MSPACE       (VLA-GET-MODELSPACE ACADDOCUMENT))
...
(VLA-AddText MSPACE EN-AREA-M (vlax-3d-point PTDT) 30) ;VBA
...
也是可以完成建立文字.

02.原来 :VLR-COPIED 的回传值,要把他 LIST 起来,
(SETQ ENT (CAR PARAMETER-LIST)
      *REACTORCOPY* (CONS ENT *REACTORCOPY*)
)
只是变数的命名,带有 *R... 跟 REACTORCOPY 反应应该是没差异吧.

03.highflybir 版大提到,在文件被关闭时,注意清空一些无用的反应器。
若是使用临时性反应器,是否变成在需要使用反应器时重新恢复关联即可,
可以免去整理反应器资料库处理问题呢?

因为发现整理永久性反应器的资料库真是不好处理...
尤其是遇到 只有一各物件对象 ,已经删除却能在资料库,
不知道版大都怎样处理呢?

烦请各位指导一下
谢谢

发表于 2012-5-1 14:27 | 显示全部楼层
收藏了! 谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 18:17 , Processed in 0.313601 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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