Bill Tillman 发表于 2022-7-6 06:19:45

LISP代码异常

我有一个非常简洁的LISP,我在不久前发现它可以将所有外部参照绑定到图形。这一直在起作用,或者至少我认为它在起作用。我知道我可以确认它曾经是有效的。我还可以确认,如果我手动运行它,它将工作。。。刚刚测试过。但当它运行时,就会出现问题。
 

(defun bind_xrefs ( / CMD)
(setq oldBnType(getvar "bindtype"))
(setq CMD (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setvar "bindtype" 0)
(setq XLIST (xref-status))
(if XLIST
   (progn
   (prompt "\nBinding all Xrefs...")
   (foreach n XLIST (rem-xref n))
   (command "-xref" "b" "*" )
   (prompt "...done")(terpri)
   )
)
(setvar "CMDECHO" CMD)
(setvar "bindtype" oldBnType)
(princ)
)

(defun rem-xref ( XL / XNAME XSTATUS )
(setq XNAME (nth 0 XL))
(setq XSTATUS (nth 2 XL))
(if (= XSTATUS "UNLOADED")
   (rem_unload)
)
(if (= XSTATUS "UNRESOLVED")
   (rem_unload)
)
)

(defun xref-status ( / d n f r)
(while (setq d (tblnext "block" (null d)))
   (cond
   (
       (eq 4 (logand 4 (cdr (assoc 70 d))))
       (setq
         d (entget (tblobjname "block" (cdr (assoc 2 d))))
         n (cdr (assoc 2 d))
         p (cdr (assoc 3 d))
         f (cdr (assoc 70 d))
       )
       (setq r
         (cons
         (list n p
             (cond
               ( (eq 32 (logand 32 f)) "LOADED")
               ( (assoc 71 d) "UNLOADED")
               ( t "UNRESOLVED")
             )
         )
         r
         )
       )
   )
   )
)
(reverse r)
)

(defun rem_unload ( / )
(setq DFILE (findfile "dummy.dwg"))
(if (not DFILE)
   (prompt "\nCannot find dummy_xref drawing ")
   (progn
   (command "-xref" "p" XNAME DFILE)
   (command "-xref" "r" XNAME)
   )
)
); end bind_xrefs function

 
我的主LISP程序使用以下代码加载并运行此程序:
 

   (load "//long_novell_path/ACAD_Enterprise/VLISP/bind_xrefs.lsp")
   (bind_xrefs)

 
当主程序执行时,所有的事情都按计划发生,除了最后两行代码在它的末尾附近运行。当主程序结束时,我进行了检查,所有四个外部参照仍插入到图形中,未绑定。我在这些行附近切换了一个断点,并观察它逐步通过load命令和bind\u xrefs函数中的每一行。但显然它并没有绑定外部参照。
 
奇怪的是,如果我在命令窗口中手动输入最后两个命令,效果很好。但从主程序全速运行时,情况并非如此。更奇怪的是,在某个时刻,我可以用一品脱的吉尼斯黑啤酒发誓它奏效了。我们在过去检查了很多次,在文件保存并自动关闭之前,外部参照被动态绑定。几天前,一位用户来找我,抱怨她的客户看不到标题栏,反而看到了一条丢失的外部参照信息。所以我今天又开始测试了一次,如果我能弄清楚发生了什么变化,那我就该死了。

Bill Tillman 发表于 2022-7-6 07:36:22

好的,我想我可能发现了一些与原来不同的东西。在执行绑定操作之前,LISP程序会删除两个布局选项卡。起初,这些布局选项卡只是空白页,上面有一个简单的边框。不久前,另一个外部参照(标题栏)被添加到两个布局中。删除这些选项卡时,其上的外部参照将变为未参照,因此在尝试绑定其他外部参照时,这两个选项卡会导致某种冲突。因此,为什么它曾经有效,但现在不再有效。我刚刚测试并证实了这个假设。为了解决这个问题,我切换了命令的顺序,首先绑定,然后删除两个布局选项卡。
 
这一点很长时间都没有被注意到,因为只有在99%的时间里只请求PDF的web用户才会受到影响。当用户突然想要更多的DWG文件除了PDF的,它变得引人注目。
 
生活和学习!
页: [1]
查看完整版本: LISP代码异常