kucha007 发表于 2022-10-30 01:28:18

【XNP】删除外部参照路径(无路径)

本帖最后由 kucha007 于 2022-10-31 08:32 编辑

要被一起配合的小伙伴逼疯了....外部参照经常用的绝对路径,换台电脑找都找不到,每次导PDF都要被气个半死...

所以打算使用此插件删除参照的路径,后续找时间会合并到这个帖子:http://bbs.mjtd.com/thread-186306-1-1.html

废了半天劲...却无意中看到更符合我想法的插件,稍微整理了一下也分享给大家,原帖在此:https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/xref-relative-path-lisp/td-p/4792859






kucha007 发表于 2022-10-30 21:44:54


同理,图片参照可以这样玩

(defun C:ImgNP ()
    (ssget "_X" '((0 . "IMAGE")))
    (vlax-for ImageXref (setq ss (vla-get-activeselectionset (vla-get-activedocument(vlax-get-acad-object))))   
          (setq FileNam (apply 'strcat (cdr (fnsplitl (vla-get-ImageFile ImageXref)))));文件名
          (vla-put-ImageFile ImageXref FileNam);删除路径
    )
)


尘缘一生 发表于 2022-10-30 22:04:15

处理完后,打开这个参照图,显示路径还是原来那里啊?

kucha007 发表于 2022-10-30 22:12:06

本帖最后由 kucha007 于 2022-10-30 22:16 编辑

尘缘一生 发表于 2022-10-30 22:04
处理完后,打开这个参照图,显示路径还是原来那里啊?
你需要刷新一下,我只检查了当前文件所在目录是否存在参照。
如果你的参照在别的文件夹,用相对或者绝对的方式参照,这个插件改为无路径以后,在当前文件所在目录找不到参照,无法重载,自然也就不会刷新了(但实际上已经改了),你可以用这个刷新一下(command "-xref" "R" "*")

尘缘一生 发表于 2022-10-31 06:53:50

kucha007 发表于 2022-10-30 22:12
你需要刷新一下,我只检查了当前文件所在目录是否存在参照。
如果你的参照在别的文件夹,用相对或者绝对 ...

[*];;参照改相对路径并重载全部------(一级)--------
[*](defun xrxd (/ ssg blnum i n obj elist blkdef path oldfiledia)
[*](setq ssg (ssget "x" '((0 . "insert"))))
[*](setq i 0 n 0)
[*](if ssg
[*]    (repeat (sslength ssg)
[*]      (setq blnum (dxf1 (ssname ssg i) 2)) ;;参照名
[*]      (setq obj (vla-item *BLKS* blnum))
[*]      (if (= (vla-get-isxref obj) :vlax-true) ;_判断给定的图块是否为XRef图块
[*]      (progn
[*]          (setq elist (entget (tblobjname "block" blnum))) ;_获取参照图块的图元表
[*]          (setq blkdef (en2obj (dxf1 elist 330)))
[*]          (setq path (vla-get-path blkdef)) ;_取得外部参照的路径
[*]          (setq path (vl-filename-base path)) ;_去掉文件的路径和扩展名,返回文件的名称
[*]          (vla-put-path blkdef (strcat ".\\" path ".dwg")) ;_参照图块路径改为“相对路径”
[*]          (setq n (1+ n))
[*]      )
[*]      )
[*]      (setq i (1+ i))
[*]    )
[*])
[*](if (> n 0)
[*]    (progn
[*]      (setq oldfiledia (getvar "filedia"))
[*]      (setvar "FILEDIA" 0)
[*]      (command "-xref" "r" "*")
[*]      (setvar "FILEDIA" oldfiledia)
[*]      (prompt (strcat "\n 总共有 \" " (itoa n) " \"个参照物体路径改为相对路径."))
[*]    )
[*]    (princ "\n **** 没有外部参照 或 外部参照没有加载 ****")
[*])
[*](princ)
[*])
[*];;删除参照路径,不带前面\\-----------------C:XNP
[*](defun c:tt (/ Old_Cmd FileNam)
[*](setq Old_Cmd (getvar "cmdecho"))
[*](_undo1)
[*](setvar "cmdecho" 0)
[*](vlax-for xref (vla-get-blocks *AcDocument* )
[*]    (if (= :vlax-true (vla-get-isxref xref))
[*]      (progn
[*]      (setq FileNam (apply 'strcat (cdr (fnsplitl (vla-get-path xref)))))
[*]      (vla-put-path xref FileNam) ;删除路径
[*]      (if (/= (findfile FileNam) nil)
[*]          (vla-reload xref) ;重载参照
[*]      )
[*]      )
[*]    )
[*])
[*](_undo2)
[*](command "redraw")
[*](setvar "cmdecho" Old_Cmd)
[*](princ)
[*])


是不是这个意思,那就是改相对路径,连前面的\\都不要就是。
关于LST1是不是可以不要这一部分,就是显示罢了?



kucha007 发表于 2022-10-31 08:22:25

本帖最后由 kucha007 于 2022-10-31 08:44 编辑

尘缘一生 发表于 2022-10-31 06:53;;参照改相对路径并重载全部------(一级)--------(defun xrxd (/ ssg blnum i n obj elist blk ...
特殊时期,早点休息啊:lol
lst1是因为之前一直出错,我就想收集路径看看,结果最后就变成跳出循环再处理了,确实可以不用。我现在还留着,就当在命令行打印哪些参照被处理了吧。
另外我无意中发现另一个更符合我思路的插件:只有在找到参照的情况下才删除路径,这样重载就不会报错了,还支持图片参照(本来这是我下一步想做的,现在直接放弃哈哈哈)
我按照自己的思路梳理了一遍代码,前人的智慧得继承下来啊,有兴趣也可以看看;P

kucha007 发表于 2022-10-31 09:25:40

kucha007 发表于 2022-10-31 08:22
特殊时期,早点休息啊
lst1是因为之前一直出错,我就想收集路径看看,结果最后就变成跳出循环再处理 ...
另外我觉得这个帖子下一步的走向应该是在嵌套文件夹内寻找参照了,如果找到,就改为无路径。

moshouhot 发表于 2023-12-1 17:31:23

居然你去年就做好了我想要的功能,赶紧学习一下。

elepeipei 发表于 2024-3-29 09:40:05

大佬们我是有外部参照打开文件就出现让我去文件夹里选文件, 这种可以屏蔽吗,看着还没有到我可以执行点的阶段
页: [1]
查看完整版本: 【XNP】删除外部参照路径(无路径)