feargt 发表于 2022-7-5 20:13:58

谢谢Tharwat,
 
 
你能解释一下这一节发生了什么吗。。。。。
 
 

........(apply 'strcat (mapcar '(lambda (x) (strcat x ",")) xrf))))))

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

Lee Mac 发表于 2022-7-5 20:16:14

我建议如下:
(defun c:findxref ( / idx ins sel td xrf xrn )
   (while (setq td (tblnext "block" (not td)))
       (and (= (logand (cdr (assoc 70 td)) 4) 4)
            (wcmatch (setq xrn (strcase (cdr (assoc 2 td)))) "*_ELC") ;; Must pass this criteria before being added to the list
            (setq xrf (vl-list* "," xrn xrf))
       )
   )
   (if (setq sel (ssget "_X" (list '(0 . "INSERT") (cons 2 (apply 'strcat (cdr xrf))))))
       (progn
         (repeat (setq idx (sslength sel))
               (setq ins (cons (cadr (assoc 10 (entget (ssname sel (setq idx (1- idx)))))) ins))
         )
         (print ins)
       )
       (princ "\nNo xrefs found.")
   )
   (princ)
)

feargt 发表于 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”……)进行替换不是问题

Tharwat 发表于 2022-7-5 20:21:34

 
如程序所示,您可以在以下程序中添加任意数量的内容,例如(“old”“new”),您需要保存并重新打开图形以查看更改。
 

(defun c:test (/ lst fnd pth)
;; Tharwat 23.06.2015 ;;
(setq lst '(("Xref_1_ELC" "Xref_1_ELC_Sub1") ("Old" "New")))
(vlax-for blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
   (if (and (= :vlax-true (vla-get-isxref blk))
            (setq fnd (assoc (vla-get-name blk) lst))
            (setq pth (findfile (strcat (cadr fnd) ".dwg")))
       )
   (vla-put-path blk pth)
   )
)
(princ)
)(vl-load-com)

feargt 发表于 2022-7-5 20:25:41

谢谢Tharwat,
 
 
我这么做的原因
 
 

(foreach n xrf
   

(setq ss (ssget "_X" (list '(0 . "INSERT")'(67 . 0)(cons 2 (apply 'strcat (mapcar '(lambda (n) (strcat n ",")) xrf))))))
(setq x (car (cdr (assoc 10 (entget ss)))))
      
(print x)



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

)(cons 2 (apply 'strcat (mapcar '(lambda (n) (strcat n ",")) xrf))))))

Tharwat 发表于 2022-7-5 20:30:03

 
首先,mapcar函数将在“xrf”变量中收集的外部参照名称的每个名称后面附加一个逗号,然后使用strcat函数的apply函数将它们收集为一个字符串,以匹配作为dxf代码的ssget功能所需的标准。
 
如。
 

xrf = ("drawing1" "drawing2" "drawing3")

(mapcar '(lambda (n) (strcat n ",")) xrf)
; return: ("drawing1," "drawing2," "drawing3,")

; then using the apply with strcat function to concatenate them all together .

(apply 'strcat (mapcar '(lambda (n) (strcat n ",")) xrf))
; return: "drawing1,drawing2,drawing3,"

feargt 发表于 2022-7-5 20:32:44

但是,接下来的事情难道不可行吗?我的意思是,它是否应该将Xrf中每个外部参照的插入点的X值打印到命令行?
 
 
假设xrf=(“Xref\u 1\u ELC”“Xref\u 2\u ELC”)
 
 
 
 



(foreach n xrf
   
   (setq ss (ssget "_X" (list '(0 . "INSERT")'(67 . 0)(cons 2 n))))

    (print ss)
      
      (setq x (car (cdr (assoc 10 (entget (ssname n 0))))))

    (print x)

      )

Tharwat 发表于 2022-7-5 20:33:48

既然你知道旧的和新的被替换的,你可以使用我在第14号帖子中发布的代码
 
为什么要重新选择相同的块名,因为您可以在立即从块表中检索时进行任何更改?

feargt 发表于 2022-7-5 20:37:39

因为我不仅仅是用另一个外部参照替换它,我还需要在同一个插入点插入第二个外部参照

Tharwat 发表于 2022-7-5 20:40:41

有了vla put path的功能,使用代码将比按计划使用命令更好地解决所有问题。
页: 1 [2]
查看完整版本: 修改外部参照列表