圖層合併功能是我在清圖時常用的功能,
從別人那邊來的圖常常會有大量的圖層,作業上常常造成困擾,而且別人的圖通常是當底圖或參考使用,有時會索性將別人的圖層都合併在一起,或是把併入外部參考後混亂的圖層進行整理。
原本我做圖層合併是採用圖層管理員的選單處理,只要打開圖層管理員,將要合併的圖層選起來,再按右鍵從選單選取「合併所選圖層至...」,就會跳出選單視窗,再選取目標圖層就可以完成圖層合併。但是這個作業方式在操作上不太便利,於是有了簡化流程的想法。
在AutoCAD中有一個指令LAYMRG,他的功能如下:
輸入指令LAYMRG
指令列提示:在圖層上選取要合併的物件或 [名稱(N)]:
如果輸入N會跳出圖層清單視窗,可以選取複數圖層,確認後輸入
指令列提示:在目標圖層上選取物件或[名稱(N)]:
此時輸入N會跳出圖層清單視窗,只能選一個目標圖層,按確定會合併圖層並刪除被合併的圖層
但是,這個指令直接寫成AutoLISP的話,執行上總是出現錯誤,所以我找到了下面這個程式碼:
(defun c:MLAY (/ CURLAY ENT I LAY LAYA LAYLST SEL SS)
(if (and (not (prompt "\nSelect objects on layers to merge: "))
(setq ss (ssget "_:L"))
(setq sel (car (entsel "\nSelect object on target layer: ")))
)
(progn
(setq laya (strcase (cdr (assoc 8 (entget sel))))
curlay (strcase (getvar 'CLAYER))
laylst nil
)
(repeat (setq i (sslength ss))
(setq ent (entget (ssname ss (setq i (1- i))))
lay (strcase (cdr (assoc 8 ent)))
)
(if
(and
(not (wcmatch lay (strcat laya ",DEFPOINTS," curlay)))
(not (member lay laylst))
)
(setq laylst (cons lay laylst))
)
)
(if laylst
(progn
(command "_.-laymrg")
(foreach l laylst (command "_N" l))
(command "" "_N" laya "_Y")
)
)
)
)
(princ)
)
交給Grok分析後發現失敗的原因在於AutoCAD有另一個指令為-LAYMRG,功能如下:
輸入指令-LAYMRG
指令列提示:在圖層上選取要合併的物件或 [名稱(N)]:
如果輸入N可以輸入一個圖層名稱,會把輸入的圖層名稱變成下面的字串
layer1, layer2, layer3, ...
令列提示:指在目標圖層上選取物件或[名稱(N)]:
此時輸入N可以輸入一個圖層名稱
指令列提示:是否要繼續?[是(Y) 否(N)] <否(N)>:
此時輸入Y可以合併圖層並刪除被合併的圖層
而我找到的程式的處理就是先選取要合併的圖層,獲得圖層清單後,再選取目標圖層,然後執行-LAYMRG指令,透過if迴圈自動逐一輸入圖層名稱,再自動確認要合併圖層。
和多數的AutoCAD指令一樣,LAYMRG跟-LAYMRG是同樣的功能但操作模式不同,在寫成AutoLISP時需要注意這個差異。