面對成百上千條多段線需統一線寬、單檔多圖紙需批量列印,手動操作不僅效率低且極易漏改。AutoLISP 讓這些重複性工作變成一鍵指令。本文提供兩個經典實用 LISP 程式:CH_W 批量修改多段線線寬、Mplot 等距多圖紙連續列印,附完整原始碼與使用說明。
需將圖面中所有輕型多段線(LWPOLYLINE)或舊版多段線(POLYLINE)線寬統一設定為指定值。
(defun C:CH_W (/ wid ent_ss n_ss j ent_n ent_a)
(princ "\n請選擇目標物件 : ")
(setq ent_ss (ssget) wid (getreal "\n請輸入線寬 <0.3>: "))
(if (= wid nil) (setq wid 0.3))
(if (/= ent_ss nil)
(progn
(setq n_ss (sslength ent_ss) j 0)
(repeat n_ss
(setq ent_n (ssname ent_ss j)
ent_a (cdr (assoc 0 (entget ent_n)))
j (1+ j))
(if (or (= ent_a "POLYLINE") (= ent_a "LWPOLYLINE"))
(command "PEDIT" ent_n "W" wid "" "")
)
)
)
)
(princ)
)
CH_W.lsp,用 APPLOAD 載入。ssget 取得選取集,sslength/ssname 遍歷。entget 取得實體定義表,assoc 0 讀取實體類型(DXF 代碼 0)。POLYLINE 與 LWPOLYLINE,其他類型自動跳過。command "PEDIT" ent_n "W" wid "" "" 等同手動:PEDIT → 選物件 → W(寬度) → 輸入值 → 兩次 Enter 結束。單一 DWG 內垂直排列多張相同尺寸圖紙,間距固定(如 500mm),需連續列印所有圖框。
(defun C:Mplot (/ p_1 p_2 n m_d)
(setq p_1 (getpoint "\n第一角點: ")
p_2 (getpoint "\n對角點: ")
n (getint "\n總張數 <1>: "))
(if (= n nil) (setq n 1))
(setq m_d 500) ; 固定間距 500mm
(repeat n
(command "PLOT" "" "W" p_1 p_2 "" "Y" "") ; 依當前列印設定直接列印
(setq p_1 (list (car p_1) (+ (cadr p_1) m_d) (caddr p_1))
p_2 (list (car p_2) (+ (cadr p_2) m_d) (caddr p_2)))
)
(princ)
)
Mplot.lsp。m_d 改為 (getreal "\n間距 <500>: ") 實現間距互動輸入。(getvar "CTAB") 判斷當前版面,支援多版面切換列印。PLOT 完整參數(裝置、樣式表、比例),脫離當前設定獨立運行。兩支不足 30 行的 LISP,解決了「批量屬性修改」與「批量列印」兩大高頻痛點。理解其邏輯後,可輕鬆擴展為:批量修改圖層/顏色/線型、批量匯出 PDF/DWF、批量更新圖框屬性等企業級自動化工具,讓 AutoCAD 真正成為生產力工具而非單純繪圖板。