小弟初学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 ) |