你能解释一下这一节发生了什么吗。。。。。
........(apply 'strcat (mapcar '(lambda (x) (strcat x ",")) xrf))))))
每次似乎只返回列表中第一个外部参照的X值,而不返回列表中下一个外部参照的X值 我建议如下:
(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)
) 谢谢李的版本。
可能有助于解释为什么我要为每一个使用。
我想用另外两个外部参照替换现有的外部参照,这两个外部参照需要插入到同一个插入点(仅在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”……)进行替换不是问题
如程序所示,您可以在以下程序中添加任意数量的内容,例如(“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)
谢谢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))))))
首先,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,"
但是,接下来的事情难道不可行吗?我的意思是,它是否应该将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)
)
既然你知道旧的和新的被替换的,你可以使用我在第14号帖子中发布的代码
为什么要重新选择相同的块名,因为您可以在立即从块表中检索时进行任何更改? 因为我不仅仅是用另一个外部参照替换它,我还需要在同一个插入点插入第二个外部参照 有了vla put path的功能,使用代码将比按计划使用命令更好地解决所有问题。
页:
1
[2]