小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

AutoLisp

 ufo999 2011-07-15
 

用數(shù)據(jù)庫管理AutoCAD的圖塊和實現(xiàn)查詢插入操作

主題詞:AutoCAD, 圖塊,數(shù)據(jù)庫,查詢

上海港口機械廠 劉啟衛(wèi)

本文介紹一個用數(shù)據(jù)庫管理和實現(xiàn)查詢插入AutoCAD圖塊的方法。

問題的提出

眾所周知,一個AutoCAD圖形中的圖塊BLOCK,可以用WBLOCK命令寫到磁盤上成為DWG文件。磁盤上的DWG文件可以用INSERT命令插人到圖形中形成圖塊。管理圖塊,實際也就是管理DWG文件。

AutoCADINSERT插入圖塊功能十分有用,可以大大簡化和加快繪圖的工作。當某個具體的AutoCAD二次開發(fā)應(yīng)用需要用大量的圖塊時,圖塊的命名和存放管理就需要費一些心思了。DOS文件名限制在8個字符,用來標識一個以圖塊描述的設(shè)計對象的標準代號往往不夠用,當然更談不上記錄圖塊的屬性性質(zhì)的數(shù)據(jù)了。而設(shè)計時經(jīng)常需要考慮和引用一個用圖塊描述的設(shè)計對象的屬性數(shù)據(jù)和完整的標準代號,名稱,安裝和使用性能參數(shù)等等。一般來說,設(shè)計任務(wù)常常需要以某些參數(shù)為準則選擇適當?shù)囊詧D塊描述的設(shè)計對象插入圖中。例如:給一個電動機配一個公稱扭矩大于300N。m,許用轉(zhuǎn)速大于2800轉(zhuǎn)/分,軸孔直徑=32毫米的聯(lián)軸器。就是說要按一定條件經(jīng)過查詢搜索,找到一個滿足要求的圖形用INSERT命令插入當前編輯的圖形形成圖塊BLOCK。最好設(shè)計者不必關(guān)心這個圖塊是存放在什么地方,只要按設(shè)計意圖指定需要什么樣的東西,就自動從數(shù)據(jù)庫中把它選擇出來插到圖上。

解決問題的途徑

上述功能可以在DOSWindows環(huán)境下分別用幾種方法實現(xiàn)。在DOS環(huán)境下,需要把圖塊的屬性數(shù)據(jù)存入數(shù)據(jù)庫,把圖塊的文件訪問路徑存入數(shù)據(jù)庫。在Windows環(huán)境下還可以把AutoCAD圖形文件作為OLE對象以鏈接或嵌入方式存入ODBC數(shù)據(jù)庫。要在DOS版或者WindowsAutoCAD環(huán)境中實現(xiàn)用LISP語言訪問數(shù)據(jù)庫的功能。

WindowsAutoCAD環(huán)境下可以利用AutoCAD提供的有關(guān)程序,利用WindowsDDE(動態(tài)數(shù)據(jù)交換)功能實現(xiàn)訪問ODBC數(shù)據(jù)庫。由于AutoCAD還不能直接從ODBC數(shù)據(jù)庫中用INSERT命令插入圖塊,因此如果用ODBC數(shù)據(jù)庫而且用了嵌入的存放方式,雖然可以把大量獨立的文件集中存放在一個大的數(shù)據(jù)庫中,但仍然要解決需要INSERT插人操作時,過濾掉OLE嵌入對象的圖元表現(xiàn)數(shù)據(jù),把DWG文件數(shù)據(jù)輸出到一個臨時DWG文件中,然后才能用INSERT命令插入。而在AutoCAD環(huán)境中通過DDE途徑操縱ODBC數(shù)據(jù)庫,把OLE嵌入對象輸出到臨時文件中是困難曲折而且耗費資源的。

本文介紹的方法

本文介紹的方法是利用一個LISP語言訪問DBASE/Foxpro數(shù)據(jù)庫的接口程序LISPBASE為支持手段實現(xiàn)的。在DOS環(huán)境下,圖塊以分立的DWG文件的形式存放,在數(shù)據(jù)庫中存放訪問路徑。在Windows環(huán)境下,可以進一步用OLE功能以鏈接或嵌人方式存放DWG文件,LISPBASE for Windows 提供一個專用函數(shù)解決OLE嵌人對象輸出到臨時文件的問題。在數(shù)據(jù)庫中以嵌人方式存放DWG圖塊時,要把圖塊插入到當前編輯的圖形文件中還有一個途徑。就是直接讀取OLE對象數(shù)據(jù),過濾掉OLE嵌入對象的圖元表現(xiàn)數(shù)據(jù),把DWG文件的ENTITY數(shù)據(jù)用LISP語言提供的函數(shù)構(gòu)造成BLOCK表并插入圖形文件中。這個方案的實現(xiàn)所需要的函數(shù)將在LISPBASE的新版本中提供。Windows環(huán)境方案的優(yōu)點是可以進一步實現(xiàn)圖文并茂的工程文檔設(shè)計和管理集成系統(tǒng)。缺點是系統(tǒng)開銷大,如果希望建立工程文檔設(shè)計和管理集成系統(tǒng),微機應(yīng)配備16兆內(nèi)存。用DOS環(huán)境的方案優(yōu)點是速度快,開銷小。唯一的缺點是無法利用WindowsOLE功能實現(xiàn)圖文并茂的工程文檔設(shè)計和管理集成系統(tǒng)。而這樣一個集成系統(tǒng)對一個小組以上規(guī)模的設(shè)計或生產(chǎn)單位的效益是十分顯著的。

具體實現(xiàn)時需要預(yù)先準備好數(shù)據(jù)庫:

第一步。

設(shè)計和建立管理所有圖塊文件的數(shù)據(jù)庫。對于沒有采用OLE嵌入方式在數(shù)據(jù)庫中存放AutoCAD圖形的方案來說,必須仔細考慮建立有條理的DOS子目錄結(jié)構(gòu)準備存放AutoCAD圖形。每個子目錄下的圖形文件在200以下為好。管理所有圖塊文件的數(shù)據(jù)庫結(jié)構(gòu)可以根據(jù)各單位的具體情況設(shè)計。例如可以設(shè)計成如下的結(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

這個結(jié)構(gòu)是針對Foxpro for Windows 2.5 設(shè)計的。使用了通用字段以OLE鏈接或嵌人對象的方式存放AutoCAD圖形的數(shù)據(jù)。如果不使用Windows版的FoxproAutoCAD,可以不建立這個通用字段。

利用LISPBASE數(shù)據(jù)庫接口可以在每建立一個圖塊后向數(shù)據(jù)庫填寫必要的屬性數(shù)據(jù)和文件訪問路徑。建立系列圖塊,可以充分利用市場上對AutoCAD二次開發(fā)編制的各種參數(shù)設(shè)計和尺寸驅(qū)動設(shè)計程序。

第二步。

針對每個圖塊系列,建立對應(yīng)結(jié)構(gòu)的屬性數(shù)據(jù)庫。例如:彈性圓柱銷聯(lián)軸器(JB108-60),可以設(shè)計如下結(jié)構(gòu):

Structure for database: JB108-60.DBF

Field Field Name Type Width Dec

1 型號 Character 8

2 許用扭矩 Numeric 6

3 許用轉(zhuǎn)速 Numeric 5

4 軸孔尺寸 Numeric 3

5 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 6

17 重量 Numeric 6 2

18 慣性矩 Numeric 6 3

19 Drawing_id Character 16

其中第19個字段Drawing_id是和圖形數(shù)據(jù)庫連接的關(guān)鍵字。可以允許多個聯(lián)軸器公用一個圖塊。然后輸入數(shù)據(jù)。

第三步。

建立管理所有圖塊系列的目錄數(shù)據(jù)庫。數(shù)據(jù)庫結(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ù)庫名的全路徑名;STANDARD NAME 字段用于存放標準和名稱;SLIDE_FILE 字段用于存放AUTOCADSLIDE文件全路徑或在SLB庫中的名稱。

使用時,1。首先打開目錄數(shù)據(jù)庫選擇要插入的圖塊系列標準——也就是選擇要打開的數(shù)據(jù)庫;2。打開選擇的數(shù)據(jù)庫;3。讀取數(shù)據(jù)庫結(jié)構(gòu);4。用對話框交互式確定各子段的查找條件準則;5。用條件準則查找數(shù)據(jù)庫;6。如果找到,則通過Drawing_ID字段在圖塊數(shù)據(jù)庫中找到圖塊,并插入到當前的圖形中。如果采用了OLE嵌入方式存放圖塊,則輸出到一個臨時文件中,然后執(zhí)行插入操作。

使用LISPBASE數(shù)據(jù)庫接口函數(shù)的部分LISP程序如下:

; 調(diào)用 USE 函數(shù),打開 JB108-60 屬性數(shù)據(jù)庫,DB_ID 是數(shù)據(jù)庫編號。

USE DB_ID "F:\\STANDARD\\JB108-60.DBF")

;調(diào)用 LOCATE 函數(shù)

;查找滿足條件準則的記錄——也就是:

; 公稱扭矩大于300N.m,許用轉(zhuǎn)速大于2800轉(zhuǎn)/分,軸孔直徑=32毫米的聯(lián);軸器。

;REC_ID 是存放記錄號的變量。

(SETQ REC_ID

(LOCATE DB_ID "許用扭矩>300 .AND.

許用轉(zhuǎn)速>2800 .AND.

軸孔直徑=32"

)

)

;找到滿足上述條件的記錄號在變量 REC_ID 中,如 REC_ID 大于 0

;就是找到了。

(IF (> REC_ID 0)

;然后就可以調(diào)用 GETREC 函數(shù)讀取該記錄,放在一個LISPREC中,以;便繼續(xù)處理。

(SETQ REC (GETREC DB_ID ))

)

具體程序省略。感興趣的讀者可來信聯(lián)系索取。對于比較大的單位,需要使用ORACLE,SYBASE,INGRESSSQL-SERVER,等數(shù)據(jù)庫的情況,可以使用另外一個AutoCAD Lisp 語言環(huán)境下的ODBC數(shù)據(jù)庫接口--LISPODBC。由于現(xiàn)在幾乎所有的數(shù)據(jù)庫都支持ODBC,因此利用LISPODBC可以不受數(shù)據(jù)庫的限制。

數(shù)據(jù)庫和AutoCAD圖形屬性標注與材料表的集成

主題詞:AutoCAD, 屬性,材料表,數(shù)據(jù)庫

上海港口機械廠 劉啟衛(wèi)

本文介紹一個使AutoCAD圖形中的屬性標注標注和材料表與數(shù)據(jù)庫保持一致的方法。用AutoCAD環(huán)境下的LISPBASE數(shù)據(jù)庫接口實現(xiàn)的。

問題的提出

眾所周知,一個AutoCAD圖形中往往會有許多具有屬性性質(zhì)的標注,如裝圖的零件號標注,外購件的型號數(shù)量,材料表,標題欄等等。這些數(shù)據(jù)往往需要同時存放在管理數(shù)據(jù)庫中,因此出現(xiàn)一個問題:如何及時地,便捷地,可靠地使AutoCAD圖形中的屬性數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)保持一致。這一問題解決得不好往往會因差錯造成很大的經(jīng)濟損失。另外,最好還能完全自動地,對設(shè)計者透明地解決這一問題。 AutoCAD提供了兩個方法解決這種問題。一個是把屬性數(shù)據(jù)寫入一個文本文件后再用數(shù)據(jù)庫的Append 命令加入數(shù)據(jù)庫;另外一個是用ASE功能解決。前一方法不方便,很難解決圖形和管理數(shù)據(jù)庫的雙向更新問題。后一方法主要是交互式地操作的,不便用LISP編程。均有一定局限性。

解決對圖形進行編輯后自動存入數(shù)據(jù)庫問題的方法

本文介紹的方法是利用一個LISP語言訪問DBASE/Foxpro數(shù)據(jù)庫的接口程序LISPBASE為支持手段實現(xiàn)的。方法如下:

1。在AutoCAD環(huán)境下,對需要輸入數(shù)據(jù)庫并和數(shù)據(jù)庫保持一致的屬性數(shù)據(jù),設(shè)計適當?shù)慕Y(jié)構(gòu),用Attribute圖塊的方式插入圖形。如裝配圖上的零件號標注和外購件標注,不要用Text圖形元素畫到圖上,而應(yīng)該針對具體對象設(shè)計Attribute圖形元素,然后插入圖中。

2。編制一個提取所有屬性圖形元素的Lisp語言程序,在需要時(結(jié)束工作)掃描圖形,把特定的Attribute圖形元素收集到Lisp表中,然后利用LispBase數(shù)據(jù)庫接口提供的函數(shù),打開管理數(shù)據(jù)庫,對數(shù)據(jù)庫進行更新。

注意數(shù)據(jù)庫中應(yīng)該設(shè)計一個存放AutoCAD圖形元素 Handle 的子段,把每個AttributeHandle記錄在數(shù)據(jù)庫中,以便在數(shù)據(jù)庫中修改數(shù)據(jù),然后更新圖形中的Attribute數(shù)據(jù)。

解決對數(shù)據(jù)庫修改以后自動更新CAD圖形問題的方法

1。在ACAD.LSP自動執(zhí)行程序中編寫查找數(shù)據(jù)庫中圖紙編號的程序。

2。打開一個已經(jīng)存在的圖形時,自動執(zhí)行在數(shù)據(jù)庫中查找圖紙編號;如果找到,自動讀出該圖有關(guān)的屬性數(shù)據(jù)和材料表,根據(jù)每個AttributeHandle對圖形中Attribute進行更新。

上述方法對標題欄,和明細表同樣適用。而保持圖紙和管理數(shù)據(jù)庫內(nèi)容的一致是圖檔管理系統(tǒng)中極為重要的必不可少的功能。

具體程序省略。感興趣的讀者可來信聯(lián)系索取。對于比較大的單位,需要使用ORACLE,SYBASE,INGRESS,SQL-SERVER,等數(shù)據(jù)庫的情況,可以使用另外一個AutoCAD Lisp 語言環(huán)境下的ODBC數(shù)據(jù)庫接口--LISPODBC。由于現(xiàn)在幾乎所有的數(shù)據(jù)庫都支持ODBC,因此利用LISPODBC可以不受數(shù)據(jù)庫的限制。

 

 

在AutoCAD環(huán)境中快速翻閱工程設(shè)計圖表

主題詞:AutoCAD, 數(shù)據(jù)庫,工程設(shè)計圖表

上海港口機械廠 劉啟衛(wèi)

設(shè)計工作的一個重要內(nèi)容就是翻閱查找存放在工程設(shè)計手冊和各種標準中的五花八門的數(shù)據(jù)表和圖表。這些數(shù)據(jù)圖表記錄了設(shè)計工作必須參照引用的數(shù)據(jù)和遵守的規(guī)范。如何正確和快速地查找引用需要的數(shù)據(jù),對提高設(shè)計工作的質(zhì)量,標準化程度和工作效率十分重要。本文介紹一個在AutoCAD環(huán)境下實現(xiàn)的快速翻閱工程設(shè)計圖表的通用方法。

各行各業(yè)的工程設(shè)計手冊和各種標準中的五花八門的數(shù)據(jù)表和圖表有一個共同特點,就是它們數(shù)量很多,格式紛雜,數(shù)據(jù)表往往附帶有插圖。在AutoCAD顯示屏幕上翻閱這類圖表需要顯示插圖和可以滾動的數(shù)據(jù)表格。數(shù)據(jù)表可以選擇幾種存放形式:1。ASCII碼文件-采用LISP語言讀取文件數(shù)據(jù)。2。直接存放于LISP語言的表中。3。數(shù)據(jù)庫文件。其中第3種形式只要有了通用的數(shù)據(jù)庫操縱手段,就有利于數(shù)據(jù)共享和維護數(shù)據(jù)的一致性;采用通用的數(shù)據(jù)庫接口簡化讀取數(shù)據(jù)的過程;有利于利用數(shù)據(jù)庫特有的索引功能提高從大量數(shù)據(jù)中進行查找的速度;利用數(shù)據(jù)庫實現(xiàn)指定搜索條件的查找;維護管理龐雜的數(shù)據(jù)圖表。因此第3種形式最為理想。在AutoCAD環(huán)境內(nèi)顯示工程設(shè)計手冊的圖形一般采用SLD圖形文件方式。SLD圖形文件有兩種存放方式:1。單獨的SLD文件。2。多個SLD文件裝人SLB庫中。SLB庫形式節(jié)省存儲空間且管理容易,但建庫稍有不便。這兩種形式圖形的具體實現(xiàn)方法在AutoCAD的各種手冊教材中都有,本文不再介紹。

在AutoCAD屏幕上顯示工程手冊的數(shù)據(jù)表和圖形一般采用對話框來實現(xiàn)。在AutoCAD環(huán)境內(nèi)顯示對話框要用對話框控制語言編制一個DCL文件和一段填寫顯示對話框數(shù)據(jù)的LISP語言程序。如果針對工程手冊的每一個圖表編制一個DCL對話框文件,一個填寫顯示對話框數(shù)據(jù)的LISP語言程序,則工作量很大,占用磁盤空間很大,不便于管理。因為工程設(shè)計手冊上的圖表雖然格式各異,但也有它們的共同特點??梢岳盟鼈兊墓餐攸c簡化程序的編制。筆者編寫了一個通用的用于翻閱工程設(shè)計圖表的LISP語言程序--HANDBOOK。實現(xiàn)的要點是:1。數(shù)據(jù)存放在DBASE/FOXBASE/FOXPRO格式的數(shù)據(jù)庫中。2。建立一個管理所有數(shù)據(jù)庫的目錄數(shù)據(jù)庫。3。每次啟動翻閱數(shù)據(jù)庫的程序時,首先翻閱圖表目錄數(shù)據(jù)庫,選定某個圖表后,動態(tài)地產(chǎn)生針對不同表格的DCL對話框語言文件以控制對話框的顯示外觀。4。利用我們自己開發(fā)的LISPBASE數(shù)據(jù)庫接口操縱所有數(shù)據(jù)庫。5。圖形存放在SLB庫中并用目錄數(shù)據(jù)庫進行管理。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ù)庫接口的函數(shù)。

可以把HANDBOOK程序掛在任何AutoCAD的菜單下,以方便用戶使用。激活HANDBOOK程序后,首先顯示所有數(shù)據(jù)表的目錄選擇對話框。下圖是一個例子:

在對話框的數(shù)據(jù)表目錄滾動列表框內(nèi)選擇所要翻閱的表格,按OK鍵,HANDBOOK程序就自動產(chǎn)生控制該表格的DCL對話框控制語言文件,然后就可以在屏幕上用對話框的形式顯示該表格的內(nèi)容,例子見下圖:

對話框可以包括一至多個插圖和滾動數(shù)據(jù)列表框。插圖的多少和列表框的寬度取決于使用顯示器的分辨率,常用的640X480分辨率VGA顯示器一般可以顯示三幅插圖,70列數(shù)據(jù)字符。如使用較高分辨率的顯示器。也可以對HANDBOOK程序稍加修改,顯示更多的圖形和數(shù)據(jù)。數(shù)據(jù)列表框的頂部自動根據(jù)數(shù)據(jù)庫字段名和字段寬度顯示字段名,列表框的行數(shù)不限。如果用戶使用中文AutoCAD環(huán)境,可以顯示中文內(nèi)容。對HANDBOOK程序稍加修改可以用盡量大的面積顯示圖形,也可以實現(xiàn)完全類似于人工在工程設(shè)計圖表中的諾模圖類型的圖表上直接選擇制定參數(shù)的功能。

本文介紹的程序和方法支持網(wǎng)絡(luò)上多用戶使用,支持DOS和Windows兩種版本的AutoCAD v12.

對于比較大的單位,需要使用ORACLESYBASE,INGRESS,SQL-SERVER,等數(shù)據(jù)庫的情況,可以使用另外一個AutoCAD Lisp 語言環(huán)境下的ODBC數(shù)據(jù)庫接口--LISPODBC。由于現(xiàn)在幾乎所有的數(shù)據(jù)庫都支持ODBC,因此利用LISPODBC可以不受數(shù)據(jù)庫的限制。

 

適用 AUTOCAD 環(huán)境的 LISPBASE 數(shù)據(jù)庫接口介紹

LISPBASE v2.0 是一個在 AUTOCAD V12 環(huán)境下訪問DBASE/ Foxbase / Foxpro Xbase 系列數(shù)據(jù)庫程序。使用 AUTOCAD 內(nèi)嵌語言 AUTOLISP 的語法。使AUTOLISP 擴充了訪問數(shù)據(jù)庫的功能。LISPBASE 提供了常用的21個函數(shù)。最多可同時打開操作10個數(shù)據(jù)庫文件。索引文件使用擴展名為IDXFox系列數(shù)據(jù)庫索引文件,對每個數(shù)據(jù)庫文件所打開的索引文件打開數(shù)不限。并且允許多個用戶在網(wǎng)絡(luò)工作站上以共享方式訪問在網(wǎng)絡(luò)服務(wù)器上的數(shù)據(jù)庫。LISPBASE DOS WINDOWS 兩種版本,分別運行于DOS WINDOWS AUTOCAD V12 環(huán)境。 LISPBASE的典型應(yīng)用是編在AUTOLISP語言程序中實現(xiàn)的。各種設(shè)計任務(wù)中的查表,數(shù)據(jù)記錄,明細表生成等均可利用LISPBASE訪問數(shù)據(jù)庫。我們還可向需要開發(fā)參數(shù)設(shè)計軟件的用戶提供按用戶需要定制的表達式求值函數(shù)和通用數(shù)據(jù)庫查表函數(shù)--EVALEXPRS SEEKTABLE。

 

LISPBASE 的運行

啟動了AUTOCAD 后,用(XLOAD "LISPBASE")命令可以把LISPBASE調(diào)入內(nèi)存并和AUTOCAD建立聯(lián)系。然后就可以使用LISPBASE 提供的LISP語法的函數(shù)對用戶建立的 FOXBASE數(shù)據(jù)庫進行操縱了。

注意: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ù)類型的說明

1。LISPBASE 的與數(shù)據(jù)庫記錄編號有關(guān)的函數(shù)受LISP數(shù)據(jù)類型限制,記錄編號在兩字節(jié)有符號整數(shù)能表示的范圍內(nèi)。

2。LISPBASE 讀取 DBASE/FOX 系列數(shù)據(jù)庫的方法:

對數(shù)值型字段:字段寬度 >= 4 或有小數(shù)點,作為浮點數(shù)處理,否則作為整數(shù)處理。

日期型字段:作為 8 字符寬度的字符串處理。

邏輯型字段:作為 1 字符寬度的字符串處理。

字符型字段:作為字符串處理。

通用型字段:FOXPRO 2.5 版有通用型字段,讀寫時作為 10 字符寬度的字符串處理。對于插入記錄操作應(yīng)以空格字符串寫出。對于替換記錄操作不應(yīng)改動原來字段的內(nèi)容,否則會出現(xiàn)數(shù)據(jù)庫內(nèi)容的不一致現(xiàn)象。

備注型字段:讀寫時作為 10 字符寬度的字符串處理。對于插入記錄操作應(yīng)以空格字符串寫出。對于替換記錄操作不應(yīng)改動原來字段的內(nèi)容,否則會出現(xiàn)數(shù)據(jù)庫內(nèi)容的不一致現(xiàn)象。

3。對于 Locate,Sum,Count 等可對數(shù)據(jù)庫記錄內(nèi)容和 AutoLisp 變量內(nèi)容進行邏輯運算操作的函數(shù),不可對通用型字段和備注型字段進行邏輯運算操作。

LISPBASE 的 21個函數(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ù)用于以共享方式打開數(shù)據(jù)庫,并使該數(shù)據(jù)庫和一個09的整數(shù)聯(lián)系起來。

(use DBFFileID Filename) 函數(shù)如果成功地打開了數(shù)據(jù)庫,返回 DBFFileID

Filename 是數(shù)據(jù)庫文件名字符串。必須是一個合法的DOS文件名。在路徑中表示子目錄的反斜線必須用兩個。use 函數(shù)可以訪問網(wǎng)絡(luò)服務(wù)器上的文件。打開數(shù)據(jù)庫后應(yīng)盡快關(guān)閉。用戶編制訪問數(shù)據(jù)庫的程序時,應(yīng)檢測是否打開數(shù)據(jù)庫,如果不能打開,則經(jīng)過適當?shù)难訒r再試一試打開的操作。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是09之間的一個整數(shù)。

如果成功地打開了數(shù)據(jù)庫,函數(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個函數(shù)同樣。以下不再重復(fù)。

 

2。(index DBFFileID IndexFilename IndexFilename ...)

index 函數(shù)用于打開數(shù)據(jù)庫的索引文件。(index DBFFileID IndexFilename IndexFilename ...) 函數(shù)如果成功地打開了索引文件,返回 DBFFileID。否則返回 -1

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是09之間的一個整數(shù)。

IndexFilename 是索引文件名字符串。必須是一個合法的DOS文件名。

索引文件可以同時打開多個,數(shù)量不限。但受內(nèi)存限制。對打開索引文件的數(shù)據(jù)庫使用 seek 函數(shù)進行查找時,LISPBASE 使用第一個索引文件。對打開多個索引文件的數(shù)據(jù)庫進行插入操作時,同時對多個索引文件更新。注意索引關(guān)鍵字不能包括FOXBASE能夠執(zhí)行的字符串或數(shù)據(jù)轉(zhuǎn)換函數(shù)和表達式,如STR(),CHR(),SUBSTR()等。

例子:(index 0 "d:\\prod\\part01.idx" "d:\\prod\\part02.idx" "d:\\prod\\part03.idx")

3。(getrec DBFFileID)

getrec 函數(shù)用于取得打開的數(shù)據(jù)庫的當前記錄,getrec 如果執(zhí)行成功,則返回由數(shù)據(jù)庫各字段數(shù)據(jù)構(gòu)成的一個表。否則返回 nil 。表的第0個原子是表示該記錄是否刪除的字符。如已刪除,為 *;如未刪除,為空格。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(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 用于從當前數(shù)據(jù)庫記錄指針的位置移動數(shù)據(jù)庫的記錄指針。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

Skip_Num 是要移動的記錄條數(shù)??梢允钦麛?shù)。也可以是負整數(shù)。

如果執(zhí)行成功,函數(shù)返回記錄編號。如果正向移動記錄指針超出了數(shù)據(jù)庫的最后一個記錄,函數(shù)返回數(shù)據(jù)庫記錄數(shù)加1的數(shù)字。如果負向移動記錄指針超出了數(shù)據(jù)庫的第一個記錄,函數(shù)返回0。對打開了索引文件的數(shù)據(jù)庫同樣如此。

例子:(skip 0 30)

5。(bof DBFFileID)

bof 用于測試記錄指針是否指向文件頭。如果是,返回1,否則返回0。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

例子:(if (= (bof 0) 1) (print "File Begen."))

 

6。(eof DBFFileID)

eof 用于測試記錄指針是否指向文件尾。如果是,返回1,否則返回0

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

例子:(if (= (eof 0) 1)(print "File End"))

 

7。(shut DBFFileID)

shut 函數(shù)用于關(guān)閉打開的數(shù)據(jù)庫。如果關(guān)閉成功,返回 DBFFileID,否則返回-1。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

例子:(setq f 1)

(use f "personal.dbf")

......

(shut f)

 

8(replace DBFFileID RecordList)

replace 用于替換打開數(shù)據(jù)庫的當前記錄。操作如果執(zhí)行成功,函數(shù)返回記錄編號,否則返回0

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

RecordList 是由一個刪除標記字符和數(shù)據(jù)庫各字段數(shù)據(jù)構(gòu)成的一個表。刪除標記字符必須是表的第一個原子。其他各原子的數(shù)據(jù)類型必須與數(shù)據(jù)庫的各對應(yīng)字段保持一致。

如果有索引文件打開,所有索引關(guān)鍵字字段不允許修改。否則容易造成索引文件的破壞。

例子:(setq reclst (list " " "Q021234 " 5 20.4 ))

(use 0 "part.dbf")

(replace 0 reclst)

(shut 0)

 

9。(erase DBFFileID)

erase 用于刪除打開數(shù)據(jù)庫的當前記錄。如果該記錄已經(jīng)刪除,則恢復(fù)之。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。刪除操作成功,函數(shù)返回 DBFFileID,否則返回-1。

例子:(use 5 "part.dbf")

(skip 5 10)

(erase 5)

(shut 5)

 

10。(insert DBFFileID RecordList)

insert 用于向打開的數(shù)據(jù)庫插入一條記錄。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。操作如果執(zhí)行成功,函數(shù)返回記錄編號,否則返回-1。

RecordList 是由一個刪除標記字符和數(shù)據(jù)庫各字段數(shù)據(jù)構(gòu)成的一個表。刪除標記字符必須是表的第一個原子。其他各原子的數(shù)據(jù)類型必須與數(shù)據(jù)庫的各對應(yīng)字段一致。

對打開多個索引文件的數(shù)據(jù)庫進行插入操作時,同時對多個索引文件更新。

例子:(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 用于在打開了索引文件的數(shù)據(jù)庫中進行查找。如果找到。函數(shù)返回該記錄的記錄號。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

使用 函數(shù)之前必須打開數(shù)據(jù)庫和索引文件。

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 用于操縱打開數(shù)據(jù)庫的當前記錄號。使之指向 Record_Id,如果 Record 超出了數(shù)據(jù)庫的最大記錄號或執(zhí)行不成功,返回 0。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

Record_Id 是要指向的記錄號。對打開索引文件的數(shù)據(jù)庫使用此函數(shù)后,索引文件的索引指針會指向 Record_id。

例子:

(use 0 "part.dbf")

(setq rcd(goto 0 5))

(setq rcd(getrec 0))

(print rcd)

(shut 0)

 

13(recno DBFFileID)

recno 用于返回打開數(shù)據(jù)庫的當前記錄號。如果BOFEOF為真,返回0。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(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 用于把打開數(shù)據(jù)庫的當前記錄號指向為數(shù)據(jù)庫的第一條記錄。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。對于打開了索引文件的數(shù)據(jù)庫文件,當前記錄號指向索引順序的第一條記錄。

例子:

(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 用于把打開數(shù)據(jù)庫的當前記錄號指向為數(shù)據(jù)庫的最后一條記錄。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。對于打開了索引文件的數(shù)據(jù)庫文件,當前記錄號指向索引順序的最后一條記錄。

例子:

(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 用于把打開數(shù)據(jù)庫的當前記錄號指針向后推向滿足條件表達式的第一條記錄,或者說是條件表達式為真的記錄。locate 返回記錄號。locate 函數(shù)是從當前記錄開始操作的。如果要從文件頭開始操作,應(yīng)在 locate 函數(shù)執(zhí)行前執(zhí)行 gotop

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

ConditionExpress 是由 AutoLisp 變量,數(shù)據(jù)庫字段,數(shù)字,字符串,邏輯運算符,算術(shù)運算符,圓括號等組成的邏輯運算表達式。該表達式與 FoxBase 的相應(yīng)表達式兼容。

圓括號 :(,)。

AutoLisp 變量 :AutoLisp 內(nèi)部的用戶建立的變量,可以是整數(shù),浮點數(shù), 字符串類型。

數(shù)據(jù)庫字段 :Dbase/FoxBase/Foxpro 數(shù)據(jù)庫的字段名。字段數(shù)據(jù)類型 可以是數(shù)字,字符串,邏輯,日期。但不能是備注 (mem) 類型和通用(general)類型的。

算術(shù)運算符 :包括 +,-*,/,取余數(shù)%,冪^

數(shù)字 :可以是整數(shù),浮點數(shù),科學(xué)計數(shù)法數(shù)值等。

字符串 :由單引號‘ 引導(dǎo)和結(jié)束的任何字符,包括漢字。

邏輯運算符 : 與: .AND.

或: .OR.

相等: =

大于: >

小于: <

大于等于: >=

小于等于: <=

不等于: <>

各算術(shù)運算和邏輯運算符的優(yōu)先級別遵從一般程序設(shè)計語言的規(guī)則,可參閱BASICC、PASCALFORTRAN等參考書。比較邏輯運算可以用于字符串。

注:邏輯運算表達式的說明適用于 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ù)庫字段名,N LISP 變量名。

17。(sum DBFFileID [FieldsList] [ConditionExpress])

sum 用于累加數(shù)據(jù)庫的數(shù)值字段的數(shù)值。當使用了可選的[ConditionExpress] 參數(shù)時。累加數(shù)據(jù)庫的數(shù)值字段的數(shù)值的條件是滿足條件表達式記錄,或者說是條件表達式為真的記錄。當使用了可選的 [FieldList] 參數(shù),對 [FieldList]表中的數(shù)據(jù)庫字段進行累加。[FieldList] 參數(shù)沒有提供時,對所有數(shù)值字段累加。函數(shù)返回一個表,表的各項是按照數(shù)據(jù)庫中數(shù)值字段排列的各字段累加數(shù)據(jù)和。

sum 函數(shù)是從當前記錄開始操作的。如果要從文件頭開始操作,應(yīng)在 sum 函數(shù)執(zhí)行前執(zhí)行 gotop。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

ConditionExpress 是由 AutoLisp 變量,數(shù)據(jù)庫字段,數(shù)字,字符串,邏輯運算符,算術(shù)運算符,圓括號等組成的邏輯運算表達式。該表達式與 FoxBase 的相應(yīng)表達式類似。詳細說明見 locate 參考。

18。(count DBFFileID [ConditionExpress])

count 用于計算數(shù)據(jù)庫的記錄條數(shù)。當使用了可選的[ConditionExpress] 參數(shù)時。計算數(shù)據(jù)庫的記錄條數(shù)的條件是滿足條件表達式的記錄,或者說是條件表達式為真的記錄。

函數(shù)返回一個滿足條件表達式的記錄條數(shù)的整數(shù)。

count 函數(shù)是從當前記錄開始操作的。如果要從文件頭開始操作,應(yīng)在 count 函數(shù)執(zhí)行前執(zhí)行 gotop。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

ConditionExpress 是由 AutoLisp 變量,數(shù)據(jù)庫字段,數(shù)字,字符串,邏輯運算符,算術(shù)運算符,圓括號等組成的邏輯運算表達式。該表達式與 FoxBase 的相應(yīng)表達式類似。詳細說明見 locate 參考。

例:(use 0 "GB3811.dbf")

(setq n (count 0 "A>=1.2"))

(print n)

19。(dbname DBFFileID)

dbname 用于返回數(shù)據(jù)庫文件名。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

例:(use 0 "GB3811.dbf")

(setq dbn (dbname 0))

 

20。(stru DBFFileID)

stru 用于返回數(shù)據(jù)庫結(jié)構(gòu)。函數(shù)返回一個表,表的各項是 17 個字符的字符串。字符110 是數(shù)據(jù)庫字段名,字符 12 是字段數(shù)據(jù)類型,字符1415是字段寬,字符 17 是數(shù)值型字段的小數(shù)點位置。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

例:(use 0 "GB3811.dbf")

(setq struct (stru 0))

(print struct)

21。(reccnt DBFFileID)

reccnt 用于返回數(shù)據(jù)庫記錄數(shù)。

DBFFileID 是數(shù)據(jù)庫文件編號。類似于FOXBASE的工作區(qū)編號。必須是0

9之間的一個整數(shù)。

例:(use 0 "GB3811.dbf")

(setq n (reccnt 0))

(print n)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多