slidster 发表于 2022-7-6 08:08:38

LISP几乎正常工作。。。

你好
 
首先,我要提到我不熟悉编写LISP表达式。有人很好,为我写了这封信。不幸的是,我不能完全让它工作,我希望有人在这里可以帮助我。
 
我的公司更新了服务器以及外部参照的文件路径。以下是之前和之后的示例:
 
W: 06-5214 Dunhams农场
 
同样的路径现在是:
 
W: \HILLSBOROUGH\W\U WINDOWS\06-5214 Dunhams Farm\000\Cad
 
目标是在打开新图形时运行此LISP,并通过插入上面的红色部分自动重定向外部参照路径。当我执行为我编写的LISP时,它会重定向外部参照,但会将文件夹添加到路径中两次,如下所示:
 
W: \HILLSBOROUGH\W\u WINDOWS\HILLSBOROUGH\W\u WINDOWS\06-5214 Dunhams Farm\000\Cad
 
 
有没有办法修改LISP以只插入文件夹一次?我真的很感谢你的帮助。以下是例行程序:
 
((lambda ( / activeDwgObj pathStr block-list xref-list xrefPathStr)
(vl-load-com)
(princ "\nUpdating XREF paths....")
(setq
   activeDwgObj (vla-get-activedocument (vlax-get-acad-object))
   pathStr (vlax-get activeDwgObj 'Path)
)
(vlax-for for-item
   (vla-get-blocks activeDwgObj)
   (setq block-list (append block-list (list for-item)))
)
(setq xref-list (vl-remove-if '(lambda (x) (= (vla-get-isxref x) :vlax-false)) block-list))
(foreach n xref-list
   (setq xrefPathStr (vlax-get n 'Path))
   (if (eq (substr xrefpathstr 1 1) ".")
   (vlax-put n 'Path (strcat (vl-string-subst "W:\\HILLSBOROUGH\\W_WINDOWS" "W:" PathStr 0) (substr xrefPathStr 2)))
   (vlax-put n 'Path (vl-string-subst "W:\\HILLSBOROUGH\\W_WINDOWS" "W:" xrefPathStr 0))
   )
)
))

Lee Mac 发表于 2022-7-6 08:16:57

欢迎来到论坛
 
请阅读代码发布指南并编辑您的帖子。

SLW210 发表于 2022-7-6 08:17:48

欢迎来到论坛!

slidster 发表于 2022-7-6 08:23:28

谢谢大家,我认为这篇文章现在格式正确了。

irneb 发表于 2022-7-6 08:28:48

这是一个快速。。。未经测试:
我不确定你的代码到底出了什么问题。我不明白为什么要添加两次路径,除非你打开两次图形。无论如何,我的方法是先检查所需路径是否已添加,然后再进行添加。所以它应该停止添加两次。。。有希望地
 
此外,我还使用了“try”“apply”功能,以避免在使用嵌套外部参照时崩溃。可能不需要,但你永远不知道。

slidster 发表于 2022-7-6 08:33:00

Irneb,
 
非常感谢你的帮助。我们太近了!!当我使用您的代码时,路径正在更改,但会留下一个额外的冒号,如下所示:
 
W: \HILLSBOROUGH\W\u WINDOWS:\06-5214 Dunhams Farm\000\Cad
 
你知道怎么摆脱这个吗?再次感谢。
 
-史蒂夫

Lee Mac 发表于 2022-7-6 08:36:33

试试这个Steve,
 
(   (lambda ( / p pr )
       (setq pr "W:\\HILLSBOROUGH\\W_WINDOWS")
       (vlax-for b (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
         (if
               (and
                   (eq (vla-get-isxref b) :vlax-true)
                   (not (wcmatch (strcase (setq p (vla-get-path b))) (strcat pr "*")))
               )
               (vl-catch-all-apply 'vla-put-path (list b (strcat pr (substr p 3))))
         )
       )
   )
)
(vl-load-com)

slidster 发表于 2022-7-6 08:40:36

李,
 
它有效!!谢谢你的帮助。现在唯一的问题是需要重新加载外部参照才能显示。在外部参照管理器中,路径正确,但状态为“未找到”。我右键单击并重新加载,外部参照显示。我可以添加第二个例程来自动重新加载外部参照吗?我在网上搜索了一下,找到了一些,但似乎没有一个奏效。我可能没有正确添加例程,我只是在你给我的内容之后粘贴了文本。如下所示:
 

(   (lambda ( / p pr )
(vl-load-com)
       (setq pr "W:\\HILLSBOROUGH\\W_WINDOWS")
       (vlax-for b (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
         (if
               (and
                   (eq (vla-get-isxref b) :vlax-true)
                   (not (wcmatch (strcase (setq p (vla-get-path b))) (strcat pr "*")))
               )
               (vl-catch-all-apply 'vla-put-path (list b (strcat pr (substr p 3))))
         )
       )
   )
)
(defun c:unreload(/ cObj cName)
(setq cObj(tblnext "BLOCK" T))
(while cObj
   (setq cName(cdr(assoc 2 cObj)))
   (if
   (and
(=(logand(cdr(assoc 70 cObj))32)32)
(=(logand(cdr(assoc 70 cObj))4)4)
); end and
   (progn
      (vl-cmdf "_.xref" "_unload" cName)
      (vl-cmdf "_.xref" "_reload" cName)
      ); end progn
   ); wnd if
(setq cObj(tblnext "BLOCK"))
); end while
(princ)
); end of c:unreload

Lee Mac 发表于 2022-7-6 08:45:14

也许是这个?(未经测试)
 
4

slidster 发表于 2022-7-6 08:48:14

就是这样。你是我的英雄!!!谢谢大家帮我解决这个问题。非常感谢。
页: [1] 2
查看完整版本: LISP几乎正常工作。。。