一.圖元資料串列的重要性:單元六:圖元資料的取得與活用技巧(一)
二、重要圖元資料應用相關的功能函數介紹:
- 您可知您所繪製的每一個AutoCAD元體 (如LINE、CIRCLE、ARC、TEXT、BLOCK、POLYLINE、DIMENSION...) 均有其專屬的資料串列!!!
- 沒錯以LIST指令即可查詢出來,顯示於螢幕上
- 但是該如何透過 AutoLISP 功能去選取、取得、修改、更新資料呢??? 該如何去有效活用呢???
- 別急就是本單元的學習重點!!!
- 請注意本章節非常重要,務必要求透徹了解!!!
- (entsel [提示]) 請求選取一個圖元,回應包含圖元名稱及選點座標的串列
- (car 串列) 傳回:串列中的第一個元素,通常用來求x座標
- (cadr 串列)傳回:串列中的第二個元素,通常用來求y座標
- (caddr 串列)傳回:串列中的第三個元素,通常用來求z座標
- (cdr 串列) 傳回:除去第一個元素後的串列
- (entlast):取出圖形資料中的最後一個圖元
- (entget 圖元名稱 [應用程式串列]):取得圖元名稱的資料聯合串列
- (assoc 關鍵元素 聯合串列) :依關鍵元素找尋聯合串列中關係資料
- (cons 新元素 串列) 傳回:將新元素結合到串列,常用於產生『點對串列』
- (subst 新項 舊項 串列) 傳回:替換新舊串列後的串列
- (entmod 圖元串列) 依更新的資料串列更新螢幕上元體
- (list 元素 元素…) 傳回:將元素結合成一串列
三、圖元資料聯合串列取得技巧與群碼分析:
1.基礎準備動作:請開一張新圖,並建立二個新層STR、TXT,顏色分別為紅色(red)、綠色 (green)
- 首先在STR層畫一條線
指令: LINE
起點: 15,10
下一點: 50,40
下一點: (按[Enter]結束)
- 在STR層畫一個圓
指令: CIRCLE
CIRCLE 三點(3P)/二點(2P)/相切,相切,半徑(T)/<中心點>: 60,15
直徑(D)/<半徑>: 12.5
- 在TXT層寫幾個字AutoCAD
指令: DTEXT
對正(J)/字型(S)/<起點>: (選取文字的位置點)
高度 <2.5000>: 8
旋轉角度 <0>:0
文字: AutoCAD
文字: (按[Enter]結束)
圖示:
2. 在AutoCAD的Command:下練習取得圖元資料串列
- 練習函數 entsel、car、cdr、entget
指令: (setq en1 (entsel))
選取物件: (選取圓)
傳回一串列: (<圖元名稱: 2940518> (67.604 24.5166 0.0))
其中<圖元名稱: 2940518> <==圖元名稱
(67.604 24.5166 0.0) <==選點座標
指令: (car en1)
傳回: <圖元名稱: 2940518> <==串列的第一個元素
指令: (cadr en1)
傳回: (67.604 24.5166 0.0) <==串列的第二個元素
指令: (setq en1_data (entget (car en1)))
傳回『圓的聯合資料串列』:
((-1 . <圖元名稱: 2940518>) (0 . "CIRCLE") (5 . "23")
(100 . "AcDbEntity") (67 . 0) (8 . "STR") (100 . "AcDbCircle") (10 60.0 15.0 0.0) (40 . 12.5) (210 0.0 0.0 1.0))
其中各子串列的第一個元素均為『群碼』,各代表不同對應資料
指令: (setq en2 (entsel))
選取物件: (碰選線)
傳回一串列: (<圖元名稱: 2940500> (30.5626 23.5743 0.0))
指令: (setq en2_data (entget (car en2)))
傳回『線的聯合資料串列』:
((-1 . <圖元名稱: 2940500>) (0 . "LINE") (5 . "20")
(100 . "AcDbEntity") (67 . 0) (8 . "STR") (100 . "AcDbLine")
(10 15.0 10.0 0.0) (11 50.0 40.0 0.0) (210 0.0 0.0 1.0))
指令:(setq en3 (entsel))
選取物件: (碰選文字)
傳回一串列: (<圖元名稱: 2940520> (45.7833 50.3614 0.0))
指令: (setq en3_data (entget (car en3)))
傳回『文字的聯合資料串列』:
((-1 . <圖元名稱: 2940520>) (0 . "TEXT") (5 . "24")
(100 . "AcDbEntity") (67 .0) (8 . "TXT") (100 . "AcDbText")
(10 10.0 50.0 0.0) (40 . 8.0) (1 . "AutoCAD") (50 . 0.0) (41 . 1.0)
(51 . 0.0) (7 . "STANDARD") (71 . 0) (72 . 0) (11 0.0 0.0 0.0)(210 0.0 0.0 1.0)
(100 . "AcDbText") (73 . 0))
3. 聯合資料串列中各子串列群碼分析說明:
四、圖元資料修改與更新技巧:您可以在 指令:下鍵入 !en1_data或 !en2_data或 !en3_data分別查看圓、線、文字的聯合資料串列,您將會發現 => 不同的元體類別,其聯合資料串列也不一樣
圓的聯合資料串列en1_data
(-1 . <圖元名稱: 2940518>) 群碼-1對應『圖元名稱』 (0 . "CIRCLE") 群碼0對應『圖元類別』 (5 . "23") 群碼5對應『處理碼』 (100 . "AcDbEntity") 群碼100對應『子類別』 (67 . 0) 群碼 67對應『模型空間』 (8 . "STR") 群碼8對應『圖層名稱』 (100 . "AcDbCircle") 群碼100對應『子類別』 (10 60.0 15.0 0.0) 群碼10對應『圓心座標』 (40 . 12.5) 群碼40對應『半徑值』 (210 0.0 0.0 1.0) 群碼210對應『圖元擠出方向』 線的聯合資料串列en2_data
(-1 . <圖元名稱: 2940500>) 群碼-1對應『圖元名稱』 (0 . "LINE") 群碼0對應『圖元類別』 (5 . "20") 群碼5對應『處理碼』 (100 . "AcDbEntity") 群碼100對應『子類別』 (67 . 0) 群碼 67對應『模型空間』 (8 . "STR") 群碼8對應『圖層名稱』 (100 . "AcDbLine") 群碼100對應『子類別』 (10 15.0 10.0 0.0) 群碼10對應『線起始點座標』 (11 50.0 40.0 0.0) 群碼11對應『線終止點座標 (210 0.0 0.0 1.0) 群碼210對應『圖元擠出方向』 文字的聯合資料串列 en3_data
(-1 . <圖元名稱: 2940520>) 群碼-1對應『圖元名稱』 (0 . "TEXT") 群碼0對應『圖元類別』 (5 . "24") 群碼5對應『處理碼』 (100 . "AcDbEntity") 群碼100對應『子類別』 (67 . 0) 群碼67對應『模型空間』 (8 . "TXT") 群碼8對應『圖層名稱』 (100 . "AcDbText") 群碼100對應『子類別』 (10 10.0 50.0 0.0) 群碼10對應『插入點』 (40 . 8) 群碼40對應『字高』 (1 . "AutoCAD") 群碼1對應『文字內容』 (50 . 0.0) 群碼50對應『旋轉角度』 (41 . 1.0) 群碼41對應『寬度比例係數』 (51 . 0.0) 群碼51對應『傾斜角』 (7 . "STANDARD") 群碼7對應『字型名稱』 (71 . 0) 群碼71對應『鏡設方向』 (72 . 0) 群碼72對應『水平對齊設定』 (11 0.0 0.0 0.0) 群碼11 對應『對齊點』 (210 0.0 0.0 1.0) 群碼210對應『圖元擠出方向』 (100 . "AcDbText") 群碼100對應『子類別』 (73 . 0) 群碼73 對應『水平對齊設定』 4. 由以上可看出,元體資料串列有些『群碼』是共通的 (如 -1、0、8、210) 有些『群碼』是因元體而異的(如 10、40),有些『群碼』是某些元體特有的(如 en3_data 資料串列就比 en1_data & en2_data 資料串列來的多)
注意1:往後練習撰寫 AutoLISP 程式中,若對各元體與群碼的對應有疑問或不清楚時,請隨時查看『附錄 C』有關詳細的群碼表分析!!! 注意2:子串列中間有一點『•』隔開二元素,我們稱為『點對串列』,點對串列要特別注意的是『第二個元素取得,要用cdr函數』,而非cadr函數!若要產生新的『點對串列』,可用cons函數完成.如:(cons 1 “ABC”) 回應 (1 . “ABC”)
1.圖元資料串列修改 & 更新四步驟:步驟一:用 entget 函數取得元體資料串列,如上例中 en1_data、en2_data、en3_data
步驟二:用assoc函數依『群碼值』找尋取得欲修改的舊『子串列』,新的子串列可以用 cons 函數去產生
步驟三:用 subst 函數將資料串列中的新、舊子串列替換
2.在AutoCAD的『指令:』下做基本圖元資料修改&更新練習:步驟四:用 entmod 函數更新的資料串列,同時自動更新螢幕上圖元
請將上例中,圓的半徑修改為23.8過程如下:
指令:!en1_data
傳回:
((-1 . <圖元名稱: 2940518>) (0 . "CIRCLE") (5 . "23")(100 . "AcDbEntity") (67 . 0) (8 . "STR") (100 . "AcDbCircle") (10 60.0 15.0 0.0) (40 . 12.5) (210 0.0 0.0 1.0))
指令: (setq oldr (assoc 40 en1_data))
傳回:(40 . 12.5) <==群碼40為索引值的子串列
指令:(setq newr (cons 40 23.8))
傳回:(40 . 23.8)
指令:(setq en1_data (subst newr oldr en1_data))
回應:
((-1 . <圖元名稱: 2940518>) (0 . "CIRCLE") (5 . "23")(100 . "AcDbEntity") (67 . 0) (8 . "STR")
(100 . "AcDbCircle") (10 60.0 15.0 0.0) (40 . 23.8) (210 0.0 0.0 1.0))
資料串列已被修改成功了,但是畫面上圖元並未更新???
指令: (entmod en1_data) <==大功告成,畫面上的圓也更新了!!!