《計算機圖形學》課件第10章_第1頁
《計算機圖形學》課件第10章_第2頁
《計算機圖形學》課件第10章_第3頁
《計算機圖形學》課件第10章_第4頁
《計算機圖形學》課件第10章_第5頁
已閱讀5頁,還剩131頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第10章AutoCAD系統(tǒng)的二次開發(fā)10.1基于AutoCAD的計算機輔助設計10.2

AutoLISP語言10.3

VisualLISP語言10.4

VBA語言10.5

ObjectARX應用程序10.1基于AutoCAD的計算機輔助設計

AutoCAD是目前微機上應用最為廣泛的通用交互式計算機輔助繪圖與設計軟件包。它有多種工業(yè)標準和開放的體系結構,其通用性使得它在機械、電子、交通、建筑、地質、測繪、印刷、服裝等領域得到了極為廣泛的應用。但是,為了完成某一個具體的項目設計,各行業(yè)、各領域在使用AutoCAD的過程中都需要根據自身特點進行定制或開發(fā)。案例一:基于AutoCAD平臺的換熱設備零部件三維造型系統(tǒng)。換熱設備廣泛應用于石油化工、煉油、化肥、動力、輕工、冶金、核工業(yè)等工業(yè)部門。在對換熱設備及其零部件進行設計時,首先需要創(chuàng)建零部件的三維模型,再對換熱設備零部件進行有限元分析和優(yōu)化設計(特別是對非國標零部件)。案例二:基于AutoCAD平臺的供電線路設計與工程概預算系統(tǒng)。該系統(tǒng)充分利用現(xiàn)有的計算機技術和數(shù)據庫技術,把兩者有效、完美地結合起來,使供電線路設計與工程概預算的基礎數(shù)據共享,供電線路設計部分的工作通過AutoCAD二次開發(fā)的設計軟件來完成,其有關數(shù)據存儲在Oracle數(shù)據庫中。10.1.1AutoCAD二次開發(fā)的主要工作和開發(fā)工具

1.AutoCAD二次開發(fā)的主要工作

1)應用程序用戶界面設計

用戶能夠創(chuàng)建基于MFC(MicrosoftFoundationClass)的用戶

界面,即設計具有Windows風格的對話框,其外觀和內建的AutoCAD用戶界面完全相同?;贛FC的應用程序與其他Windows應用程序有機地聯(lián)系在一起,以便充分發(fā)揮Windows環(huán)境下各種應用程序協(xié)同工作的能力。

2)參數(shù)化繪圖程序設計

實現(xiàn)參數(shù)化繪圖是CAD軟件開發(fā)過程的核心任務之一。所謂參數(shù)化繪圖,就是將圖形尺寸與一定的設計條件(或約束條件)相關聯(lián)。當設計條件發(fā)生變化時,圖形尺寸也隨之更新。

3)圖庫的開發(fā)和利用

圖庫是工程CAD的一種方便快捷的繪圖手段,它在CAD軟件開發(fā)過程中占有重要的地位。圖庫就是一系列基本圖形構成的圖形庫,組成圖庫的基本圖形稱為圖元。對具體的工程應用領域(如機械CAD),必須創(chuàng)建較多的基本圖元,如螺栓、螺母、墊片等。在設計中按給定的公稱尺寸調用圖元,會使繪圖效率得到提高。

4)創(chuàng)建應用軟件幫助系統(tǒng)

幫助系統(tǒng)對于使用軟件非常重要。在設計大型CAD應用程序時,建立自己的幫助系統(tǒng)是必不可少的。建立幫助系統(tǒng)主要涉及兩個基本問題,一是要有幫助文件,二是要有調用函數(shù)。

2.AutoCAD開發(fā)工具

AutoCAD開發(fā)工具又被稱為AutoCADAPI(應用程序接

口),是將AutoCAD環(huán)境客戶化的基本手段。圖10-1反映了AutoCAD二次開發(fā)工具的演變過程。圖10-1AutoCAD二次開發(fā)工具的演變過程

1)AutoLISP/VisualLISP

AutoLISP(LISTProcessingLanguage)出現(xiàn)于1985年推出的AutoCADR2.18中,是一種嵌入在AutoCAD內部的編程語言,是AutoCAD最早的解釋型API,一直是低版本AutoCAD的首

選編程語言。

AutoLISP是一種表處理語言,是被解釋執(zhí)行的,任何一個語句鍵入后就能馬上執(zhí)行。AutoLISP主要用來自動完成重復性任務,進行客戶化開發(fā)和編制菜單及通過簡單的機制增加命令。AutoLISP雖然容易學會,但因繼承了LISP語言的編程規(guī)則而導致繁多的括號,所以不利于被編輯。AutoLISP不是面向對象的語言,因此很難用于開發(fā)大型應用程序。

VisualLISP是一種面向對象的開發(fā)環(huán)境,是AutoLISP的擴展和延伸。它是編譯型API,與AutoLISP完全兼容,提供AutoLISP的全部功能。它提供了完整的、功能強大的編譯環(huán)境,可以進行包括括號匹配、跟蹤調試、源代碼及語法檢查等工具,方便創(chuàng)建和調試程序。在很大程度上,VisualLISP克服了AutoLISP原來的效率低和保密性差的缺陷。在VisualLISP中還新增了一些函數(shù),使開發(fā)者可以直接使用AutoCAD中的對象和反應器,進行更底層的開發(fā)。

2)ActiveX/VBA

提供Automation服務的軟件組件通過標準接口能夠對外開放它的特定功能,以便于如VisualBasic一類的編程工具對其進行訪問。由于AutoCAD擁有ActiveXAutomation接口,因此用戶可以容易地用各種ActiveX客戶編程語言來定制AutoCAD。AutoCAD與其他應用程序的關系如圖10-2所示。圖10-2AutoCAD與其他應用程序的關系

VBA(VisualBasicforApplications)是VB的特殊形式,它將VB環(huán)境植入應用程序AutoCAD中,使二者緊密集成在一起。VBA是一個基于對象的編程環(huán)境,能為使用VB的用戶提供豐富

的開發(fā)AutoCAD的功能,從而提高了開發(fā)效率。

3)ADS/ObjectARX

ADS(AutoCADDevelopmentSystem)是AutoCAD的C語言開發(fā)系統(tǒng),本質上是一組可以用C語言編寫AutoCAD應用程序的頭文件和目標庫。利用用戶熟悉的各種流行的C語言編譯器,

將應用程序編譯成可執(zhí)行的文件在AutoCAD環(huán)境下運行,這種可以在AutoCAD環(huán)境中直接運行的可執(zhí)行文件叫做ADS應用程序。

ADS由于其速度快,又采用結構化的編程體系,因而很適合于高強度的數(shù)據處理,如二次開發(fā)的機械設計CAD、工程分析CAD、建筑結構CAD、土木工程CAD、化學工程CAD及電氣工程CAD等。

ObjectARX是一種特定的面向對象的C++編程環(huán)境,包括一組動態(tài)鏈接庫(DLL)。這些庫與AutoCAD在同一地址空間運行并能直接利用AutoCAD核心數(shù)據結構和代碼;庫中包含一組通用工具,使得二次開發(fā)者可以充分利用AutoCAD的開放結構,直接訪問AutoCAD數(shù)據庫結構、圖形系統(tǒng)以及CAD幾何造型核心,以便能在運行期間實時擴展AutoCAD的功能,創(chuàng)建能全面享受AutoCAD固有命令的新命令。

ObjectARX能夠對AutoCAD的所有事務進行完整的、先進的、面向對象的設計與開發(fā),并且開發(fā)的應用程序速度更快、集成度更高、穩(wěn)定性更強。ObjectARX的核心是兩組關鍵的ARI,即AcDb(AutoCAD數(shù)據庫)和AcEd(AutoCAD編譯器),

另外還有其他的一些重要庫組件,如AcRX(AutoCAD實時擴展)、AcGi(AutoCAD圖形接口)、AcGe(AutoCAD幾何庫)、

ADSRX(AutoCAD開發(fā)系統(tǒng)實時擴展)。

ObjectARX還可以按需要加載應用程序,一般可與Windows系統(tǒng)集成,并與其他Windows應用程序實現(xiàn)交互操作。ObjectARX并沒有包含在AutoCAD中,可在AutoDESK公司網站中下載。10.1.2AutoCAD二次開發(fā)應遵循的原則

AutoCAD二次開發(fā)應遵循以下五個原則。

1.用戶界面友好

軟件開發(fā)的目的是為了應用,所以用戶是否可以較為容易地掌握軟件成為評價該軟件的基本標準。一個友好的用戶界面應包括:使用方便,界面熟悉,具有靈活的提示幫助信息以及良好的交互方式與出錯處理。

2.遵循軟件工程方法

軟件工程是指導計算機軟件開發(fā)和維護的工程科學,即采用工程的概念、原理、技術和方法來開發(fā)和維護軟件。軟件工程采用生命周期法從時間上對軟件的開發(fā)和維護進行分解,把軟件生存周期依次劃分為幾個階段,分階段進行開發(fā)。

3.參數(shù)化CAD

對于系列化、通用化和標準化程度高的產品,要將已知條件及其他的隨著產品規(guī)格而變化的基本參數(shù)用相應的變量代替,然后根據這些已知條件和基本參數(shù),由計算機自動查詢圖形數(shù)

據庫,或由相應的軟件計算出繪圖所需的全部數(shù)據,由專門的繪圖生成軟件在屏幕上自動地設計出圖形來。

4.成組CAD

許多企業(yè)的部分產品結構比較相似,我們可以根據產品結構和工藝性的相似性,利用成組技術將零件劃分成有限數(shù)目的零件庫。根據同一零件族中各零件的結構特點編制相應的

CAD通用軟件,用于該族所有零件的設計,這就是成組CAD。

5.智能化CAD

采用專家系統(tǒng)可以指導設計師下一步該做什么,當前存在問題,建議問題的解決途徑和推薦解決方案;或者模擬人的智慧,根據出現(xiàn)的問題提出合理的解決方案。采用專家系統(tǒng)可以提高設計質量和效率。智能化CAD就是將專家系統(tǒng)與CAD技術融為一體而建立起來的系統(tǒng)。

10.2AutoLISP語言

LISP(LISTProcessingLanguage)語言是一種計算機表處理語言,被廣泛用于人工智能領域,是由美國麻省理工學院的J.MCCarthy于1960年提出的。它的特點是程序和數(shù)據都采用符號表達式的形式,即一個LISP程序可以將另一個程序作為其數(shù)據處理,這使得程序設計十分靈活。

AutoCAD內部有一個LISP解釋器,AutoLISP語言是嵌入到AutoCAD內部的LISP編程語言。用戶可以通過AutoLISP編程,開發(fā)自己的應用程序系統(tǒng),也可以創(chuàng)建新的AutoCAD命令。

基本的AutoLISP語法與通用的LISP相同,允許用戶在命令行直接輸入AutoLISP代碼,或從外部的ASCLL格式文本文件中加載AutoLISP代碼,其擴展名為.lsp。10.2.1AutoLISP的基本語法

1.AutoLISP程序由表達式構成

表達式的基本格式是:

(functionarguments)

每個表達式從左括號“(”開始,由函數(shù)名和可選參數(shù)組成,到右括號“)”結束。例如,(+25)表示進行加法運算,值為7。

2.AutoLISP程序從defun函數(shù)開始

defun函數(shù)用于在AutoLISP程序中定義一個函數(shù),其語法

如下:

(defunname[argument])

其中,name是函數(shù)名,argument是參數(shù)表。例如,

(defunaa())定義一個沒有參數(shù)和位置標記的函數(shù)aa。該函數(shù)使用的所有變量都是全局變量。在該程序運行結束后,全局變量不會失去其數(shù)值。例如,

(defunbb(abc))

定義一個有三個參數(shù)a、b和c的bb函數(shù)。變量a、b和c可調用該程序以外的值。例如,

(defuncc(/ab))

定義一個有兩個局部變量a和b的cc函數(shù)。局部變量指變量值僅在本程序執(zhí)行過程中保持其值,且只能在該程序中使用的變量。例如,

(defunC:dd())

在函數(shù)名稱前的“C:”指該函數(shù)可以通過在AutoCAD的Command:提示下輸入函數(shù)名稱來調用。輸入時應將函數(shù)名用括號括起來。

3.AutoLISP的數(shù)據類型

(1)整數(shù):32位帶符號的整數(shù)。取值范圍為-2147483648~+2147483647。

(2)實數(shù):雙精度浮點格式的實數(shù),至少有14位有效數(shù)字,小數(shù)點前必須加0??茖W計數(shù)法是實數(shù)的有效表示方法。

(3)字符串:是一組用雙引號括起來的字符序列。用反斜杠“\”可以引入控制符。例如,“\nEnterfirstpoint”表示換行顯示“Enterfirstpoint”字符串。

(4)表:是一組用空格分隔的包括在括號內的一組有序的元素,元素可以是數(shù)值、符號、字符串或表。表是AutoLISP主要的數(shù)據存儲結構。例如,(123.030.00.0)可以表示三維點

的坐標。

(5)選擇集:是一個或多個實體的集合。AutoLISP可以把實體對象添加到選擇集中或從選擇集中移去。

(6)實體名:是指定給每個對象的一個數(shù)字標識。實體名實際上是一個指針,可以用來尋找一個對象的數(shù)據庫記錄。

(7)文件描述符:是由AutoLISPOpen函數(shù)打開文件時所用的參數(shù)。Open函數(shù)返回一個字母數(shù)字串作為其后文件操作的指針。

(8)符號與變量:AutoLISP用符號來引用數(shù)據。符號由字母數(shù)字組成,不區(qū)分大小寫。不可再拆分的符號稱為符號原子。AutoLISP內部函數(shù)與AutoCAD系統(tǒng)變量均為保留符號,以下

字符不能用作符號名:“(”、“)”、“.”、“′”、“″”、“:”。10.2.2AutoLISP的基本函數(shù)

AutoLISP提供了大量的預定義函數(shù)。這里只介紹一些比較典型的常用函數(shù),更多的信息請查閱AutoLISP參考資料。

(1)加減乘除:(+num1num2num3...)(-num1num2num3...)(*num1num2num3...)(/num1num2num3...)

(2)增量、減量:(1+nmuber)(1-number)

(3)絕對值:(absnumber)

(4)平方根:(sqrtnumber)

(5)變量賦值:(setqnamevalue[namevalue...]),如(setqX8.5Y12)

(6)系統(tǒng)變量賦值:(setvar″variable-name″value),如(setvar″cmdecho″0)

(7)正弦和余弦:(sinangle)計算以弧度表示的角度的正弦函數(shù)值。(cosangle)計算以弧度表示的角度的余弦函數(shù)值。

(8)反正切:(atannumber)返回以弧度表示的角度值。

(atannum1num2)計算(num1/num2)的反正切值,以弧度

表示。

(9)關系運算:判斷兩個操作數(shù)的關系,條件為真時返回值為T,條件為假時返回值為nil。

(=atom1atom2)(/=atom1atom2)(<atom1atom2)

(<=atom1atom2)(>atom1atom2)(>=atom1atom2)

(10)邏輯運算:條件為真時返回值為T,條件為假時返回值為nil。

(andexpr1expr2...)邏輯與

(orexpr1expr2...)邏輯或

(notexpr)邏輯非

(11)條件與循環(huán):

(ifconditionexpr1expr2)條件

(repeatnexpressions)計次循環(huán)

(whileconditionexpressions)條件循環(huán)

(12)求值函數(shù):

(distancepoint1point2)求兩點間距離

(anglepoint1point2)求兩點確定的角度

(prognexpressions)表達式求值,常用于條件函數(shù)

(polarpointangledistance)以一個給定角度和一個與給定點的距離來定義一個新點,

point為給定點,angle為以弧度表示的給定角度,并以逆時針方向為正,distance為與給定點的距離。

(13)表處理:

(listexpressions)將表達式的值串成一個表

(carlist)求表的第一個元素

(cadrlist)求表的第二個元素

(nthnlist)求表的第n個元素

(cdrlist)將一個列表的第一項刪除后返回該列表

(14)交互輸入:

(getpoint[point][prompt])等待輸入一個點

(getangle[point][prompt])等待輸入一個角度

(getreal[prompt])等待輸入一個實數(shù)

(15)Command函數(shù):在AutoLISP程序中執(zhí)行標淮的AutoCAD命令。

如:(Command″line″pt1pt2″″)

(16)princ函數(shù):打印(或顯示)變量的值。

(princ)在屏幕上顯示一個空格

(princa)在屏幕上顯示變量a的值

(princ″Welcome″)在屏幕上顯示字符串Welcome

(17)prompt函數(shù):(promptmessage)輸出提示信息。10.2.3AutoLISP程序的加載和運行

在運行AutoLISP應用程序之前,必須先將程序代碼加載到內存中。加載程序的方法有以下兩種:

方法一:選取下拉菜單“Tools”中的“LoadApplication”選項。方法二:在AutoCAD的命令行鍵入“appload”命令,然后按空格鍵或回車鍵。加載AutoLISP應用程序對話框,如圖10-3

所示。圖10-3用“Load/UnloadApplications”對話框加載AutoLISP文件10.2.4程序實例

【例10-1】編寫一個AutoLISP程序,其功能是繪制給定直徑的圓周上均勻分布的若干個螺釘孔,如圖10-4所示。程序提示用戶輸入特定圓周的圓心、直徑,螺釘孔的個數(shù)、直徑、起始孔心在分布圓周上的角度。圖10-4均勻分布的孔示意圖程序代碼如下:

(defunc:screw()

(graphscr)

(setvar″cmdecho″0)

(setqcr(getpoint″\nEntercenterofCircle:″))

(setqd(getdist″\nDiaofCircle:″))

(setqn(getint″\nNumberofholesinCircle:″))

(setqa(getangle″\nEnterstartangle:″))

(setqdh(getdist″\nEnterdiameterofhole:″))

(setqinc(/(*2pi)n))

(setqang0)

(setqr(/dh2))

(while(<ang(*2pi))

(setqp1(polarcr(+ainc)(/d2)))

(command″circle″p1r)

(setqa(+ainc))

(setqang(+anginc))

)

(setvar″cmdecho″1)

(princ)

)

【例10-2】編寫一個程序,其功能是繪制兩個滑輪加皮帶,它們的半徑分別為r1和r2,兩圓的中心距為d,連接兩圓圓心的直線與x軸的夾角為ang,如圖10-5所示。圖10-5滑輪加皮帶程序代碼如下:

(defundtr(a)

(*a(/pi180.0))

);Thisfunctionchangesdegreeintoradian

(defunc:belt(/r1r2dac1x1x2c2p1p2p3p4)

(setvar″cmdecho″0)

(graphscr)

(setqr1(getdist″\nEnterradiusofsmallpulley:″))

(setqr2(getdist″\nEnterradiusoflargepulley:″))

(setqd(getdist″\nEnterdistancebetweenpulleys:″))

(setqa(getangle″\nEnterangleofpulleys:″))

(setqc1(getpoint″\nEntercenterofsmallpulley:″))

(setqx1(-r2r1))

(setqx2(sqrt(-(*dd)(*(-r2r1)(-r2r1)))))

(setqang(atan(/x1x2)))

(setqc2(polarc1ad))

(setqp1(polarc1(+anga(dtr90))r1))

(setqp3(polarc1(-(+a(dtr270))ang)r1))

(setqp2(polarc2(+anga(dtr90))r2))

(setqp4(polarc2(-(+a(dtr270))ang)r2))

(command″circle″c1p3)

(command″circle″c2p2)

(command″line″p1p2″″)

(command″line″p3p4″″)

(setvar″cmdecho″1)

(princ)

)

10.3VisualLISP語言

AutoCAD用戶已經使用AutoLISP為各行各業(yè)編寫了無數(shù)的應用程序,但AutoLISP仍然具有某些局限性。例如,當用戶使用一個文本編輯器編寫AutoLISP程序時,想要檢查圓括號是否匹配、AutoLISP函數(shù)或變量的當前值是較為困難的。通常程序員會在程序中增加一些語句,以便在程序的不同運行狀態(tài)中檢查變量的值。當程序最終完成后,再刪除這些附加的語句。

VisualLISP是AutoCAD的新一代LISP語言,它包括了編譯器、調試器和其他開發(fā)工具,是一個完全集成在AutoCAD內部的可視化LISP開發(fā)環(huán)境。它提供了以下功能。

(1)語法檢查器:可識別AutoLISP語法錯誤和調用內置函數(shù)時的參數(shù)錯誤。

(2)文件編譯器:改善了程序的執(zhí)行速度,并提供了安全高效的程序發(fā)布平臺。

(3)專為AutoLISP設計的源代碼調試器:利用它可以在窗口中單步調試AutoLISP源代碼,同時還在AutoCAD圖形窗口顯示代碼運行結果。

(4)文字編輯器:可采用AutoLISP和 DCL語法著色,并提供其他AutoLISP語法支持功能。

(5)AutoLISP格式編排程序:用于調整程序格式,改善其可讀性。

(6)全面的檢驗和監(jiān)視功能:用戶可以方便地訪問變量和表達式的值,以便瀏覽和修改數(shù)據結構這些功能,還可用來瀏覽AutoLISP數(shù)據和AutoCAD圖形的圖元。

(7)上下文相關幫助:提供AutoLISP函數(shù)的信息。強大的自動匹配功能方便了符號名查找等操作。

(8)工程管理系統(tǒng):使得維護多文件應用程序更加容易。(9)打包:可將編譯后的AutoLISP文件打包成單個模塊。

(10)桌面保存和恢復能力:可保存和重用任意VLISP任務的窗口環(huán)境。

(11)智能化控制臺窗口:它給AutoLISP用戶提供了極大的方便,大大提高了用戶的工作效率。

控制臺的基本功能與AutoCAD文本屏幕類似,還提供了許多交互功能,例如歷史記錄功能和完整的行編輯功能等。10.3.1啟動和退出VisualLISP

啟動VisualLISP的方法有兩種:一是在AutoCAD菜單中選擇“Tools→AutoLISP→VisualLISPEditor”命令;二是在命令行輸入“VLISP”命令。

首次啟動VisualLISP后,它將顯示如圖10-6所示的窗口。圖10-6“VisualLISP”窗口用戶可選擇菜單“File→Exit”選項,或者單擊窗口右上角的按鈕退出VisualLISP環(huán)境并返回AutoCAD系統(tǒng)窗口。VisualLISP將保存退出時的狀態(tài),并在下次啟動VisualLISP時自動打開上次退出時打開的文件和窗口。10.3.2編寫VisualLISP程序

編寫VisualLISP程序的步驟如下:

(1)從“File”菜單中選擇“NewFile”選項,彈出“VisualLISPTextEditor(VisualLISP文本編輯器)”窗口,編輯器窗口的頂端顯示缺省文件名為Untitled-0。

(2)點擊“VisualLISPTextEditor”窗口中的任意地方,以激活該編輯器。圖10-7在“VisualLISPTextEditor”窗口中編寫程序代碼

(3)鍵入下列程序,并注意VisualLISP文本編輯器與使用其他文本編輯器(如Notepad)編輯AutoLISP程序的不同。

;;;Thisprogramwilldrawatriangle

(defuntr1()

(setqp1(list2.02.0))

(setqp2(list6.03.0))

(setqp3(list4.07.0))

(command″line″p1p2p3″c″)

(princ)

)

(4)從“File”菜單中選擇“Save”或者“SaveAs”命令。在“SaveAs”對話框輸入文件名Triang1.lsp。在完成保存后,該文件名將顯示在文本編輯器窗口的頂部,如圖10-7所示。10.3.3加載和運行VisualLISP程序

加載和運行VisualLISP程序的步驟如下:

(1)確保VisualLISPTextEditor窗口已被激活,如果還未激活,則可點擊窗口任意一處使其激活。

(2)從“Tools”菜單中選擇“LoadTextinEditor(加載文本到編輯器)”選項。也可以在“Tools”工具條中選擇“Loadactiveeditwindow(加載活動編輯窗口)”選項來加載程序。VisualLISP將在控制臺窗口中顯示一個信息,以提示程序已被加載。如果在加載過程中出現(xiàn)問題,則會顯示錯誤信息。

(3)要運行程序,可在控制臺提示符(“$”符號)下鍵入函數(shù)名(trl),函數(shù)名必須放在圓括號中。該程序將在AutoCAD中畫一個三角形。要查看程序的輸出結果,可以在“View”工具條中選擇“ActivateAutoCAD”按鈕,以切換到AutoCAD。也可以在AutoCAD中運行程序,具體方法是:先切換到AutoCAD窗口中,并在命令提示行中輸入函數(shù)名“tr1”。AutoCAD將運行程序,

并在屏幕上畫出一個三角形,如圖10-8所示。圖10-8在AutoCAD中的程序輸出結果10.3.4程序實例

【例10-3】編寫一個程序,其功能是繪制漸開線。

程序代碼如下:

(setqlastangle_a360lastlenght_d10lastcenter_p(000))

(defunc:jkx(/pp0p1alfarsitalen)

(initget6)

(if(setqr(getreal(strcat″\n基圓半徑<″(rtoslastlenght_d2)″>:″)))

(setqlastlenght_dr)(setqrlastlenght_d))

(initget2)

(if(setqsita(getreal(strcat″\n展開角度<″(rtoslastangle_a2)″>:″)))

(setqlastangle_asita)(setqsitalastangle_a))

(setqsita(/(*sitapi)180))

(initget6)

(princ″\n插入點<″)(princlastcenter_p)(princ″>:″)

(setqlastcenter_p(if(setqq0(getpoint))q0lastcenter_p))(princ″\n″)

(setqOsnap_Mode(getvar″osmode″))(setvar″osmode″0)

(setqp0lastcenter_pp(polarp00r))

(command″circle″p0p)

(setqalfa0pi1(*pi0.5))

(command″pline″p″w″00)

(while(<alfasita)

(setqlen(*ralfa)p(polarp0alfar)p1(polarp(-alfapi1)len)alfa(+alfa(/pi190.0)))

(commandp1)

)

(command″″)

(command″undo″″e″)

(princ)

)程序運行結果如圖10-9所示。圖10-9在AutoCAD中的程序輸出結果10.4VBA語言

10.4.1VBA概述

VBA是VisualBasicforApplicationsprogrammingenvironment的縮寫。MicrosoftVBA是一個面向對象的編程環(huán)境,它和VisualBasic(VB)一樣有很強的開發(fā)能力。VBA和VB兩者之間的區(qū)別在于VBA與AutoCAD運行在同一處理空間,為AutoCAD提供了智能和快速的編程環(huán)境。

VBA也提供集成了其他可以使用VBA的應用程序的應用。也就是說,當AutoCAD使用其他應用程序對象庫時,AutoCAD可以看做一個其他應用程序的自動控制器,比如Microsoft

Word和Excel。

相對其他的AutoCADAPI環(huán)境,AutoCADVBA接口具有以下優(yōu)點:

(1)速度快。因為VBA是作為AutoCAD的一個過程在程序中運行的,ActiveX應用程序比AutoLISP或者ADS應用程序都要快得多。

(2)使用方便。VisualBasic編程環(huán)境易學易用,編程語言和開發(fā)環(huán)境的使用都很方便,而且可以和AutoCAD一起安裝。

(3)Windows交互開發(fā)性好。ActiveX和VBA是為和其他的Windows應用程序一起使用而設計的,并且提供一條很好的通過應用程序交換信息的途徑。對話框結構快速、有效,允許開發(fā)者在設計時啟動應用程序并且能很快得到反饋。

(4)能快速成型。VBA的快速接口開發(fā)為應用程序的成型提供了近乎完美的環(huán)境,即使這些程序最終將會用另外的編程語言來開發(fā)。對象既可以獨立出來,也可以嵌入AutoCAD圖形。這樣,為用戶發(fā)布他們的開發(fā)程序提供更多的靈活性。

(5)便于VB程序員學習掌握。在這個世界上有數(shù)以百萬的VisualBasic(VB)程序員,AutoCAD、ActiveX和VBA

技術對這些程序員及更多的以后將學習VisualBasic的程序員開放了AutoCAD定制和程序開發(fā)。

AutoCAD中內置的VBA,是一個基于VisualBasic6.0版本的面向對象的編程環(huán)境,為AutoCAD提供了智能和快速的編程環(huán)境。

VBA是通過AutoCADActiveXAutomation接口和AutoCAD對象進行聯(lián)系的。每一個AutoCAD對象代表了AutoCAD中的一個明確的功能,如繪制圖形、定義塊和屬性。AutoCAD功能以方法和屬性的方式被封裝在對象中,這些對象可供應用程序通過編程來引用。根據功能的不同,可以把這些對象分成以下幾類:

(1)圖元(Entity)類對象:如直線、圓弧、多段線、文本、標注等。

(2)樣式設置(Style)類對象:如線型、標注樣式等。

(3)組織結構(Organizing)類對象:如圖層、編組、圖塊等。(4)圖形顯示(View)類對象:如視圖、視口等。

(5)文檔與應用程序(Document&Application)類對象:如DWG文件或應用程序本身等。10.4.2VBA的啟動和退出

啟動VBA的方法有兩種:一是在AutoCAD菜單中選擇“Tools→Macor→VisualBasicEditor”命令;二是在命令行輸入“VBAIDE”命令。

啟動VBA后,它將顯示如圖10-10所示的窗口。用戶可選擇“File→CloseandReturntoAutoCAD”選項,或者單擊窗口右上角的按鈕來退出VBAIDE環(huán)境并返回AutoCAD系統(tǒng)窗口。圖10-10VBA的窗口10.4.3VBA工程

進入VBAIDE后,用戶可選擇“View”菜單或按F7鍵,打開代碼窗口,輸入程序代碼。可以在窗體添加控件,以及在屬性窗口中設置相關的屬性。如圖10-10,用戶選擇“File→Save

as”菜單選項,將編寫或修改后的程序以.dvb(工程)類型存儲。一個AutoCADVBA工程是一個由代碼模塊、類模塊和窗體組成的集合,它們一起執(zhí)行指定的函數(shù)。工程可以是嵌入的工程,存入到一個AutoCAD圖形文件中,也可以是全局的工程,作為一個單獨的文件存儲起來。

用戶也可選擇“Tools→Macro-LoadProject”菜單選項,打開如圖10-11所示的“打開VBA工程”對話框,加載已有的VBA

工程。圖10-11“OpenVBAProject”對話框10.4.4程序實例

【例10-4】編寫一個程序,其功能是在模型空間創(chuàng)建一個長方體,然后以某一個三點定義的平面對它進行剖切,并返回3Dsolid。

程序代碼如下:

SubSolid3D()

DimboxObjAsAcad3Dsolid

DimlengthAsDouble

DimwidthAsDouble

DimheightAsDouble

Dimcenter(0To2)AsDouble

Center(0)=5#:center(1)=5#:center(2)=0

Length=5#:width=7:#height=10//在模型空間創(chuàng)建長方體對象3Dsolid

SetboxObj=ThisDrawing.ModelSpace.AddBox(center,length,width,height)

BoxObj.Color=acWhite//三點定義剖面平面DimslicePt1(0To2)AsDouble

DimslicePt2(0To2)AsDouble

DimslicePt3(0To2)AsDouble

slicePt1(0)=1.5:slicePt1(1)=7.5:slicePt1(2)=0

slicePt2(0)=1.5:slicePt2(1)=7.5:slicePt2(2)=10

slicePt3(0)=8.5:slicePt3(1)=2.5:slicePt3(2)=1

//剖切長方體,新實體的顏色定義為紅色

DimsliceObjAsAcad3Dsolid

SetsliceObj=boxObj.SliceSolid(slicePt1,slicePt2,slicePt3,True)

sliceObj.Color=acRed//改變視點

DimNewDirection(0)=-1

DimNewDirection(1)=-1

DimNewDirection(2)=1

ThisDrawing.ActiveViewport.Direction=NewDirection

ThisDrawing.ActiveViewport=ThisDrawing.ActiveViewportEndSub

【例10-5】編寫程序,其功能是利用Select方法構造一個選擇集,并且將所有的實體線型修改為“BYLAYER”。

程序代碼如下:

PrivateSubButton2_Click(ByValsenderAsSystem.Object,

ByValeAs

System.EventArgs)HandlesButton2.ClickDimssetAsObject

DimbFoundAsBoolean

bFound=False

ForEachssetInacadDoc.SelectionSets

Ifsset.Name=″SS1″Then

bFound=True

ExitFor

EndIf

Next

IfbFound=FalseThen

sset=acadDoc.SelectionSets.Add(″SS1″)

sset.SelectOnScreen()

EndIf

DimentAsObject

ForEachentInsset

ent.Linetype=″BYLAYER″

ent.Update()

Next

MsgBox(Format(sset.Count))

EndSub

10.5ObjectARX應用程序

ObjectARX是AutoCAD系統(tǒng)的第三代開發(fā)環(huán)境和工具之一,用戶可以利用ObjectARX環(huán)境的支持,采用面向對象的C++語言開發(fā)ARX應用程序。ObjectARX應用程序是一個動態(tài)鏈接庫(DLL),它共享AutoCAD的地址空間并直接調用AutoCAD的函數(shù)。用戶可以向ObjectARX程序環(huán)境添加新類,并將其輸出以供其他程序使用。在ObjectARX應用程序中,用戶定義的命

令與AutoCAD內部命令的運行方式相同,用戶創(chuàng)建的實體對象與AutoCAD內部實體沒有區(qū)別。用戶還可以向既有的AutoCAD類添加函數(shù)來擴充ObjectARX協(xié)議。10.5.1ObjectARX應用程序的開發(fā)環(huán)境

要使用ObjectARX對AutoCAD進行二次開發(fā),開發(fā)人員需要具備一些基本知識,如:C/C++知識、面向對象編程的概念、MicrosoftVisualC++的使用、AutoCAD的基本知識和使用經驗。用戶最好是曾經用AutoLISP或者ADS開發(fā)過AutoCAD。使用ObjectARX對AutoCAD進行二次開發(fā)的軟件配置要

求有:

MicrosoftWindows95或WindowsNT4.0以上版本;ObjectARXSDKforAutoCAD2008;

MicrosoftVisualC++編譯器。CPU至少為InterPentium90

MHz或更高;內存至少為32MB;

800×600SVGA顯示適配器或更高。

ObjectARX開發(fā)工具包括以下幾個目錄:

(1)ARXLABS:含有9個子目錄,分別從9個方面對ObjectARX程序開發(fā)進行說明和示范。

(2)CLASSMAP:只有一個名為classmap.dwg的圖形文件,它說明了ObjectARX類的層次結構。

(3)DOCS:含有ObjectARX的聯(lián)機幫助文件。

(4)DOCSAMPS:含有32個子目錄,分別保存著ObjectARXDeveloper’sGuide中所用到的例程。

(5)INC:含有ObjectARX的頭文件。

(6)LIB:含有ObjectARX的庫文件。

(7)REDISTRIB:含有ObjectARX應用程序可能用到的DLL文件。

(8)SAMPLES:含有22個子目錄,分別保存著一個完整的、具有代表性的ObjectARX例程。

(9)UTILS:包含有ObjectARX擴展應用程序使用的文件。

ObjectARX開發(fā)環(huán)境包含以下幾組類和函數(shù):

(1)AcRx類庫:用于綁定應用程序及運行時類的注冊和標識的類。

(2)AcEd類庫:注冊本地AutoCAD命令和AutoCAD事件通知的類。

(3)AcDb類庫:AutoCAD數(shù)據庫類。

(4)AcGi類庫:顯示AutoCAD實體的圖形類。

(5)AcGe類庫:公用線性代數(shù)學和幾何學對象應用類。

(6)AcBr類庫:邊界表述類。10.5.2ObjectARX對數(shù)據庫對象的操作

AutoCAD數(shù)據庫是按一定結構組織的各有關數(shù)據的集合。AutoCAD中的圖形是AdDb對象的集合,存儲在數(shù)據庫中。圖10-12展示了AutoCAD數(shù)據庫的關鍵組件。圖10-12AutoCAD數(shù)據庫的關鍵組件可以通過句柄、對象ID或C++指針引用數(shù)據庫對象。當AutoCAD不運行時,圖形存儲在文件系統(tǒng)中。DWG文件中包含的對象是通過它們的句柄被識別的。在圖形被打開之后,通過AcDbDatabase來使用圖形的信息。數(shù)據庫中的每個對象有一個對象ID,這個ID在當前編輯進程中一直存在,從它所在的數(shù)據庫產生到數(shù)據庫被刪除。

Open()函數(shù)將對象ID作為一個參數(shù)并返回指向一個AcDbDatabase的指針。這個指針在對象被關閉前都是合法的。用于打開一個對象的函數(shù)是acdbOpenObject():

Acad::ErrorStatus

AcDbDatabase::acdbOpenObject(AcDbObject*&obj,AcDbObjectIdid,

AcDb::OpenModemode,Adesk::Boolean

OpenEraseObject=Adesk::kFalse)可以用下面的函數(shù)將一個對象ID映射到一個句柄上:

Acad::ErrorStatus

getAcDbObjectId(AcDbObjectId&retId,Adesk::BooleancreateIfNotFound,

constAcDbHandle&objHandle,Adesk::Uint32xRefId=0);也可以打開一個對象,然后查詢它的句柄:

AcDbObject*pObject;

AcDbHandlehandle;

PObject->getAcDbHandle(handle);10.5.3ObjectARX對實體的操作

實體是AutoCAD內部的基本圖形對象,是一個由圖形表示的數(shù)據庫對象,一個點(Point)或一個圓(Circle)都是一個實體。在AutoCAD環(huán)境中,使用一個長整型數(shù)來表示實體,這也是實體的名稱。實體名是“暫時性的”,它們只有在當前圖形編輯中有效。當關閉當前圖形并打開另一幅圖形時,實體名失效。為了對一個實體進行操作,ObjectARX應用程序必須獲得它的名稱,以便調用數(shù)據處理函數(shù)進行后續(xù)操作。ObjectARX提供了一系列用于處理實體名稱的函數(shù),例如acdbEntNext()

函數(shù)是按實體進入圖形數(shù)據庫中的順序得到實體的名稱。如果該函數(shù)的第一個參數(shù)是Null,則返回當前圖形數(shù)據庫中的第一個實體名稱;如果第一個參數(shù)是一個實體的名稱,則返回接在這個實體下面的實體的名稱。下面是使用acdbEntNext()函數(shù)一次一個遍歷整個圖形數(shù)據庫的例子。

Ads_nameent0,ent1;

//定義兩個用于存放實體名稱的變量

Structresbuf*entdata;

//定義結果緩沖區(qū)鏈表指針

if(acadEntNext(NULL,ent0)!=RENORM)

{//獲取圖形數(shù)據庫中第一個實體,存入ent0

AcdbFail(″Drawingisempty\n″);

}

do{

entdata=acdbEntGet(ent0);//獲得實體ent0的定義數(shù)據,存入鏈表entdata

if(entdata=NULL){

avdbFail(″Failedtogetentity\n″);

}…//根據需要對實體ent0進行操作(這里省略)

if(acadUsrBrk()==TRUE){//檢測用戶是否按下Esc鍵

(acdbFail(″Userbreak\n″));

returnBAD;

}

acutRelRb(entdata);//釋放鏈表

ads_name_set(ent0,ent1);//將變量ent0中的內容賦給變量ent1

}while(acdbEntNext(ent1,ent0)==RTNORM);//獲得ent1的下一個實體,存入ent010.5.4建立ObjectARX應用程序的基本步驟

(1)創(chuàng)建自定義類來實現(xiàn)新的命令.用戶可以從ObjectARX類層次關系中的大多數(shù)類和符號表類中派生自己的類。

(2)決定ObjectARX程序應該響應的AutoCAD消息。AutoCAD通過向ObjectARX程序發(fā)出一系列的消息指明在它內部發(fā)生的特殊事件,ObjectARX程序必須對其中的某些消息作出反映,并觸發(fā)相應的操作。

(3)實現(xiàn)應用程序與AutoCAD通信的入口。AutoCAD通過函數(shù)acrxEntryPoint()來調用ObjectARX程序,而不是像普通的C++程序那樣使用main()函數(shù)。函數(shù)acrxEntryPoint()中可以用switch語句處理AutoCAD的各種返回信息,根據不同信息執(zhí)行不同的函數(shù),并返回狀態(tài)碼。如果針對特定的消息返回出錯代碼,則必須用case語句來處理。必須用AcRx::kRetOk作為函數(shù)acrxEntryPoint()的最終返回值。

(4)完成ObjectARX程序的初始化。用戶必須在acrxEntryPoint()函數(shù)的AcRx::kInitAppMsg事件中或者該事件調用的函數(shù)(例如:initApp()函數(shù))中,對程序中自定義的所有類進行初始化,然后調用acedRegCmds->addCommand()函數(shù)在AutoCAD命令堆棧中注冊新命令。

(5)實現(xiàn)卸載(Unload)功能。用戶必須在acrxEntryPoint()函數(shù)的AcRx::kUnloadAppMsg事件中或者該事件調用的函數(shù)(例如:unloadApp()函數(shù))中,調用acedRegCmds->removeGroup()函數(shù)將initApp()函數(shù)中注冊的新命令組從AutoCAD命令堆棧中清除,調用deleteAcRxClass()函數(shù)清除程序中自定義的任何類,刪除所有由應用程序添加到AutoCAD中的對象,并清除所有與AcDbObject、AcDbDatabase、AcRxDynamicLinker或AcEditor對象相關聯(lián)的事件反應器。注意:缺省情況下,ObjectARX程序處于被鎖定狀態(tài)而不能被卸載,如果要使ObjectARX程序可以被卸載,則需保存由AcRx::kInitAppMsg傳送的appId參數(shù),由unlockApplication()

函數(shù)調用,見acrxEntryPoint()函數(shù)注釋。10.5.5AutoCAD與ObjectARX程序之間的消息傳遞

1.發(fā)送消息分類

(1)發(fā)送給所有ObjectARX程序的消息,如kInitAppMsg、kUnloadAppMsg、kLoadDwgMsg、kPreQuitMsg。

(2)只發(fā)送給通過調用acedDefun()函數(shù)注冊AutoLISP函數(shù)的ObjectARX程序的消息,如kUnloadDwgMsg、kInvkSubrMsg、kEndMsg、kQuitMsg、kSaveMsgkCfgMsg。

(3)只發(fā)送給注冊service對象的ObjectARX程序的消息,如kDependencyMsg、kNoDependencyMsg。

(4)只發(fā)送給使用ActiveX控件對象的ARX程序的消息,如kOleUnloadAppMsg。

2.普通ObjectARX程序僅需的響應消息

1)消息kInitAppMsg

對于此消息,ObjectARX程序應該注冊服務對象、類、AcEd命令和事件反應器,以及AcRxDynamicLinker類事件反應器,初始化應用程序的系統(tǒng)資源(如設備、窗口),并執(zhí)行簡單的初始化操作;AcRx、AcEd和AcGe類庫都應該被激活;如果需要對應用程序進行解鎖或重新加鎖操作,則還應該保存pkt參數(shù)。

2)消息kUnloadAppMsg

當ObjectARX程序被卸載時(由用戶卸載或者AutoCAD程序終止時),AutoCAD發(fā)送此消息,關閉當前文件并執(zhí)行清除操作。對于此消息,ObjectARX程序應該清除所有系統(tǒng)資源,所有對kInitAppMsg消息所做

溫馨提示

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

最新文檔

評論

0/150

提交評論