乐筑天下

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

[编程交流] 外部参照保存的路径查找和重放

[复制链接]

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 15:15:05 | 显示全部楼层 |阅读模式
大家好,
 
长期读者,很少张贴海报。我想这次我找到了一个很好的答案,但找不到解决办法。
 
我正在寻找并替换数百个外部参照路径中的字符串。我需要更改的不是路径,而是图形名称中的字符串。例如:
 
“otl”应找到并替换为“int”
 
*\计划\p\u otl\u 001。图纸->*\平面图\ p\U int\U 001。图纸
*\计划\p\u otl\u 002。dwg->*\平面图\p\U int\U 002。图纸
 
我可以使用“重命名”快速更改参照名称,“参照管理器”可以更改所有路径,但只影响文件路径,而不影响图形的名称。用*通配符重读也不起作用。
 
我已经搜索了几个小时的脚本,将实现这一点,但我似乎找不到一个。以前有人找到过解决方法吗?(一有机会我就给你买很多啤酒。)
 
使用AutoCAD Architecture 2012。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 15:26:15 | 显示全部楼层
这是一个非常简单的查找和替换图形文件重命名器,使用风险自负:
 
  1. ([color=BLUE]defun[/color] c:fixdwg ( [color=BLUE]/[/color] dir new old )
  2.    ([color=BLUE]if[/color]
  3.        ([color=BLUE]and[/color]
  4.            ([color=BLUE]setq[/color] old ([color=BLUE]getstring[/color] [color=BLUE]t[/color] [color=MAROON]"\nSpecify string to find: "[/color]))
  5.            ([color=BLUE]setq[/color] new ([color=BLUE]getstring[/color] [color=BLUE]t[/color] [color=MAROON]"\nSpecify string to replace: "[/color]))
  6.            ([color=BLUE]setq[/color] dir (LM:BrowseForFolder [color=MAROON]"Select directory of drawings to rename"[/color] [color=BLUE]nil[/color] 0))
  7.        )
  8.        ([color=BLUE]foreach[/color] dwg ([color=BLUE]vl-directory-files[/color] dir [color=MAROON]"*.dwg"[/color] 1)
  9.            ([color=BLUE]if[/color] ([color=BLUE]vl-string-search[/color] old ([color=BLUE]vl-filename-base[/color] dwg))
  10.                ([color=BLUE]vl-file-rename[/color]
  11.                    ([color=BLUE]strcat[/color] dir [color=MAROON]"\"[/color] dwg)
  12.                    ([color=BLUE]strcat[/color] dir [color=MAROON]"\"[/color] ([color=BLUE]vl-string-subst[/color] new old ([color=BLUE]vl-filename-base[/color] dwg)) [color=MAROON]".dwg"[/color])
  13.                )
  14.            )
  15.        )
  16.    )
  17.    ([color=BLUE]princ[/color])
  18. )
  19. [color=GREEN];;------------------=={ Browse for Folder }==-----------------;;[/color]
  20. [color=GREEN];;                                                            ;;[/color]
  21. [color=GREEN];;  Displays a dialog prompting the user to select a folder.  ;;[/color]
  22. [color=GREEN];;------------------------------------------------------------;;[/color]
  23. [color=GREEN];;  Author: Lee Mac, Copyright © 2012 - www.lee-mac.com       ;;[/color]
  24. [color=GREEN];;------------------------------------------------------------;;[/color]
  25. [color=GREEN];;  Arguments:                                                ;;[/color]
  26. [color=GREEN];;  msg - message to display at top of dialog                 ;;[/color]
  27. [color=GREEN];;  dir - root directory (or nil)                             ;;[/color]
  28. [color=GREEN];;  flg - bit coded flag specifying dialog display settings   ;;[/color]
  29. [color=GREEN];;------------------------------------------------------------;;[/color]
  30. [color=GREEN];;  Returns:  Selected folder filepath, else nil              ;;[/color]
  31. [color=GREEN];;------------------------------------------------------------;;[/color]
  32. ([color=BLUE]defun[/color] LM:BrowseForFolder ( msg dir flg [color=BLUE]/[/color] err shell fold self path )
  33.    ([color=BLUE]setq[/color] err
  34.        ([color=BLUE]vl-catch-all-apply[/color]
  35.            ([color=BLUE]function[/color]
  36.                ([color=BLUE]lambda[/color] ( [color=BLUE]/[/color] acapp hwnd )
  37.                    ([color=BLUE]if[/color] ([color=BLUE]setq[/color] acapp ([color=BLUE]vlax-get-acad-object[/color])
  38.                              shell ([color=BLUE]vla-getinterfaceobject[/color] acapp [color=MAROON]"shell.application"[/color])
  39.                              hwnd  ([color=BLUE]vl-catch-all-apply[/color] '[color=BLUE]vla-get-hwnd[/color] ([color=BLUE]list[/color] acapp))
  40.                              fold  ([color=BLUE]vlax-invoke-method[/color] shell 'browseforfolder ([color=BLUE]if[/color] ([color=BLUE]vl-catch-all-error-p[/color] hwnd) 0 hwnd) msg flg dir)
  41.                        )
  42.                        ([color=BLUE]setq[/color] self ([color=BLUE]vlax-get-property[/color] fold 'self)
  43.                              path ([color=BLUE]vlax-get-property[/color] self 'path)
  44.                              path ([color=BLUE]vl-string-right-trim[/color] [color=MAROON]"\"[/color] ([color=BLUE]vl-string-translate[/color] [color=MAROON]"/"[/color] [color=MAROON]"\"[/color] path))
  45.                        )
  46.                    )
  47.                )
  48.            )
  49.        )
  50.    )
  51.    ([color=BLUE]if[/color] self  ([color=BLUE]vlax-release-object[/color]  self))
  52.    ([color=BLUE]if[/color] fold  ([color=BLUE]vlax-release-object[/color]  fold))
  53.    ([color=BLUE]if[/color] shell ([color=BLUE]vlax-release-object[/color] shell))
  54.    ([color=BLUE]if[/color] ([color=BLUE]vl-catch-all-error-p[/color] err)
  55.        ([color=BLUE]prompt[/color] ([color=BLUE]vl-catch-all-error-message[/color] err))
  56.        path
  57.    )
  58. )
  59. ([color=BLUE]vl-load-com[/color]) ([color=BLUE]princ[/color])

 
对于给定的示例,键入“otl”作为“find”字符串,键入“int”作为“replace”字符串。
回复

使用道具 举报

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 15:34:55 | 显示全部楼层
李,非常感谢你的代码和怪物快速回复。但是,这会更改图形文件的名称,但我想知道是否可以更改当前图形中保存的路径的名称。
 
我可能还应该提到,我对RhinoScript和一些方面很有经验。网为蚱蜢,但尚未跳转到。NET for AutoCAD。这是名单上的下一个。
 
算上我是《非常简单》的粉丝,再次感谢你的关注。。。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 15:39:07 | 显示全部楼层
 
我想我误解了你的要求;当你在第一篇帖子中说:“我需要更改的不是路径,而是图形名称中的字符串。”,我认为这意味着您不希望更改外部参照路径特性,而是希望更改外部参照引用的图形文件的物理文件名。
 
试试这个:
请注意,需要关闭并重新打开图形,才能使外部参照块定义中的更改反映在图形中的外部参照参照参照中。
 
由于我不能保证在这方面花费太多时间,上面的代码极其简单,查找/替换字符串是硬编码的,并且区分大小写。查找/替换操作也将仅替换外部参照源图形文件名中第一个出现的查找字符串。
回复

使用道具 举报

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 15:46:30 | 显示全部楼层
 
是的,我想那个句子有点模棱两可。无论如何,非常感谢你花时间来看这个。也感谢您解释注意事项。这对我有很大帮助,我相信对其他人也会有帮助。
 
我已经插入了你第一次发布成功的用户输入部分。也可以编辑pth部分,但不管怎样:
 
  1. (defun c:fixpath ( / new old pth )
  2.       
  3.            (setq old (getstring t "\nSpecify string to find: "))
  4.            (setq new (getstring t "\nSpecify string to replace: "))
  5.    (vlax-for blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
  6.        (if
  7.            (and
  8.                (= :vlax-true (vla-get-isxref blk))
  9.                (vl-string-search old (vl-filename-base (setq pth (vla-get-path blk))))
  10.            )
  11.            (vla-put-path blk
  12.                (strcat
  13.                    (vl-filename-directory pth) "\"
  14.                    (vl-string-subst new old (vl-filename-base pth)) ".dwg"
  15.                )
  16.            )
  17.        )
  18.    )
  19.    (princ)
  20. )
  21. (vl-load-com) (princ)

 
再次感谢你。非常有帮助。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 15:54:07 | 显示全部楼层
 
不客气,谢谢你的礼貌和感激。
这只是仓促编写的代码,但我很高兴它将为您节省一些时间。
 
 
好东西
 
 
但我不知道你这是什么意思?
回复

使用道具 举报

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 15:56:24 | 显示全部楼层
 
啊,我只是误读了代码,认为pth参数什么都没有。我的错误。
 
后来我发现我想在外部参照路径中查找并替换,然后将引用名称重命名为新建立的路径(这样我就不必乱用rename命令),然后重新加载所有引用以显示结果。为了做到这一点,我非常笨拙地拼凑了三段独立的代码,并取得了成功——至少在我的具体案例中是这样。没有错误捕捉和一些潜在的有缺陷的逻辑,但这里是:
 
  1. (defun c:fixpath4 ( / new old pth )
  2.       
  3.            (setq old (getstring t "\nSpecify string to find: "))
  4.            (setq new (getstring t "\nSpecify string to replace: "))
  5.    (vlax-for blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
  6.        (if
  7.            (and
  8.                (= :vlax-true (vla-get-isxref blk))
  9.                (vl-string-search old (vl-filename-base (setq pth (vla-get-path blk))))
  10.            )
  11.            (vla-put-path blk
  12.                (strcat
  13.                    (vl-filename-directory pth) "\"
  14.                    (vl-string-subst new old (vl-filename-base pth)) ".dwg"
  15.                )
  16.            )
  17.        )
  18.    )
  19. (vlax-for bo (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
  20. (if (= (vla-get-IsXref bo) :vlax-true)
  21. (progn
  22. (setq name (vla-get-Path bo))
  23. (while (wcmatch name "*\\*")
  24. (setq name (substr name (+ (vl-string-search "\" name) 2)))
  25. )
  26. (while (wcmatch name "*.[dD][wW][gG]")
  27. (setq name (substr name 1 (- (strlen name) 4)))
  28. )
  29. (vl-catch-all-apply 'vla-put-Name (list bo name))
  30. )
  31. )
  32. )
  33. (setvar "modemacro" "Reloading loaded xrefs......please wait......")
  34. (setvar "cmdecho" 0)
  35. (setq cObj(tblnext "BLOCK" T))
  36. (while cObj
  37. (setq cName(cdr(assoc 2 cObj)))
  38. (if
  39. (and
  40. (=(logand(cdr(assoc 70 cObj))32)32)
  41. (=(logand(cdr(assoc 70 cObj))4)4)
  42. ); end and
  43. (progn
  44. (vl-cmdf "_.xref" "_unload" cName)
  45. (vl-cmdf "_.xref" "_reload" cName)
  46. ); end progn
  47. ); wnd if
  48. (setq cObj(tblnext "BLOCK"))
  49. ); end while
  50. (setvar "modemacro" ".")
  51. (setvar "cmdecho" 1)
  52. (prompt "\n--- Xref change finished! ---")
  53.    (princ)
  54. )
  55. (vl-load-com) (princ)

 
借用此线程:http://www.cadtutor.net/forum/showthread.php?62998-更改“引用名称”以匹配外部参照文件名&
 
在花了6-8个小时深夜研究代码片段和大量建议之后,我不得不说,这种lisp语言令人耳目一新。很遗憾,我很难找到它的文档,而且沼泽不接受新成员!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:03:41 | 显示全部楼层
 
没问题
 
 
由于我的代码已经在块集合内的外部参照上迭代,因此可以压缩为:
 
  1. 4
回复

使用道具 举报

3

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 16:14:05 | 显示全部楼层
李,帮了大忙。再次感谢你。
回复

使用道具 举报

2

主题

22

帖子

19

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 16:18:59 | 显示全部楼层
我有一个excel电子表格数据链接ed中约30个单元格的绘图。
大家偶尔我会对excel文件进行更改,并将其保存为新版本。。。
 
..\电气数据v8.4。xlsx公司
 
..\电气数据v8.5。xlsx公司
 
然后,我转到外部参照管理器,选择其中一个数据链接的保存路径,并更改保存路径文件的名称。全选,复制,转到下一个数据链接,全选,粘贴。。。
 
在我的图形中,数据链接和单元格范围的名称不会更改,但它们引用的文件会更改。
 
我欢迎任何反馈或代码帮助。
 
提前谢谢。
 
 
 
接下来:我确实发现数据链接信息存储在图形的字典文件中,但显示了外部参照
 
 
(defun c:列表字典(/ed ed1)
(提示“\n当前图形中的词典:”)
(foreach ed(entget(namedobjdict))
(程序
(条件((=(car ed)3)
(提示(strcat“\n”(cdr ed)))
((=(car ed)350)
(程序
(foreach ed1(entget(cdr ed))
(if(=(汽车ed1)3)
(提示(strcat“\n”(cdr ed1)))
)
)
))
)
)
)
(普林斯)
)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:04 , Processed in 2.238374 second(s), 72 queries .

© 2020-2025 乐筑天下

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