劉承權(quán) 劉昌文 王艷
【摘 要】AutoCAD工程制圖中,使用AutoLISP進(jìn)行一些適應(yīng)需要的簡單編程,實現(xiàn)一個命令替代多個命令或命令多步執(zhí)行,從而簡化操作,使工程制圖變得更快捷。
【關(guān)鍵詞】AutoLisp;編程;工程制圖;AutoCAD
中圖分類號: G434 文獻(xiàn)標(biāo)識碼: A 文章編號: 2095-2457(2018)23-0084-002
DOI:10.19694/j.cnki.issn2095-2457.2018.23.035
【Abstract】In AutoCAD engineering drawing,AutoLISP is used to carry out some simple programming to meet the needs,and a single command is implemented instead of multiple commands or multi-step execution,which simplifies operation and makes engineering drawing more rapid.
【Key words】AutoLisp;Programming;Engineering drawing;AutoCAD
0 引言
AutoCAD工程制圖中,常常會遇到需要不斷重復(fù)使用某個命令的情況,而命令使用時,通常還需要繼續(xù)輸入數(shù)個選項,這樣的命令使用起來枯燥而繁瑣。一些AutoCAD插件雖然能提供一些功能,但未必符合自己的應(yīng)用場景。使用AutoLISP對命令進(jìn)行一些適應(yīng)需要的簡單編程,就能簡化命令操作,從而提高制圖效率。AutoLisp可以直接調(diào)用AutoCAD中的全部命令,因此我們在使用AutoCAD命令完成的一系列操作都可以用AutoLisp來完成。
1 基本原理
下面的例子定義了一個函數(shù)“n”,在AutoCAD中加載這個例子后,輸入命令“n”,即可執(zhí)行?!?;”符號后面的描述是注釋,程序執(zhí)行時會忽略這些內(nèi)容。
(defun c:n () ;;;定義名為n函數(shù),也就是在AutoCAD中輸入的命令n,可以根據(jù)需要定義,不要與已有AutoCAD命令相同;
(command "ZOOM" "d") ;;; command函數(shù)是本文的主角,用于執(zhí)行AutoCAD中的命令,其后跟隨的“"ZOOM"”就是視圖縮放命令,“"d"”是執(zhí)行“ZOOM”命令后出現(xiàn)的選項字段;
) ;;;括號注意配對;
從上面的例子可以看出,就是定義一個函數(shù)的名稱,然后調(diào)用AutoCAD的命令,就簡單的完了需要的功能。
2 應(yīng)用場景實踐
2.1 動態(tài)縮放:
(defun c:n ()
(command "ZOOM" "d")
(princ)
)
在某些比面積較大的項目圖紙中,比如市政工程,我們需要放大視圖檢查多個細(xì)節(jié),我們可以不斷的滾動鼠標(biāo)中間來放大縮小,也可以輸入命令“zoom”然后選擇字段“d”來查看,在多個細(xì)節(jié)上檢查來回放大縮小,確實感覺操作繁瑣,這個例子看似很簡單,但卻能解決這個問題。使用時,先加載程序,輸入命令n,鼠標(biāo)變成一個矩形框,將矩形框移動到需要查看的細(xì)節(jié)位置,點擊空格鍵即可放大該區(qū)域,可以用空格重復(fù)該命令而不用再輸入中間選項。
2.2 合并多段線
(defun c:jn ()
(setq pet (getvar "PEDITACCEPT"))
(setvar "PEDITACCEPT" 1)
(setq ss (ssget '((0 . "ARC,*LINE"))))
(if (and ss)
(command "_pedit" "m" ss "" "j" "" "")
)
(setvar "PEDITACCEPT" pet)
(princ)
)
當(dāng)我們需要合并線段、圓弧、多段線時,尤其是在鋼箱橋梁展開圖中,曲線是由小段的線段組成,線段數(shù)量大,需要合并為一條多段線。通常做法是,輸入“PEDIT”命令,根據(jù)提示依次輸入“M”,選擇線段,輸入“J”,輸入“模糊距離”……步驟多,并且必須是先輸入命令再選擇,有時候常常忘記順序,先選擇了線段對象,再輸入命令,這是發(fā)現(xiàn)之前的選擇無效必須重新選擇。這個例子實現(xiàn)了可以在命令之前或之后選擇都可以,中間的選項都不用再輸入,輸入一次命令即可完成。
2.3 定制打印
(defun c:pt()
(setq slc nil)
(setq slc (ssget '((0 . "lwpolyline") (8 . "圖紙"))))
(if (and slc)
(progn
(setq tkn (sslength slc))
(setq i 0)
(repeat tkn
(setq tki (ssname slc i))
(setq tki_inf (entget tki))
(setq ptlist nil)
(foreach n_print tki_inf
(if (= 10 (car n_print))
(setq ptlist (cons (cdr n_print) ptlist))
)
)
(if (> (abs(- (car (car ptlist)) (car (caddr ptlist)))) (abs(- (cadr (car ptlist)) (cadr (caddr ptlist)))))
(setq trad "L")
(setq trad "P")
)
(if (= (getvar "TILEMODE") 1)
(command "-plot" "y" "" "pdfFactory Pro" "A3" "M" trad "n" "w" (car ptlist) (caddr ptlist) "f" "c" "y" "@黃.ctb" "y" "w" "n" "y" "y")
(command "-plot" "y" "" "pdfFactory Pro" "A3" "M" trad "n" "w" (car ptlist) (caddr ptlist) "f" "c" "y" "@黃.ctb" "y" "n" "y" "n" "n" "y" "y")
)
(setq i (1+ i))
)
)
)
)
如果有大量的dwg格式圖紙需要打印,通常需要先設(shè)置紙張規(guī)格、打印樣式、打印機(jī)、圖紙橫向或縱向打印,然后每張圖需要逐個選擇和打印。網(wǎng)絡(luò)上也有一些插件工具,但也需要先進(jìn)行打印設(shè)置。我們一般在固定的工作場所中,采用的紙張規(guī)格、打印樣式等基本都是固定的,通過這個簡單的程序,每次打印都不需要再進(jìn)行設(shè)置,輸入命令即可直接打印,支持一個文件中多張圖紙的批量框選打印,并且自動判斷圖紙的方向。其中“'((0 . "lwpolyline") (8 . "圖紙"))”定義了可選擇的圖框?qū)ο鬄榫匦位蚨喽尉€創(chuàng)建的圖框線,圖框線所在圖層為“圖紙”;“"pdfFactory Pro"”是我們使用的打印機(jī)名稱;“"A3"”是我們使用的圖幅;“"@黃.ctb"”是我們使用的顏色打印樣式。只需要將上述字段修改為適合自己常用的字符,以后打印圖紙再也不需要去設(shè)置了。
3 效果評價
我們在實際工作中,積累了很多的lsp程序,不但簡化了一些常用的命令,更是針對不同的工程結(jié)構(gòu)編制了用于處理工程數(shù)據(jù)的實用lsp程序,使一些復(fù)雜的操作過程得到了簡化,提高了制圖效率和正確率。
【參考文獻(xiàn)】
[1]AutoLISP Reference Guide.Autodesk.
[2]吳永進(jìn),林美櫻.AutoCAD完全應(yīng)用指南 AutoLISP+DCL+Visual LISP程序設(shè)計.科學(xué)出版社,2011-4-1.