在程序中實(shí)現(xiàn)圖層的檢查及新建_第1頁
在程序中實(shí)現(xiàn)圖層的檢查及新建_第2頁
在程序中實(shí)現(xiàn)圖層的檢查及新建_第3頁
在程序中實(shí)現(xiàn)圖層的檢查及新建_第4頁
在程序中實(shí)現(xiàn)圖層的檢查及新建_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、我勸天公重抖擻,不拘一格降人才。風(fēng)暖鳥聲碎,日高花影重。為有犧牲多壯志,敢教日月?lián)Q新天。大漠孤煙直,長河落日圓。關(guān)關(guān)雎鳩,在河之洲。窈窕淑女,君子好逑。在程序中實(shí)現(xiàn)圖層的檢查及新建 有些編程者編程時(shí)沒有考慮到用戶環(huán)境的不同,經(jīng)常所編制的程序能運(yùn)行在自制的模板圖形上,而不能在用戶的圖形中運(yùn)行,這種情況也是我經(jīng)常碰到的。 最容易碰到的是圖層。程序中,經(jīng)常會(huì)使用特定的圖層來放置程序所生成的對象,比如說你將圖層設(shè)置為“3”層,寫出的程序如下: (setq oldLayer ( getvar "clayer" ;將當(dāng)前圖層保存起來,以便以后的恢復(fù) (setvar "clay

2、er" "3" ;將圖層“3”轉(zhuǎn)換為當(dāng)前圖層 這時(shí),如果用戶當(dāng)前圖形中不存在“3”圖層,程序就會(huì)出錯(cuò)并中斷。為此,你首先應(yīng)判斷“3”圖層是否存在,采用以下的聚光燈中判斷圖層的存在: (tblobjname "layer" "3" 這時(shí),如果圖層“3”確實(shí)不存在時(shí),則可用以下函數(shù)內(nèi)容建立該名稱的圖層: (entmake (list '(0 . "LAYER" '(100 . "AcDbSymbolTableRecord" '(100 . "AcDbLay

3、erTableRecord" '(6 . "CONTINUOUS" '(62 . 3 '(70 . 0 '(2. "3" 這樣就可以建立新圖層,完整的程序如下: (setq old_lay (getvar "clayer" (if (=(tblobjname "LAYER" "3" nil (progn (entmake (list '(0 . "LAYER" '(100 . "AcDbSymbolTable

4、Record" '(100 . "AcDbLayerTableRecord" '(6 . "CONTINUOUS" '(62 . 3 '(70 . 0 (cons 2 "3" (setvar "clayer" "3" 可能有人會(huì)說,使用command轉(zhuǎn)換及新建圖層不是更加簡單嗎?但我總認(rèn)為其它函數(shù)能完成的動(dòng)作,最好不要使用“command”函數(shù),因?yàn)榭赡芟乱粋€(gè)版本中,command所引用的命令內(nèi)容會(huì)有變化(如功能的加強(qiáng)),使用程序出錯(cuò)。就象R12、R13

5、、R14版中的清理命令Purge就各不相同。 回到頂部 將一個(gè)大程序分成多個(gè)小程序以簡化編寫過程 初學(xué)者常常會(huì)將所有的功能都編入到一個(gè)程序(或函數(shù))中。這不僅會(huì)使程序冗長難讀,也會(huì)給修改和重用帶來麻煩。AutoLISP是一種函數(shù)式的語言,因此,將一個(gè)單獨(dú)的功能編制成一個(gè)函數(shù)可以使程序簡明易讀。對于重復(fù)調(diào)用次數(shù)較多的程序,應(yīng)編制一個(gè)通用函數(shù)并在初始化時(shí)加載到環(huán)境中,以便于調(diào)用。 回到頂部 將自己編制的程序或函數(shù)的調(diào)用放在菜單系統(tǒng)中 不要讓自己編制的程序只能夠從命令行調(diào)用,要將它們安排在菜單中以方便用 戶的調(diào)用。 回到頂部 不要將自己編制的程序全都放入ACAD.LSP文件中 一些程序只喜歡將自己編

6、寫的程序或函數(shù)放在ACAD.LSP文件中,因?yàn)樵撐募梢栽贏utoCAD啟動(dòng)時(shí)裝載到環(huán)境中。這樣做的確可以方便自己編制函數(shù)的調(diào)用。不過,如果ACAD.LSP文件太大,則調(diào)入每個(gè)繪圖的時(shí)間將變長,因?yàn)閮?nèi)存減小了。 事實(shí)上,ACAD.LSP是用來存放通用函數(shù)的,只有頻率很高的函數(shù)才應(yīng)放入到ACAD.LSP中。例如:用戶庫函數(shù)通常都放在ACAD.LSP中,或在ACAD.LSP中加載。 回到頂部 加載文件前應(yīng)判別程序是否已被加載 在調(diào)用用戶自己定義的函數(shù)之前,應(yīng)將與之相關(guān)的應(yīng)用程序加載到AutoCAD環(huán)境中,否則AutoCAD會(huì)報(bào)告不存在該函數(shù)。當(dāng)一個(gè)函數(shù)會(huì)被多次調(diào)用時(shí),如果每次調(diào)用之前都加載一次文件

7、,則會(huì)浪費(fèi)很多時(shí)間,因?yàn)橐粋€(gè)文件只需加載一閃即可。這時(shí),判別一下某文件是否已經(jīng)裝入是非常必要的,這種用法在菜單文件的語句中很常見,例如: . 技術(shù)要求(if(not jsyq(load"jsyq"(jsyq; . 這里我們假定jsyq是文件jsyq.lsp中的一個(gè)函數(shù)(不是一個(gè)變量),在調(diào)用函數(shù)(jsyq之前,(if not.語句首先判斷一下該函數(shù)是否已經(jīng)存在。如果不存在,就加載相關(guān)文件jsyq.lsp;否則說明步過加載語句。 回到頂部 為自己的應(yīng)用程序建立一個(gè)單獨(dú)的目錄 不要將自己的應(yīng)用程序放在AutoCAD軟件包所在的目錄下,這樣不僅會(huì)擾亂軟件包中文件的排列,也不便于管

8、理。通常開發(fā)者會(huì)建立一個(gè)單獨(dú)的目錄來旋轉(zhuǎn)自己的應(yīng)用程序。此建立目錄的名字應(yīng)盡量避免可能會(huì)因安裝 AutoCAD或其它第三方軟件包而產(chǎn)生的沖突。 回到頂部 盡量減小應(yīng)用程序的文件數(shù) AutoLISP程序通常都很短小,因?yàn)橐粋€(gè)功能一般只需幾十條語句就可以完成,這也是AutoLISP語言的效率所在。不過,如果將每一個(gè)編制的功能都生成一個(gè)單獨(dú)的文件,不僅會(huì)使程序的數(shù)量繁多,而且使用時(shí)也要一次次加載,十分不方便。因此,應(yīng)盡量將相關(guān)甚至相關(guān)性不太強(qiáng)的文件合并為一。這樣,您可以將多個(gè)文件合為一個(gè),使用時(shí)只要裝載一次而無需多次裝載。如本站提供的圖欄程序和流程程序就是這樣,圖欄程序?qū)⒘鶄€(gè)相關(guān)的功能組合在一起,而

9、流程程序?qū)⑺膫€(gè)相關(guān)的功能組合在一起。 回到頂部 用縮進(jìn)方法使程序便于閱讀 和其它軟件開發(fā)程序一樣,AutoLISP程序也可以使用縮進(jìn)的方法進(jìn)行編寫以便于閱讀,縮進(jìn)后程序的調(diào)用并不多占用內(nèi)存。 回到頂部 為變量取名應(yīng)便于理解但不要太長 在為變量取名時(shí),應(yīng)力求簡潔且含義清晰。例如:ABC、QQX會(huì)被認(rèn)為是無意義的,它不便于理解 testpgm之后,用戶可以通過!字符檢查defvar的當(dāng)前值。 回到頂部 為命令行的選項(xiàng)提供右鍵快捷菜單 在AutoCAD2000中,命令行中的可選項(xiàng)可以使用鼠標(biāo)的右鍵顯示,提高了用戶的操作速度,但這種方法必須按照一定的格式書寫程序,一般,選項(xiàng)內(nèi)容是用中括號.括起來,每個(gè)

10、選項(xiàng)之間使用"/"分隔。例如: (initget "Single Horizonal Vertical" (setq sele(getkword "n部裝明細(xì)序號填寫方式水平多項(xiàng)(H/垂直多項(xiàng)(V/單一序號(S<單一序號>:" 這樣,在程序運(yùn)行到當(dāng)前提示時(shí),用戶可點(diǎn)擊鼠標(biāo)右鍵彈出快捷菜單顯示各選項(xiàng)的內(nèi)容選取。 回到頂部 關(guān)于程序調(diào)試的一些建議 一個(gè)程序在編制是沒有一定的規(guī)定的,因此,程序的調(diào)試方法也沒有一定的規(guī)律。機(jī)器是不會(huì)告訴你程序到底錯(cuò)在哪里,你只能從邏輯上一遍又一遍地檢查一個(gè)程序,可不幸的是,在某些情況下它還是會(huì)出錯(cuò)

11、。 從這種角度出發(fā),我們說編程是非常令人生厭的,也是極具有挑戰(zhàn)性的。其中最大困難的就是調(diào)試這一步,調(diào)試方法是否合適將直接影響到程序編制的進(jìn)度。 下面我們將介紹一些調(diào)試的策略。 1.不要和計(jì)算機(jī)較勁 請記住,計(jì)算機(jī)是不知疲憊的,可你不行。如果感到累了,可以暫時(shí)放下工作去花園散散步或干脆去看場電影,等你精神轉(zhuǎn)好了再重新投入工作中去。 2.計(jì)算機(jī)是非常公正的 計(jì)算機(jī)的眼睛是雪亮的,它絕不會(huì)讓任何錯(cuò)誤的數(shù)據(jù)蒙混過關(guān)。加外,計(jì)算機(jī)幾乎不會(huì)犯錯(cuò)誤,因此,請多找一找自身的原因吧! 3.在計(jì)算機(jī)中,相是的激勵(lì)應(yīng)該得到相同的結(jié)果 有時(shí),你的程序可能會(huì)在相同的輸入下得到不盡相同的結(jié)果,這時(shí)你要提醒自己:一定有什么

12、條件被改變了,雖然它還未暴露出來。 在調(diào)試程序時(shí)更要注意這一點(diǎn),不要因之而影響你的判斷力。 4.兩種常見的錯(cuò)誤類型 語法錯(cuò)誤和邏輯錯(cuò)誤是程序中兩種常見的錯(cuò)誤類型。語法錯(cuò)誤是較容易發(fā)現(xiàn)的,因?yàn)槠渲写嬖阱e(cuò)誤的命令,例如: (setq a (ang1 p1 p2 此處函數(shù)(ang1拼寫錯(cuò)了,正確的名字是(angle,系統(tǒng)會(huì)提示發(fā)現(xiàn)空函數(shù)而終止。 邏輯錯(cuò)誤是不容易發(fā)現(xiàn)的,例如: (angle pnt1 pnt2 這條語句看上去似乎是正確的,但如果pnt2的值為空,程序同樣運(yùn)行不下去。 5.通過“斷點(diǎn)”檢查與變量有關(guān)的錯(cuò)誤 如果希望在程序運(yùn)行到某處時(shí)檢查變量a的當(dāng)前值,可在程序中的該處加入如下語句: (

13、princ a (setq bp(getstring 這樣,到印出a的值之后,函數(shù)(getstring可使程序暫停,就好象遇到了一個(gè)斷點(diǎn)一樣,觀察完a的值之后,可按任意鍵使程序繼續(xù)。 6.變量作用哉的定義 在剛開始編 程時(shí),應(yīng)將函數(shù)中用到的變量定義成全局性的。在AutoLISP中,函數(shù)中的變量只要不在函數(shù)定義defun命令的函數(shù)名之后的(中用斜杠說明,該變量就是全局的,例如: (defun drawline( . 假設(shè)(drawline用到了兩個(gè)點(diǎn)pnt1和pnt2,則這兩個(gè)將成為全局性的.用戶可在命令稈用!字符檢查它們的值. 一旦將程序調(diào)試完畢確認(rèn)無錯(cuò)之后,便可將變量定義成局部的,例如: (

14、defun drawline(/ pnt1 pnt2 . 這樣,函數(shù)運(yùn)行過程中pnt1和pnt2有效,運(yùn)行完畢之后它們將消失,這樣可以節(jié)省出一點(diǎn)內(nèi)存空間來。 7.注意不要混淆度和弧度 當(dāng)使用到角度時(shí),最常見的錯(cuò)誤是混淆了度和弧度兩種單位,請記住,AutoLISP函數(shù)使用弧度為單位,AutoCAD命令使用度為單位。 8.對相關(guān)的系統(tǒng)變量進(jìn)行檢查 程序運(yùn)行得正常與否與系統(tǒng)變量也有著直接的關(guān)系。例如:將對象捕捉系統(tǒng)變量OSMODE設(shè)置為終點(diǎn)捕捉模式(1或交戰(zhàn)捕捉模式(32,同一個(gè)程序在運(yùn)行效果上可能就會(huì)產(chǎn)生很大的差別。 9.從屏幕上的細(xì)微變化觀察程序運(yùn)行 在AutoLISP程序運(yùn)行時(shí),屏幕上常會(huì)產(chǎn)生

15、一些微小的變化,如:若出現(xiàn)一個(gè)表示點(diǎn)的小叉絲然后又消失,這有可能是在執(zhí)行insert或與插入點(diǎn)有關(guān)的命令。若屏幕上的對象變成虛線表示,這有可能是在執(zhí)行(ssget函數(shù)并選中了這些對象,總之,仔細(xì)觀察屏幕上的細(xì)微變化將有助于了解程序運(yùn)行的進(jìn)程,這對于程序的調(diào)試是有益的。 10.調(diào)試通則 程序出錯(cuò)通常是由多個(gè)錯(cuò)誤引發(fā)的,而許多錯(cuò)誤會(huì)導(dǎo)致同一種現(xiàn)象,因此,在分析錯(cuò)誤時(shí),應(yīng)將它們分享出來進(jìn)行檢查,不要企圖一次性將所有的錯(cuò)誤都改正過來。 回到頂部 使命令暫停以等待用戶輸入 在AutoLISP函數(shù)(command中,您可以加入pause項(xiàng)使命令在執(zhí)行到該處時(shí)暫時(shí)停下來以等待用戶輸入,例如: (comman

16、d "circle" pnt1 pause 該命令將pnt1指定為圓心之后暫停,等待用戶輸入圓的半徑值。 回到頂部 AutoCAD原始命令的取消與恢復(fù) UNDEFINE和REDEFINE是AutoCAD的兩條命令。UNDEFINE用來取消AutoCAD的原始命令。例如:如果你在命令行上鍵入INDEFINE FILLET,AutoCAD會(huì)禁止FILLET命令的使用,這樣你使可以使用自己定義的FILLET命令。如果你想再使用AutoCAD的FILLET命令,這時(shí)應(yīng)使用.FILLET命令,當(dāng)然,你也可以干脆使用REDEFINE來恢復(fù)原先的狀態(tài)。 回到頂部 (findfile查找文

17、件 (findfile函數(shù)用來在磁盤上查找指定的文件,若只給出了文件名,則它會(huì)在當(dāng)前路徑、DOS的PATH環(huán)境變量所指定的路徑和ACAD環(huán)境變量所指定的路徑中查找該文件(找到第一個(gè)便停止)。例如:若要查找TYL.INI文件,則使用: (findfile "tyl.ini 它 將返回: "c:program filesacad2000tyl.ini" 回到頂部 (getenv取系統(tǒng)的環(huán)境變量 庫函數(shù)允許用戶在AutoCAD環(huán)境中取系統(tǒng)的環(huán)境變量。例如: (getenv "acad" 它將返回: "C:program filesacad2

18、000support;C:program filesacad2000fonts;C:program filesacad2000express" 除ACAD之外,AutoCAD還有兩個(gè)系統(tǒng)環(huán)境變量,它們是ACADCFG和ACADDRV。其用法相同。 回到頂部 (setcfg設(shè)置應(yīng)用程序配置 從AutoCAD R13版開始,AutoCAD為應(yīng)用程序開發(fā)者和用戶提供了在ACAD14.CFG(AutoCAD2000中為ACAD2000.cfg文件中保存半永久性配置信息的方法。該文件可以用記事本打開,文件分成兩個(gè)部分。應(yīng)用程序開發(fā)者和用戶可以控制的那一部分被稱為AppData。 在本站所提供的圖欄程序中就采用了該命令設(shè)置圖欄的默認(rèn)設(shè)計(jì)單位在tyl.ini文件中的位置及其它設(shè)計(jì)單位的名稱,詞句如下: (setcfg "AppData/Tyl/Number" 1 (setcfg "AppData/Tyl/Other" "明經(jīng)通道" 該語句在ACAD.CFG文件中生成如下語句: AppData

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論