找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4499|回复: 35

[分享]:vlisp反应器初探

[复制链接]
发表于 2005-5-17 03:13:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
刚编了一个小程序,将图纸中的详图图号和索引符号关联,更改详图图号,索引符号自动更新,大家分享,互相学习!


  1.   [FONT=courier new]

  2. ;;; 反应器其实是一个autocad的vlr物体,它就像其他cad物体一样,包含很多数据
  3. ;;; 在这个程序里,主要用到了反应器内的以下数据:
  4. ;;; 1,反应器的所有者,即由何物体触发反应器,通过vlr-owners函数访问
  5. ;;; 2,反应器所携带的数据(不是包含),通过vlr-data函数访问
  6. ;;; 3,反应器的回调函数,即触发了反应器后,执行什么操作

  7. ;;; 反应器与其所有者的关系:
  8. ;;; 1,一个所有者  owner    可以拥有多个反应器    reactor
  9. ;;; 2,一个反应器  reactor  可以附着在多个所有者  owner

  10. ;;; 下面的程序主要用到两个变量
  11. ;;; drawno--详图的编号,块,包含两个属性。其中一个为隐藏属性,表示图号
  12. ;;; index --图纸中的索引,块,包含两个属性。就是大家常见的圆圈,上面是详图号,下面是图号
  13. ;;; 本程序的目的是将两者关联,
  14. ;;; drawno作为owner,对其编辑将触发反应器,自动更新index
  15. ;;; index 作为反应器要进行操作的对象,已数据的形式被反应器所携带
  16. ;;; 原则:一个drawno可以带动反应器对多个index修改,因为详图可以被多次索引
  17. ;;;       一个index只能被唯一的drawno所控制,因为索引和详图是单一对应的


  18. ;;; 下面是几个通用函数,跳过介绍

  19.   ;==========================
  20. (defun lhj_sel (str fi_list / pt ename ss loop ename)
  21.   (princ "\n")
  22.   (princ str)
  23.   (setq loop T)

  24.   (while loop
  25.     (setq pt (grread t 4 2))
  26.     (if        (= 3 (car pt))
  27.       (setq loop nil)
  28.     )
  29.   )
  30.   (setq pt (cadr pt))
  31.   (setq ss (ssget pt fi_list))
  32.   (if ss
  33.     (setq ename (ssname ss 0))
  34.     (setq ename nil)
  35.   )
  36. )

  37. =====================================
  38. ;;;获取实体dxf组码内容
  39. ;;; (lhj_dxf 实体名 dxf码编号)
  40. ;;;例:(lhj_dxf textname 10),获取文字左下点标

  41. (defun lhj_dxf (ename code / elist res)
  42.   (setq elist (entget ename))
  43.   (setq res (cdr (assoc code elist)))
  44. )

  45. ;;;  ==========================================
  46. ;;;  ;;初始化,读取系统变量。结束时,恢复系统变量
  47. ;;;  ;  osmode             0
  48. ;;;  ;  cmdecho         1
  49. ;;;  ;  clayer             2
  50. ;;;  ;  textstyle          3
  51. ;;;  ;  cecolor        4
  52. ;;;  ;  dimstyle        5
  53. ;;;  ;  plinewid    6
  54. ;;;  ;  filletrad   7


  55. (defun lhj_start ()
  56.   (setq        lhj_s_lst
  57.          (list
  58.            (getvar "osmode")
  59.            (getvar "cmdecho")
  60.            (getvar "clayer")
  61.            (getvar "textstyle")
  62.            (getvar "cecolor")
  63.            (getvar "dimstyle")
  64.            (getvar "plinewid")
  65.            (getvar "filletrad")
  66.            (getvar "attdia")
  67.          )
  68.   )
  69.   (setq old_error *error*)
  70.   (setvar "cmdecho" 0)
  71.   (command "undo" "be")
  72.   (setvar "osmode" 0)
  73.   (setvar "attdia" 0)
  74.   (princ)
  75. )


  76. (defun lhj_end ()
  77.   (setvar "osmode" (nth 0 lhj_s_lst))
  78.   (setvar "clayer" (nth 2 lhj_s_lst))
  79.   (setvar "textstyle" (nth 3 lhj_s_lst))
  80.   (setvar "cecolor" (nth 4 lhj_s_lst))
  81.   (command "dimstyle" "r" (nth 5 lhj_s_lst))
  82.   (setvar "plinewid" (nth 6 lhj_s_lst))
  83.   (setvar "filletrad" (nth 7 lhj_s_lst))
  84.   (setvar "attdia" (nth 8 lhj_s_lst))
  85.   (setq *error* old_error)
  86.   (command "undo" "e")
  87.   (setvar "cmdecho" (nth 1 lhj_s_lst))
  88.   (princ)
  89. )

  90. ;;;
  91. ;;;
  92. ;;;
  93. ;;;
  94. ;;;
  95. ;;;
  96. ;;;
  97. ;;;
  98. ;;; 开始主要内容了


  99. ;;=================================
  100. ;;定义dwg文件关闭程序
  101. ;;(defun IA:dwgclose ()
  102. ;;还没搞定呢,这个函数的规划想法是:在dwg文件关闭的时候,
  103. ;;检查无效的反应器,将其删除,
  104. ;;因为反应器也是cad的物体,占用文件大小,
  105. ;;并且可能带来无法意料的情况


  106. ;;一下两段程序可以写在主程序内部,作为内部函数
  107. ;;现在写在外部,主要目的是加载了本文件后,
  108. ;;就可以对图纸中已经存在的反应器进行操作了,
  109. ;;不一定非要运行主程序

  110. ;;=================================
  111. ;;定义IA:makesame程序,使 drawno 和 index 统一
  112. ;;这段很简单,就是一般的lsp操作
  113. (defun IA:makesame (drawno index / attlist dn1 dn2 temp templist)
  114.   (setq        temp (entnext drawno)
  115.         dn1  (lhj_dxf temp 1)
  116.         temp (entnext temp)
  117.         dn2  (lhj_dxf temp 1)
  118.   )
  119.   (setq
  120.     temp     (entnext index)
  121.     templist (entget temp)
  122.     templist (subst (cons 1 dn1) (assoc 1 templist) templist)
  123.   )
  124.   (entmod templist)
  125.   (setq
  126.     temp     (entnext temp)
  127.     templist (entget temp)
  128.     templist (subst (cons 1 dn2) (assoc 1 templist) templist)
  129.   )
  130.   (entmod templist)
  131.   (entupd index)
  132. )



  133. ;;=================================
  134. ;;定义图号drawno被修改时的程序
  135. ;;这个就是回调函数,它需要三个接受变量,这完全是由反映器的类型决定的
  136. ;;具体看一下帮助文档吧!
  137. (defun ia:dn_modified
  138.        (drawno reactor parameter-list / indextomodifylist x)
  139.   (setq        indextomodifylist (vlr-data reactor) ;读取反映器附带的数据,
  140.         drawno                  (vlax-vla-object->ename drawno)
  141.   )
  142.   (foreach x indextomodifylist
  143.   ;如前所述,要修改的index是可以存在多个的,所以用表来保存
  144.     (progn
  145.       (setq x (handent x))
  146.       (IA:makesame drawno x)
  147.     )
  148.   ) ;end of foreach
  149. )


  150. ;;=================================
  151. ;;查找由Indexassoc函数产生的反应器
  152. ;;返回如下格式的表
  153. ;; '((reactor owner data) (reactor owner data) ....)
  154. ;;针对indexassoc函数,返回格式为
  155. ;; '((reactorA drawnoA '(indexA1 indexA2 indexA3 ...)) (reactorB drawnoB '(indexB1 indexB2 indexB3 ...)) ...)
  156. ;;将所有由主程序生成的反应器及其owner和data保存在全局变量*IA:allreactor*中
  157. (defun IA:calreactor (/ all data owner reactor reaction)
  158.   (setq        *IA:allreactor*        '()
  159.         all                (vlr-pers-list)
  160.   )
  161.   (foreach x all
  162.     (setq reaction (vlr-reactions x))
  163.     (if        (member '(:VLR-subObjModified . IA:DN_MODIFIED) reaction)
  164.       (setq data            (vlr-data x)
  165.             owner            (vlr-owners x)
  166.             *IA:allreactor* (cons (list x (car owner) data) *IA:allreactor*)
  167.       )
  168.     )
  169.   )
  170. )


  171. ;;;===========================================
  172. ;;;    关联索引及图号
  173. ;;;下面就是主程序了
  174. (defun c:lhj_IndexAssoc        (/           index     drawno    indexhandle
  175.                          reactor   x             re2del    dodel
  176.                          olddata   doreset   howto     re2set
  177.                         )

  178.   ;初始化程序=======
  179.   (lhj_start)
  180.   (defun *error* (msg)
  181.     (princ "\n")
  182.     (princ "\n:::lhj_tools:::")
  183.     (princ msg)
  184.     (princ ",程序退出!")
  185.   )


  186.   ;添加关闭图形时的反应器
  187.   ;
  188.   ;  (if (not *IA:dwgclosereactor*)
  189.   ;    (setq *IA:dwgclosereactor* (vlr-dwg-reactor nil '((vlr-beginClose . IA:dwgclose))))
  190.   ;   )
  191.   ;未完善,个人体会,反应器程序一定要完善后在发布使用,
  192.   ;否则一旦更新后的数据格式与以前不同,将造成原来的反应器失效。


  193.   ;定义反映关联程序,这是主体
  194.   (defun ia:makeassoc ()
  195.     (IA:calreactor) ;查找图纸中所有由lhj_IndexAssoc生成的反应器
  196.     (setq index         (vlax-ename->vla-object index)
  197.           drawno (vlax-ename->vla-object drawno)
  198.     )

  199.     (if        *IA:allreactor*
  200.       (foreach x *IA:allreactor*
  201.         (if (member indexhandle (caddr x))
  202.           (setq re2del (car x)) ;如果index是某一反应器的处理对象,将该反应器提取,以备后需
  203.         )
  204.         (if (member drawno x)
  205.           (setq        olddata        (caddr x) ;如果drawno拥有了反映器,将该反应器所携带数据提取
  206.                 re2set        (car x)   ;并将该反应器保存,以备后需
  207.           )
  208.           (setq olddata '())
  209.         )
  210.       )
  211.     )

  212.     (if        re2del
  213.       (progn
  214.         (initget "Yes No")
  215.         (setq dodel
  216.                (getstring
  217.                  "\n:::TACON:::所选择的[索引]曾被设置关联,是否打断关联?(Yes/No):"
  218.                )
  219.         )
  220.         (if (wcmatch dodel "y*,Y*")
  221.           (vlr-remove re2del) ;删除旧反应器,见最上面的原则。
  222.           (exit)              ;或者退出
  223.         )
  224.       )
  225.     )

  226.     (if        olddata
  227.       (progn
  228.         (initget "1 2 3")
  229.         (setq howto     ;如果drawno拥有反应器,如何操作捏?
  230.                (getint
  231.                  "\n:::TACON:::所选择的[图纸编号]曾被设置关联,如何处理?(1_替换/2_添加/3_退出):"
  232.                )
  233.         )
  234.         (cond ((= howto 1) ;替换,即将新的index替换旧的
  235.                (progn (IA:makesame
  236.                         (vlax-vla-object->ename drawno)
  237.                         (vlax-vla-object->ename index)
  238.                       )
  239.                       (vlr-data-set re2set (list indexhandle))
  240.                )
  241.               )
  242.               ((= howto 2) ;添加,即将新的index添加到要被反应器操作的目标中
  243.                (progn (IA:makesame
  244.                         (vlax-vla-object->ename drawno)
  245.                         (vlax-vla-object->ename index)
  246.                       )
  247.                       (vlr-data-set re2set (cons indexhandle olddata))
  248.                )
  249.               )
  250.               ((= howto 3) (exit)) ;退出
  251.         )
  252.       )
  253.       (progn  ;如果drawno不拥有反应器,那就给他弄一个
  254.         (IA:makesame
  255.           (vlax-vla-object->ename drawno)
  256.           (vlax-vla-object->ename index)
  257.         )
  258.         (setq reactor
  259.                (vlr-object-reactor
  260.                  (list drawno)
  261.                  (list indexhandle)
  262.                  '((:vlr-subObjModified . ia:dn_modified))
  263.                )
  264.         )
  265.         (vlr-pers reactor)
  266.       )
  267.     )
  268.   )


  269.   ;主程序外框,输入部分===========
  270.   (if
  271.     (setq index        (lhj_sel "\n:::TW:::请选择要进行关联的[索引]:"
  272.                          '((2 . "lhj_ref"))
  273.                 )
  274.     )
  275.      (progn
  276.        (redraw index 3)
  277.        (if
  278.          (setq
  279.            drawno
  280.             (lhj_sel "\n:::TW:::请选择要与之关联的[详图图号]:"
  281.                      '((2 . "lhj_drawno"))
  282.             )
  283.          )
  284.           (progn
  285.             (redraw index 4)
  286.             (setq indexhandle (lhj_dxf index 5)) ;这里把index的handle作为数据储存,而没有使用objname
  287.             (IA:makeassoc)                       ;是因为用户在undo和oops后,名字会变,而handle不变
  288.           )
  289.           (progn
  290.             (redraw index 4)
  291.             (princ "\n:::TW:::没有选择到[详图图号]!")
  292.           )
  293.        )
  294.      )
  295.      (princ "\n:::TW:::没有选择到[索引]!")
  296.   )


  297.   ;主程序结束=======

  298.   (lhj_end)
  299.   (princ)
  300. )

  301.   [/FONT]


附件中包含lisp文件和一个dwg文件,里面有程序需要的图块,大家试试!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-5-17 13:00:41 | 显示全部楼层
感谢分享,顶!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-18 11:05:51 | 显示全部楼层
不错,可以考虑将很多的同样的修改作为同一个块考虑了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-18 11:50:12 | 显示全部楼层
论坛中关于反应器的讨论真的不多,值得奖励,期待有更多关于反应器的文章或程序贴上来与大家分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-18 13:55:55 | 显示全部楼层
更新了一部分代码,加载前把一楼的通用函数部分复制到这个程序的前面。


  1.   [FONT=courier new]

  2. ;;=================================
  3. ;;定义IA:makesame程序,使 drawno 和 index 统一
  4. ;;这段很简单,就是一般的lsp操作
  5. (defun IA:makesame (drawno index / attlist dn1 dn2 temp templist)
  6.   (setq        temp (entnext drawno)
  7.         dn1  (lhj_dxf temp 1)
  8.         temp (entnext temp)
  9.         dn2  (lhj_dxf temp 1)
  10.   )
  11.   (setq
  12.     temp     (entnext index)
  13.     templist (entget temp)
  14.     templist (subst (cons 1 dn1) (assoc 1 templist) templist)
  15.   )
  16.   (entmod templist)
  17.   (setq
  18.     temp     (entnext temp)
  19.     templist (entget temp)
  20.     templist (subst (cons 1 dn2) (assoc 1 templist) templist)
  21.   )
  22.   (entmod templist)
  23.   (entupd index)
  24. )



  25. ;;=================================
  26. ;;定义图号drawno被修改时的程序
  27. ;;这个就是回调函数,它需要三个接受变量,这完全是由反映器的类型决定的
  28. ;;具体看一下帮助文档吧!
  29. (defun ia:dn_modified
  30.        (drawno reactor parameter-list / indextomodifylist x)
  31.   (setq        indextomodifylist (vlr-data reactor) ;读取反映器附带的数据,
  32.         drawno                  (vlax-vla-object->ename drawno)
  33.   )
  34.   (foreach x indextomodifylist
  35.   ;如前所述,要修改的index是可以存在多个的,所以用表来保存
  36.     (progn
  37.       (setq x (handent x))
  38.       (IA:makesame drawno x)
  39.     )
  40.   ) ;end of foreach
  41. )


  42. ;;=================================
  43. ;;查找由Indexassoc函数产生的反应器
  44. ;;返回如下格式的表
  45. ;; '((reactor owner data) (reactor owner data) ....)
  46. ;;针对indexassoc函数,返回格式为
  47. ;; '((reactorA drawnoA '(indexA1 indexA2 indexA3 ...)) (reactorB drawnoB '(indexB1 indexB2 indexB3 ...)) ...)
  48. ;;将所有由主程序生成的反应器及其owner和data保存在全局变量*IA:allreactor*中
  49. (defun IA:calreactor (/ all data owner reactor reaction)
  50.   (setq        *IA:allreactor*        '()
  51.         all                (vlr-pers-list)
  52.   )
  53.   (foreach x all
  54.     (setq reaction (vlr-reactions x))
  55.     (if        (member '(:VLR-subObjModified . IA:DN_MODIFIED) reaction)
  56.       (setq data            (vlr-data x)
  57.             owner            (vlr-owners x)
  58.             *IA:allreactor* (cons (list x (car owner) data) *IA:allreactor*)
  59.       )
  60.     )
  61.   )
  62. )


  63. ;;===================================
  64. ;;定义程序存盘反应器的回调函数
  65. ;;更新的内容
  66. ;;在acad存盘的之前,搜索所有的由IA创建的反应器
  67. ;;对于每一个反应器,判断如下内容
  68. ;;是否该反应器的owner还存在?
  69. ;;是否该反应器携带数据中的index还存在?
  70. ;;如果不存在,把该反应器列为无效的
  71. ;;提示用户,是否删除这些反应器
  72. ;;之所以不直接删除,是以防用户继续绘图,并使用undo命令,
  73. ;;恢复了owner和index。

  74. (defun IA:dwgclose
  75.        (reactor paralist / x y newdata olddata dodel all2del)

  76.   (IA:calreactor)
  77.   (setq all2del '())

  78.   ;---------------
  79.   (defun IA:delreactor (del)
  80.     (foreach n del
  81.       (vlr-pers-release n)
  82.       (vlr-remove n)
  83.     )
  84.   )

  85.   ;---------------
  86.   (setq n 0)
  87.   (if *IA:allreactor*
  88.     (foreach x *IA:allreactor*
  89.       (if (= (cadr x) nil)
  90.         (setq all2del (cons (car x) all2del))
  91.         (if (= (vlax-vla-object->ename (cadr x)) nil)
  92.           (setq all2del (cons (car x) all2del))
  93.           (progn
  94.             (setq olddata (caddr x)
  95.                   newdata '()
  96.             )
  97.             (foreach y olddata
  98.               (if (/= (entget (handent y)) nil)
  99.                 (setq newdata (cons y newdata))
  100.               )
  101.               (if (= newdata '())
  102.                 (setq all2del (cons (car x) all2del))
  103.                 (vlr-data-set (car x) newdata)
  104.               )
  105.             )
  106.           )
  107.         )
  108.       )
  109.     )
  110.   )

  111.   (if all2del
  112.     (progn
  113.       (princ (strcat "\n:::TW:::lhj_IndexAssoc程序共搜索到"
  114.                      (itoa (length all2del))
  115.                      "个无效的反应器,是否删除?"
  116.              )
  117.       )
  118.       (initget "Yes No")
  119.       (setq dodel (getstring "(Yes/No)"))
  120.       (if (wcmatch dodel "y*,Y*")
  121.         (IA:delreactor all2del)
  122.       )
  123.     )
  124.   )

  125.   (princ)
  126. )



  127. ;;;===========================================
  128. ;;;    关联索引及图号
  129. ;;;下面就是主程序了
  130. (defun c:lhj_IndexAssoc        (/           index     drawno    indexhandle
  131.                          reactor   x             re2del    dodel
  132.                          olddata   doreset   howto     re2set
  133.                         )

  134.   ;初始化程序=======
  135.   (lhj_start)
  136.   (defun *error* (msg)
  137.     (princ "\n")
  138.     (princ "\n:::lhj_tools:::")
  139.     (princ msg)
  140.     (princ ",程序退出!")
  141.   )


  142.   ;添加开始保存图形时的反应器
  143.   ;
  144.   (if (not *IA:beginSavereactor*)
  145.     (setq *IA:beginSavereactor*
  146.            (vlr-dwg-reactor
  147.              nil
  148.              '((:vlr-beginSave . IA:dwgclose))
  149.            )
  150.     )
  151.   )


  152.   ;定义反映关联程序,这是主体
  153.   (defun ia:makeassoc ()
  154.     (IA:calreactor) ;查找图纸中所有由lhj_IndexAssoc生成的反应器
  155.     (setq index         (vlax-ename->vla-object index)
  156.           drawno (vlax-ename->vla-object drawno)
  157.     )

  158.     (if        *IA:allreactor*
  159.       (foreach x *IA:allreactor*
  160.         (if (member indexhandle (caddr x))
  161.           (setq re2del (car x))
  162.   ;如果index是某一反应器的处理对象,将该反应器提取,以备后需
  163.         )
  164.         (if (member drawno x)
  165.           (setq        olddata        (caddr x)
  166.   ;如果drawno拥有了反映器,将该反应器所携带数据提取
  167.                 re2set        (car x) ;并将该反应器保存,以备后需
  168.           )
  169.           (setq olddata '())
  170.         )
  171.       )
  172.     )

  173.     (if        re2del
  174.       (progn
  175.         (initget "Yes No")
  176.         (setq dodel
  177.                (getstring
  178.                  "\n:::TACON:::所选择的[索引]曾被设置关联,是否打断关联?(Yes/No):"
  179.                )
  180.         )
  181.         (if (wcmatch dodel "y*,Y*")
  182.                        (progn
  183.                          (vlr-pers-release re2del)
  184.             (vlr-remove re2del) ;删除旧反应器,见最上面的原则。
  185.              )
  186.           (exit) ;或者退出
  187.         )
  188.       )
  189.     )

  190.     (if        olddata
  191.       (progn
  192.         (initget "1 2 3")
  193.         (setq howto ;如果drawno拥有反应器,如何操作捏?
  194.                (getint
  195.                  "\n:::TACON:::所选择的[图纸编号]曾被设置关联,如何处理?(1_替换/2_添加/3_退出):"
  196.                )
  197.         )
  198.         (cond ((= howto 1) ;替换,即将新的index替换旧的
  199.                (progn (IA:makesame
  200.                         (vlax-vla-object->ename drawno)
  201.                         (vlax-vla-object->ename index)
  202.                       )
  203.                       (vlr-data-set re2set (list indexhandle))
  204.                )
  205.               )
  206.               ((= howto 2)
  207.   ;添加,即将新的index添加到要被反应器操作的目标中
  208.                (progn
  209.                  (IA:makesame
  210.                    (vlax-vla-object->ename drawno)
  211.                    (vlax-vla-object->ename index)
  212.                  )
  213.                  (if (not (member indexhandle olddata))
  214.                    (vlr-data-set re2set (cons indexhandle olddata))
  215.                  )
  216.                )
  217.               )
  218.               ((= howto 3) (exit)) ;退出
  219.         )
  220.       )
  221.       (progn ;如果drawno不拥有反应器,那就给他弄一个
  222.         (IA:makesame
  223.           (vlax-vla-object->ename drawno)
  224.           (vlax-vla-object->ename index)
  225.         )
  226.         (setq reactor
  227.                (vlr-object-reactor
  228.                  (list drawno)
  229.                  (list indexhandle)
  230.                  '((:vlr-subObjModified . ia:dn_modified))
  231.                )
  232.         )
  233.         (vlr-pers reactor)
  234.       )
  235.     )
  236.   )


  237.   ;主程序外框,输入部分===========
  238.   (if
  239.     (setq index        (lhj_sel "\n:::TW:::请选择要进行关联的[索引]:"
  240.                          '((2 . "lhj_ref"))
  241.                 )
  242.     )
  243.      (progn
  244.        (redraw index 3)
  245.        (if
  246.          (setq
  247.            drawno
  248.             (lhj_sel "\n:::TW:::请选择要与之关联的[详图图号]:"
  249.                      '((2 . "lhj_drawno"))
  250.             )
  251.          )
  252.           (progn
  253.             (redraw index 4)
  254.             (setq indexhandle (lhj_dxf index 5))
  255.   ;;这里把index的handle作为数据储存,而没有使用objname
  256.             (IA:makeassoc)
  257.   ;是因为用户在undo和oops后,名字会变,而handle不变
  258.           )
  259.           (progn
  260.             (redraw index 4)
  261.             (princ "\n:::TW:::没有选择到[详图图号]!")
  262.           )
  263.        )
  264.      )
  265.      (princ "\n:::TW:::没有选择到[索引]!")
  266.   )


  267.   ;主程序结束=======

  268.   (lhj_end)
  269.   (princ)
  270. )
  271.   [/FONT]


临时反应器随dwg文件的关闭将删除
永久反应器作为一个vla对象,保存在dwg文件中
要删除永久反应器,先要释放它,使之成为临时反应器
(vlr-pers reactor)函数使反应器成为永久反应器
(vlr-pers-release reactor)函数释放永久反应器
(vlr-remove reactor)删除反应器
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-19 12:44:35 | 显示全部楼层
正想学习这方面的内容呢,可惜一时还没看明白。谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-19 17:14:12 | 显示全部楼层
反应器的资料看过,不太了解,学习中......
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-20 16:31:17 | 显示全部楼层
楼主的功力蛮深厚的,反应器我也正在学习中!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-23 09:36:19 | 显示全部楼层
;;樓主程序有一個致命的缺點
;;當它與別的程序(某些永久反應器程序---如我所附的程序,指令:sample---
;;請把圖tr.dwg與sample.vlx放在同一目錄)一起使用時,會有一個現象,
;;當你不冊除反應器時,圖檔存檔再打開,程序都能保持永久反應器
;;但當你冊除反應器再存檔打開時,你的永久反應器將失效......
;;並會提示:error: no function definition: IA:DN_MODIFIED
;;我可沒有故意寫程序來影嚮你的程序!你可用別的類似結構的程序試試!

;;PS:sample.vlx---以線未點為圓心,周長等於線長的永久反應器
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-23 10:28:09 | 显示全部楼层
谢谢楼主,现在这方面的内容挺难找的~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-23 13:02:36 | 显示全部楼层
顶,ACTIVEX正在学习之中!好资料啊!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-23 15:40:41 | 显示全部楼层
LUCAS  ,能把你程序的源码发给我么?
好像你的tr.dwg自动加载sample.vlx,应该是有一个永久反应器保存在dwg文件中的,
你所说的问题的确存在,即使不删除我所定义的永久反应器,问题也重现了。
我不知道你的程序在dwg退出时,是否有反应器。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-23 16:58:55 | 显示全部楼层
1.不是好像----確實是---只要打開tr.dwg圖檔就會自動載入sample.vlx(放在一起的話…)
2.dwg退出時,沒有反應器(你的寫法,我以前也用過…..後來發現那致命的缺點就不用了!)
3.其實最後連打開圖檔自動載入vlx也放棄不用,因自動載入vlx有點危險
(有心人會改為病毒….它不像vba會有警告對話框,程序要做甚麼都可以
……危險…..希望不會發生)     8-(
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-23 20:06:28 | 显示全部楼层
Lucas,能看一下你的源码么,不然我还是搞不懂哪里造成的冲突。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-24 08:18:47 | 显示全部楼层
我也還在找造成冲突的原因, 猜想是獨立變量空間的bug, 它影嚮了其他程序,看來是autocad某些結構的問題,

Reply From: Tanzillo, Tony
Date: Sep/18/03 - 09:06 (GMT)
   
Re:
You don't remove reactors from erased objects, because
they can be unerased (UNDO, OOPS, etc.).
;;永久反應器的麻煩 > 它的好處  ---------8-(
My advice is to avoid persistent reactors entirely as
they're far more trouble than they're worth, even if
they did work correctly.

You can just attach data (e.g., extension dictionaries
with an xrecord) to objects, and when a drawing is opened,
you find and attach non-persistent reactors to all those
objects.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-27 00:50 , Processed in 0.435317 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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