乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 35|回复: 14

[编程交流] LISP几乎正常工作。。。

[复制链接]

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 08:08:38 | 显示全部楼层 |阅读模式
你好
 
首先,我要提到我不熟悉编写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以只插入文件夹一次?我真的很感谢你的帮助。以下是例行程序:
 
  1. ((lambda ( / activeDwgObj pathStr block-list xref-list xrefPathStr)
  2. (vl-load-com)
  3. (princ "\nUpdating XREF paths....")
  4. (setq
  5.    activeDwgObj (vla-get-activedocument (vlax-get-acad-object))
  6.    pathStr (vlax-get activeDwgObj 'Path)
  7. )
  8. (vlax-for for-item
  9.    (vla-get-blocks activeDwgObj)
  10.    (setq block-list (append block-list (list for-item)))
  11. )
  12. (setq xref-list (vl-remove-if '(lambda (x) (= (vla-get-isxref x) :vlax-false)) block-list))
  13. (foreach n xref-list
  14.    (setq xrefPathStr (vlax-get n 'Path))
  15.    (if (eq (substr xrefpathstr 1 1) ".")
  16.      (vlax-put n 'Path (strcat (vl-string-subst "W:\\HILLSBOROUGH\\W_WINDOWS" "W:" PathStr 0) (substr xrefPathStr 2)))
  17.      (vlax-put n 'Path (vl-string-subst "W:\\HILLSBOROUGH\\W_WINDOWS" "W:" xrefPathStr 0))
  18.    )
  19. )
  20. ))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:16:57 | 显示全部楼层
欢迎来到论坛
 
请阅读代码发布指南并编辑您的帖子。
回复

使用道具 举报

4

主题

2143

帖子

2197

银币

限制会员

铜币
-24
发表于 2022-7-6 08:17:48 | 显示全部楼层
欢迎来到论坛!
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 08:23:28 | 显示全部楼层
谢谢大家,我认为这篇文章现在格式正确了。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 08:33:00 | 显示全部楼层
Irneb,
 
非常感谢你的帮助。我们太近了!!当我使用您的代码时,路径正在更改,但会留下一个额外的冒号,如下所示:
 
W: \HILLSBOROUGH\W\u WINDOWS:\06-5214 Dunhams Farm\000\Cad
 
你知道怎么摆脱这个吗?再次感谢。
 
-史蒂夫
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:36:33 | 显示全部楼层
试试这个Steve,
 
  1. (   (lambda ( / p pr )
  2.        (setq pr "W:\\HILLSBOROUGH\\W_WINDOWS")
  3.        (vlax-for b (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
  4.            (if
  5.                (and
  6.                    (eq (vla-get-isxref b) :vlax-true)
  7.                    (not (wcmatch (strcase (setq p (vla-get-path b))) (strcat pr "*")))
  8.                )
  9.                (vl-catch-all-apply 'vla-put-path (list b (strcat pr (substr p 3))))
  10.            )
  11.        )
  12.    )
  13. )
  14. (vl-load-com)
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 08:40:36 | 显示全部楼层
李,
 
它有效!!谢谢你的帮助。现在唯一的问题是需要重新加载外部参照才能显示。在外部参照管理器中,路径正确,但状态为“未找到”。我右键单击并重新加载,外部参照显示。我可以添加第二个例程来自动重新加载外部参照吗?我在网上搜索了一下,找到了一些,但似乎没有一个奏效。我可能没有正确添加例程,我只是在你给我的内容之后粘贴了文本。如下所示:
 
  1. (   (lambda ( / p pr )
  2. (vl-load-com)
  3.        (setq pr "W:\\HILLSBOROUGH\\W_WINDOWS")
  4.        (vlax-for b (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
  5.            (if
  6.                (and
  7.                    (eq (vla-get-isxref b) :vlax-true)
  8.                    (not (wcmatch (strcase (setq p (vla-get-path b))) (strcat pr "*")))
  9.                )
  10.                (vl-catch-all-apply 'vla-put-path (list b (strcat pr (substr p 3))))
  11.            )
  12.        )
  13.    )
  14. )
  15. (defun c:unreload(/ cObj cName)
  16. (setq cObj(tblnext "BLOCK" T))
  17. (while cObj
  18.    (setq cName(cdr(assoc 2 cObj)))
  19.    (if
  20.      (and
  21. (=(logand(cdr(assoc 70 cObj))32)32)
  22. (=(logand(cdr(assoc 70 cObj))4)4)
  23. ); end and
  24.      (progn
  25.       (vl-cmdf "_.xref" "_unload" cName)
  26.       (vl-cmdf "_.xref" "_reload" cName)
  27.       ); end progn
  28.      ); wnd if
  29. (setq cObj(tblnext "BLOCK"))
  30. ); end while
  31.   (princ)
  32. ); end of c:unreload
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:45:14 | 显示全部楼层
也许是这个?(未经测试)
 
  1. 4
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 08:48:14 | 显示全部楼层
就是这样。你是我的英雄!!!谢谢大家帮我解决这个问题。非常感谢。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-9 09:37 , Processed in 0.389002 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表