用數(shù)據(jù)庫(kù)管理AutoCAD的圖塊和實(shí)現(xiàn)查詢插入操作 主題詞: AutoCAD, 圖塊,數(shù)據(jù)庫(kù),查詢上海港口機(jī)械廠 劉啟衛(wèi) 本文介紹一個(gè)用數(shù)據(jù)庫(kù)管理和實(shí)現(xiàn)查詢插入 AutoCAD圖塊的方法。問(wèn)題的提出 眾所周知,一個(gè) AutoCAD圖形中的圖塊BLOCK,可以用WBLOCK命令寫到磁盤上成為DWG文件。磁盤上的DWG文件可以用INSERT命令插人到圖形中形成圖塊。管理圖塊,實(shí)際也就是管理DWG文件。AutoCAD 的INSERT插入圖塊功能十分有用,可以大大簡(jiǎn)化和加快繪圖的工作。當(dāng)某個(gè)具體的AutoCAD二次開(kāi)發(fā)應(yīng)用需要用大量的圖塊時(shí),圖塊的命名和存放管理就需要費(fèi)一些心思了。DOS文件名限制在8個(gè)字符,用來(lái)標(biāo)識(shí)一個(gè)以圖塊描述的設(shè)計(jì)對(duì)象的標(biāo)準(zhǔn)代號(hào)往往不夠用,當(dāng)然更談不上記錄圖塊的屬性性質(zhì)的數(shù)據(jù)了。而設(shè)計(jì)時(shí)經(jīng)常需要考慮和引用一個(gè)用圖塊描述的設(shè)計(jì)對(duì)象的屬性數(shù)據(jù)和完整的標(biāo)準(zhǔn)代號(hào),名稱,安裝和使用性能參數(shù)等等。一般來(lái)說(shuō),設(shè)計(jì)任務(wù)常常需要以某些參數(shù)為準(zhǔn)則選擇適當(dāng)?shù)囊詧D塊描述的設(shè)計(jì)對(duì)象插入圖中。例如:給一個(gè)電動(dòng)機(jī)配一個(gè)公稱扭矩大于300N。m,許用轉(zhuǎn)速大于2800轉(zhuǎn)/分,軸孔直徑=32毫米的聯(lián)軸器。就是說(shuō)要按一定條件經(jīng)過(guò)查詢搜索,找到一個(gè)滿足要求的圖形用INSERT命令插入當(dāng)前編輯的圖形形成圖塊BLOCK。最好設(shè)計(jì)者不必關(guān)心這個(gè)圖塊是存放在什么地方,只要按設(shè)計(jì)意圖指定需要什么樣的東西,就自動(dòng)從數(shù)據(jù)庫(kù)中把它選擇出來(lái)插到圖上。解決問(wèn)題的途徑 上述功能可以在 DOS或Windows環(huán)境下分別用幾種方法實(shí)現(xiàn)。在DOS環(huán)境下,需要把圖塊的屬性數(shù)據(jù)存入數(shù)據(jù)庫(kù),把圖塊的文件訪問(wèn)路徑存入數(shù)據(jù)庫(kù)。在Windows環(huán)境下還可以把AutoCAD圖形文件作為OLE對(duì)象以鏈接或嵌入方式存入ODBC數(shù)據(jù)庫(kù)。要在DOS版或者Windows版AutoCAD環(huán)境中實(shí)現(xiàn)用LISP語(yǔ)言訪問(wèn)數(shù)據(jù)庫(kù)的功能。在 Windows版AutoCAD環(huán)境下可以利用AutoCAD提供的有關(guān)程序,利用Windows的DDE(動(dòng)態(tài)數(shù)據(jù)交換)功能實(shí)現(xiàn)訪問(wèn)ODBC數(shù)據(jù)庫(kù)。由于AutoCAD還不能直接從ODBC數(shù)據(jù)庫(kù)中用INSERT命令插入圖塊,因此如果用ODBC數(shù)據(jù)庫(kù)而且用了嵌入的存放方式,雖然可以把大量獨(dú)立的文件集中存放在一個(gè)大的數(shù)據(jù)庫(kù)中,但仍然要解決需要INSERT插人操作時(shí),過(guò)濾掉OLE嵌入對(duì)象的圖元表現(xiàn)數(shù)據(jù),把DWG文件數(shù)據(jù)輸出到一個(gè)臨時(shí)DWG文件中,然后才能用INSERT命令插入。而在AutoCAD環(huán)境中通過(guò)DDE途徑操縱ODBC數(shù)據(jù)庫(kù),把OLE嵌入對(duì)象輸出到臨時(shí)文件中是困難曲折而且耗費(fèi)資源的。本文介紹的方法 本文介紹的方法是利用一個(gè) LISP語(yǔ)言訪問(wèn)DBASE/Foxpro數(shù)據(jù)庫(kù)的接口程序LISPBASE為支持手段實(shí)現(xiàn)的。在DOS環(huán)境下,圖塊以分立的DWG文件的形式存放,在數(shù)據(jù)庫(kù)中存放訪問(wèn)路徑。在Windows環(huán)境下,可以進(jìn)一步用OLE功能以鏈接或嵌人方式存放DWG文件,LISPBASE for Windows 提供一個(gè)專用函數(shù)解決OLE嵌人對(duì)象輸出到臨時(shí)文件的問(wèn)題。在數(shù)據(jù)庫(kù)中以嵌人方式存放DWG圖塊時(shí),要把圖塊插入到當(dāng)前編輯的圖形文件中還有一個(gè)途徑。就是直接讀取OLE對(duì)象數(shù)據(jù),過(guò)濾掉OLE嵌入對(duì)象的圖元表現(xiàn)數(shù)據(jù),把DWG文件的ENTITY數(shù)據(jù)用LISP語(yǔ)言提供的函數(shù)構(gòu)造成BLOCK表并插入圖形文件中。這個(gè)方案的實(shí)現(xiàn)所需要的函數(shù)將在LISPBASE的新版本中提供。Windows環(huán)境方案的優(yōu)點(diǎn)是可以進(jìn)一步實(shí)現(xiàn)圖文并茂的工程文檔設(shè)計(jì)和管理集成系統(tǒng)。缺點(diǎn)是系統(tǒng)開(kāi)銷大,如果希望建立工程文檔設(shè)計(jì)和管理集成系統(tǒng),微機(jī)應(yīng)配備16兆內(nèi)存。用DOS環(huán)境的方案優(yōu)點(diǎn)是速度快,開(kāi)銷小。唯一的缺點(diǎn)是無(wú)法利用Windows的OLE功能實(shí)現(xiàn)圖文并茂的工程文檔設(shè)計(jì)和管理集成系統(tǒng)。而這樣一個(gè)集成系統(tǒng)對(duì)一個(gè)小組以上規(guī)模的設(shè)計(jì)或生產(chǎn)單位的效益是十分顯著的。具體實(shí)現(xiàn)時(shí)需要預(yù)先準(zhǔn)備好數(shù)據(jù)庫(kù): 第一步。 設(shè)計(jì)和建立管理所有圖塊文件的數(shù)據(jù)庫(kù)。對(duì)于沒(méi)有采用 OLE嵌入方式在數(shù)據(jù)庫(kù)中存放AutoCAD圖形的方案來(lái)說(shuō),必須仔細(xì)考慮建立有條理的DOS子目錄結(jié)構(gòu)準(zhǔn)備存放AutoCAD圖形。每個(gè)子目錄下的圖形文件在200以下為好。管理所有圖塊文件的數(shù)據(jù)庫(kù)結(jié)構(gòu)可以根據(jù)各單位的具體情況設(shè)計(jì)。例如可以設(shè)計(jì)成如下的結(jié)構(gòu):Field Field Name Type Width Dec 1 DRAWING_ID Character 16 2 DESIGNER Character 6 3 DESIGNDATE Date 8 4 DRAW_SIZE Character 2 5 SCALE Character 5 6 WEIGHT Numeric 8 2 7 SIZE Character 20 8 PATH Character 32 9 PICTURE General 10 這個(gè)結(jié)構(gòu)是針對(duì) Foxpro for Windows 2.5 設(shè)計(jì)的。使用了通用字段以OLE鏈接或嵌人對(duì)象的方式存放AutoCAD圖形的數(shù)據(jù)。如果不使用Windows版的Foxpro和AutoCAD,可以不建立這個(gè)通用字段。利用 LISPBASE數(shù)據(jù)庫(kù)接口可以在每建立一個(gè)圖塊后向數(shù)據(jù)庫(kù)填寫必要的屬性數(shù)據(jù)和文件訪問(wèn)路徑。建立系列圖塊,可以充分利用市場(chǎng)上對(duì)AutoCAD二次開(kāi)發(fā)編制的各種參數(shù)設(shè)計(jì)和尺寸驅(qū)動(dòng)設(shè)計(jì)程序。第二步。 針對(duì)每個(gè)圖塊系列,建立對(duì)應(yīng)結(jié)構(gòu)的屬性數(shù)據(jù)庫(kù)。例如:彈性圓柱銷聯(lián)軸器( JB108-60),可以設(shè)計(jì)如下結(jié)構(gòu):Structure for database: JB108-60.DBF Field Field Name Type Width Dec 1 型號(hào) Character 82 許用扭矩 Numeric 63 許用轉(zhuǎn)速 Numeric 54 軸孔尺寸 Numeric 35 B Numeric 3 6 D Numeric 3 7 D1 Numeric 3 8 A Numeric 3 9 B1 Numeric 3 10 C Numeric 3 11 L1 Numeric 3 12 L2 Numeric 3 13 D3 Numeric 3 14 D4 Numeric 3 15 A1 Numeric 3 16 材料 Character 617 重量 Numeric 6 218 慣性矩 Numeric 6 319 Drawing_id Character 16 其中第 19個(gè)字段Drawing_id是和圖形數(shù)據(jù)庫(kù)連接的關(guān)鍵字??梢栽试S多個(gè)聯(lián)軸器公用一個(gè)圖塊。然后輸入數(shù)據(jù)。第三步。 建立管理所有圖塊系列的目錄數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)結(jié)構(gòu)建議如下: Structure for database: BLOCKS.DBF Field Field Name Type Width Dec 1 DATABASE Character 16 2 STANDARD Character 32 3 NAME Character 32 4 SLIDE_FILE Character 32 5 PICTURE General 10 6 PATH Character 32 其中 DATABASE 字段用于存放各圖塊系列數(shù)據(jù)庫(kù)名的全路徑名;STANDARD 和 NAME 字段用于存放標(biāo)準(zhǔn)和名稱;SLIDE_FILE 字段用于存放AUTOCAD的SLIDE文件全路徑或在SLB庫(kù)中的名稱。使用時(shí), 1。首先打開(kāi)目錄數(shù)據(jù)庫(kù)選擇要插入的圖塊系列標(biāo)準(zhǔn)——也就是選擇要打開(kāi)的數(shù)據(jù)庫(kù);2。打開(kāi)選擇的數(shù)據(jù)庫(kù);3。讀取數(shù)據(jù)庫(kù)結(jié)構(gòu);4。用對(duì)話框交互式確定各子段的查找條件準(zhǔn)則;5。用條件準(zhǔn)則查找數(shù)據(jù)庫(kù);6。如果找到,則通過(guò)Drawing_ID字段在圖塊數(shù)據(jù)庫(kù)中找到圖塊,并插入到當(dāng)前的圖形中。如果采用了OLE嵌入方式存放圖塊,則輸出到一個(gè)臨時(shí)文件中,然后執(zhí)行插入操作。使用 LISPBASE數(shù)據(jù)庫(kù)接口函數(shù)的部分LISP程序如下:; 調(diào)用 USE 函數(shù),打開(kāi) JB108-60 屬性數(shù)據(jù)庫(kù),DB_ID 是數(shù)據(jù)庫(kù)編號(hào)。( USE DB_ID "F:\\STANDARD\\JB108-60.DBF");調(diào)用 LOCATE 函數(shù);查找滿足條件準(zhǔn)則的記錄——也就是: ; 公稱扭矩大于300N.m,許用轉(zhuǎn)速大于2800轉(zhuǎn)/分,軸孔直徑=32毫米的聯(lián);軸器。; REC_ID 是存放記錄號(hào)的變量。(SETQ REC_ID (LOCATE DB_ID " 許用扭矩>300 .AND. 許用轉(zhuǎn)速>2800 .AND. 軸孔直徑=32") ) ;找到滿足上述條件的記錄號(hào)在變量 REC_ID 中,如 REC_ID 大于 0;就是找到了。 (IF (> REC_ID 0) ;然后就可以調(diào)用 GETREC 函數(shù)讀取該記錄,放在一個(gè)LISP表REC中,以;便繼續(xù)處理。(SETQ REC (GETREC DB_ID )) ) 具體程序省略。感興趣的讀者可來(lái)信聯(lián)系索取。對(duì)于比較大的單位,需要使用 ORACLE,SYBASE,INGRESS,SQL-SERVER,等數(shù)據(jù)庫(kù)的情況,可以使用另外一個(gè)AutoCAD Lisp 語(yǔ)言環(huán)境下的ODBC數(shù)據(jù)庫(kù)接口--LISPODBC。由于現(xiàn)在幾乎所有的數(shù)據(jù)庫(kù)都支持ODBC,因此利用LISPODBC可以不受數(shù)據(jù)庫(kù)的限制。數(shù)據(jù)庫(kù)和 AutoCAD圖形屬性標(biāo)注與材料表的集成主題詞: AutoCAD, 屬性,材料表,數(shù)據(jù)庫(kù)上海港口機(jī)械廠 劉啟衛(wèi) 本文介紹一個(gè)使 AutoCAD圖形中的屬性標(biāo)注標(biāo)注和材料表與數(shù)據(jù)庫(kù)保持一致的方法。用AutoCAD環(huán)境下的LISPBASE數(shù)據(jù)庫(kù)接口實(shí)現(xiàn)的。問(wèn)題的提出 眾所周知,一個(gè) AutoCAD圖形中往往會(huì)有許多具有屬性性質(zhì)的標(biāo)注,如裝圖的零件號(hào)標(biāo)注,外購(gòu)件的型號(hào)數(shù)量,材料表,標(biāo)題欄等等。這些數(shù)據(jù)往往需要同時(shí)存放在管理數(shù)據(jù)庫(kù)中,因此出現(xiàn)一個(gè)問(wèn)題:如何及時(shí)地,便捷地,可靠地使AutoCAD圖形中的屬性數(shù)據(jù)和數(shù)據(jù)庫(kù)中的數(shù)據(jù)保持一致。這一問(wèn)題解決得不好往往會(huì)因差錯(cuò)造成很大的經(jīng)濟(jì)損失。另外,最好還能完全自動(dòng)地,對(duì)設(shè)計(jì)者透明地解決這一問(wèn)題。 AutoCAD提供了兩個(gè)方法解決這種問(wèn)題。一個(gè)是把屬性數(shù)據(jù)寫入一個(gè)文本文件后再用數(shù)據(jù)庫(kù)的Append 命令加入數(shù)據(jù)庫(kù);另外一個(gè)是用ASE功能解決。前一方法不方便,很難解決圖形和管理數(shù)據(jù)庫(kù)的雙向更新問(wèn)題。后一方法主要是交互式地操作的,不便用LISP編程。均有一定局限性。解決對(duì)圖形進(jìn)行編輯后自動(dòng)存入數(shù)據(jù)庫(kù)問(wèn)題的方法 本文介紹的方法是利用一個(gè) LISP語(yǔ)言訪問(wèn)DBASE/Foxpro數(shù)據(jù)庫(kù)的接口程序LISPBASE為支持手段實(shí)現(xiàn)的。方法如下:1 。在AutoCAD環(huán)境下,對(duì)需要輸入數(shù)據(jù)庫(kù)并和數(shù)據(jù)庫(kù)保持一致的屬性數(shù)據(jù),設(shè)計(jì)適當(dāng)?shù)慕Y(jié)構(gòu),用Attribute圖塊的方式插入圖形。如裝配圖上的零件號(hào)標(biāo)注和外購(gòu)件標(biāo)注,不要用Text圖形元素畫(huà)到圖上,而應(yīng)該針對(duì)具體對(duì)象設(shè)計(jì)Attribute圖形元素,然后插入圖中。2 。編制一個(gè)提取所有屬性圖形元素的Lisp語(yǔ)言程序,在需要時(shí)(結(jié)束工作)掃描圖形,把特定的Attribute圖形元素收集到Lisp表中,然后利用LispBase數(shù)據(jù)庫(kù)接口提供的函數(shù),打開(kāi)管理數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新。注意數(shù)據(jù)庫(kù)中應(yīng)該設(shè)計(jì)一個(gè)存放 AutoCAD圖形元素 Handle 的子段,把每個(gè)Attribute的Handle記錄在數(shù)據(jù)庫(kù)中,以便在數(shù)據(jù)庫(kù)中修改數(shù)據(jù),然后更新圖形中的Attribute數(shù)據(jù)。解決對(duì)數(shù)據(jù)庫(kù)修改以后自動(dòng)更新 CAD圖形問(wèn)題的方法1 。在ACAD.LSP自動(dòng)執(zhí)行程序中編寫查找數(shù)據(jù)庫(kù)中圖紙編號(hào)的程序。2 。打開(kāi)一個(gè)已經(jīng)存在的圖形時(shí),自動(dòng)執(zhí)行在數(shù)據(jù)庫(kù)中查找圖紙編號(hào);如果找到,自動(dòng)讀出該圖有關(guān)的屬性數(shù)據(jù)和材料表,根據(jù)每個(gè)Attribute的Handle對(duì)圖形中Attribute進(jìn)行更新。上述方法對(duì)標(biāo)題欄,和明細(xì)表同樣適用。而保持圖紙和管理數(shù)據(jù)庫(kù)內(nèi)容的一致是圖檔管理系統(tǒng)中極為重要的必不可少的功能。 具體程序省略。感興趣的讀者可來(lái)信聯(lián)系索取。對(duì)于比較大的單位,需要使用 ORACLE,SYBASE,INGRESS,SQL-SERVER,等數(shù)據(jù)庫(kù)的情況,可以使用另外一個(gè)AutoCAD Lisp 語(yǔ)言環(huán)境下的ODBC數(shù)據(jù)庫(kù)接口--LISPODBC。由于現(xiàn)在幾乎所有的數(shù)據(jù)庫(kù)都支持ODBC,因此利用LISPODBC可以不受數(shù)據(jù)庫(kù)的限制。
在AutoCAD環(huán)境中快速翻閱工程設(shè)計(jì)圖表 主題詞: AutoCAD, 數(shù)據(jù)庫(kù),工程設(shè)計(jì)圖表上海港口機(jī)械廠 劉啟衛(wèi) 設(shè)計(jì)工作的一個(gè)重要內(nèi)容就是翻閱查找存放在工程設(shè)計(jì)手冊(cè)和各種標(biāo)準(zhǔn)中的五花八門的數(shù)據(jù)表和圖表。這些數(shù)據(jù)圖表記錄了設(shè)計(jì)工作必須參照引用的數(shù)據(jù)和遵守的規(guī)范。如何正確和快速地查找引用需要的數(shù)據(jù),對(duì)提高設(shè)計(jì)工作的質(zhì)量,標(biāo)準(zhǔn)化程度和工作效率十分重要。本文介紹一個(gè)在AutoCAD環(huán)境下實(shí)現(xiàn)的快速翻閱工程設(shè)計(jì)圖表的通用方法。 各行各業(yè)的工程設(shè)計(jì)手冊(cè)和各種標(biāo)準(zhǔn)中的五花八門的數(shù)據(jù)表和圖表有一個(gè)共同特點(diǎn),就是它們數(shù)量很多,格式紛雜,數(shù)據(jù)表往往附帶有插圖。在AutoCAD顯示屏幕上翻閱這類圖表需要顯示插圖和可以滾動(dòng)的數(shù)據(jù)表格。數(shù)據(jù)表可以選擇幾種存放形式:1。ASCII碼文件-采用LISP語(yǔ)言讀取文件數(shù)據(jù)。2。直接存放于LISP語(yǔ)言的表中。3。數(shù)據(jù)庫(kù)文件。其中第3種形式只要有了通用的數(shù)據(jù)庫(kù)操縱手段,就有利于數(shù)據(jù)共享和維護(hù)數(shù)據(jù)的一致性;采用通用的數(shù)據(jù)庫(kù)接口簡(jiǎn)化讀取數(shù)據(jù)的過(guò)程;有利于利用數(shù)據(jù)庫(kù)特有的索引功能提高從大量數(shù)據(jù)中進(jìn)行查找的速度;利用數(shù)據(jù)庫(kù)實(shí)現(xiàn)指定搜索條件的查找;維護(hù)管理龐雜的數(shù)據(jù)圖表。因此第3種形式最為理想。在AutoCAD環(huán)境內(nèi)顯示工程設(shè)計(jì)手冊(cè)的圖形一般采用SLD圖形文件方式。SLD圖形文件有兩種存放方式:1。單獨(dú)的SLD文件。2。多個(gè)SLD文件裝人SLB庫(kù)中。SLB庫(kù)形式節(jié)省存儲(chǔ)空間且管理容易,但建庫(kù)稍有不便。這兩種形式圖形的具體實(shí)現(xiàn)方法在AutoCAD的各種手冊(cè)教材中都有,本文不再介紹。 在AutoCAD屏幕上顯示工程手冊(cè)的數(shù)據(jù)表和圖形一般采用對(duì)話框來(lái)實(shí)現(xiàn)。在AutoCAD環(huán)境內(nèi)顯示對(duì)話框要用對(duì)話框控制語(yǔ)言編制一個(gè)DCL文件和一段填寫顯示對(duì)話框數(shù)據(jù)的LISP語(yǔ)言程序。如果針對(duì)工程手冊(cè)的每一個(gè)圖表編制一個(gè)DCL對(duì)話框文件,一個(gè)填寫顯示對(duì)話框數(shù)據(jù)的LISP語(yǔ)言程序,則工作量很大,占用磁盤空間很大,不便于管理。因?yàn)楣こ淘O(shè)計(jì)手冊(cè)上的圖表雖然格式各異,但也有它們的共同特點(diǎn)??梢岳盟鼈兊墓餐攸c(diǎn)簡(jiǎn)化程序的編制。筆者編寫了一個(gè)通用的用于翻閱工程設(shè)計(jì)圖表的LISP語(yǔ)言程序--HANDBOOK。實(shí)現(xiàn)的要點(diǎn)是:1。數(shù)據(jù)存放在DBASE/FOXBASE/FOXPRO格式的數(shù)據(jù)庫(kù)中。2。建立一個(gè)管理所有數(shù)據(jù)庫(kù)的目錄數(shù)據(jù)庫(kù)。3。每次啟動(dòng)翻閱數(shù)據(jù)庫(kù)的程序時(shí),首先翻閱圖表目錄數(shù)據(jù)庫(kù),選定某個(gè)圖表后,動(dòng)態(tài)地產(chǎn)生針對(duì)不同表格的DCL對(duì)話框語(yǔ)言文件以控制對(duì)話框的顯示外觀。4。利用我們自己開(kāi)發(fā)的LISPBASE數(shù)據(jù)庫(kù)接口操縱所有數(shù)據(jù)庫(kù)。5。圖形存放在SLB庫(kù)中并用目錄數(shù)據(jù)庫(kù)進(jìn)行管理。HANDBOOK源程序如下: ;;;;;;;;;;;;;;;;;;;;; HANDBOOK ;;;;;;;;;;;;;;;;;;;;;; (defun handbook( / dcl_id templist rlist tempstr name) (setq dcl_id (load_dialog "handbook")) (if (not(new_dialog "handbook" dcl_id)) (exit)) (if (null use) (xload"lispbase")) (setq hbook (use 0 "handbook.dbf")) (if (/= hbook 0) (exit)) (setq templist (list)) (while (/= (eof hbook) 1) (setq rlist (getrec hbook)) (setq tempstr (strcat (nth 1 rlist) (nth 2 rlist))) (setq templist (append templist (list tempstr))) (skip hbook 1) ) (start_list "tablelist") (mapcar 'add_list templist) (end_list) (action_tile "accept" "(setq name (select_row))(done_dialog)(princ)") (action_tile "cancel" "(done_dialog)(unload_dialog dcl_id)(princ)") (action_tile "tablelist" "(setq name (select_row))(done_dialog)(princ)") (start_dialog) (shut hbook) (unload_dialog dcl_id) (if (> (length name) 0) (display name)) ) ;;;display table;;;; (defun display( name / tablename filename s l i title str f r rlist templist tempstr dcl_id sld_name) (setq tablename (packname (car name)) filename (packname (cadr name))) (setq fileid (use 0 Filename)) (if (/= fileid 0) (progn (alert "Can't open data table...")(exit))) (setq s (stru fileid)) (setq l (length s) i 0) (setq title "" str "------------------------------------") (while (< i l) (progn (setq m (atoi (substr (nth i s) 14 2))) (if (> m 10) (setq title (strcat title (substr (nth i s) 1 10) (substr str 1 (- m 10)) " ")) (setq title (strcat title (substr (nth i s) 1 m ) " ")) ) (setq i (1+ i)) ) ) (setq f(open "table.dcl" "w")) (write-line "table:dialog{" f) (write-line (strcat " label=\"" tablename "\";") f) (if (/= (findfile (packname(nth 2 name))) nil) (progn (write-line " :boxed_row {" f) (write-line " :image {" f) (write-line " key=\"picture1\";" f) (write-line " color=0;" f) (write-line " height=10;" f) (write-line " width=12;" f) (write-line " }" f) (if (/= (findfile (packname(nth 3 name))) nil) (progn (write-line " :image {" f) (write-line " key=\"picture2\";" f) (write-line " color=0;" f) (write-line " height=10;" f) (write-line " width=12;" f) (write-line " }" f) (if (/= (findfile (packname(nth 4 name))) nil) (progn (write-line " :image {" f) (write-line " key=\"picture3\";" f) (write-line " color=0;" f) (write-line " height=10;" f) (write-line " width=12;" f) (write-line " }" f) ) ) ) ) (write-line " }" f) ) ) (write-line " :list_box{" f) (write-line (strcat " label=\"" (substr title 1 74) "\";") f) (write-line " key=\"table\";" f) (setq m (+ (strlen title) 2)) (if (< m 30) (setq m 30)) (setq testname name) (if (or (> m 74) (/= (findfile (packname(nth 4 name))) nil)) (setq m 74)) (write-line (strcat " width=" (itoa m) ";") f) (write-line " }" f) (write-line " ok_cancel;" f) (write-line "}" f) (close f) (setq dcl_id (load_dialog "table")) (if (not(new_dialog "table" dcl_id)) (exit)) (setq templist (list) str " ") (while (= (eof fileid) 0) (setq tempstr "") (setq rlist (getrec fileid) i 0) (while (< i l) (cond ((= (substr (nth i s) 12 1) "C") (setq tempstr (strcat tempstr (nth (1+ i) rlist) " "))) ((= (substr (nth i s) 12 1) "N") (progn (setq r (rtos (nth (1+ i) rlist) 2 (atoi (substr (nth i s) 17 1)))) (setq sl (strlen r)) (setq tempstr (strcat tempstr (substr str 1 (- (atoi (substr (nth i s) 14 2)) sl)) r " ")) ) ) ) (setq i (1+ i)) ) (setq templist (append templist (list tempstr))) (skip fileid 1) ) (start_list "table") (mapcar 'add_list templist) (end_list) (setq sldname (nth 2 name)) (if (/= (findfile sldname) nil) (set_image sldname "1") ) (setq sldname (nth 3 name)) (if (/= (findfile sldname) nil) (set_image sldname "2") ) (setq sldname (nth 4 name)) (if (/= (findfile sldname) nil) (set_image sldname "3") ) (action_tile "accept" "(setq r(get_row))(done_dialog)") (action_tile "cancel" "(done_dialog)(princ)") (action_tile "tablelist" "(setq r(get_row))(done_dialog)") (start_dialog) (unload_dialog dcl_id) (shut fileid) (if (listp r) (setq r (cdr r)) ) )
;;;;select_row;;;; (DEFUN select_row(/ recid record ) (setq recid (1+ (atoi (get_tile "tablelist")))) (goto hbook recid) (setq record (getrec hbook)) (list (nth 1 record) (nth 3 record) (nth 4 record) (nth 5 record) (nth 6 record)) ) (defun get_row(/ recid ) (setq recid (1+ (atoi (get_tile "table")))) (goto fileid recid) (getrec fileid) ) (defun packname(fn / i j) (if (/= fn nil) (progn (setq i 1 j (strlen fn)) (while (and (/= (substr fn i 1) " ") (<= i j)) (setq i(1+ i))) (if (<= i j) (progn (setq i(1- i)) (setq fn (substr fn 1 i)) ) (setq fn fn) ) ) ) ) ;;;;;;set_image;;;;;;;;; (defun set_image(sldname id / x y ) (setq x (dimx_tile (strcat "picture" id)) y (dimy_tile (strcat "picture" id))) (start_image (strcat "picture" id)) (slide_image 0 0 x y sldname) (end_image) ) 上述程序中使用了若干LISPBASE數(shù)據(jù)庫(kù)接口的函數(shù)。 可以把HANDBOOK程序掛在任何AutoCAD的菜單下,以方便用戶使用。激活HANDBOOK程序后,首先顯示所有數(shù)據(jù)表的目錄選擇對(duì)話框。下圖是一個(gè)例子: 在對(duì)話框的數(shù)據(jù)表目錄滾動(dòng)列表框內(nèi)選擇所要翻閱的表格,按OK鍵,HANDBOOK程序就自動(dòng)產(chǎn)生控制該表格的DCL對(duì)話框控制語(yǔ)言文件,然后就可以在屏幕上用對(duì)話框的形式顯示該表格的內(nèi)容,例子見(jiàn)下圖: 對(duì)話框可以包括一至多個(gè)插圖和滾動(dòng)數(shù)據(jù)列表框。插圖的多少和列表框的寬度取決于使用顯示器的分辨率,常用的640X480分辨率VGA顯示器一般可以顯示三幅插圖,70列數(shù)據(jù)字符。如使用較高分辨率的顯示器。也可以對(duì)HANDBOOK程序稍加修改,顯示更多的圖形和數(shù)據(jù)。數(shù)據(jù)列表框的頂部自動(dòng)根據(jù)數(shù)據(jù)庫(kù)字段名和字段寬度顯示字段名,列表框的行數(shù)不限。如果用戶使用中文AutoCAD環(huán)境,可以顯示中文內(nèi)容。對(duì)HANDBOOK程序稍加修改可以用盡量大的面積顯示圖形,也可以實(shí)現(xiàn)完全類似于人工在工程設(shè)計(jì)圖表中的諾模圖類型的圖表上直接選擇制定參數(shù)的功能。 本文介紹的程序和方法支持網(wǎng)絡(luò)上多用戶使用,支持DOS和Windows兩種版本的AutoCAD v12. 對(duì)于比較大的單位,需要使用 ORACLE,SYBASE,INGRESS,SQL-SERVER,等數(shù)據(jù)庫(kù)的情況,可以使用另外一個(gè)AutoCAD Lisp 語(yǔ)言環(huán)境下的ODBC數(shù)據(jù)庫(kù)接口--LISPODBC。由于現(xiàn)在幾乎所有的數(shù)據(jù)庫(kù)都支持ODBC,因此利用LISPODBC可以不受數(shù)據(jù)庫(kù)的限制。
適用 AUTOCAD 環(huán)境的 LISPBASE 數(shù)據(jù)庫(kù)接口介紹 LISPBASE v2.0 是一個(gè)在 AUTOCAD V12 環(huán)境下訪問(wèn)DBASE/ Foxbase / Foxpro 等Xbase 系列數(shù)據(jù)庫(kù)程序。使用 AUTOCAD 內(nèi)嵌語(yǔ)言 AUTOLISP 的語(yǔ)法。使AUTOLISP 擴(kuò)充了訪問(wèn)數(shù)據(jù)庫(kù)的功能。LISPBASE 提供了常用的21個(gè)函數(shù)。最多可同時(shí)打開(kāi)操作10個(gè)數(shù)據(jù)庫(kù)文件。索引文件使用擴(kuò)展名為IDX的Fox系列數(shù)據(jù)庫(kù)索引文件,對(duì)每個(gè)數(shù)據(jù)庫(kù)文件所打開(kāi)的索引文件打開(kāi)數(shù)不限。并且允許多個(gè)用戶在網(wǎng)絡(luò)工作站上以共享方式訪問(wèn)在網(wǎng)絡(luò)服務(wù)器上的數(shù)據(jù)庫(kù)。LISPBASE 有DOS 和 WINDOWS 兩種版本,分別運(yùn)行于DOS 或WINDOWS 版AUTOCAD V12 環(huán)境。 LISPBASE的典型應(yīng)用是編在AUTOLISP語(yǔ)言程序中實(shí)現(xiàn)的。各種設(shè)計(jì)任務(wù)中的查表,數(shù)據(jù)記錄,明細(xì)表生成等均可利用LISPBASE訪問(wèn)數(shù)據(jù)庫(kù)。我們還可向需要開(kāi)發(fā)參數(shù)設(shè)計(jì)軟件的用戶提供按用戶需要定制的表達(dá)式求值函數(shù)和通用數(shù)據(jù)庫(kù)查表函數(shù)--EVALEXPRS 和 SEEKTABLE。
LISPBASE 的運(yùn)行 啟動(dòng)了 AUTOCAD 后,用(XLOAD "LISPBASE")命令可以把LISPBASE調(diào)入內(nèi)存并和AUTOCAD建立聯(lián)系。然后就可以使用LISPBASE 提供的LISP語(yǔ)法的函數(shù)對(duì)用戶建立的 FOXBASE數(shù)據(jù)庫(kù)進(jìn)行操縱了。注意: LISPBASE.EXE 可執(zhí)行文件應(yīng)該在AUTOCAD的搜索路徑中,即在 DOS 批處理命令中的環(huán)境變量設(shè)置命令 SET ACAD= ... 的路徑中。例如有: SET ACAD=C:\\ACAD;C:\\ACAD\\SUPPORT;C:\\ACAD\\FONTS則 LISPBASE.EXE 可執(zhí)行文件應(yīng)該在上述路徑中。關(guān)于 LISPBASE 的數(shù)據(jù)類型的說(shuō)明 1 。LISPBASE 的與數(shù)據(jù)庫(kù)記錄編號(hào)有關(guān)的函數(shù)受LISP數(shù)據(jù)類型限制,記錄編號(hào)在兩字節(jié)有符號(hào)整數(shù)能表示的范圍內(nèi)。2 。LISPBASE 讀取 DBASE/FOX 系列數(shù)據(jù)庫(kù)的方法:對(duì)數(shù)值型字段:字段寬度 >= 4 或有小數(shù)點(diǎn),作為浮點(diǎn)數(shù)處理,否則作為整數(shù)處理。日期型字段:作為 8 字符寬度的字符串處理。邏輯型字段:作為 1 字符寬度的字符串處理。字符型字段:作為字符串處理。 通用型字段: FOXPRO 2.5 版有通用型字段,讀寫時(shí)作為 10 字符寬度的字符串處理。對(duì)于插入記錄操作應(yīng)以空格字符串寫出。對(duì)于替換記錄操作不應(yīng)改動(dòng)原來(lái)字段的內(nèi)容,否則會(huì)出現(xiàn)數(shù)據(jù)庫(kù)內(nèi)容的不一致現(xiàn)象。備注型字段:讀寫時(shí)作為 10 字符寬度的字符串處理。對(duì)于插入記錄操作應(yīng)以空格字符串寫出。對(duì)于替換記錄操作不應(yīng)改動(dòng)原來(lái)字段的內(nèi)容,否則會(huì)出現(xiàn)數(shù)據(jù)庫(kù)內(nèi)容的不一致現(xiàn)象。3 。對(duì)于 Locate,Sum,Count 等可對(duì)數(shù)據(jù)庫(kù)記錄內(nèi)容和 AutoLisp 變量?jī)?nèi)容進(jìn)行邏輯運(yùn)算操作的函數(shù),不可對(duì)通用型字段和備注型字段進(jìn)行邏輯運(yùn)算操作。LISPBASE 的 21個(gè)函數(shù)的清單: (use DBFFileID Filename) (index DBFFileID IndexFilename IndexFilename ...) (getrec DBFFileID) (skip DBFFileID Skip_Num) (bof DBFFileID) (eof DBFFileID) (shut DBFFileID) (replace DBFFileID RecordList) (erase DBFFileID) (insert DBFFileID RecordList) (seek DBFFileID SeekString) (goto DBFFileID Record_Id) (recno DBFFileID) (gotop DBFFileID) (gobott DBFFileID) (locate DBFFileID ConditionExpress) (sum DBFFileID [FieldsList] [ConditionExpress]) (count DBFFileID [ConditionExpress]) (dbname DBFFileID) (stru DBFFileID) (reccnt DBFFileID)
LISPBASE 函數(shù)參考 1 。(use DBFFileID Filename)use 函數(shù)用于以共享方式打開(kāi)數(shù)據(jù)庫(kù),并使該數(shù)據(jù)庫(kù)和一個(gè)0…9的整數(shù)聯(lián)系起來(lái)。(use DBFFileID Filename) 函數(shù)如果成功地打開(kāi)了數(shù)據(jù)庫(kù),返回 DBFFileID。Filename 是數(shù)據(jù)庫(kù)文件名字符串。必須是一個(gè)合法的DOS文件名。在路徑中表示子目錄的反斜線必須用兩個(gè)。use 函數(shù)可以訪問(wèn)網(wǎng)絡(luò)服務(wù)器上的文件。打開(kāi)數(shù)據(jù)庫(kù)后應(yīng)盡快關(guān)閉。用戶編制訪問(wèn)數(shù)據(jù)庫(kù)的程序時(shí),應(yīng)檢測(cè)是否打開(kāi)數(shù)據(jù)庫(kù),如果不能打開(kāi),則經(jīng)過(guò)適當(dāng)?shù)难訒r(shí)再試一試打開(kāi)的操作。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9之間的一個(gè)整數(shù)。如果成功地打開(kāi)了數(shù)據(jù)庫(kù),函數(shù)返回 DBFFileID,否則返回 -1。例子: (setq FieID (use 1 "f:\\design\\object1\\partlist.dbf" ) )(if (/= FieID 1) (print "DBF File can't open")) 注解: Filename ,DBFFileID 都可以是 LISP 變量。以下的12個(gè)函數(shù)同樣。以下不再重復(fù)。
2 。(index DBFFileID IndexFilename IndexFilename ...)index 函數(shù)用于打開(kāi)數(shù)據(jù)庫(kù)的索引文件。(index DBFFileID IndexFilename IndexFilename ...) 函數(shù)如果成功地打開(kāi)了索引文件,返回 DBFFileID。否則返回 -1。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9之間的一個(gè)整數(shù)。IndexFilename 是索引文件名字符串。必須是一個(gè)合法的DOS文件名。索引文件可以同時(shí)打開(kāi)多個(gè),數(shù)量不限。但受內(nèi)存限制。對(duì)打開(kāi)索引文件的數(shù)據(jù)庫(kù)使用 seek 函數(shù)進(jìn)行查找時(shí),LISPBASE 使用第一個(gè)索引文件。對(duì)打開(kāi)多個(gè)索引文件的數(shù)據(jù)庫(kù)進(jìn)行插入操作時(shí),同時(shí)對(duì)多個(gè)索引文件更新。注意索引關(guān)鍵字不能包括FOXBASE能夠執(zhí)行的字符串或數(shù)據(jù)轉(zhuǎn)換函數(shù)和表達(dá)式,如STR(),CHR(),SUBSTR()等。例子: (index 0 "d:\\prod\\part01.idx" "d:\\prod\\part02.idx" "d:\\prod\\part03.idx")3 。(getrec DBFFileID)getrec 函數(shù)用于取得打開(kāi)的數(shù)據(jù)庫(kù)的當(dāng)前記錄,getrec 如果執(zhí)行成功,則返回由數(shù)據(jù)庫(kù)各字段數(shù)據(jù)構(gòu)成的一個(gè)表。否則返回 nil 。表的第0個(gè)原子是表示該記錄是否刪除的字符。如已刪除,為 *;如未刪除,為空格。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。例子: (setq f 0)(use f "d:\\product\\part.dbf") (setq reclst(getrec f)) (print reclst) 函數(shù)返回: (" " "MQ25014401 " "A" 4 65.82 "GB3811 " "一金工 " )4 。(skip DBFFileID Skip_Num)skip 用于從當(dāng)前數(shù)據(jù)庫(kù)記錄指針的位置移動(dòng)數(shù)據(jù)庫(kù)的記錄指針。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。Skip_Num 是要移動(dòng)的記錄條數(shù)??梢允钦麛?shù)。也可以是負(fù)整數(shù)。如果執(zhí)行成功,函數(shù)返回記錄編號(hào)。如果正向移動(dòng)記錄指針超出了數(shù)據(jù)庫(kù)的最后一個(gè)記錄,函數(shù)返回?cái)?shù)據(jù)庫(kù)記錄數(shù)加 1的數(shù)字。如果負(fù)向移動(dòng)記錄指針超出了數(shù)據(jù)庫(kù)的第一個(gè)記錄,函數(shù)返回0。對(duì)打開(kāi)了索引文件的數(shù)據(jù)庫(kù)同樣如此。例子: (skip 0 30)5 。(bof DBFFileID)bof 用于測(cè)試記錄指針是否指向文件頭。如果是,返回1,否則返回0。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。例子: (if (= (bof 0) 1) (print "File Begen."))
6 。(eof DBFFileID)eof 用于測(cè)試記錄指針是否指向文件尾。如果是,返回1,否則返回0。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。例子: (if (= (eof 0) 1)(print "File End"))
7 。(shut DBFFileID)shut 函數(shù)用于關(guān)閉打開(kāi)的數(shù)據(jù)庫(kù)。如果關(guān)閉成功,返回 DBFFileID,否則返回-1。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。例子: (setq f 1)(use f "personal.dbf") ...... (shut f)
8 。(replace DBFFileID RecordList)replace 用于替換打開(kāi)數(shù)據(jù)庫(kù)的當(dāng)前記錄。操作如果執(zhí)行成功,函數(shù)返回記錄編號(hào),否則返回0。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。RecordList 是由一個(gè)刪除標(biāo)記字符和數(shù)據(jù)庫(kù)各字段數(shù)據(jù)構(gòu)成的一個(gè)表。刪除標(biāo)記字符必須是表的第一個(gè)原子。其他各原子的數(shù)據(jù)類型必須與數(shù)據(jù)庫(kù)的各對(duì)應(yīng)字段保持一致。如果有索引文件打開(kāi),所有索引關(guān)鍵字字段不允許修改。否則容易造成索引文件的破壞。 例子: (setq reclst (list " " "Q021234 " 5 20.4 ))(use 0 "part.dbf") (replace 0 reclst) (shut 0)
9 。(erase DBFFileID)erase 用于刪除打開(kāi)數(shù)據(jù)庫(kù)的當(dāng)前記錄。如果該記錄已經(jīng)刪除,則恢復(fù)之。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。刪除操作成功,函數(shù)返回 DBFFileID,否則返回-1。例子: (use 5 "part.dbf")(skip 5 10) (erase 5) (shut 5)
10 。(insert DBFFileID RecordList)insert 用于向打開(kāi)的數(shù)據(jù)庫(kù)插入一條記錄。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。操作如果執(zhí)行成功,函數(shù)返回記錄編號(hào),否則返回-1。RecordList 是由一個(gè)刪除標(biāo)記字符和數(shù)據(jù)庫(kù)各字段數(shù)據(jù)構(gòu)成的一個(gè)表。刪除標(biāo)記字符必須是表的第一個(gè)原子。其他各原子的數(shù)據(jù)類型必須與數(shù)據(jù)庫(kù)的各對(duì)應(yīng)字段一致。對(duì)打開(kāi)多個(gè)索引文件的數(shù)據(jù)庫(kù)進(jìn)行插入操作時(shí),同時(shí)對(duì)多個(gè)索引文件更新。 例子: (setq reclst (list " " "Q021234 " 5 20.4 ))(use 0 "part.dbf") (index 0 "part.idx") (insert 0 reclst) (shut 0)
11 。(seek DBFFileID SeekString)seek 用于在打開(kāi)了索引文件的數(shù)據(jù)庫(kù)中進(jìn)行查找。如果找到。函數(shù)返回該記錄的記錄號(hào)。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。使用 函數(shù)之前必須打開(kāi)數(shù)據(jù)庫(kù)和索引文件。SeekString 是要查找的字符串。例子: (setq s "Q03")(use 0 "part.dbf") (index 0 "part05.idx") (setq rcd(seek 0 s)) (if (/= rcd 0)(print rcd)(print "\nNot Found")) (shut 0) 12 。(goto DBFFileID Record_Id)goto 用于操縱打開(kāi)數(shù)據(jù)庫(kù)的當(dāng)前記錄號(hào)。使之指向 Record_Id,如果 Record 超出了數(shù)據(jù)庫(kù)的最大記錄號(hào)或執(zhí)行不成功,返回 0。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。Record_Id 是要指向的記錄號(hào)。對(duì)打開(kāi)索引文件的數(shù)據(jù)庫(kù)使用此函數(shù)后,索引文件的索引指針會(huì)指向 Record_id。例子: (use 0 "part.dbf") (setq rcd(goto 0 5)) (setq rcd(getrec 0)) (print rcd) (shut 0)
13 。(recno DBFFileID)recno 用于返回打開(kāi)數(shù)據(jù)庫(kù)的當(dāng)前記錄號(hào)。如果BOF或EOF為真,返回0。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。例子: (use 0 "part.dbf") (index 0 "part05.idx") (setq rcd(seek 0 s)) (setq rcd1(recno 0)) (print rcd) (print rcd1) (shut 0) 14 。(gotop DBFFileID)gotop 用于把打開(kāi)數(shù)據(jù)庫(kù)的當(dāng)前記錄號(hào)指向?yàn)閿?shù)據(jù)庫(kù)的第一條記錄。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。對(duì)于打開(kāi)了索引文件的數(shù)據(jù)庫(kù)文件,當(dāng)前記錄號(hào)指向索引順序的第一條記錄。例子: (use 0 "part.dbf") (index 0 "part05.idx") (setq rcd(gotop 0)) (setq rcd1(recno 0)) (print rcd) (print rcd1) (shut 0) 15 。(gobott DBFFileID)gobott 用于把打開(kāi)數(shù)據(jù)庫(kù)的當(dāng)前記錄號(hào)指向?yàn)閿?shù)據(jù)庫(kù)的最后一條記錄。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。對(duì)于打開(kāi)了索引文件的數(shù)據(jù)庫(kù)文件,當(dāng)前記錄號(hào)指向索引順序的最后一條記錄。例子: (use 0 "part.dbf") (index 0 "part05.idx") (setq rcd(gotop 0)) (setq rcd1(recno 0)) (print rcd) (print rcd1) (shut 0) 16 。(locate DBFFileID ConditionExpress)locate 用于把打開(kāi)數(shù)據(jù)庫(kù)的當(dāng)前記錄號(hào)指針向后推向滿足條件表達(dá)式的第一條記錄,或者說(shuō)是條件表達(dá)式為真的記錄。locate 返回記錄號(hào)。locate 函數(shù)是從當(dāng)前記錄開(kāi)始操作的。如果要從文件頭開(kāi)始操作,應(yīng)在 locate 函數(shù)執(zhí)行前執(zhí)行 gotop。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。ConditionExpress 是由 AutoLisp 變量,數(shù)據(jù)庫(kù)字段,數(shù)字,字符串,邏輯運(yùn)算符,算術(shù)運(yùn)算符,圓括號(hào)等組成的邏輯運(yùn)算表達(dá)式。該表達(dá)式與 FoxBase 的相應(yīng)表達(dá)式兼容。圓括號(hào) : (,)。AutoLisp 變量 :AutoLisp 內(nèi)部的用戶建立的變量,可以是整數(shù),浮點(diǎn)數(shù), 字符串類型。數(shù)據(jù)庫(kù)字段 : Dbase/FoxBase/Foxpro 數(shù)據(jù)庫(kù)的字段名。字段數(shù)據(jù)類型 可以是數(shù)字,字符串,邏輯,日期。但不能是備注 (mem) 類型和通用(general)類型的。算術(shù)運(yùn)算符 :包括 +,-,*,/,取余數(shù)%,冪^。數(shù)字 :可以是整數(shù),浮點(diǎn)數(shù),科學(xué)計(jì)數(shù)法數(shù)值等。 字符串 :由單引號(hào)‘ 引導(dǎo)和結(jié)束的任何字符,包括漢字。邏輯運(yùn)算符 : 與: .AND. 或: .OR. 相等: = 大于: > 小于: < 大于等于: >= 小于等于: <= 不等于: <>各算術(shù)運(yùn)算和邏輯運(yùn)算符的優(yōu)先級(jí)別遵從一般程序設(shè)計(jì)語(yǔ)言的規(guī)則,可參閱 BASIC、C、PASCAL、FORTRAN等參考書(shū)。比較邏輯運(yùn)算可以用于字符串。注:邏輯運(yùn)算表達(dá)式的說(shuō)明適用于 SUM 和 COUNT 函數(shù)。以下不再重復(fù)。例子: (use 0 "part.dbf") (locate 0 "Weight>200.0 .and.Quantity>40.or.Name<>N.and.Type='GB76'") (getrec 0) 本例中, Weight,Quantity,Name,Type 為數(shù)據(jù)庫(kù)字段名,N 是 LISP 變量名。17 。(sum DBFFileID [FieldsList] [ConditionExpress])sum 用于累加數(shù)據(jù)庫(kù)的數(shù)值字段的數(shù)值。當(dāng)使用了可選的[ConditionExpress] 參數(shù)時(shí)。累加數(shù)據(jù)庫(kù)的數(shù)值字段的數(shù)值的條件是滿足條件表達(dá)式記錄,或者說(shuō)是條件表達(dá)式為真的記錄。當(dāng)使用了可選的 [FieldList] 參數(shù),對(duì) [FieldList]表中的數(shù)據(jù)庫(kù)字段進(jìn)行累加。[FieldList] 參數(shù)沒(méi)有提供時(shí),對(duì)所有數(shù)值字段累加。函數(shù)返回一個(gè)表,表的各項(xiàng)是按照數(shù)據(jù)庫(kù)中數(shù)值字段排列的各字段累加數(shù)據(jù)和。sum 函數(shù)是從當(dāng)前記錄開(kāi)始操作的。如果要從文件頭開(kāi)始操作,應(yīng)在 sum 函數(shù)執(zhí)行前執(zhí)行 gotop。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。ConditionExpress 是由 AutoLisp 變量,數(shù)據(jù)庫(kù)字段,數(shù)字,字符串,邏輯運(yùn)算符,算術(shù)運(yùn)算符,圓括號(hào)等組成的邏輯運(yùn)算表達(dá)式。該表達(dá)式與 FoxBase 的相應(yīng)表達(dá)式類似。詳細(xì)說(shuō)明見(jiàn) locate 參考。18 。(count DBFFileID [ConditionExpress])count 用于計(jì)算數(shù)據(jù)庫(kù)的記錄條數(shù)。當(dāng)使用了可選的[ConditionExpress] 參數(shù)時(shí)。計(jì)算數(shù)據(jù)庫(kù)的記錄條數(shù)的條件是滿足條件表達(dá)式的記錄,或者說(shuō)是條件表達(dá)式為真的記錄。函數(shù)返回一個(gè)滿足條件表達(dá)式的記錄條數(shù)的整數(shù)。 count 函數(shù)是從當(dāng)前記錄開(kāi)始操作的。如果要從文件頭開(kāi)始操作,應(yīng)在 count 函數(shù)執(zhí)行前執(zhí)行 gotop。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。ConditionExpress 是由 AutoLisp 變量,數(shù)據(jù)庫(kù)字段,數(shù)字,字符串,邏輯運(yùn)算符,算術(shù)運(yùn)算符,圓括號(hào)等組成的邏輯運(yùn)算表達(dá)式。該表達(dá)式與 FoxBase 的相應(yīng)表達(dá)式類似。詳細(xì)說(shuō)明見(jiàn) locate 參考。例: (use 0 "GB3811.dbf")(setq n (count 0 "A>=1.2")) (print n) 19 。(dbname DBFFileID)dbname 用于返回?cái)?shù)據(jù)庫(kù)文件名。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。 例:(use 0 "GB3811.dbf")(setq dbn (dbname 0))
20 。(stru DBFFileID)stru 用于返回?cái)?shù)據(jù)庫(kù)結(jié)構(gòu)。函數(shù)返回一個(gè)表,表的各項(xiàng)是 17 個(gè)字符的字符串。字符1…10 是數(shù)據(jù)庫(kù)字段名,字符 12 是字段數(shù)據(jù)類型,字符14…15是字段寬,字符 17 是數(shù)值型字段的小數(shù)點(diǎn)位置。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。例: (use 0 "GB3811.dbf")(setq struct (stru 0)) (print struct) 21 。(reccnt DBFFileID)reccnt 用于返回?cái)?shù)據(jù)庫(kù)記錄數(shù)。DBFFileID 是數(shù)據(jù)庫(kù)文件編號(hào)。類似于FOXBASE的工作區(qū)編號(hào)。必須是0…9 之間的一個(gè)整數(shù)。例: (use 0 "GB3811.dbf")(setq n (reccnt 0)) (print n) |
|