明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1340|回复: 0

[求助]一个动态统计图块程序遇到的问题?

[复制链接]
发表于 2009-4-12 09:39 | 显示全部楼层 |阅读模式

小弟初学VLISP,参照论坛的一些源程序写了个动态统计图块的程序。就是某个图块的数量随着图块增加、删除自动更新。

图块的增加用了vlr-acdb-reactor反应器,能实现了。删除图块用了vlr-object-reactor反应器,但是它只对运行LISP程序时图中现有的图块有用,对增加的图块再删除无效。

我调试了程序,发现这句(vlr-owner-add objectreactor newvlaobj)没有成功,不知为什么?这句的意图是在图块增加时,把它加入到OWNERS中,使下次删除它时也能触发反应器。源程序如下,请各位前辈赐教。

我在控制台直接运行(vlr-owner-add objectreactor newvlaobj)就能行。纳闷

(defun C:test ()
   (setq entResult (car (entsel "\n 选择计数值(文字)...")))                                  ;选择一个自动更新的计数值
   (setq handResult (cdr (assoc 5 (entget entResult))))
   (setq entblk (car (entsel "\n 选择图块...")))                                             ;选择一个图块,对其计数更新
   (setq blkname (cdr (assoc 2 (entget entblk))))
   (setq blkss (ssget "_x" (list '(0 . "INSERT") (cons 2 blkname)) ))                        ;选择所有同名图块
   (vl-load-com)
   (setq VLALst (VLAlist blkss))                                                             ;转换为VLA对象列表
   (if (/= VLALst nil)
     (progn
       (setq acdbreactor (vlr-acdb-reactor (list handResult blkname) '((:vlr-objectAppended . newinsert))))   ;反应器 增加图块
       (setq objectreactor (vlr-object-reactor VLALst (list handResult blkname) '((:vlr-erased . delinsert))));反应器 删除图块
   ;(vlr-remove-all)
     )
   ) 
)

(defun newinsert(reactor_object obj)                                ;插入图块回调函数
  (vl-load-com)
  (setq Recblkname (cadr (vlr-data reactor_object)))
  (setq newobjname (cadr obj))
  (setq newobj (entget newobjname))
  (setq newblkname (cdr (assoc 2 newobj)))
  (if (= newblkname Recblkname)
    (progn
      (print (strcat "新增图块:" newblkname))
      (setq handResult (car (vlr-data reactor_object)))
      (setq entResult (entget (handent handResult)))
      (setq Resulttext (cdr (assoc 1 entResult)))
      (setq Resultdata (distof Resulttext))
      (setq newResultdata (rtos (+ Resultdata 1) 2 0))
      (entmod (subst (cons 1 newResultdata) (assoc 1 entResult) entResult))

      (setq newvlaobj (vlax-ename->vla-object newobjname))                                 
      (vlr-owner-add objectreactor newvlaobj)                                     !!!这句没有成功!!!
    )
  )
)

(defun delinsert(notifier_object reactor_object parameter_list)      ;删除图块回调函数
  (vl-load-com)
  (setq Recblkname (cadr (vlr-data reactor_object)))
  (print (strcat "删除图块:" Recblkname))
  (setq handResult (car (vlr-data reactor_object)))
  (setq entResult (entget (handent handResult)))
  (setq Resulttext (cdr (assoc 1 entResult)))
  (setq Resultdata (distof Resulttext))
  (setq newResultdata (rtos (- Resultdata 1) 2 0))
  (entmod (subst (cons 1 newResultdata) (assoc 1 entResult) entResult))
)

(defun VLAlist (ss / l i EName VList)                ;VLA对象列表函数
  (setq l (sslength ss))
  (setq i 0 VList nil)
  (while (< i l)
    (setq EName (ssname ss i))                       ;取得图元名
    (setq VLAobj (vlax-ename->vla-object EName))     ;转换对象
    (setq VList (cons VLAobj VList))                 ;添加到表中
    (setq i (1+ i))                                  ;计数器加1
  )
  VList
)

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

本版积分规则

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

GMT+8, 2024-7-4 12:28 , Processed in 0.151261 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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