明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2480|回复: 7

关于反应器的问题。

[复制链接]
发表于 2003-1-26 16:35:00 | 显示全部楼层 |阅读模式
我写了一个DWG反应器,目的是自动修改文档的存储路径。在使用命令QSAVE,save,saveas时
自动更改我事先写入的路径。但是在加载了这个LISP程序以后,我用CTRL+C进行粘贴复制
时,所选的实体一直保持亮显,直到我用REGEN命令重新生成才会恢复。(当然用别的命令选择这些实体后也会恢复)。我不知道是我的程序有问题还是ACAD本身的问题,想请教各位高手知不知道原因或有没有解决的办法。感激不尽。
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2003-1-26 20:12:00 | 显示全部楼层

把程序贴出来看看,然后才能分析

发表于 2003-1-27 08:46:00 | 显示全部楼层

程序中是否使用了(redraw 实体名 3)这样的函数?

 楼主| 发表于 2003-1-27 10:40:00 | 显示全部楼层

这是程序的代码。请明总帮忙看看。

;|全局变量 *drawingreactor*


(defun fn:writeatt (/ tm cvp newatt factor)
  (setq factor (cdr (assoc 41 (entget (tblobjname "style" "text-s")))))
  (if (and (= (setq tm (getvar "tilemode")) 0)
           (= (setq cvp (getvar "cvport")) 1)
      )
    (setq pt pt)
    (setq pt '(0 0 0))
  )
  (if (= (tblsearch "layer" "Tile") nil)
    (command "_.layer" "n" "Tile" "c" 7 "Tile" "")
    )
  (setq        newatt (vla-addattribute
                 (paper-space)
                 2.5
                 0
                 "Acad FilePath & Filename :"
                 (vlax-3d-point pt)
                 "FILENAME"
                 "filename"
               )
  )
  (vla-put-scalefactor newatt factor)
  (vla-put-stylename newatt "text-s")
  (vla-put-layer newatt "Tite")
  (vla-put-color newatt 7)
  newatt
)

(defun fn:changepath-fn        ()
  (setq cnt 0)
  (if attss
    (repeat (sslength attss)
      (setq attnlst (append
                      attnlst
                      (list (vlax-ename->vla-object (ssname attss cnt)))
                    )
            cnt            (1+ cnt)
      )
    )
  )
  (setq        pa   (getvar "dwgprefix")
        fn   (getvar "dwgname")
        pafn (strcase (strcat pa fn))
  )
  (while attnlst
    (setq attname (car attnlst))
    (setq old-pafn (vla-get-tagstring attname))
    (if        (/= pafn old-pafn)
      (progn
        (vla-put-tagstring attname pafn)
        (vla-put-textstring attname pafn)
        )
      )
    (setq attnlst (cdr attnlst))
  )
)

(defun c:fn (/                 pt            attss      pafn          old-pafn
              attname         cnt            attnlst    objrea          old-cmdecho
              old-ortho         old-osmode pa         fn
             )
  (setq old-ortho (getvar "orthomode") old-osmode (getvar "osmode")
        old-cmdecho (getvar "cmdecho")
        )
  (setvar "cmdecho" 0)
  (if (= (tblsearch "STYLE" "text-s") nil)
    (command "style" "text-s" "romans.shx" "0" "0.8" "0" "n" "n" "n")
    )
  (if (= (setq attss (ssget "X"
                            (list (cons 0 "ATTDEF")
                                  (cons 3 "Acad FilePath & Filename :")
                            )
                     )
         )
         nil
      )
    (progn
      (setq pt (getpoint "\nPick insert point of text :"))
      (setq attnlst (list (fn:writeatt)))
      (fn:changepath-fn)
    )
    (fn:changepath-fn)
  )
  (if (not *drawingreactor*)
    (setq *drawingreactor*
           (vlr-dwg-reactor
             nil
             '((:vlr-beginClose . fn:cleanreactors)
               (:vlr-saveComplete . fn:dwg-saved)
                                        ;(:vlr-dwgFileOpened . fn:dwg-opened)
              )
           )
    )
  )
  (setvar "orthomode" old-ortho)
  (setvar "osmode" old-osmode)
  (setvar "cmdecho" old-cmdecho)
  (princ)
)

(defun CleanReactors ()
  (setq
    *drawingreactor*
     nil                                ; clear the variable
  )

  (mapcar 'vlr-remove-all
          '(:VLR-AcDb-reactor                 :VLR-Editor-reactor
            :VLR-Linker-reactor                 :VLR-Object-reactor
            :VLR-Command-Reactor         :VLR-DeepClone-Reactor
            :VLR-DocManager-Reactor         :VLR-DWG-Reactor
            :VLR-DXF-Reactor                 :VLR-Editor-reactor
            :VLR-Insert-Reactor                 :VLR-Linker-Reactor
            :VLR-Lisp-Reactor                 :VLR-Miscellaneous-Reactor
            :VLR-Mouse-Reactor                 :VLR-Object-Reactor
            :VLR-SysVar-Reactor                 :VLR-Toolbar-Reactor
            :VLR-Undo-Reactor                 :VLR-Wblock-Reactor
            :VLR-Window-Reactor                 :VLR-XREF-Reactor
           )
    )
  )

(defun fn:cleanreactors        (reactor_object data)
  (cleanreactors)
)

(defun fn:dwg-saved (reactor_object data)
  (setq        attss (ssget "X"
                     (list (cons 0 "ATTDEF")
                           (cons 3 "Acad FilePath & Filename :")
                     )
              )
       )
  (fn:changepath-fn)
  )
发表于 2003-1-27 15:09:00 | 显示全部楼层

CTRL+C进行粘贴复制时,触动了:vlr-savecomplete反应器

 楼主| 发表于 2003-1-27 18:30:00 | 显示全部楼层

那么请问龙大侠有没有办法解决或避免?

发表于 2003-1-28 11:14:00 | 显示全部楼层

可以這樣,但感覺不是很好的辦法

(defun FN:DWG-SAVED (REACTOR_OBJECT DATA / N SS)
  (setq SS (ssget "p"))
  (setq        ATTSS (ssget "X"
                     (list (cons 0 "ATTDEF")
                           (cons 3 "Acad FilePath & Filename :")
                     )
              )
  )
  (setq N 0)
  (if (>= (sslength SS) 1)
    (repeat (sslength SS)
      (redraw (ssname SS N) 4)
      (setq N (1+ N))
    )
  )
  (FN:CHANGEPATH-FN)
  ;;(vla-regen (vla-get-activedocument (vlax-get-acad-object))
  ;;acactiveviewport                ;acallviewports
  ;;)
)
 楼主| 发表于 2003-1-28 16:22:00 | 显示全部楼层

虽然解除了亮显,但是多做了工作。我想这可能是AutoCAD本身的一点瑕玭。感谢龙大侠

虽然解除了亮显,但是多做了工作。我想这可能是AutoCAD本身的一点瑕玭。感谢龙大侠的指点。[br]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 04:27 , Processed in 0.161004 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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