帮助循环#039;转换Byl
大家好,我是Lisp新手,在循环下面的Lisp时遇到了麻烦。我试图选择对象,然后将它们放在与其颜色和线型相关的图层上。例如,我想选择一个BYLAYER=红色和虚线的对象,然后将其放置在名为1DASHED的层上。我已经用下面的代码运行了它,但因为我使用了NENTSEL,我一次只能选择一个对象(它可以工作),我需要它循环运行整个图形中的每个对象,但每次我尝试循环时,我都会收到一个错误,说VARITYP或类似的东西(现在在家里,没有CAD来重新生成错误),我查找了它,这意味着我引用的是一个选择集,而不是一个列表。请帮忙循环这个。我绝望了。(定义C:QQQ(/esl laycol)
(while(not(setq esl(nentsel)));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq LayCol(cdr(cadddr(tblsearch“layer”(cdr(assoc 8(entget(car esl k k)а)))))
(setq LayLin(Cdr(cdddr(tblsearch“layer”(Cdr(assoc 8(entget(car esl Ϟ)Ϟ))))))
(setq LayName(strcat(rtos LayCol)LayLin))
(命令“LAYER”“m”LayName“C”laycol LayName“Ltype”LayLin LayName“”)
(命令“CHPROP”esl““LA”LayName“C”“BYLAYER”“LType”“BYLAYER”)
) 欢迎来到Micko79论坛
试试这个
(defun c:LayMod (/ aDoc lyrsColl ltpotd Lyrs ss ent nme)
(vl-load-com)
(setq aDoc(vla-get-ActiveDocument (vlax-get-acad-object))
lyrsColl (vla-get-layers aDoc)
ltpotd(vla-get-linetypes aDoc)
)
(defun _dxf (ent dx_) (cdr (assoc dx_ ent)))
(defun _lyslst (/ Laylst)
(while (setq a (tblnext "Layer" (null a)))
(if (not (wcmatch (_dxf a 2) "*|*"))
(progn (setq lyp (tblsearch "Layer" (_dxf a 2)))
(setq
Laylst (append
(list (_dxf a 2) (itoa (_dxf a 62)) (_dxf a 6))
Laylst
)
)
)
)
)
Laylst
)
(setq Lyrs (_lyslst))
(if (ssget ":L" '((0 . "~VIEWPORT")))
(progn
(vlax-for itm (setq ss (vla-get-ActiveSelectionSet aDoc))
(setq nme (member (vla-get-layer itm) Lyrs))
(vla-put-layer
itm
(if (vl-catch-all-error-p
(vl-catch-all-apply
'vla-item
(list lyrsColl
(setq lynm (strcat (cadr nme) (caddr nme)))
)
)
)
(progn (vla-add lyrsColl lynm)
(vla-put-color
(vla-item lyrsColl lynm)
(atoi (cadr nme))
)
(if (= nil (tblsearch "LTYPE" (caddr nme)))
(vla-add (vla-get-linetypes ltpotd (caddr nme)))
)
(vla-put-linetype
(vla-item lyrsColl lynm)
(caddr nme)
)
lynm
)
lynm
)
)
(vla-put-linetype itm "ByLayer")
(vla-put-color itm acByLayer)
)
(vla-delete ss)
)
)
(princ)
)
希望这有帮助
如果需要此选项来选择所有对象
更改此
(ssget“:L”'((0.~视口”))
到
(ssget“_X”'((0。“~视口”)) 希望你不要介意,如果我张贴我的尝试与香草代码。
(defun c:TesT (/ ss sset e l New)
;; Tharwat 07 Nov. 2011 ;;
(if (setq ss (ssget "_:L"))
(repeat (setq i (sslength ss))
(setq sset (ssname ss (setq i (1- i))))
(setq e (entget sset))
(setq l (entget (tblobjname "LAYER" (cdr (assoc 8 e)))))
(if (not
(tblsearch
"LAYER"
(setq
New (strcat (itoa (cdr (assoc 62 l))) (cdr (assoc 6 l)))
)
)
)
(progn
(entmakex (list '(0 . "LAYER")
'(100 . "AcDbSymbolTableRecord")
'(100 . "AcDbLayerTableRecord")
(cons 2 New)
(assoc 62 l)
(assoc 6 l)
(cons 70 0)
)
)
(entmod (subst (cons 8 New) (assoc 8 e) e))
)
(entmod (subst (cons 8 New) (assoc 8 e) e))
)
)
(princ)
)
(princ)
) 不用担心,塔尔瓦特。我最初也是用vanilla编写的,但现在我总是假设OP使用注释性实体。
(entmod(subst(cons 8 New)(assoc 8 e)e));
特别是对于注释性多行文字,上面的行会弄乱文字高度
干杯
顺便提一下
此外,您可能需要添加到例程中,根据OP的要求将颜色和线型更改为“Bylayer” 使用entmod函数更改图层不会对注释性文本产生负面影响,这与更改文本高度的entmod相同。
这套程序按预期完成了任务,我想你没有试过,试试吧。 塔瓦,我确实试过了,你认为我为什么建议这么做?
尝试将两个实体的颜色更改为1,将线型更改为虚线,然后运行例程
对于注释性多行文字,不要假设每个人在绘制时使用相同的单位
因为大多数专家阅读代码都没有尝试过(毫无疑问,你就是其中之一)
这是完全正确的,我没有这样想。你说得对。
顺致敬意,
我不是专家,真的。我确实先看了你的代码,我看到你使用了entmod,这促使我说我做了什么,所有这些都是因为我一直在使用这种方法,但对于注释性实体,你永远也不能太确定。
是的,这就是OP想要他的代码做的。
(命令“CHPROP”esl““LA”LayName“C”“BYLAYER”“LType”“BYLAYER”“);
为我的朋友干杯。
请阅读代码发布指南并编辑您的帖子。
页:
[1]