将对象移动到新层
我有一个lisp,我拼凑在一起,得到一个dxf输出,并将其重新排列到一组标准层上。我得到了一个错误,但我想知道是否有人可以写得更有效??
谢谢
(defun c:DoerVer(/)
(command "_.-layer" "_N" "CCC_DOER_LA0001" "_M" "CCC_DOER_LA0001" "_C" "253" "CCC_DOER_LA0001" "_LW" "0.3" "CCC_DOER_LA0001" "" )
(command "_.-layer" "_N" "CCC_DOER_LA0002" "_M" "CCC_DOER_LA0002" "_C" "7" "CCC_DOER_LA0002" "_LW" "0.3" "CCC_DOER_LA0002" "" )
(command "_.-layer" "_N" "CCC_DOER_LA0003" "_M" "CCC_DOER_LA0003" "_C" "84" "CCC_DOER_LA0003" "_LW" "0.3" "CCC_DOER_LA0003" "" )
(command "_.-layer" "_N" "CCC_DOER_LA0004" "_M" "CCC_DOER_LA0004" "_C" "1" "CCC_DOER_LA0004" "_LW" "0.3" "CCC_DOER_LA0004" "" )
(command "_.-layer" "_N" "CCC_DOER_LA0005" "_M" "CCC_DOER_LA0005" "_C" "2" "CCC_DOER_LA0005" "_LW" "0.3" "CCC_DOER_LA0005" "" )
(command "_.-layer" "_N" "CCC_DOER_LA0006" "_M" "CCC_DOER_LA0006" "_C" "7" "CCC_DOER_LA0006" "_LW" "0.3" "CCC_DOER_LA0006" "" )
(command "_change" "all" """p" "layer" "CCC_DOER_LA0006" "" )
(setq blue(ssget "x" '((62 . 5))))
(command "_change" blue """p" "layer" "CCC_DOER_LA0001" "color" "bylayer" "")
(setq magenta(ssget "x" '((62 . 6))))
(command "_change" magenta """p" "layer" "CCC_DOER_LA0002" "color" "bylayer" "")
(setq green(ssget "x" '((62 . 3))))
(command "_change" green """p" "layer" "CCC_DOER_LA0003" "color" "bylayer" "")
(setq red(ssget "x" '((62 . 1))))
(command "_change" red """p" "layer" "CCC_DOER_LA0004" "color" "bylayer" "")
(setq yellow(ssget "x" '((62 . 2))))
(command "_change" yellow """p" "layer" "CCC_DOER_LA0005" "color" "bylayer" "")
(setq text1(ssget "x" '((8 . "TEXT"))))
(command "_change" text1 """p""color" "bylayer" "")
(princ)
)
不确定这是否是将数据制成表格的最佳方式,但它应该比您使用的更快。
(defun c:DoerVer (/ *error* Make_Layer Layers obj ss tag)
(vl-load-com)
(setq Layers
; Old Color ; New Layer ; Layer Color ; Layer Lineweight
'((5 . ("CCC_DOER_LA0001" 253 "030"))
(6 . ("CCC_DOER_LA0002" 7 "030"))
(3 . ("CCC_DOER_LA0003" 84 "030"))
(1 . ("CCC_DOER_LA0004" 1 "030"))
(2 . ("CCC_DOER_LA0005" 2 "030"))
(nil . ("CCC_DOER_LA0006" 7 "030")))
)
(setq *doc* (cond (*doc*) ((vla-get-ActiveDocument
(vlax-get-acad-object)))))
(defun *error* (msg)
(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
(princ (strcat "\n** Error: " msg " **")))
(princ))
(defun Make_Layer (lay Col LnW)
(cond ((tblsearch "LAYER" lay))
((setq lObj (vla-add (vla-get-Layers *doc*) lay))
(vla-put-color lObj Col)
(vla-put-lineweight lObj
(eval (read (strcat "acLnWt" LnW)))))))
(mapcar
(function
(lambda (x) (apply (function Make_Layer) (cdr x)))) Layers)
(if (ssget "_X")
(progn
(vlax-for obj (setq ss (vla-get-ActiveSelectionSet *doc*))
(if (setq tag (assoc (vla-get-color obj) Layers))
(mapcar
(function
(lambda (x y) (vlax-put-property obj x y))) '(color layer)
(list acByLayer (cadr tag))))
(if (eq "TEXT" (vla-get-layer obj))
(vla-put-color obj acByLayer)))
(vla-delete ss)))
(princ))
谢谢你,李。这很管用。另一件事,我正在应用lisp的输出文件的一部分创建了两条垂直间距始终为2.25个单位的绿线。我包括dxf以了解我的意思。它们都是相同的颜色。是否可以选择较低的线并将其移动到层CCC\u DOER\u LA0005。这是一个很长的部分。
我还为一组横截面运行了此lisp的修改版本。每个横截面也包含两条绿线。是否可以扫描图形并将较低的绿线移动到要关闭的单独图层??
谢谢
您必须使用线的某些特征创建ssget过滤器-无论它始终处于某个高程,或者y坐标始终相同,或者它具有已知长度。
但是,在没有任何定义特征的情况下自动选择一行是一场噩梦。。。 好啊
无论如何谢谢李。值得一试。
好吧,我并不是说这是不可能的-但这条线有任何“定义”的特点,把它从其他线,你不想选择? 谢谢李,但他们是同一行只有2.25分开。没有任何区别。别担心。
.. 好啊
页:
[1]