摘要:對(duì)在A(yíng)utoCAD2000中實(shí)現(xiàn)焊接符號(hào)快速標(biāo)注的原理和方法進(jìn)行了研究,提出了以人機(jī)交互方式實(shí)現(xiàn)焊接符號(hào)標(biāo)注的系統(tǒng)運(yùn)行模式,設(shè)計(jì)了具有良好人機(jī)學(xué)特性的系統(tǒng)界面,極大地提高了焊接符號(hào)標(biāo)注的效率。以VisualC 6.0和ObjectARX3.0為開(kāi)發(fā)工具,運(yùn)用自定義實(shí)體類(lèi)技術(shù),通過(guò)對(duì)一系列ObjectARX類(lèi)函數(shù)的重載,開(kāi)發(fā)了基于A(yíng)utoCAD2000的焊接符號(hào)快速標(biāo)注系統(tǒng)。詳細(xì)討論了從AcDbEntity類(lèi)派生自定義焊接符號(hào)類(lèi)所涉及的相關(guān)應(yīng)用技術(shù)。
關(guān)鍵詞:焊接符號(hào);ObjectARX;AcDbEntity類(lèi);AcEdJig類(lèi);AcDbObject類(lèi)
AutoCAD是目前微機(jī)系統(tǒng)中廣泛使用的CAD繪圖軟件,利用它可以大大提高繪圖的效率和自動(dòng)化程度。但AutoCAD本身是一個(gè)通用的CAD支撐軟件,隨著CAD應(yīng)用的不斷深入,應(yīng)用范圍的不斷拓寬,越來(lái)越多的用戶(hù)需要借助二次開(kāi)發(fā)來(lái)使該系統(tǒng)更好地適應(yīng)本地使用需求。很多行業(yè)有自己的專(zhuān)用符號(hào)體系,各自的標(biāo)注規(guī)則,這時(shí)AutoCAD自帶的標(biāo)注系統(tǒng)很難滿(mǎn)足用戶(hù)的需求。好在A(yíng)utoCAD提供了很強(qiáng)的二次開(kāi)發(fā)手段,借助這些開(kāi)發(fā)手段,可以把這種使用率很高的繪圖過(guò)程用簡(jiǎn)單的命令加以實(shí)現(xiàn)。
ObjectARX(AutoCADRuntimeeXtension)工具是Autodesk公司推出的一種新的AutoCAD二次開(kāi)發(fā)工具,采用并支持面向?qū)ο蠹夹g(shù),是新一代AutoCAD二次開(kāi)發(fā)的首選工具[1]。利用它的類(lèi)庫(kù),可解決許多AutoLisp、ADS、VBA難以解決或不能解決的問(wèn)題[2],提高開(kāi)發(fā)效率。ARX應(yīng)用程序利用AutoCAD核心數(shù)據(jù)庫(kù)結(jié)構(gòu)、圖形系統(tǒng)、幾何造型核心及代碼,建立和AutoCAD本身固有命令有同樣操作方式的新命令。利用ObjectARX開(kāi)發(fā)工具進(jìn)行CAD應(yīng)用系統(tǒng)開(kāi)發(fā)已有一些成功的案例,如用ObjectARX開(kāi)發(fā)滑動(dòng)軸承結(jié)構(gòu)CAD設(shè)計(jì)系統(tǒng)。[3]
本文對(duì)在A(yíng)utoCAD中實(shí)現(xiàn)機(jī)械設(shè)計(jì)中常用的焊接符號(hào)的標(biāo)注進(jìn)行了深入研究。本系統(tǒng)以Auto CAD2000為平臺(tái),以VisualC 6.0和ObjectARX3.0為二次開(kāi)發(fā)工具[4],成功地實(shí)現(xiàn)了常用焊接符號(hào)的標(biāo)注。本系統(tǒng)以選擇坡口的形式來(lái)決定焊接符號(hào),符合設(shè)計(jì)人員的設(shè)計(jì)習(xí)慣,把用戶(hù)從繁雜的焊接符號(hào)選擇和組合中解放出來(lái)。本標(biāo)注系統(tǒng)生成的焊接符號(hào)是從AcDbEntity類(lèi)派生的自定義類(lèi)的對(duì)象,因此它具有AutoCAD實(shí)體的各種屬性和操作方式。焊接符號(hào)生成后用戶(hù)可以很方便地修改它的層、字體,對(duì)它進(jìn)行平移、縮放、拉伸等操作,極大地滿(mǎn)足了后期對(duì)設(shè)計(jì)圖進(jìn)行編輯和修改的需要。
1 系統(tǒng)開(kāi)發(fā)、運(yùn)行環(huán)境
本系統(tǒng)是在VisualC 6.0和ObjectARX3.0編程環(huán)境下開(kāi)發(fā)的,可在A(yíng)utoCAD2000下動(dòng)態(tài)加載運(yùn)行,操作系統(tǒng)為Windows98或Windows2000。
2 系統(tǒng)結(jié)構(gòu)及實(shí)現(xiàn)
本系統(tǒng)主要由三大部分組成,包括實(shí)現(xiàn)焊接符號(hào)的選擇及焊接參數(shù)輸入的對(duì)話(huà)框類(lèi)、實(shí)現(xiàn)焊接標(biāo)注的自定義實(shí)體類(lèi)、實(shí)現(xiàn)以拖動(dòng)方式創(chuàng)建焊接標(biāo)注的自定義類(lèi)。
2.1 實(shí)現(xiàn)焊接符號(hào)的選擇及焊接參數(shù)輸入的對(duì)話(huà)框類(lèi)
這是系統(tǒng)的用戶(hù)界面。通過(guò)此用戶(hù)界面,用戶(hù)可進(jìn)行焊接符號(hào)的選擇和焊接參數(shù)的輸入,如圖1所示。用戶(hù)通過(guò)選擇焊接類(lèi)型、焊縫類(lèi)型、焊接的坡口形式,并輸入所選坡口參數(shù)進(jìn)行焊接符號(hào)的標(biāo)注,操作過(guò)程直觀(guān)、簡(jiǎn)便[5,6]。
圖1 用戶(hù)界面 2.2 實(shí)現(xiàn)焊接標(biāo)注的自定義實(shí)體類(lèi)
實(shí)現(xiàn)焊接標(biāo)注的自定義實(shí)體類(lèi)是由AcDbEntity類(lèi)派生而來(lái)的,因此在程序中必須重載AcDbEntity類(lèi)及其父類(lèi)AcDbObject的虛函數(shù)。實(shí)現(xiàn)焊接標(biāo)注的自定義實(shí)體類(lèi)是本系統(tǒng)開(kāi)發(fā)的關(guān)鍵部分。
2.2.1 重載函數(shù)worldDraw()
AutoCAD調(diào)用函數(shù)worldDraw()在屏幕上顯示實(shí)體,因此從基類(lèi)AcDbEntity中派生自定義類(lèi)時(shí)必須重載函數(shù)worldDraw()。其函數(shù)原型為:
virtualAdesk::BooleanworldDraw(AcGiWorldDraw mode)。
函數(shù)worldDraw()用于繪制圖形中與指定的模型空間或圖紙空間視口內(nèi)容無(wú)關(guān)的部分。World Draw()接受一個(gè)指向類(lèi)AcGiWorldDraw對(duì)象的參數(shù)。對(duì)于A(yíng)cGi類(lèi)庫(kù)中的幾何對(duì)象和特征對(duì)象,類(lèi)AcGi WorldDraw是一個(gè)容器類(lèi)。它包括兩個(gè)對(duì)象:AcGi WorldGeometry對(duì)象和AcGiSubEntityTraits對(duì)象。在函數(shù)worldDraw()中,可以通過(guò)調(diào)用函數(shù)AcGiWorld Draw::geometry()來(lái)訪(fǎng)問(wèn)AcGiWorldGeometry對(duì)象,通過(guò)調(diào)用函數(shù)AcGiWorldDraw::subEntityTraits()來(lái)訪(fǎng)問(wèn)AcGiSubEntityTraits對(duì)象。
2.2.2 重載函數(shù)getGripPoints()和moveGripPointsAt()
為了實(shí)現(xiàn)自定義實(shí)體的夾點(diǎn)功能,本系統(tǒng)重載了這兩個(gè)函數(shù)。當(dāng)用戶(hù)使用定點(diǎn)設(shè)備選擇實(shí)體時(shí),AutoCAD調(diào)用函數(shù)getGripPoints()返回實(shí)體類(lèi)定義的夾點(diǎn),并顯示該實(shí)體的夾點(diǎn)。此時(shí)AutoCAD就可以通過(guò)調(diào)用函數(shù)moveGripPointsAt()實(shí)現(xiàn)夾點(diǎn)編輯的移動(dòng)操作。這兩個(gè)函數(shù)的原型為:
virtualAcad::ErrorStatusgetGripPoints(AcGe Point3dArraygripPoints,AcDbIntArray&osnapModes,AcDbIntArray&geomIds)const;
virtualAcad::ErrorStatusmoveGripPointsAt(constAcDbIntArrayindices,constAcGeVector3doffset)。
2.2.3 重載函數(shù)getStretchPoints()和moveStretch PointsAt()
實(shí)體的拉伸點(diǎn)集合通常是該實(shí)體的夾點(diǎn)集合的一個(gè)子集,當(dāng)用戶(hù)執(zhí)行命令STRETCH時(shí),AutoCAD調(diào)用函數(shù)getStretchPoints()返回被選擇實(shí)體中定義的所有拉伸點(diǎn)。對(duì)于大多數(shù)實(shí)體來(lái)說(shuō),夾點(diǎn)編輯模式和拉伸點(diǎn)編輯模式是一致的。在本系統(tǒng)中函數(shù)getStretchPoints()和moveStretchPointsAt()只是調(diào)用了重載過(guò)后的getGripPoints()和moveGripPointsAt()函數(shù)。getStretchPoints()和moveStretchPointsAt()函數(shù)的原型為:
virtualAcad::ErrorStatusgetStretchPoints(AcGe Point3dArray)const;
virtualAcad::ErrorStatusmoveStretchPointsAt(constAcDbIntArrayindices,constAcGeVector3d&offset)。
2.2.4 重載函數(shù)transformBy()和getTransformedCopy()
類(lèi)AcDbEntity提供了兩個(gè)轉(zhuǎn)換函數(shù):一個(gè)是函數(shù)transformBy(),它對(duì)實(shí)體進(jìn)行指定的矩陣變換操作;另一個(gè)是函數(shù)getTransformedCopy(),它首先復(fù)制自身,然后再對(duì)復(fù)制實(shí)體進(jìn)行指定的矩陣變換,并返回變換后的復(fù)制實(shí)體。當(dāng)用戶(hù)使用編輯中的移動(dòng)、旋轉(zhuǎn)、比例縮放和鏡像模式時(shí),AutoCAD就調(diào)用這兩個(gè)函數(shù)之一來(lái)實(shí)現(xiàn)相應(yīng)的操作。這兩個(gè)函數(shù)的原型為:
virtualAcad::ErrorStatustransformBy(constAcGe Matrix3dxform);
virtualAcad::ErrorStatusgetTransformedCopy(constAcGeMatrix3dxform,AcDbEntity &ent)const。
2.2.5 重載函數(shù)explode()
本系統(tǒng)中為了使AutoCAD的EXPLODE和BHATCH命令能正常運(yùn)行,在應(yīng)用程序的自定義類(lèi)中重載了函數(shù)explode(),重載后的explode()函數(shù)將自定義實(shí)體分解為簡(jiǎn)單的本地實(shí)體。如果分解后的實(shí)體不是本地實(shí)體,BHATCH命令會(huì)再次調(diào)用函數(shù)explode()進(jìn)行分解,直至它們被分解為本地實(shí)體為止。BHATCH命令能直接操作的本地實(shí)體有:AcDb2dPolyline、AcDb3dPolyline、AcDbPolyline、AcDb Text、AcDbMText、AcDbShape、AcDbTrace、AcDbSolid、AcDbFace、AcDbViewport、AcDbFcf、AcDbDimension、AcDbRegion、AcDbBlockReference、AcDbHatch等。此函數(shù)的原型為:virtualAcad::ErrorStatusexplode(AcDbVoidPtrArrayentitySet)const。
2.2.6 重載文件操作函數(shù)
當(dāng)從類(lèi)AcDbEntity派生自定義類(lèi)時(shí),需要重載AcDbEntity類(lèi)的父類(lèi)AcDbObject的4個(gè)用于從DWG和DXF文件中讀寫(xiě)數(shù)據(jù)的函數(shù)。函數(shù)原型為:
virtualAcad::ErrorStatusdwgInFields(AcDbDwg Filer filer);
virtualAcad::ErrorStatusdwgOutFields(AcDbDwg Filer filer)const;
virtualAcad::ErrorStatusdxfInfields(AcDbDxfFiler filer);
virtualAcad::ErrorStatusdxfOutFields(AcDbDxf Filer filer)const。
以上每個(gè)函數(shù)的主要參數(shù)都是一個(gè)文件操作類(lèi)(AcDbDwgFiler或AcDbDxfFiler)的指針,使用這個(gè)參數(shù),可以完成對(duì)DWG或DXF文件數(shù)據(jù)的讀寫(xiě)操作。自定義類(lèi)中重載了這4個(gè)函數(shù)后,就可以持久的保存對(duì)象,實(shí)現(xiàn)復(fù)制和撤銷(xiāo)操作。
派生AcDbEntity自定義類(lèi)時(shí)需要注意2個(gè)問(wèn)題:
1)定義了自定義類(lèi)的應(yīng)用程序在運(yùn)行初始化時(shí)必須調(diào)用函數(shù)rxInit(),它由任意一個(gè)ACRXxxxDEFINEMEMBERS()宏自動(dòng)定義,并完成下面的任務(wù):注冊(cè)自定義類(lèi);創(chuàng)建類(lèi)的描述符對(duì)象;將類(lèi)描述符對(duì)象添加到類(lèi)詞典中。然后調(diào)用函數(shù)acrxBuild ClassHierarchy()把該類(lèi)添加到ACRX運(yùn)行類(lèi)層次中,最后在應(yīng)用程序的卸載函數(shù)中通過(guò)調(diào)用函數(shù)deleteAcRxClass()將該類(lèi)從ACRX運(yùn)行類(lèi)層次中刪除。
2)當(dāng)自定義類(lèi)中定義一個(gè)新的成員函數(shù)或重載基類(lèi)的虛函數(shù)時(shí),首先應(yīng)該調(diào)用函數(shù)assertReadEn abled()或assertWriteEnabled()或assertNotifyEnabled來(lái)校驗(yàn)對(duì)象是否處于正確的打開(kāi)狀態(tài)。
2.3 實(shí)現(xiàn)以拖動(dòng)方式創(chuàng)建焊接標(biāo)注的自定義類(lèi)
為了在創(chuàng)建焊接標(biāo)注的過(guò)程中實(shí)現(xiàn)拖動(dòng)的效果,本系統(tǒng)從基類(lèi)AcEdJig派生了一個(gè)自定義類(lèi)用來(lái)實(shí)現(xiàn)此功能。類(lèi)AcEdJig用于完成拖動(dòng)效果,通常用于查詢(xún)、創(chuàng)建、編輯和添加一個(gè)新的實(shí)體到數(shù)據(jù)庫(kù)中。從基類(lèi)AcEdJig派生新類(lèi)必須重載成員函數(shù):AcEdJig::sampler()、AcEdJig::update()和AcEd Jig::entity()。這3個(gè)函數(shù)分別用于獲得一個(gè)幾何值,如角度、距離、輸入點(diǎn)等;分析并保存獲得的幾何值或者更新實(shí)體;返回重構(gòu)后的實(shí)體指針[7]。
本系統(tǒng)在自定義類(lèi)中定義了一個(gè)重要的成員函數(shù)doIt(),它用來(lái)實(shí)現(xiàn)拖動(dòng)循環(huán)過(guò)程。函數(shù)doIt()首先調(diào)用函數(shù)setDispPrompt()來(lái)顯示提示字符串,然后調(diào)用drag()函數(shù)來(lái)控制拖動(dòng)循環(huán)。在拖動(dòng)循環(huán)過(guò)程中,函數(shù)drag()依次調(diào)用sampler()、update()和en tity()函數(shù),直至循環(huán)結(jié)束。
拖動(dòng)循環(huán)過(guò)程如圖2所示。圖中的代表用戶(hù)從AcEdJig基類(lèi)派生的自定義類(lèi)。
圖2 程序流程圖 由本系統(tǒng)生成的焊接標(biāo)注實(shí)例如圖3所示。
圖3 標(biāo)注實(shí)例 3 結(jié)束語(yǔ)
對(duì)基于A(yíng)utoCAD平臺(tái)的應(yīng)用程序開(kāi)發(fā)進(jìn)行了有益的嘗試,采用ObjectARX與VisualC 結(jié)合編程的方法可方便地在A(yíng)utoCAD2000中實(shí)現(xiàn)焊接符號(hào)的自動(dòng)標(biāo)注。利用ObjectARX提供的類(lèi)和函數(shù)可深入到AutoCAD系統(tǒng)內(nèi)核;利用VisualC 進(jìn)行Win dows風(fēng)格的編程,可以大大提高開(kāi)發(fā)效率,能更迅速、更準(zhǔn)確地實(shí)現(xiàn)二次開(kāi)發(fā)目的。利用本文提出的開(kāi)發(fā)原理和實(shí)現(xiàn)方法開(kāi)發(fā)的焊接符號(hào)標(biāo)注系統(tǒng)在運(yùn)行效率、對(duì)象管理、用戶(hù)界面和智能化程度等方面都有了突破性的進(jìn)步,為基于A(yíng)utoCAD平臺(tái)的應(yīng)用程序開(kāi)發(fā)提供了一種可行方案。