基于AutoLisp軸類(lèi)零件參數(shù)化繪圖含程序及2張CAD圖
基于AutoLisp軸類(lèi)零件參數(shù)化繪圖含程序及2張CAD圖,基于,autolisp,零件,參數(shù),繪圖,程序,cad
基于AutoLisp軸類(lèi)零件參數(shù)化繪圖
摘 要
AutoCAD是當(dāng)今世界上使用最多的通用繪圖軟件之一,但其在某些具體的功能方面仍有其自身的不足。在機(jī)械零件的設(shè)計(jì)繪圖中,一些常用圖形需要經(jīng)常繪制,若我們逐一繪制,顯然費(fèi)時(shí)費(fèi)力,事倍功半,系統(tǒng)自帶的圖快復(fù)制粘貼插入等編輯功能操作又有著難以避免的局限性。隨著標(biāo)準(zhǔn)件庫(kù)的陸續(xù)推出,確實(shí)解決了很大一部分問(wèn)題,但我個(gè)人認(rèn)為這無(wú)法滿足我們對(duì)實(shí)際的要求。因此,為了提高繪圖速度,我們可以利用計(jì)算機(jī)軟件來(lái)進(jìn)行參數(shù)化繪圖。AutoLisp語(yǔ)言內(nèi)嵌于AutoCAD,實(shí)現(xiàn)了計(jì)算與繪圖的統(tǒng)一,我們有必要在AutoCAD平臺(tái)上,利用語(yǔ)言進(jìn)行二次開(kāi)發(fā),建立常用圖形庫(kù),在繪制時(shí)調(diào)出,避免重復(fù)性勞動(dòng)及繪圖不規(guī)范等問(wèn)題。
本論文的主要目的就是在對(duì)軸類(lèi)零件結(jié)構(gòu)分析的基礎(chǔ)上,選擇一種有代表性的圖形結(jié)構(gòu),通過(guò)采用AutoLisp語(yǔ)言編程對(duì)AutoCAD進(jìn)行二次開(kāi)發(fā),即可實(shí)現(xiàn)不同軸徑、槽寬和槽深的軸剖面圖的自動(dòng)繪制及尺寸標(biāo)注,提高了軸類(lèi)零件的繪圖效率。
關(guān)鍵詞:軸類(lèi)零件;參數(shù)化設(shè)計(jì);二次開(kāi)發(fā);AutoLisp語(yǔ)言
Abstract
AutoCAD is the world’s most common use of graphics software,but its specific functions in certain still its own shortcomings.Drawing in the design of mechanical parts,some common graphic needs often draw,if we draw one by one,obviosly laborious and time consuming duplication of efforts,the system map that comes with fast copy and paste into other editing operations it has inevitable limitations.With the continuous introdution of standard parts library,a large part of the problem is indeed solved,but personally think that we can not meet the actual requirements.Therefore,in order to improve drawing speed,we can use computer software to conduct parametric drawing.AutoLisp language embedded in AutoCAD, calculation and drawing to achieve a unified,we need the AutoCAD platform,use the second language development,the establishment of common graphics library,in the draw when called up,to avoid repetitive work and the problem of drawing is not standardized,etc.
The main purpose of this paper is to analyze three dimensional structure based on the graphic to select a representative structure,through the use of AutoLisp language programming on the secondary of AutoCAD,you can achieve different shaft diameter,groove width and groove depth of the axial profiles of automatic drawing and dimensioning,improve the efficiency of shaft parts of the drawing.
Keywords:shaft parts;parameterization design;secondary development;AutoLisp language
目 錄
引言 1
1 AutoCAD及其二次開(kāi)發(fā)技術(shù) 2
1.1 第一代開(kāi)發(fā)工具——AutoLISP 2
1.2 第二代開(kāi)發(fā)工具——ADS 2
1.3 第三代開(kāi)發(fā)工具——Visual LISP,ARS及基于ActiveX Automation技術(shù)的VBA等 3
1.3.1 Visual LISP(VLISP) 3
1.3.2 ARX 3
1.3.3 基于ActiveX Automation技術(shù)的VBA等開(kāi)發(fā)工具 4
1.4 總結(jié) 5
2 利用AutoLisp進(jìn)行參數(shù)化繪圖的方案 6
2.1 鼠標(biāo)拖動(dòng) 6
2.2 尺寸驅(qū)動(dòng) 6
2.3 總結(jié) 7
3 對(duì)話框的設(shè)計(jì) 8
3.1 DCL語(yǔ)言的語(yǔ)法規(guī) 8
3.2 對(duì)話框設(shè)計(jì)中用到的控件和屬性 8
3.3 對(duì)話框的程序編譯 9
4 系統(tǒng)設(shè)計(jì) 14
4.1 軸設(shè)計(jì)的總體方案 14
4.2 主程序的設(shè)計(jì) 14
4.2.1 對(duì)話框PDB函數(shù) 14
4.2.2 主程序的編譯 16
4.3 程序的運(yùn)行 25
5 結(jié)論 29
謝 辭 30
參考文獻(xiàn) 31
引言
AutoLisp是集成在計(jì)算機(jī)輔助設(shè)計(jì)軟件AutoCAD和MDT中,為擴(kuò)展它們的功能和編寫(xiě)應(yīng)用程序而設(shè)計(jì)的一種編程語(yǔ)言,它的起源可以追溯到20世紀(jì)50年代末的LISP語(yǔ)言。LISP最初是為了編寫(xiě)人工智能(AI)應(yīng)用程序設(shè)計(jì)的,現(xiàn)在仍是很多人工智能程序的基礎(chǔ)。LISP之所以被選為AutoCAD最初的應(yīng)用程序編輯接口,是因?yàn)橹挥兴胚m合于工程中的非結(jié)構(gòu)化設(shè)計(jì)過(guò)程。美國(guó)Autodesk公司在AutoCAD內(nèi)部嵌入AutoLisp語(yǔ)言的目的是使用戶充分利用AutoCAD進(jìn)行二次開(kāi)發(fā),實(shí)現(xiàn)直接增加和修改AutoCAD命令,隨意擴(kuò)大圖形編輯功能,建立圖形庫(kù)和數(shù)據(jù)庫(kù)并對(duì)當(dāng)前圖形進(jìn)行直接訪問(wèn)和修改,開(kāi)發(fā)CAD軟件包等。AutoLisp語(yǔ)言最典型的應(yīng)用之一就是實(shí)現(xiàn)參數(shù)化繪圖程序設(shè)計(jì),包括尺寸驅(qū)動(dòng)程序和鼠標(biāo)拖動(dòng)程序等。尺寸驅(qū)動(dòng)是指通過(guò)改變實(shí)體標(biāo)注的尺寸值來(lái)實(shí)現(xiàn)圖形的自動(dòng)修改,鼠標(biāo)拖動(dòng)即利用AutoLisp語(yǔ)言提供的(GRREAD[])函數(shù),讓用戶直接讀取AutoCAD的輸入設(shè)備(通常為鼠標(biāo)),任選項(xiàng)追蹤光標(biāo)移動(dòng)存在且為真時(shí),調(diào)整所需的參數(shù)值而達(dá)到自動(dòng)改變屏幕圖形的屬性。到目前為止,大多數(shù)參數(shù)化程序都是針對(duì)二維平面圖編制的。另一個(gè)AutoLisp的典型應(yīng)用就是驅(qū)動(dòng)利用AutoCAD提供的PDB模板構(gòu)成DCL(Dialog Control Language)文件創(chuàng)建自己的對(duì)話框。
自從AutoLisp嵌入AutoCAD之后,使僅僅作為交互式圖形編輯軟件的AutoCAD編輯能真正進(jìn)行計(jì)算機(jī)輔助設(shè)計(jì)、繪圖的CAD軟件。由于LISP靈活多變、易于學(xué)習(xí)和使用,因而AutoCAD成為功能強(qiáng)大的工具性軟件。
1 AutoCAD及其二次開(kāi)發(fā)技術(shù)
AutoCAD是目前微機(jī)上應(yīng)用最為廣泛的通用的交互式計(jì)算機(jī)輔助繪圖與設(shè)計(jì)軟件包。AutoCAD的強(qiáng)大生命力在于它的通用性、多種工業(yè)標(biāo)準(zhǔn)和開(kāi)放的體系結(jié)構(gòu)。其通用性使得它在機(jī)械、電子、航空、輪船、建筑、服裝等領(lǐng)域得到了極為廣泛的應(yīng)用。但是,不同的行業(yè)標(biāo)準(zhǔn)使得各領(lǐng)域在使用AutoCAD的過(guò)程中均需要根據(jù)自身特點(diǎn)進(jìn)行定制或開(kāi)發(fā)。Autodesk公司為滿足廣大用戶的需求,自AutoCAD v2.18版至AutoCAD2000的短短十幾年間,就相繼推出了三代二次開(kāi)發(fā)工具??梢哉f(shuō),AutoCAD的通用性為其二次開(kāi)發(fā)提供了必要條件,而AutoCAD開(kāi)放的體系結(jié)構(gòu)則使其二次開(kāi)發(fā)成為可能。下面對(duì)AutoCAD的三代開(kāi)發(fā)工具進(jìn)行淺析。
1.1 第一代開(kāi)發(fā)工具——AutoLISP
AutoLISP是1986年隨AutoCAD v2.18提供的二次開(kāi)發(fā)工具。它是一種人工智能語(yǔ)言,是嵌入AutoCAD內(nèi)部的COMMON LISP的一個(gè)子集。在AutoCAD的二次開(kāi)發(fā)工具中,它是唯一的一種解釋型語(yǔ)言。使用AutoLISP可直接調(diào)用幾乎所有的AutoCAD命令。
AutoLISP語(yǔ)言最典型的應(yīng)用之一是實(shí)現(xiàn)參數(shù)化繪圖程序設(shè)計(jì),包括尺寸驅(qū)動(dòng)程序和鼠標(biāo)拖動(dòng)程序等。另一個(gè)典型應(yīng)用就是驅(qū)動(dòng)AutoCAD提供PDB模塊構(gòu)成DCL(Dialog Control Language)文件創(chuàng)建自己的對(duì)話框。
AutoLISP具有以下優(yōu)點(diǎn):
(1)語(yǔ)言規(guī)則十分簡(jiǎn)單,易學(xué)易用;
(2)直接針對(duì)AutoCAD,易于交互;
(3)解釋執(zhí)行,立竿見(jiàn)影。
AutoLISP的缺點(diǎn)是:
(1)功能單一,綜合處理能力差;
(2)解釋執(zhí)行,程序運(yùn)行速度慢;
(3)缺乏很好的保護(hù)機(jī)制,源程序保密性差;
(4)LISP用表來(lái)描述一切,并不能很好地反映現(xiàn)實(shí)世界和過(guò)程,跟人的思維方式也不一致;
(5)不能直接訪問(wèn)硬件設(shè)備、進(jìn)行二進(jìn)制文件的讀寫(xiě)。
AutoLISP的這些特點(diǎn),使其僅適合于有能力的終端用戶完成一些自己的開(kāi)發(fā)任務(wù)。
1.2 第二代開(kāi)發(fā)工具——ADS
ADS(AutoCAD Development System)是AutoCAD R11開(kāi)始支持的一種基于C語(yǔ)言的靈活的開(kāi)發(fā)環(huán)境。ADS可直接利用用戶熟悉的C編譯器,將應(yīng)用程序編譯成可執(zhí)行文件后在AutoCAD環(huán)境下運(yùn)行,從而既利用了AutoCAD環(huán)境的強(qiáng)大功能,又利用了C語(yǔ)言的結(jié)構(gòu)化編程、運(yùn)行效率高的優(yōu)勢(shì)。
與AutoLISP 相比,ADS優(yōu)越之處在于:
(1)具備錯(cuò)綜復(fù)雜的大規(guī)模處理能力;
(2)編譯成機(jī)器代碼后執(zhí)行速度快;
(3)編譯時(shí)可以檢查出程序設(shè)計(jì)語(yǔ)言的邏輯錯(cuò)誤;
(4)程序源代碼的可讀性好于AutoLISP。
而其不便之處在于:
(1)C語(yǔ)言比LISP語(yǔ)言難于掌握和熟練應(yīng)用;
(2)ADS程序的隱藏錯(cuò)誤往往導(dǎo)致AutoCAD,乃至操作系統(tǒng)的崩潰;
(3)需要編譯才能運(yùn)行,不易見(jiàn)到代碼的效果;
(4)同樣功能ADS程序源代碼比AutoLISP代碼長(zhǎng)很多。
1.3 第三代開(kāi)發(fā)工具——Visual LISP,ARS及基于ActiveX Automation技術(shù)的VBA等
1.3.1 Visual LISP(VLISP)
VLISP是AutoLISP的換代產(chǎn)品。它與AutoLISP完全兼容,并提供它所有的功能,是新一代的AutoCAD LISP語(yǔ)言。VLISP對(duì)語(yǔ)言進(jìn)行了擴(kuò)展,可以通過(guò)Microsoft ActiveX Automation接口與對(duì)象交互。同時(shí),通過(guò)實(shí)現(xiàn)反應(yīng)器函數(shù),還擴(kuò)展AutoLISP響應(yīng)事件的能力。作為開(kāi)發(fā)工具,VLISP提供了一個(gè)完整的集成開(kāi)發(fā)環(huán)境(IDE),包括編譯器、調(diào)試器和其他工具,可以提高二次開(kāi)發(fā)的效率 。另外,VLISP還提供了工具用于發(fā)布獨(dú)立的應(yīng)用程序。
1.3.2 ARX
ARX(AutoCAD Runtime eXtension)是AutoCAD R13之后推出的一個(gè)以C++語(yǔ)言為基礎(chǔ)的面向?qū)ο蟮拈_(kāi)發(fā)環(huán)境和應(yīng)用程序接口。ARX程序本質(zhì)上Windows動(dòng)態(tài)連接庫(kù)(DLL)程序,與AutoCAD共享地址空間,直接調(diào)用AutoCAD的核心函數(shù),可直接訪問(wèn)AutoCAD數(shù)據(jù)庫(kù)的核心數(shù)據(jù)結(jié)構(gòu)和代碼,以便能夠在運(yùn)行期間擴(kuò)展AutoCAD固有的類(lèi)及其功能,創(chuàng)建能夠全面享受AutoCAD固有命令特權(quán)的新命令。ARX程序與AutoCAD、Windows之間均采用Windows消息傳遞機(jī)制直接通訊。
AutoLISP、ADS、ARX都是AutoCAD提供的內(nèi)嵌式編程語(yǔ)言。AutoLISP和ADS都是通過(guò)內(nèi)部進(jìn)程通訊(IPC)來(lái)和AutoCAD通訊,它們與AutoCAD是相互分離的過(guò)程,而ARX以DLL形式與AutoCAD共享地址空間。因此,與前兩者相比,其速度更快、運(yùn)行更穩(wěn)定、更簡(jiǎn)單。由于是在Windows及VC++編程環(huán)境里運(yùn)行,所以,對(duì)開(kāi)發(fā)者的編程能力要求較高。
ObjectARX應(yīng)用程序以C++為基本開(kāi)發(fā)語(yǔ)言,具有面向?qū)ο缶幊谭绞降臄?shù)據(jù)可封裝性、可繼承性及多態(tài)性的特點(diǎn),用其開(kāi)發(fā)的CAD軟件具有模塊性好、獨(dú)立性強(qiáng)、連接簡(jiǎn)單、使用方便、內(nèi)部功能高效實(shí)現(xiàn)以及代碼可重用性強(qiáng)等特點(diǎn),并且支持MFC基本類(lèi)庫(kù),能簡(jiǎn)潔高效地實(shí)現(xiàn)許多復(fù)雜功能。
這里順便提一下ADSRX。AutoCAD R14的開(kāi)發(fā)環(huán)境ADSRX是ARX的一個(gè)子集,它等效于ADS。使用ADSRX,能夠用C語(yǔ)言編寫(xiě)基于AutoCAD的程序,也能很方便地將ADS程序移植為ARX程序。
盡管ARX接口是四個(gè)API中最強(qiáng)有力的,它也具有產(chǎn)生嚴(yán)重編程錯(cuò)誤的最大潛在性,如破壞AutoCAD數(shù)據(jù)結(jié)構(gòu)等。其它編程環(huán)境要求較少的編程經(jīng)驗(yàn),但提供的功能和范圍也較小。
可以說(shuō),AutoLISP著眼于應(yīng)用程序的交互性,ADS C/C++著眼于應(yīng)用程序的綜合性,而ARX則著眼于應(yīng)用程序的智能性。
1.3.3 基于ActiveX Automation技術(shù)的VBA等開(kāi)發(fā)工具
ActiveX Automation是一套微軟標(biāo)準(zhǔn),以前稱(chēng)為OLE Automation技術(shù)。該標(biāo)準(zhǔn)允許通過(guò)外顯的對(duì)象由一個(gè)Windows應(yīng)用程序控制另一個(gè)Windows應(yīng)用程序,這也是面向?qū)ο缶幊碳夹g(shù)的精髓所在。AutoCAD從R14開(kāi)始增加了作為ActiveX Automation服務(wù)器應(yīng)用程序的功能,使得許多面向?qū)ο缶幾g語(yǔ)言和應(yīng)用程序可以通過(guò)ActiveX與AutoCAD進(jìn)行通信,并操縱AutoCAD的許多功能。
ActiveX Automation服務(wù)器應(yīng)用程序是通過(guò)自身對(duì)象的屬性、方法、事件外顯其功能。對(duì)象是服務(wù)器應(yīng)用程序的簡(jiǎn)單而抽象的代表。不管是用VB、VC、OFFICE VBA等從外部,還是用AutoCAD VBA從內(nèi)部對(duì)AutoCAD進(jìn)行二次開(kāi)發(fā),都是通過(guò)調(diào)用AutoCAD的對(duì)象體系結(jié)構(gòu)來(lái)進(jìn)行的。AutoCAD 2000 ActiveX Automation技術(shù)將AutoCAD 2000的各種功能封裝在AutoCAD ActiveX對(duì)象中,供編程使用。AutoCAD 2000中提供的所有對(duì)象組成一個(gè)樹(shù)形結(jié)構(gòu),最高層是Application對(duì)象,其它對(duì)象都是它的后代。為了得到一個(gè)特定的對(duì)象,必須從Application對(duì)象對(duì)其子孫進(jìn)行遍歷,直到找到該特定的對(duì)象。
ActiveX Automation技術(shù)的完全面向?qū)ο蠡幊痰奶攸c(diǎn),使其開(kāi)發(fā)環(huán)境具備了強(qiáng)大的開(kāi)發(fā)能力和簡(jiǎn)單易用的優(yōu)良特點(diǎn),開(kāi)發(fā)工具的選擇也具有很大的靈活性。所以,利用ActiveX Automation技術(shù),是極具潛力的一種開(kāi)發(fā)手段。
實(shí)際上,CAD系統(tǒng)能否真正體現(xiàn)出它的存在價(jià)值,最明顯的標(biāo)志就是上述專(zhuān)業(yè)設(shè)計(jì)軟件。這些軟件真正起到了“設(shè)計(jì)”的作用。實(shí)踐證明,在某個(gè)專(zhuān)業(yè)性很強(qiáng)的設(shè)計(jì)上,它確實(shí)能夠替代工程師!
對(duì)于設(shè)計(jì)支持軟件和專(zhuān)業(yè)設(shè)計(jì)軟件,可以由一些不必很了解設(shè)計(jì),而軟件知識(shí)較多的人來(lái)寫(xiě)。當(dāng)然,應(yīng)當(dāng)由現(xiàn)場(chǎng)工程師進(jìn)行測(cè)評(píng),防止寫(xiě)成“學(xué)院派”的設(shè)計(jì)支持軟件。而對(duì)于專(zhuān)業(yè)設(shè)計(jì)軟件,就只能由設(shè)計(jì)師直接參與來(lái)寫(xiě),這樣的題目范圍較小,幾乎是開(kāi)發(fā)商永遠(yuǎn)的“盲區(qū)”。由于專(zhuān)業(yè)性太強(qiáng),知識(shí)結(jié)構(gòu)太偏,對(duì)于工科大學(xué)畢業(yè),沒(méi)有在這個(gè)行業(yè)里,做過(guò)幾個(gè)真正的設(shè)計(jì)的人,很難聽(tīng)懂專(zhuān)業(yè)設(shè)計(jì)師的敘述,要求他完成這個(gè)程序,就太過(guò)分了。
1.4 總結(jié)
可見(jiàn),必須有一個(gè)能夠被專(zhuān)業(yè)設(shè)計(jì)師所掌握,又能夠發(fā)揮他們的長(zhǎng)處(熟悉設(shè)計(jì)和交互操作),避開(kāi)他們的短處(軟件知識(shí)較少)的開(kāi)發(fā)方法。這就是AutoLISP。
可以在AutoLISP程序中引用AutoCAD的幾乎所有的功能,進(jìn)行圖形處理的自動(dòng)化,尤其是較深層的應(yīng)用——對(duì)象數(shù)據(jù)庫(kù)的操作。
在Visual LISP的協(xié)助下,從對(duì)AutoCAD進(jìn)行操作的功能上討論,僅比ARX少幾個(gè)功能:自定義AutoCAD對(duì)象、多圖檔的深入管理等。從目前的情況看,AutoLISP是AutoCAD中幾乎所有的應(yīng)用程序的“總管、大管家”,而且目前只有AutoLISP 表達(dá)式,才能以添加在腳本文件、對(duì)話框程序、菜單、甚至VBA程序,更可以直接用在AutoCAD的命令行中響應(yīng)幾乎所有的命令。
總的來(lái)說(shuō),LISP是典型的結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,AutoLISP是解釋運(yùn)行,源程序保密性差,巨量數(shù)據(jù)的復(fù)雜運(yùn)算效率較低,文件管理功能簡(jiǎn)單,但可以在絕大多數(shù)源程序內(nèi)容不變的條件下,用Visual LISP將其編譯成VLX程序包或者FAS程序,這樣處理之后的AutoLISP程序,將具有與ARX程序相同的高保密性能,也將具有比解釋運(yùn)行明顯提高的運(yùn)行效率。而且,AutoLISP程序設(shè)計(jì)的復(fù)雜程度和運(yùn)行風(fēng)險(xiǎn)大大低與ARX,絕少在程序崩潰后連帶AutoCAD崩潰。
2 利用AutoLisp進(jìn)行參數(shù)化繪圖的方案
用AutoLisp進(jìn)行開(kāi)發(fā)的一個(gè)典型的也是最重要的應(yīng)用就是實(shí)現(xiàn)參數(shù)化繪圖程序設(shè)計(jì),參數(shù)化繪圖包括尺寸驅(qū)動(dòng)和鼠標(biāo)拖動(dòng)。
鼠標(biāo)拖動(dòng),就是用AutoLisp語(yǔ)言提供的(GRREAD[])函數(shù),讓用戶直接讀AutoCAD的輸入設(shè)備(如鼠標(biāo)),通過(guò)鼠標(biāo)移動(dòng)光標(biāo),實(shí)現(xiàn)鼠標(biāo)拖動(dòng)實(shí)體數(shù)據(jù)庫(kù)與屏幕圖形的同時(shí)變動(dòng)。
尺寸驅(qū)動(dòng),就是通過(guò)改變幾何圖形的形狀和大小的繪圖參數(shù),即改變圖形尺寸,而驅(qū)動(dòng)圖形的自動(dòng)變化。
2.1 鼠標(biāo)拖動(dòng)
用AutoCAD提供的AutoLISP語(yǔ)言進(jìn)行二次開(kāi)發(fā),修改、擴(kuò)充AutoCAD的功能;用AutoLISP語(yǔ)言提供的(GRREAD[])函數(shù),讓用戶直接讀AutoCAD的輸入設(shè)備(如鼠標(biāo)),任選項(xiàng)追蹤光標(biāo)移動(dòng)存在且為真時(shí),通過(guò)鼠標(biāo)移動(dòng)光標(biāo),達(dá)到從鼠標(biāo)那里不斷返回坐標(biāo)值,實(shí)現(xiàn)鼠標(biāo)拖動(dòng)實(shí)體數(shù)據(jù)庫(kù)與屏幕圖形的一致變化,深化AutoCAD的作圖環(huán)境,使鼠標(biāo)拖動(dòng)圖形的參數(shù)化繪圖成為可能。
設(shè)計(jì)人員不需要考慮圖形的原始尺寸,只需用鼠標(biāo)移動(dòng)屏幕上的光標(biāo),調(diào)整所需的參數(shù)值即可,同時(shí)也免去了編制大量繪圖程序的工作。
用鼠標(biāo)拖動(dòng)來(lái)實(shí)現(xiàn)繪圖操作非常簡(jiǎn)便直觀,靈活迅速,符合用戶習(xí)慣,適應(yīng)當(dāng)今AutoCAD的發(fā)展趨勢(shì)。但用于拖動(dòng)的原始草圖一般是一些簡(jiǎn)單實(shí)體(由line命令繪制的角、梯形、矩形和多邊形)。若草圖是用pline命令繪制的復(fù)雜實(shí)體,需要對(duì)程序另外加入entnext函數(shù)等。
2.2 尺寸驅(qū)動(dòng)
參數(shù)化繪圖在現(xiàn)代機(jī)械CAD中應(yīng)用很廣,特別是對(duì)于定型的機(jī)械設(shè)計(jì)產(chǎn)品設(shè)計(jì),需要形成系列,以便針對(duì)用戶的生產(chǎn)特點(diǎn)提供不同大小、功率、規(guī)格的產(chǎn)品。這就要求該產(chǎn)品的CAD系統(tǒng)具有參數(shù)化的設(shè)計(jì)功能,使得產(chǎn)品的設(shè)計(jì)圖可以方便地隨著某些結(jié)構(gòu)尺寸的修改而修改并自動(dòng)地重新繪出所要求的圖紙,實(shí)現(xiàn)尺寸驅(qū)動(dòng)圖形的自動(dòng)變化。
參數(shù)化設(shè)計(jì)的設(shè)計(jì)對(duì)象(即機(jī)械圖)的結(jié)構(gòu)形狀一般比較定型,其尺寸關(guān)系可以用一組參數(shù)來(lái)確定,從而確定所要畫(huà)的圖紙。在AutoCAD R12以上版本中可以設(shè)計(jì)對(duì)話框來(lái)輸入?yún)?shù),若要改變圖形的尺寸參數(shù),可以使用對(duì)話框重新輸入一組數(shù)據(jù)重畫(huà)即可。對(duì)于實(shí)現(xiàn)了標(biāo)準(zhǔn)化、系列化的,且曲線、曲面較多,形狀復(fù)雜等的零件,比較適合采用AutoLISP編程,用尺寸驅(qū)動(dòng)來(lái)實(shí)現(xiàn)自動(dòng)繪制。
2.3 總結(jié)
由于鼠標(biāo)拖動(dòng)過(guò)程過(guò)于繁瑣,不易操作。故本次設(shè)計(jì)采用尺寸驅(qū)動(dòng)參數(shù)化繪圖。通過(guò)對(duì)對(duì)話框的設(shè)計(jì),用戶只要在對(duì)話框中改變參數(shù)值,就可得出不同軸徑、槽寬和槽深的軸的自動(dòng)繪制和尺寸標(biāo)注。
3 對(duì)話框的設(shè)計(jì)
AutoCAD有自己的一套對(duì)話框設(shè)計(jì)語(yǔ)言,稱(chēng)為對(duì)話框控制語(yǔ)言(DCL)。該語(yǔ)言以文件形式定義對(duì)話框,對(duì)話框中的各種元素(如按鈕和編輯框)又稱(chēng)為控件,空間的尺寸和功能由空間的屬性控制。使用對(duì)話框,分為二步來(lái)完成:第一步對(duì)話框的界面設(shè)計(jì),即用DCL語(yǔ)言定義一個(gè)對(duì)話框界面;第二步使用AutoLISP程序來(lái)驅(qū)動(dòng)用DCL語(yǔ)言定義的對(duì)話框,并完成對(duì)話框中各控件(如按鈕)對(duì)應(yīng)的操作。
3.1 DCL語(yǔ)言的語(yǔ)法規(guī)
在提出編寫(xiě)的DCL文件時(shí),先簡(jiǎn)單地介紹一下DCL的語(yǔ)言語(yǔ)法規(guī)。
(1)DCL語(yǔ)言采用類(lèi)似C語(yǔ)言的形式來(lái)描述,每個(gè)空件的定義由一對(duì)匹配的“{}”
大括號(hào)包容,其內(nèi)容說(shuō)明屬性,每個(gè)屬性賦值語(yǔ)句和調(diào)用標(biāo)準(zhǔn)控件語(yǔ)句都以“;”分隔。
(2)控件的定義和屬性用小寫(xiě)字母書(shū)寫(xiě),用戶只有在給控件的屬性(如label)賦值時(shí)才可以使用大寫(xiě)字母。
(3)DCL文件應(yīng)采用縮格形式以便清楚地表達(dá)語(yǔ)句的從屬關(guān)系。例如,在列的聲明中,列中的按鈕控件的聲明應(yīng)該縮進(jìn)幾格,而且這些同等位置的按鈕聲明應(yīng)該對(duì)折。
(4)構(gòu)件的名字可包括字母、數(shù)字和若干個(gè)下劃線,但要以字母開(kāi)頭。
(5)屬性用等號(hào)來(lái)賦值,分號(hào)結(jié)束。
(6)空行被忽略。
(7)文件中可以用“//”表示從“//”后直到行末尾部分為注釋?zhuān)坏诙N注釋以/*開(kāi)始,以*/結(jié)束,/*和*/可以處在不同的行,也可以處在同一行中間,這樣方便用戶用以大段的文檔說(shuō)明和行中間的消息說(shuō)明。
(8)另外指出,在用AutoLISP驅(qū)動(dòng)時(shí),AutoCAD會(huì)對(duì)其編譯檢查,如果用戶定義的DCL文件,存在嚴(yán)重錯(cuò)誤,AutoCAD會(huì)在當(dāng)前工作目錄下生成ACAD.DCE文本文件,該文件給出出錯(cuò)說(shuō)明。
3.2 對(duì)話框設(shè)計(jì)中用到的控件和屬性
(1)關(guān)鍵字和值屬性
key(關(guān)鍵字)是用雙引號(hào)括起來(lái)的字符串(無(wú)缺省值)。它為特定的控件給出了一個(gè)ASCII名字。應(yīng)用程序利用這個(gè)名字來(lái)引用相應(yīng)的控件。在一個(gè)特定的對(duì)話框內(nèi)部,每個(gè)key取值必須是唯一的。Key的值對(duì)應(yīng)用是不可見(jiàn)的,其名稱(chēng)可任意指定(但在對(duì)話框中必須是唯一的)。同理,key屬性也不需要用多種語(yǔ)言轉(zhuǎn)換到應(yīng)用程序中。
value(值)是用雙引號(hào)括起來(lái)的字符串(也無(wú)缺省值)。它規(guī)定了控件的初值。Value的含義隨控件的類(lèi)型不同而變化。在運(yùn)行期間,控件值可以由用戶輸入或調(diào)用(set_tile)函數(shù)來(lái)改變。打開(kāi)對(duì)話框時(shí)(即在調(diào)用new_dialog函數(shù)之前),不必考慮控件值屬性。只是在對(duì)話框顯示出來(lái)后,new_dialog才使用這些值來(lái)初始化對(duì)話框中的每一個(gè)控件。這意味著value屬性不會(huì)影響控件在對(duì)話框中的大小和定位。
(2)編輯框及其專(zhuān)用屬性
編輯框(edit_box)是用戶能夠輸入和編輯單行文本的控件窗口。而且可以在編輯框的左側(cè)顯示任意的label(標(biāo)簽)。如果輸入的文本比編輯框更長(zhǎng),文本則可作水平滾動(dòng)。
1 label用雙引號(hào)括起來(lái)的字符串(缺省值為空串:())。該文本顯示在框的左邊。如果給定了label值,它將按左對(duì)齊顯示在edit_box控件中。
2 edit_width一個(gè)整數(shù)或?qū)崝?shù)值,并用字符寬度單位表示。編輯框的輸入部分的寬度就是edit_box類(lèi)型控件的實(shí)際邊框部分的寬度。如果沒(méi)有給定edit_width值或?qū)⑺脼?,那么控件的寬度是不確定的,編輯框?qū)U(kuò)展到占滿可用空間為止;如果給定edit_width非零值,則編輯框在該控件所占據(jù)的空間內(nèi)是右對(duì)齊的。出于布局考慮,伸展控件的尺寸是有必要的。PDB工具能在label與框的編輯部分插入適當(dāng)空白。
(3) 加框列
加框列(boxed_column)是指一種周?chē)?huà)邊界線的列。對(duì)話框的布局就像boxed_column(加框列)描述的那樣。如果加框列具有l(wèi)abel,則label會(huì)出現(xiàn)在邊框的上方。若不要出現(xiàn)label,用空白(" ")或空(null)或""就只顯示邊框。
(4)加框行
加框行(boxed_column)是指一種周?chē)?huà)有邊界線的行。如果加框行具有l(wèi)abel,則label會(huì)出現(xiàn)在邊框的上方,若不要出現(xiàn)label,用空白(" ")或空(null)或""就只顯示邊框。
3.3 對(duì)話框的程序編譯
圖3-1 對(duì)話框圖示
對(duì)話框如圖3-1所示,其編譯的程序如下:
myshaft:dialog{
label="軸的參數(shù)化設(shè)計(jì)";
:boxed_column{label="軸的參數(shù)";
:boxed_row{
:edit_box{
label="左側(cè)軸直徑d1(mm)";
key="d1";
edit_width=8;
}
:edit_box{
label="左側(cè)軸長(zhǎng)度a1(mm)";
key="a1";
edit_width=8;
}
:edit_box{
label="倒角距離c(mm)";
key="c";
edit_width=8;
}
}
:boxed_row{
:edit_box{
label="第二段軸直徑d2(mm)";
key="d2";
edit_width=14;
}
:edit_box{
label="第二段軸長(zhǎng)度a2(mm)";
key="a2";
edit_width=14;
}
}
:boxed_row{
:edit_box{
label="鍵槽寬b(mm)";
key="b";
edit_width=10;
}
:edit_box{
label="鍵槽深t(mm)";
key="t";
edit_width=10;
}
:edit_box{
label="鍵槽長(zhǎng)L(mm)";
key="L";
edit_width=10;
}
}
:boxed_row{
:edit_box{
label="第三段軸直徑d3(mm)";
key="d3";
edit_width=14;
}
:edit_box{
label="第三段軸長(zhǎng)度a3(mm)";
key="a3";
edit_width=14;
}
}
:boxed_row{
:edit_box{
label="退刀槽直徑d7(mm)";
key="d7";
edit_width=16;
}
:edit_box{
label="退刀槽長(zhǎng)度a7(mm)";
key="a7";
edit_width=16;
}
}
:boxed_row{
:edit_box{
label="第四段軸直徑d4(mm)";
key="d4";
edit_width=14;
}
:edit_box{
label="第四段軸長(zhǎng)度a4(mm)";
key="a4";
edit_width=14;
}
}
:boxed_row{
:edit_box{
label="第五段軸直徑d5(mm)";
key="d5";
edit_width=14;
}
:edit_box{
label="第五段軸長(zhǎng)度a5(mm)";
key="a5";
edit_width=14;
}
}
:boxed_row{
:edit_box{
label="右側(cè)軸直徑d6(mm)";
key="d6";
edit_width=16;
}
:edit_box{
label="右側(cè)軸長(zhǎng)度a6(mm)";
key="a6";
edit_width=16;
}
}
}
ok_cancel;
}
4 系統(tǒng)設(shè)計(jì)
4.1 軸設(shè)計(jì)的總體方案
開(kāi)始
初始化變量,讀入數(shù)據(jù)文件
輸入軸的參數(shù)
N
輸入完成
進(jìn)入繪圖程序
結(jié)束
圖4-1程序流程圖
整個(gè)軸的參數(shù)化繪圖流程如圖4-1所示。為了實(shí)現(xiàn)軸類(lèi)零件的參數(shù)化繪圖設(shè)計(jì),采用了建立圖元庫(kù)的方法。圖元庫(kù)是將具有相同結(jié)構(gòu)的繪圖元素,組合到一起形成繪圖元素集合,在繪制類(lèi)似結(jié)構(gòu)特征的零件時(shí),便可從圖元庫(kù)調(diào)用某一圖元,輸入圖元的特征尺寸,在屏幕上自動(dòng)繪出此圖元的圖形。通過(guò)對(duì)話框的設(shè)計(jì),利用對(duì)話框?qū)S的各段直徑及長(zhǎng)度尺寸進(jìn)行輸入和修改,從而實(shí)現(xiàn)不同軸徑、槽寬和槽深的軸剖面圖的自動(dòng)繪制及尺寸標(biāo)注,進(jìn)而提高軸類(lèi)零件的繪圖效率。
4.2 主程序的設(shè)計(jì)
4.2.1 對(duì)話框PDB函數(shù)
(1)對(duì)話框打開(kāi)和關(guān)閉函數(shù)
1 (load_dialog delfile)本函數(shù)將一個(gè)DCL文件加載到內(nèi)存,一個(gè)應(yīng)用程序通過(guò)多次調(diào)用本函數(shù)而裝入多個(gè)文件,本函數(shù)按照AutoCAD庫(kù)搜索路徑來(lái)搜索指定的DCL文件。
defile變量指定要裝入的DCL文件的一個(gè)字符串,若未指定擴(kuò)展名,則假定它的擴(kuò)展名是.DCL。若本函數(shù)調(diào)用成功,則返回一個(gè)正整數(shù)值(假設(shè)存入變量在index_value中);否則,返回一個(gè)負(fù)整數(shù),這個(gè)index_value在隨后調(diào)用new_dialog和unload_dialog時(shí)可用作被裝入的DCL文件的句柄使用。
2 (unload_dialog index_value)本函數(shù)卸載與文件句柄index_value相聯(lián)系的那個(gè)DCL文件(這個(gè)句柄是在先前調(diào)用nex_dialog函數(shù)時(shí)取得的)。本函數(shù)總是返回nil。本函數(shù)與load_dialog函數(shù)互為反函數(shù)。
3 (new_dialog dlgname index_value [action[screen_pt]])本函數(shù)開(kāi)始一個(gè)新的對(duì)話框,并顯示該對(duì)話框,還能指定一個(gè)隱含動(dòng)作。
如果new_dialog調(diào)用成功,它返回T;否則,它返回nil。
在應(yīng)用程序中,在調(diào)用start_dialog函數(shù)之前,必須先調(diào)用new_dialog。所有對(duì)話框的初始化工作,如:設(shè)置控件值、生成圖像、生成列表框的表以及將各個(gè)動(dòng)作與特定的控件聯(lián)系起來(lái)(用action_tile函數(shù)完成)等等,都必須發(fā)生在調(diào)用new_dialog函數(shù)之后,同時(shí)也必須發(fā)生在調(diào)用start_dialog函數(shù)之前。
在應(yīng)用程序中應(yīng)該總是檢查由new_dialog函數(shù)返回的狀態(tài)。當(dāng)new_dialog函數(shù)調(diào)用失敗時(shí),調(diào)用start_dialog函數(shù)將有可能導(dǎo)致無(wú)法預(yù)料的后果。
4 (start_dialog)本函數(shù)顯示一個(gè)對(duì)話框,并開(kāi)始接受用戶的輸入。
在調(diào)用本函數(shù)之前,必須調(diào)用new_dialog函數(shù),首先將對(duì)話框進(jìn)行初始化。對(duì)話框一直保持激活狀態(tài),直到一個(gè)動(dòng)作表達(dá)式或回調(diào)函數(shù)調(diào)用done_dialog的函數(shù)。通常,done_dialog函數(shù)與關(guān)鍵字為“accept”的那個(gè)控件相聯(lián)系(典型情況下是OK按鈕),也可以與關(guān)鍵字為“cancel”的那個(gè)控件相聯(lián)系(典型情況下是cancel按鈕)。
調(diào)用start_dialog函數(shù)不帶變量。它返回一個(gè)傳遞函數(shù)給done_dialog函數(shù)的狀態(tài)代碼。如果用戶按下了OK按鈕,start_dialog函數(shù)返回隱含值1,如果用戶按下了cancel按鈕,start_dialog函數(shù)返回值0,而如果所有對(duì)話框都被term_dialog函數(shù)終止,那么start_dialog函數(shù)就返回-1。但是,如果done_dialog函數(shù)傳遞了一個(gè)大于1的整型狀態(tài)代碼,start_dialog函數(shù)就會(huì)將這個(gè)值返回,它的含義由應(yīng)用程序決定。
5 (done_dialog[status])本函數(shù)終止一個(gè)對(duì)話框。必須從一個(gè)動(dòng)作表達(dá)式或一個(gè)回調(diào)函數(shù)中調(diào)用done_dialog函數(shù)。
如果為關(guān)鍵字“accept”或“cancel”的按鈕(通常是OK和cancel按鈕)提供了一個(gè)回調(diào)函數(shù),那么,該回調(diào)函數(shù)必須顯示地調(diào)用done_dialog函數(shù)。如果不這樣做,用戶就會(huì)被困在這個(gè)對(duì)話框中,如果不為這些按鈕提供一個(gè)顯示的回調(diào)函數(shù),而使用標(biāo)準(zhǔn)的退出按鈕,AutoCAD將自動(dòng)處理他們。此外,為“accept”按鈕提供的一個(gè)顯式的回調(diào)函數(shù)必須使其在調(diào)用done_dialog時(shí)將變量status指定為1(或由應(yīng)用程序定義的其他值);否則,start_dialog函數(shù)會(huì)返回隱含值0,而0意味著用戶取消了該對(duì)話框。
(2) 控件和屬性處理函數(shù)
1 (action_tile key action_expression)本函數(shù)為某一控件指定一個(gè)動(dòng)作表達(dá)式。當(dāng)用戶在對(duì)話框中選擇了這個(gè)控件時(shí),就會(huì)對(duì)這個(gè)動(dòng)作表達(dá)式進(jìn)行求值。
2 (get_tile key)本函數(shù)檢索一個(gè)對(duì)話框控件的當(dāng)前運(yùn)行時(shí)的值。變量key是指定控件的一個(gè)字符串,它區(qū)分大小寫(xiě),并以字符串的形式返回控件的值。本函數(shù)被更多地用于回調(diào)函數(shù)之中,而不是用于構(gòu)件的初始化。此函數(shù)還可用于查看未被選中的控件的值。例如對(duì)對(duì)話框進(jìn)行出錯(cuò)檢查并檢查其設(shè)定值的一致性,這時(shí)只知道被選中的控件的值(在變量value中)是不夠的,還要知道別的控件的值。
3 (set_tile key value)本函數(shù)為一個(gè)對(duì)話框控件設(shè)置值,key變量是指定控件的一個(gè)字符串,而value則是指定新值的一個(gè)字符串變量名(控件的初始值由value屬性設(shè)置)。
4.2.2 主程序的編譯
程序如下:
;主程序
(defun C:MYSHAFT ()
(setq id_load (load_dialog "myshaft.dcl"))
(if (<= id_load 0)
(alert "\n加載DCL文件出錯(cuò)!")
(progn (setq id_disp (new_dialog "myshaft" id_load))
(if (not id_disp)
(alert "\n顯示對(duì)話框時(shí)出錯(cuò)!")
(progn (set_tile "d1" "50") ;設(shè)置初始值
(set_tile "a1" "35")
(set_tile "c" "2")
(set_tile "d2" "54")
(set_tile "a2" "60")
(set_tile "b" "16")
(set_tile "t" "6")
(set_tile "L" "45")
(set_tile "d3" "60")
(set_tile "a3" "30")
(set_tile "d7" "50")
(set_tile "a7" "5")
(set_tile "d4" "56")
(set_tile "a4" "35")
(set_tile "d5" "50")
(set_tile "a5" "25")
(set_tile "d6" "40")
(set_tile "a6" "55")
(action_tile "accept" "(getdata) (done_dialog 1)")
;用getdata函數(shù)獲取用戶輸入數(shù)據(jù)
(action_tile "cancel" "(done_dialog 0)")
(setq id_start (start_dialog)) ;顯示對(duì)話框
) ;end progn inner and if display
)
) ;end progn outter and if load
)
(if (= id_start 1)
(Drawshaft)
)
(unload_dialog id_load)
(princ)
) ;end defun return parameters
;獲取數(shù)據(jù)函數(shù)
(defun getdata ()
(setq dd1 (atoi (get_tile "d1"))) ;獲取左側(cè)軸直徑數(shù)據(jù)
(setq aa1 (atoi (get_tile "a1"))) ;獲取左側(cè)軸長(zhǎng)度數(shù)據(jù)
(setq cc (atoi (get_tile "c"))) ;獲取倒角距離數(shù)據(jù)
(setq dd2 (atoi (get_tile "d2"))) ;獲取第二段軸直徑數(shù)據(jù)
(setq aa2 (atoi (get_tile "a2"))) ;獲取第二段軸長(zhǎng)度數(shù)據(jù)
(setq bb (atoi (get_tile "b"))) ;獲取鍵槽寬
(setq tt (atoi (get_tile "t"))) ;獲取鍵槽深
(setq LL (atoi (get_tile "L"))) ;獲取鍵槽長(zhǎng)
(setq dd3 (atoi (get_tile "d3"))) ;獲取第三段軸直徑數(shù)據(jù)
(setq aa3 (atoi (get_tile "a3"))) ;獲取第三段軸長(zhǎng)度數(shù)據(jù)
(setq dd7 (atoi (get_tile "d7"))) ;獲取退刀槽直徑數(shù)據(jù)
(setq aa7 (atoi (get_tile "a7"))) ;獲取退刀槽長(zhǎng)度數(shù)據(jù)
(setq dd4 (atoi (get_tile "d4"))) ;獲取第四段軸直徑數(shù)據(jù)
(setq aa4 (atoi (get_tile "a4"))) ;獲取第四段軸長(zhǎng)度數(shù)據(jù)
(setq dd5 (atoi (get_tile "d5"))) ;獲取第五段軸直徑數(shù)據(jù)
(setq aa5 (atoi (get_tile "a5"))) ;獲取第五段軸長(zhǎng)度數(shù)據(jù)
(setq dd6 (atoi (get_tile "d6"))) ;獲取左側(cè)軸直徑數(shù)據(jù)
(setq aa6 (atoi (get_tile "a6"))) ;獲取左側(cè)軸長(zhǎng)度數(shù)據(jù)
)
收藏
編號(hào):15441862
類(lèi)型:共享資源
大?。?span id="rh2v3je" class="font-tahoma">5.73MB
格式:ZIP
上傳時(shí)間:2020-08-10
45
積分
關(guān) 鍵 詞:
基于
autolisp
零件
參數(shù)
繪圖
程序
cad
資源描述:
基于AutoLisp軸類(lèi)零件參數(shù)化繪圖含程序及2張CAD圖,基于,autolisp,零件,參數(shù),繪圖,程序,cad
展開(kāi) 閱讀全文
溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學(xué)習(xí)交流,未經(jīng)上傳用戶書(shū)面授權(quán),請(qǐng)勿作他用。
鏈接地址:http://m.kudomayuko.com/article/15441862.html