使用lisp修改图层
对不起,如果这一切都已经准备好处理,但我找不到任何东西时,我做了搜索。使用2008年和目前获得的所有图层(约60)具有相同的笔颜色、线型和厚度的图纸。
因此,所有线路都是相同的。
由于我从这个partiuclur源获得的所有图形都具有相同的图层和图层名称,我认为可能会有一个lisp例程,它将笔的颜色、线型和厚度更改为预先确定的值,这样我就可以用新的图层值保存图形。
你可以假设一个particluer层名称是“water\u tap”,这样我就可以看到例程中发生了什么,然后我可以通过复制所有其他层名称的相关代码,在例程中添加所有需要更改的其他层名称。
希望这有意义。
当做 这可能与:
http://www.cadtutor.net/forum/showthread.php?t=30508
看看这是否有点帮助。 我确信还有比这更好的方法,但我正在试验mapcar。。
; w ~ layer name
; x ~ layer colour
; y ~ linetype
; z ~ lineweight (0 - 2.11)
(defun laychng (w x y z)
(if (not (tblsearch "Layer" w))
(progn
(setvar "cmdecho" 0)
(command "-layer" "m" w "c" x w "lt" y w "lw" z w "")
(setvar "cmdecho" 1)
) ;_end progn
(progn
(setvar "cmdecho" 0)
(command "-layer" "c" x w "lt" y w "lw" z w "")
(setvar "cmdecho" 1)
) ;_end progn
) ;_end if
(princ)
) ;_end defun
(defun c:layerchanger ()
(mapcar
'laychng
'("water_tap" "B-layer" "C-layer" "D-layer" "E-layer") ; w
'("1" "2" "3" "4" "5") ; x
'("HIDDEN" "HIDDEN" "HIDDEN" "HIDDEN" "HIDDEN") ; y
'("0.2" "0.3" "0.8" "1.5" "2.1") ; z
) ;_end mapcar
(princ)
) ;_end defun
谢谢你这么快回复我。
有没有办法重写代码,使每一层都有自己的代码行来更改笔的颜色、线宽和线型,以便更容易修改某一层(例如第34层)
如果我没看错的话
“(“water_tap”“B-layer”“C-layer”“D-layer”“E-layer”);w
'("1" "2" "3" "4" "5") ; x
“(HIDDEN”“HIDDEN”“HIDDEN”“HIDDEN”“HIDDEN”);y
'("0.2" "0.3" "0.8" "1.5" "2.1") ; z
我必须沿着直线数到第34位才能更改单个参数。
这有意义吗?
当做
亨利 我知道你来自哪里,我意识到这不是最好的方式,但正如我所说,我想试试mapcar
试试这个
; w ~ layer name
; x ~ colour
; y ~ linetype
; z ~ lineweight
(defun c:test (/ *error* varlist oldvars)
(defun *error* (msg)
(mapcar 'setvar varlist oldvars)
(if (= msg "")
(princ "\nFunction Complete.")
(princ "\nError or Esc Pressed.")
) ;_end if
(princ)
) ;_end defun
(setq varlist (list "CMDECHO" "CLAYER")
oldvars (mapcar 'getvar varlist)
) ;_end setq
(setvar "cmdecho" 0)
(defun chnglay (w x y z)
(if (not (tblsearch "Layer" w))
(command "-layer" "m" w "c" x w "lt" y w "lw" z w "")
(command "-layer" "c" x w "lt" y w "lw" z w "")
) ;_end if
(princ)
) ;_end defun
(chnglay "water_tap" "2" "Hidden" "1.5")
(*error* "")
(princ)
) ;_end defun
添加更多线,如高亮显示的示例,以更改更多层。 好极了,好极了,好极了。。。。。但我有一个问题。
因为我有大约20层,从单词water开始(例如water\u tap、water\u hose、water\u conn等)
lisp是否具有等价的通配符,例如wat*
因此,你可以用一行文字来改变20层,而不是用20行文字来改变20层
因为我对所有以水开始的层都有相同的属性,所以在本例中,1行文本可以更改为20。
希望这有意义 试试这个:
; w ~ layer name
; x ~ colour
; y ~ linetype
; z ~ lineweight
(defun c:test (/ *error* varlist oldvars)
(defun *error* (msg)
(mapcar 'setvar varlist oldvars)
(if (= msg "")
(princ "\nFunction Complete.")
(princ "\nError or Esc Pressed.")
) ;_end if
(princ)
) ;_end defun
(setq varlist (list "CMDECHO" "CLAYER")
oldvars (mapcar 'getvar varlist)
) ;_end setq
(setvar "cmdecho" 0)
(defun chnglay (w x y z)
(if (not (tblsearch "Layer" w))
(command "-layer" "m" w "c" x w "lt" y w "lw" z w "")
(command "-layer" "c" x w "lt" y w "lw" z w "")
) ;_end if
(princ)
) ;_end defun
(defun GetLayerList ()
(vl-load-com)
(vlax-for l
(vla-get-Layers
(vla-get-ActiveDocument
(vlax-get-acad-object)
) ;_end vla-get-ActiveDocument
) ;_end vla-get-Layers
(setq oLst
(cons (vla-get-Name l) oLst)
) ; end setq
) ; end vlax-for
(reverse oLst)
) ; end of GetLayerList
(GetLayerList)
(if (= oLst nil)
(alert "No Layers Retrieved.")
) ;_end if
(foreach lay oLst
(if (wcmatch lay "wat*")
(chnglay lay "2" "Hidden" "1.5")
) ;_end if
) ;_end foreach
(*error* "")
(princ)
) ;_end defun
添加额外代码,如为不同的通配符匹配突出显示的代码。 谢谢李。。。。在你的上一篇文章和前一篇文章之间,我想出了一个宏,它完全符合我的要求。
我迫不及待地开始学习lisp,希望我能创建自己的基本例程。
祝你新年快乐。
我很快就会发布一篇关于插入区块的新帖子。希望你能再次帮助我。
当做
亨利·约翰 欢迎你,亨利,很高兴你能解决你的问题。
页:
[1]