乐筑天下

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

[编程交流] 修改外部参照列表

[复制链接]

23

主题

132

帖子

112

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 2022-7-5 20:13:58 | 显示全部楼层
谢谢Tharwat,
 
 
你能解释一下这一节发生了什么吗。。。。。
 
 
  1. ........(apply 'strcat (mapcar '(lambda (x) (strcat x ",")) xrf))))))

 
 
每次似乎只返回列表中第一个外部参照的X值,而不返回列表中下一个外部参照的X值
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 20:16:14 | 显示全部楼层
我建议如下:
  1. (defun c:findxref ( / idx ins sel td xrf xrn )
  2.    (while (setq td (tblnext "block" (not td)))
  3.        (and (= (logand (cdr (assoc 70 td)) 4) 4)
  4.             (wcmatch (setq xrn (strcase (cdr (assoc 2 td)))) "*_ELC") ;; Must pass this criteria before being added to the list
  5.             (setq xrf (vl-list* "," xrn xrf))
  6.        )
  7.    )
  8.    (if (setq sel (ssget "_X" (list '(0 . "INSERT") (cons 2 (apply 'strcat (cdr xrf))))))
  9.        (progn
  10.            (repeat (setq idx (sslength sel))
  11.                (setq ins (cons (cadr (assoc 10 (entget (ssname sel (setq idx (1- idx)))))) ins))
  12.            )
  13.            (print ins)
  14.        )
  15.        (princ "\nNo xrefs found.")
  16.    )
  17.    (princ)
  18. )
回复

使用道具 举报

23

主题

132

帖子

112

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 2022-7-5 20:19:25 | 显示全部楼层
谢谢李的版本。
 
 
可能有助于解释为什么我要为每一个使用。
我想用另外两个外部参照替换现有的外部参照,这两个外部参照需要插入到同一个插入点(仅在x轴上变化)
 
 
举个例子。
替换Xref\u 1\u ELC
 
 
带有Xref\u 1\u ELC\u Sub1和Xref\u 1\u ELC\u Sub2
 
 
我可以通过操纵“n”来获得外部参照的新名称
 
 
(setq xrefn(vl string subst“\u ELC\u Sub1”“\u ELC”n)))
 
 
我认为使用(命令“_.-xref”……)进行替换不是问题
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 20:21:34 | 显示全部楼层
 
如程序所示,您可以在以下程序中添加任意数量的内容,例如(“old”“new”),您需要保存并重新打开图形以查看更改。
 
  1. (defun c:test (/ lst fnd pth)
  2. ;; Tharwat 23.06.2015 ;;
  3. (setq lst '(([color=red]"Xref_1_ELC"[/color] [color=blue]"Xref_1_ELC_Sub1"[/color]) ([color=red]"Old"[/color] [color=blue]"New"[/color])))
  4. (vlax-for blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
  5.    (if (and (= :vlax-true (vla-get-isxref blk))
  6.             (setq fnd (assoc (vla-get-name blk) lst))
  7.             (setq pth (findfile (strcat (cadr fnd) ".dwg")))
  8.        )
  9.      (vla-put-path blk pth)
  10.    )
  11. )
  12. (princ)
  13. )(vl-load-com)
回复

使用道具 举报

23

主题

132

帖子

112

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 2022-7-5 20:25:41 | 显示全部楼层
谢谢Tharwat,
 
 
我这么做的原因
 
 
  1. (foreach n xrf
  2.    
  3. (setq ss (ssget "_X" (list '(0 . "INSERT")'(67 . 0)(cons 2 (apply 'strcat (mapcar '(lambda (n) (strcat n ",")) xrf))))))
  4. (setq x (car (cdr (assoc 10 (entget ss)))))  
  5.       
  6. (print x)

因为我不知道外部参照的名称,我只知道它们以“_ELC”结尾,需要对大约150个图形进行处理
 
 
这就是为什么我想遍历列表中的每个外部参照,获取插入点并使用它插入新的外部参照。每个外部参照将替换为2个外部参照。
主要问题是,您提供的上面的不是返回每个外部参照的插入点(如“n”)而是每次返回列表中第一个外部参照的插入点,而不是遍历它们。
 
 
我一直无法理解这部分代码
 
 
  1. )(cons 2 (apply 'strcat (mapcar '(lambda (n) (strcat n ",")) xrf))))))
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 20:30:03 | 显示全部楼层
 
首先,mapcar函数将在“xrf”变量中收集的外部参照名称的每个名称后面附加一个逗号,然后使用strcat函数的apply函数将它们收集为一个字符串,以匹配作为dxf代码的ssget功能所需的标准。
 
如。
 
  1. xrf = ("drawing1" "drawing2" "drawing3")
  2. (mapcar '(lambda (n) (strcat n ",")) xrf)
  3. ; return: ("drawing1," "drawing2," "drawing3,")
  4. ; then using the apply with strcat function to concatenate them all together .
  5. (apply 'strcat (mapcar '(lambda (n) (strcat n ",")) xrf))
  6. ; return: "drawing1,drawing2,drawing3,"
回复

使用道具 举报

23

主题

132

帖子

112

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 2022-7-5 20:32:44 | 显示全部楼层
但是,接下来的事情难道不可行吗?我的意思是,它是否应该将Xrf中每个外部参照的插入点的X值打印到命令行?
 
 
假设xrf=(“Xref\u 1\u ELC”“Xref\u 2\u ELC”)
 
 
 
 
  1. (foreach n xrf
  2.    
  3.    (setq ss (ssget "_X" (list '(0 . "INSERT")'(67 . 0)(cons 2 n))))
  4.   
  5.     (print ss)
  6.       
  7.         (setq x (car (cdr (assoc 10 (entget (ssname n 0))))))
  8.     (print x)
  9.       )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 20:33:48 | 显示全部楼层
既然你知道旧的和新的被替换的,你可以使用我在第14号帖子中发布的代码
 
为什么要重新选择相同的块名,因为您可以在立即从块表中检索时进行任何更改?
回复

使用道具 举报

23

主题

132

帖子

112

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 2022-7-5 20:37:39 | 显示全部楼层
因为我不仅仅是用另一个外部参照替换它,我还需要在同一个插入点插入第二个外部参照
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 20:40:41 | 显示全部楼层
有了vla put path的功能,使用代码将比按计划使用命令更好地解决所有问题。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 00:54 , Processed in 0.377778 second(s), 70 queries .

© 2020-2025 乐筑天下

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