DuanJinHui 发表于 2022-7-5 17:21:00

问题:选择上的对象

你好
 
我看到一个关于重新加载外部参照的lisp,我发现了一个问题。

(Defun C:xref_reload ( / rnames i e elist rname)
       (setvar "cmdecho" 0)
         (princ "\nSelectobjects on the reference file to be Reloaded:")
         (if (setq SS (ssget))
                   (progn
                           (setq Rnames "")
                           (repeat
                               (setq I (sslength SS))
                               (setq E (ssname SS (setq I (1- I))))
                               (setq ELIST (entget E))
                               (setq Rname (cdr (assoc 2 ELIST)))
                               (command "-xref" "R" Rname)
                               (setq Rnames (strcat Rname ", " Rnames))
                           );end repeat
                           (prompt "\nFiles have been Reloaded:")
                           (princ Rnames)
                   );end progn
         );end if
       (princ)
)

 
问题是:如果此外部参照已卸载。我在图形中看不到此外部参照。那么,如何“选择引用文件上的对象”?
 
我认为需要一个对话框显示卸载参考文件列表,从对话框中选择项目重新加载。
 
我想可以用李的listbox函数来做。谁能帮我?非常感谢。
 
 

DuanJinHui 发表于 2022-7-5 17:28:18

如何获取卸载外部参照列表?

Roy_043 发表于 2022-7-5 17:39:23

这可能有用:
(defun ListUnloadedXrefs ( / ret)
(vlax-for blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
   (if
   (and
       (= :vlax-true (vla-get-isxref blk))
       (not (vla-get-xrefdatabase blk))
   )
   (setq ret (cons (vla-get-name blk) ret))
   )
)
(reverse ret)
)

Lee Mac 发表于 2022-7-5 17:42:15

另一种,使用香草:
(defun unloadedxrefs ( / r x )
   (while (setq x (tblnext "block" (not x)))
       (if (= 4 (logand (cdr (assoc 70 x)) 36))
         (setq r (cons (cdr (assoc 2 x)) r))
       )
   )
   (reverse r)
)
_$ (unloadedxrefs)
("xref")

DuanJinHui 发表于 2022-7-5 17:53:41

 
嗨,罗伊。谢谢你,但我测试,没有成功!
 
我使用acad2011和2015测试,相同的错误:
; 错误:自动化错误。未提供说明。

DuanJinHui 发表于 2022-7-5 17:57:51

 
李,非常感谢!好极了!!!
 
这样地?

(defun c:xr ( )        
(if (unloadedxrefs)
        (progn
                (foreach x (LM:listbox "Select reference file to be Reloaded" (unloadedxrefs) 1)
                        (command "-xref" "R" x)
                )       
                (prompt "\nFiles have been Reloaded:")       
        )
        (prompt "\nNo reference file need reload.")       
)
(princ)
)

Roy_043 发表于 2022-7-5 18:04:49

奇怪的我不知道你为什么会这样。 
您的代码中是否包含此项
(vl-load-com)

DuanJinHui 发表于 2022-7-5 18:12:38

 
嗨,罗伊,是我。

Lee Mac 发表于 2022-7-5 18:20:47

 
不客气!
 
 
是的,这会起作用-您可以通过使用局部变量存储未加载的外部参照列表来稍微提高效率,例如:
(defun c:xr ( / lst )   
   (if (setq lst (unloadedxrefs))
       (progn
         (foreach x (LM:listbox "Select reference file to be Reloaded" lst 1)
               < ... >

DuanJinHui 发表于 2022-7-5 18:26:54

 
李,再次谢谢你。非常有帮助。
页: [1]
查看完整版本: 问题:选择上的对象