AutoLISP入門教學.JPG (45140 bytes)


單元六:圖元資料的取得與活用技巧(一)

 

一.圖元資料串列的重要性:

 

二、重要圖元資料應用相關的功能函數介紹:

 

三、圖元資料聯合串列取得技巧與群碼分析:

1.基礎準備動作:請開一張新圖,並建立二個新層STR、TXT,顏色分別為紅色(red)、綠色 (green)

指令: LINE

起點: 15,10

下一點: 50,40

下一點: ([Enter]結束)

指令: CIRCLE

CIRCLE 三點(3P)/二點(2P)/相切,相切,半徑(T)/<中心點>: 60,15

直徑(D)/<半徑>: 12.5

指令: DTEXT

對正(J)/字型(S)/<起點>: (選取文字的位置點)

高度 <2.5000>: 8

旋轉角度 <0>:0

文字: AutoCAD

文字: ([Enter]結束)

圖示:

 

 Lisp6_1.jpg (15195 bytes)

2. AutoCADCommand:下練習取得圖元資料串列

指令: (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. 由以上可看出,元體資料串列有些『群碼』是共通的 (-108210) 些『群碼』是因元體而異的(1040),有些『群碼』是某些元體特有的(en3_data 資料串列就比 en1_data & en2_data 資料串列來的多)

注意1:往後練習撰寫 AutoLISP 程式中,若對各元體與群碼的對應有疑問或不清楚時,請隨時查看『附錄 C』有關詳細的群碼表分析!!!

注意2:子串列中間有一點『•』隔開二元素,我們稱為『點對串列』,點對串列要特別注意的是『第二個元素取得,要用cdr函數』,而非cadr函數!若要產生新的『點對串列』,可用cons函數完成.:

(cons 1 ABC)   回應 (1 . ABC)

 

四、圖元資料修改與更新技巧:

1.圖元資料串列修改 & 更新四步驟:

步驟一:entget 函數取得元體資料串列,如上例中 en1_dataen2_dataen3_data

步驟二:assoc函數依『群碼值』找尋取得欲修改的舊『子串列』,新的子串列可以用 cons 函數去產生

步驟三:subst 函數將資料串列中的新、舊子串列替換

步驟四:entmod 函數更新的資料串列,同時自動更新螢幕上圖元

2.AutoCAD的『指令:』下做基本圖元資料修改&更新練習:

請將上例中,圓的半徑修改為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)   <==大功告成,畫面上的圓也更新了!!!