簡介
對AutoCAD圖形資料庫操作的LISP函式有command,雖然利用它可以解決圖形處理程式化的問題,但是它畢竟是一個接口函式,真正處理圖形還需要AutoCAD命令,AutoLISP提供了另外一些直接處理圖形實體的函式,它們具有訪問AutoCAD實體、圖形螢幕和輸入設備的功能。利用這些函式,用戶可以直接選擇實體和提取實體的值以及修改實體,用戶選中的實體集可以存放在AutoLISP變數中,以便對其進行操作。
這類函式中用了兩種特殊的AutoLISP數據類型,一種是“實體名”;另一種是“選擇集”。這兩種數據類型僅供調用它們的函式所操作,用戶不必關係其內部結構。實體名是檔案內部的一個指針,該檔案由AutoCAD的圖像編輯程式存取;選擇集就是實體名的集合。只有在圖形編輯過程中從AutoCAD得到的實體名和選擇集才是幼有效的。
實體訪問
AutoLISP提供一組函式用來訪問AutoCAD的實體(包括直線、圓、多義線以及由它們組成的圖形)。用戶可以選擇實體、提取實體的值和修改實體。實體選擇集可以保存在AutoLISP變數中,以便對實體的選擇集進行操作。實體的生成可通過AutoLISP函式Command實現。
選擇實體
常用的實體選擇AutoLISP函式有entnext、entlast、entsel,這些函式將賦給選擇實體一個名字,實體名是AutoCAD檔案內部的一個指針,檔案由圖形編輯程式保存。
(1)entnext函式。這個函式的表達式為:(entnext[<實體名>1)
表達式中是否提供<實體名>由用戶決定。如果沒有<實體名>這個函式返回資料庫中第一個沒有被刪除的實體名。如果有<實體名>,函式返回資料庫中<實體名>之後的第一個沒有被刪除的實體名。如果資料庫中再沒有下一個實體,則返回nil。如:
(setq e1(entnext)) 置e1為圖中第一個實體的名
(setq e2(entnext e1)) 置e2為e1之後的實體的名
(2)entlast函式。這個函式的表達式為(entlast)
函式返回資料庫中最後那個沒有被刪除的主實體名。這個函式常被用來獲得最新實體名,最新實體是用Command函式加入到資料庫中的。這個實體不一定顯示在螢幕上或處於解凍層上。例如:
(command“line”pl p2 p3“”)
(setq e l(entlast))
實體名e1被設定為p2、p3連線所形成的實體。
(3)entsel函式。這個函式的表達式為(entsel[<提示>])
Entsel函式用點選擇的方式來選擇單個實體,它將返回一個表,表的第一個元素是所選擇的實體名,第一個元素是用於選擇實體的點的坐標。如果為<提示>提供了一個字元串,這個字元串用於詢問用戶以選擇實體:否則,提示將為默認的“Select object:4)9 0例如:
Command:(setq el(entsel“Please choose an entity:”))(Enter)
Please choose all entity:醜魚(Enter) (指定實體上一點)
函式返回。
(<Entity Name:2bf06287>(5.0 8.0 0.0))
建立選擇集
選擇集是實體名的集合。可以通過ssget函式得到一個選擇集,也可以通過ssadd或ssdel函式增加實體到選擇集中或從選擇集中刪除實體。
(ssget“P”) 選擇前一次已選擇過的實體
(ssget“L”) 選擇最新加入資料庫的實體
(ssget…W“(xl y1)‘(x2 y2)) 選擇由(x1,y1)和(x2,y2)確定視窗內的實體
(ssget…C“(X1 y1)‘(x2 y2)) 選擇與(xl, y1)和(x2, y2)確定視窗交叉和之內的實體
(ssget‘(xy)) 選擇過點(x,y)的實體
(ssget) 可用任意方法選擇實體
(2)ssadd函式。函式表達式為(ssadd[<實體名>【<選擇集>]]),各變數含義及函式使
用方法如下:
(setq eS(ssadd))
函式名後不帶變數,這時將生成一個新的名為es的選擇集,其中沒有實體。
(ssadd el es)
函式名後帶有實體名和選擇集,這時將把實體名為e1的實體加入到選擇集es中。
(ssadd e2 es)
執行表達式,將把e2實體也加入到選擇集es中。
(ssadd e3)
函式名後只帶有實體名,這時生成一個包含實體e3的新選擇集。
(3)ssdel函式。函式表達式為(ssdel<實體名><選擇集>)
執行這個表達式將從<選擇集>中刪除指定<實體名>的實體。如果實體存在於選擇集中,表達式返回選擇集,如果不存在,則返回nil,例如選擇集es包含e1,e2實體,則有:
(ssdel el es)
(ssdel e3 es)
返回選擇集eS,其中只包含e2實體
返回nil,e3不是es中的實體
實體訪問函式
對選擇集操作的函式
選擇集構造函式
格式:(ssget[<方式>][<點1>][<點2>])
該函式得到一個選擇集。其第一個參數“方式”指定了選擇實體的方式,它可以是“W”(視窗)、“C”(交叉)、“L”(最新的)和“P”(前一個)等選擇方式。若沒有該參數,則用戶以互動方式來構造選擇集。請看下面幾個例子:
•(ssget“W”‘(0 0)’(5 5)) 選擇在角點(0,0),(5,5)視窗內的實體
•(ssget“C”‘(0 0)’(5 5)) 選擇在角點(0,0),(5,5)視窗內以及與其交叉的實體
•(ssget’(2 2)) 選擇通過點(2,2)的實體
•(ssget“L”) 選擇前一次選過的實體
•(ssget“P”) 要求用互動方式選擇實體
該函式返回值為(selection set:n)。其中n為選擇集的序號。AutoCAD規定每次構成的選擇集個數不能多於六個。此外,在使用中通常將選擇集賦給一個變數。如:
•(setq s (ssget “P”))
該函式還有一種按照過濾表的要求來構造選擇集的方式。其形式為:
•(ssget “X” 過濾表)
這裡的“過濾表”為一個連線表,它指明要檢查的實體特性及其匹配值。如:
•(ssget “X”(list(cons 0 'circle')))
將返回一個由圖中所有圓組成的的選擇集。此處0為組合碼,表示後面circle為實體。組代碼及其含義見下表。
組代碼 | 意義 |
0 | 實體類型 |
2 | 引用塊的塊名 |
6 | 線型名 |
7 | 用作正文(TEXT)、屬性和屬性定義的字型名 |
8 | 圖層名 |
38 | Z向高度 |
39 | 延伸厚度 |
62 | 顏色號 |
66 | 被引用的屬性塊的跟隨標誌 |
210 | 3D延伸變數 |
若過濾表中含有一個及以上的連線表,則選擇集中的每一個實體必須同時滿足所有指定的條件。過濾表中可以使用通配符。
選擇長度測試函式
格式:(sslength<選擇集>)
該函式返回選擇集的長度,即選擇集中實體的個數
實體名檢索函式
格式:(ssname<選擇集><索引號>)
該函式返回選擇集中的一個實體名稱該實體在選擇集中的序號為其索引號。例如:
(setq entx(ssname sset 600))取出選擇集sset中的第601個實體名稱
向選擇集中加入實體的函式
格式: (ssadd<實體名>[<選擇集>])
該函式向“選擇集”中加入新實體。若無“選擇集”變元,則構成一個新選擇集(只含一個實體)。若無任何變元,則返回一個新的空選擇集。
從選擇集中刪除實體的函式
格式:〔ssdel<實體名><選擇集>)
該函式從“選擇集”中刪除指定的實體。
測試實體是否在選擇集中的函式
格式:(ssmemb<實體名><選擇集>)
該函式測試給定實體是否在“選擇集”中。若在,就返回此實體名;否則返回nil
對實體名和實體數據進行操作的函式
實體名搜尋函式
格式:(entnext[<實體名>])
該函式返回資料庫中“實體名”之後的那個實體。若無變數調用,則返回資料庫中第一個實體:用ssget函式構成的選擇集只有主實體名。但一個複雜的實體除了主實體外,還有一些子實體,如塊的屬性及多義線的頂點等。
用entnext函式可以順序找出各個子實體,對這些複雜實體的內部結構進行訪問。一旦獲得子實體名,就可對其進行操作。
獲取最後一個主實體名的函式
格式:(entlast)
該函式返回資料庫中最後一個實體的名稱,常用來獲得最新的實體的名稱。
刪除或恢復實體的函式
格式:(entdel [<實體名>])
該函式刪除當前圖中的指定實體。若在本次編輯中該實體已被刪除過,則調用本函式可將其恢復。但它只能在刪除實體的那次編輯中使實體再恢復。塊中定義的實體不能被刪除。
選擇任一實休的函式
格式:(entsel [<提示>])
該函式要求用戶以互動的方式選擇一個實體。在選擇實體時,只能採用選點的方式。
其返回值為一張表:(實體名選擇點)。例如,有一個實體為一條直線,其兩端點為(1,1)
和(5,5),則:
•(setq e (entsel"please choose an entity:"))
•顯示:please choose an entity:3,3
•顯示:((3.0.3.0.0.0))
存取包含插入的實體(內部塊)定義數據的函式
格式;(nentsel [<提示>])
若被選擇的實體不是一個複雜實體(多義線或塊),nentel函式返回和entsel一樣的信息。若被選擇實體是多義線,則nentsel函式返回包含子實體(頂點)和選取點的一個表。當被選擇目標是一個塊時,nentsel返回包含用來描述下一個塊的四個元素的一個表。
獲取實體定義數據的函式
格式:(entget<實體名>[<任選表>])
該函式根據其第一個參數“實體名”在資料庫中檢索實體,並以包含實體定義數據的一張表的形式返回結果。這張表是LISP聯接表,用assoc函式可以從中檢索到每一項口表中內容是用Auto的.DXF檔案的組碼的形式定義的。例如,假設當前層為“O”,當前線型為“CONTINUS",當前高度Z是零,實體標號功能被關閉,而FLLAND系統變數值為零。則對於最新繪製的一條直線(從點1,2——點6,6),有:
•(setq a (entget(entlast)))
這將把a置為下表:
((-1,<Enitity name:60000014>)
(0."LINE") ;實體類型
(8.")") ;層名
(10 1.0 2.0 0.0) ;起點
(11 6.0 6.0 0.0) ;終點
)
若函式調用時提供了記錄應用程式名的“任選表”,則它將在返回上述表的同時返回相關指定應用程式的擴展實體數據。
生成新實體的函式
格式:(entmake<實體定義數據表>)
該函式在圖中生成一個新的實體,若成功則返回定義數據的表;否則返回nil。其參數必須是一個實體的定義數據表,該表與enget函式返回的表格式相似,且必須提供實體的所有信息。生成一個新實體的一種方法是用entget函式獲取一個實體的定義數據,然後對其進行修改並將修改後的實體加入圖中。例如:按圓心坐標(4,4)、半徑為1繪製一個紅色的圓。層和線型為默認值:
(entmake `((0 "CIRCLE") ;實體類型
(62 1) ;顏色
(10 4.0 4.0 0.0) :中心點
(40 1.0) :半徑
)
)
修改實體在圖形庫中定義的函式
格式:(entmod<實體定義數據表>)
該函式更新實體資料庫中的信息。其參數為一個修改過的實體定義數據表。AutoLISP修改資料庫的基本方法就是用entmod提取實體(得到一張實體定義數據表)。修改定義實體的表,再用entmod函式更新資料庫中的實體。例如:
(setq en (entnext))置en為庫中第一個實體的名
(setq ed (entget en))置ed為EN的實體定義數據表
(setq ed (subst (cons 8 "0")
(assoc 8 ed) ed)將ed中圖層組設為"0"層
)
(entmod ed)更新資料庫中的內容
本函式對其更改內容有如下限制:
•不能更改實體類型和標號。
•實體表引用的所有對象必須是AutoCAD己知的,如文木類型、線型、形、塊等必須預先定義好。此外,修改主實體時,本函式更新其螢幕.顯示(包括子實體),當修改子實體時,entmod只修改資料庫中內容,而不更新螢幕顯示。
更新子實體螢幕顯示的函式
格式:(handent<實體名>)
該函式用於更新子實體的螢幕顯示,如上所述,當用entrn閱修改多義線頂點或塊屬性後,整個實體並不在螢幕上更新,否則將大大減慢工作速度。因此,用戶可在完成所有多義線的修改後,最後用entupd來更新螢幕顯示。
實體標號處理函式
格式:(handent<實體標號>)
該函式返回當前編輯期間使用的與實體標號對應的實體名。實體名在不同的圖形編輯期間是變化的,但實體標號卻不會變化,它對於一個實體具有永久的意義。因此,總可以用實體標號來獲取希望對其操作的實體名,以便其他操作函式使用。
應用程式名註冊函式
格式:(ragapp<應用程式名>)
該函式註冊具有當前AutoCAD圖形的應用程式名。應用程式名是進行建組、存儲、檢索和修改應用程式擴展實體數據的主要依據。本函式註冊的應用程式可以是AutoLISP應用程式,也可以是ARX等應用程式。
擴展實體數據空間的函式
格式:(xdroom<實體名>)
該函式返回足夠用於實體的擴展實體數據(xdata)空間,若失敗則返回nil。
測試表占用空間的函式
格式:(xdsize<表>)
該函式的參數<表>是一個xdata的有效表。xdsize函式返回當用戶把表作為擴展實體數據添加到一個實體時表占用的空間大小。
符號表掃描函式
格式:(tblnext<表名>[<首項開關>])
該函式返回一個DXF類型的點對表,它與entget函式的返回值很類似。本函式根據其第一個參數<表名>的要求對整個符號表進行檢索。<表名>以字元串的形式給出,是希望獲得符號表的名稱。當重複調用此函式時,一般每次返回符合指定表中下一個實體。但當第二個變元給出且其值不為nil時,則轉到符號表頭並返回表中第一項。
訪問符號表中指定項的函式
格式:(tblsearch<表名><符號>[<下一項>])
該函式搜尋用<表名>指定的符號表,並找用<符號對指定的符號名。若找到,則有關信息用與tblnext一樣的格式返回。
若本函式操作無誤,且<下一項>存在並為非空值。則會調整tblnext的檢索順序,使下次調用tblnext能夠返回緊隨在這次tblsearch調用之後的表項。
訪問AutoCAD圖形螢幕和輸入設備的幾個函式
連線函式
格式:(grdraw<起點><終點><顏色>[<高亮度>])
該函式在當前視窗中的兩點之間畫一條矢量線。其<顏色>參數若為一1,則按異或方式畫。若<高亮度>參數存在且為非零值,則該矢量以高亮度顯示。
文本函式
格式:(gretext[<框><文本>[<高亮>]]}
該函式可將文本寫在圖形螢幕的文本區內,若調用時有<框>參數,則在指定的螢幕選單框內寫字元串,該字元串由<文本>參數指定。該函式僅用於螢幕選單區的文本顯示。
讀設備函式
格式:(grread[<跟蹤>])
用戶可以使用該函式直接讀AutoCAD輸入設備。它返回二個表,表中第一個元素是整型數,是輸入類型的編碼。例如:2表示鍵盤字元,3表示選擇的點,4表示螢幕選單單元選擇,6表示按扭選單項選擇等。
其任選參數球<跟蹤>指定了是否對定標器的移動進行跟蹤。