■ 何守望
基于.NET的AutoCAD Civil 3D二次開(kāi)發(fā)技術(shù)及應(yīng)用
■ 何守望
以.NET API為工具,介紹在AutoCAD Civil 3D進(jìn)行二次開(kāi)發(fā)的技術(shù)與實(shí)現(xiàn)過(guò)程,并以鐵路隧道洞口位置選擇軟件實(shí)例說(shuō)明.NET API開(kāi)發(fā)技術(shù)的實(shí)際應(yīng)用,進(jìn)一步驗(yàn)證利用.NET API可以擴(kuò)展AutoCAD Civil 3D專業(yè)功能,使其達(dá)到一個(gè)新的專業(yè)深度。
.NET API;AutoCAD Civil 3D;初始化與優(yōu)化;鐵路隧道;二次開(kāi)發(fā)
AutoCAD Civil 3D軟件是美國(guó)Autodesk公司推出的面向土木工程行業(yè)的建筑信息模型(BIM)解決方案,適用于勘察測(cè)繪、土地規(guī)劃、交通運(yùn)輸工程、市政基礎(chǔ)設(shè)置、水利水電、地質(zhì)礦產(chǎn)等多個(gè)不同的行業(yè)領(lǐng)域。它基于AutoCAD構(gòu)建,包含了AutoCAD全部的功能,并且包含了GIS桌面端產(chǎn)品Map 3D的全部功能,此外還具有用于項(xiàng)目協(xié)作的Vault的功能,它能夠在工程設(shè)計(jì)對(duì)象之間建立智能化關(guān)系,從而使設(shè)計(jì)變更實(shí)現(xiàn)動(dòng)態(tài)更新。它的功能非常強(qiáng)大,可以分析與調(diào)整測(cè)量數(shù)據(jù),創(chuàng)建精確三維地形,設(shè)計(jì)各種路線及縱斷面,生成道路模型并計(jì)算土方量等,能夠幫助項(xiàng)目團(tuán)隊(duì)更加高效地設(shè)計(jì)、分析和可視化項(xiàng)目。它具有開(kāi)放的體系結(jié)構(gòu),允許用戶根據(jù)自己的專業(yè)特點(diǎn),進(jìn)行定制開(kāi)發(fā),擴(kuò)展和延伸專業(yè)功能,從而滿足專業(yè)設(shè)計(jì)需求。
AutoCAD Civil 3D提供COM API 和.NET API以及CustomDraw API,利用這些可以創(chuàng)建、存取和操作絕大多數(shù)Civil 3D對(duì)象,包括點(diǎn)、曲面、地塊、路線、縱斷面、橫斷面、道路、管道、測(cè)量等。COM API主要以ActiveX 接口的方式提供,從托管代碼或者非托管代碼訪問(wèn)COM API,可以采用任何支持COM的開(kāi)發(fā)語(yǔ)言和開(kāi)發(fā)環(huán)境,如VB(VBA)、C++、.NET(C# 、VB.NET)等。.NET API創(chuàng)建基于Civil 3D的NET應(yīng)用程序,可以使用.NET框架所支持的任何語(yǔ)言來(lái)編寫(xiě),如VB.NET、C# 和Managed C++等。CustomDraw API是對(duì)ObjectARX的擴(kuò)展,能定制Civil 3D渲染對(duì)象的方式,提高圖形的繪制顯示,該接口僅對(duì)C++開(kāi)發(fā)語(yǔ)言提供支持。
.NET是微軟面向XML Web服務(wù)的平臺(tái),是一個(gè)可以作為平臺(tái)支持下一代Internet的可編程結(jié)構(gòu),允許應(yīng)用程序通過(guò)Internet進(jìn)行通訊和共享數(shù)據(jù)。使用.NET開(kāi)發(fā)的應(yīng)用程序具有統(tǒng)一的面向?qū)ο箝_(kāi)發(fā)平臺(tái)、內(nèi)存自動(dòng)管理、一致的異常處理、支持多種開(kāi)發(fā)語(yǔ)言等好處。AutoCAD Civil 3D的.NET API提供了一系列操縱或者訪問(wèn)Civil 3D對(duì)象的類、結(jié)構(gòu)、方法及事件,使開(kāi)發(fā)人員在.NET框架下,使用任何支持.NET的語(yǔ)言對(duì)Civil 3D進(jìn)行二次開(kāi)發(fā)。其優(yōu)點(diǎn)是完全面向?qū)ο螅藫碛?NET開(kāi)發(fā)應(yīng)用程序的好處的同時(shí),還具有方便易用的特點(diǎn),一般而言,.NET API的性能要比COM API快得多。另外,它包含的Map 3D與土木工程對(duì)象相關(guān)的最新的API只提供.NET API,所以是較理想的Civil 3D二次開(kāi)發(fā)工具,也是今后的發(fā)展方向。利用.NET API可以實(shí)現(xiàn):(1)與AutoCAD Civil 3D進(jìn)行交互操作,監(jiān)控/編輯AutoCAD Civil 3D標(biāo)準(zhǔn)的行為;(2)訪問(wèn)內(nèi)部圖形數(shù)據(jù)庫(kù);(3)定制命令或者用戶UI;(4)開(kāi)發(fā)面向工程實(shí)際的專業(yè)的模塊或解決方案;(5)使工作流程自動(dòng)化,簡(jiǎn)化應(yīng)用操作,提高工作效率。
2.1 構(gòu)建開(kāi)發(fā)環(huán)境
利用.N E T A P I進(jìn)行定制開(kāi)發(fā),雖然不像利用ObjectARX對(duì)AutoCAD進(jìn)行二次開(kāi)發(fā)時(shí)需要嚴(yán)格遵守編譯環(huán)境與SDK版本的對(duì)應(yīng)關(guān)系,但是依然還存在運(yùn)行沒(méi)有問(wèn)題,但不能用來(lái)調(diào)試加載等版本問(wèn)題,所以需要考慮開(kāi)發(fā)環(huán)境。開(kāi)發(fā)環(huán)境包括目標(biāo)平臺(tái)、開(kāi)發(fā)包以及開(kāi)發(fā)工具,一般來(lái)說(shuō),開(kāi)發(fā)AutoCAD Civil 3D 2012/2013/2014 .NET API項(xiàng)目,需要使用Visual Studio 2010與Microsoft .NET Framework 4.0;開(kāi)發(fā)AutoCAD Civil 3D 2010/2011 .NET API項(xiàng)目,需要使用Visual Studio 2008與Microsoft .NET Framework 3.5;開(kāi)發(fā)AutoCAD Civil 3D 2007/2008/2009 .NET API項(xiàng)目,需要使用Visual Studio 2005與Microsoft .NET Framework 2.0或2.0以上。從一個(gè)版本遷移到另一個(gè)版本,幾乎不用修改代碼,只需要加載不同版本的.NET API庫(kù)文件和選擇不同的.NET框架重新編譯程序即可。
2.2 .NET API的初始化與優(yōu)化
通常,AutoCAD Civil 3D在載入程序模塊時(shí),需要執(zhí)行一些代碼,在卸載程序或AutoCAD Civil 3D終止時(shí),需要做一些清理工作。.NET API通過(guò)IExtensionApplication接口實(shí)現(xiàn)對(duì)程序的初始化和清理工作,該接口包含Initialize與Terminate兩個(gè)函數(shù),其中Initialize實(shí)現(xiàn)加載程序時(shí)的初始化操作,Terminate實(shí)現(xiàn)卸載程序時(shí)的清理操作。在Initialize中,一般要設(shè)置系統(tǒng)變量和可能調(diào)用命令來(lái)執(zhí)行一些預(yù)先存在的程序的初始化代碼。AutoCAD Civil 3D終止時(shí).NET程序才會(huì)被卸載,這意味著在Terminate被調(diào)用時(shí),AutoCAD Civil 3D已經(jīng)在關(guān)閉進(jìn)程了,所以Terminate可用來(lái)實(shí)現(xiàn)關(guān)閉任何打開(kāi)的文件、數(shù)據(jù)庫(kù)連接等清理工作。
對(duì)于大型的程序,需要考慮優(yōu)化工作,使得程序更快地被載入到AutoCAD Civil 3D中。通常的做法是在類的聲明語(yǔ)句之前加入以下語(yǔ)句:
[assembly: ExtensionApplication(typeof(InitClass))]
[assembly: CommandClass(typeof(CmdClass))]
這樣在AutoCAD Civil 3D載入程序時(shí),將與ExtensionApplication屬性相關(guān)的類型做為程序的入口點(diǎn),并在Initialize中進(jìn)行初始化。否則,AutoCAD Civil 3D將搜索程序中所有輸出類型的IExtensionApplication實(shí)現(xiàn),以此進(jìn)行初始化,如果找不到則不進(jìn)行初始化。同樣,通過(guò)CommandClass屬性,AutoCAD Civil 3D也會(huì)直接到類中搜索要注冊(cè)的命令。當(dāng)程序中包含的類數(shù)目較多時(shí),通過(guò)ExtensionApplication和CommandClass這兩個(gè)屬性可顯著地加快程序的加載速度。
2.3 程序的調(diào)試、加載和運(yùn)行
在程序的開(kāi)發(fā)過(guò)程中,需要進(jìn)行大量的調(diào)試工作,.NET API程序的調(diào)試可以跟普通的C#程序一樣通過(guò)設(shè)置斷點(diǎn)跟蹤。.NET API程序的跟蹤調(diào)試首先需要設(shè)置調(diào)試版本的編譯環(huán)境,選擇AutoCAD Civil 3D程序的位置,編譯完成后,設(shè)置斷點(diǎn),點(diǎn)擊F5進(jìn)行跟蹤調(diào)試,調(diào)試開(kāi)始時(shí)會(huì)自動(dòng)打開(kāi)AutoCAD Civil 3D進(jìn)程,加載運(yùn)行.NET API應(yīng)用程序后,到達(dá)斷點(diǎn)的位置,進(jìn)入調(diào)試界面,可以查詢程序中變量的當(dāng)前值,點(diǎn)擊F5可以繼續(xù)調(diào)試。程序運(yùn)行完成后,退出AutoCAD Civil 3D,結(jié)束調(diào)試。
.NET API應(yīng)用程序編譯完成后,就可以在AutoCAD Civil 3D上加載運(yùn)行,加載方式主要有使用NETLOAD命令的手動(dòng)方式和基于注冊(cè)表的自動(dòng)載入方式,其中自動(dòng)載入機(jī)制基于注冊(cè)表中描述條件的信息,說(shuō)明在何種條件下哪些模塊會(huì)被載入以及如何載入,基本上信息被存儲(chǔ)在HKEY_LOCAL_MACHINE下或HKEY_ CURRENT_USER下,主要是在AutoCAD Civil 3D相應(yīng)版本下的Application項(xiàng)下創(chuàng)建一個(gè)新項(xiàng),并在里面設(shè)四個(gè)鍵值: “DESCRIPTION”(應(yīng)用程序描述)、“LOADCTRLS”(應(yīng)用程序隨AutoCAD Civil 3D加載的方式)、“LOADER”(應(yīng)用程序路徑)、“MANAGED”(應(yīng)用程序形式)。定義一個(gè)后綴名為.reg的文件,文件內(nèi)容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREAutodesk AutoCADR16.0ACAD-B000:804Applications SDPortal3D(注:這個(gè)名稱可以自己定義)]
“DESCRIPTION”=“Tunnel Portal”
“LOADCTRLS”=dword:00000002(注:此處表示隨AutoCAD Civil 3D啟動(dòng)時(shí)一起啟動(dòng))
“LOADER”=“D:\SDPortal3D\Debug\ SDPortal3D.dll”(注:此處為應(yīng)用程序SDPortal3D.dll所在路徑)
“MANAGED”=dword:00000001(注:此處表示為托管程序)
完成以后,雙擊此文件,將注冊(cè)信息導(dǎo)入注冊(cè)表,即可實(shí)現(xiàn)啟動(dòng)AutoCAD Civil 3D時(shí)應(yīng)用程序自動(dòng)加載。
執(zhí)行.NET API應(yīng)用程序僅需在AutoCAD Civil 3D命令行中輸入程序中所注冊(cè)的命令即可。
2.4 利用CustomDraw API提高圖形的繪制
為了提高圖形的顯示,需要借助CustomDraw API,該接口僅對(duì)C++開(kāi)發(fā)語(yǔ)言提供支持,它通過(guò)使用在模塊程序加載時(shí)注冊(cè)生效的回調(diào)函數(shù)實(shí)現(xiàn),傳入回調(diào)函數(shù)的是要繪制對(duì)象和匿名塊的COM接口指針,可實(shí)現(xiàn)曲面、路線、縱斷面、道路、地塊、管道等的定制繪制。在工程設(shè)置中需要添加對(duì)其頭文件和庫(kù)文件路徑的支持,它們?cè)贏utoCAD Civil 3D安裝目錄下Sample文件夾下可以找到。
2.5 應(yīng)用事例
根據(jù)前面敘述的方法,在AutoCAD Civil 3D平臺(tái)上利用.NET API進(jìn)行鐵路隧道洞口位置選擇軟件的開(kāi)發(fā)(下文討論基于AutoCAD Civil 3D 2013,Visual Studio 2010,Microsoft .NET Framework 4.0, C#進(jìn)行)。
(1)新建項(xiàng)目。啟動(dòng)Visual Studio 2010,選擇“文件/新建/項(xiàng)目”菜單項(xiàng),在項(xiàng)目類型中選擇Visual C#語(yǔ)言,然后在模板列表中選擇“類庫(kù)”項(xiàng)目,最后輸入項(xiàng)目名稱及項(xiàng)目存儲(chǔ)位置,單擊“OK”按鈕,完成新建項(xiàng)目。
(2)添加引用。添加對(duì)acdbmgd.dll、acmgd.dll、accoremgd.dll 、AecBaseMgd.dll、AeccDbMgd.dll程序集的引用。在“解決方案資源管理器”標(biāo)簽項(xiàng)中,用鼠標(biāo)右鍵單擊項(xiàng)目名稱下面的“引用”節(jié)點(diǎn),然后選擇“添加引用”菜單項(xiàng),在“添加引用”對(duì)話框中選擇“瀏覽”選項(xiàng)卡,然后選擇AutoCAD Civil 3D安裝目錄下的上述五個(gè)DLL庫(kù)文件,并把引用的DLL庫(kù)文件的“復(fù)制本地”屬性設(shè)置為False。
(3)項(xiàng)目屬性設(shè)置。在“解決方案資源管理器”標(biāo)簽項(xiàng)中,用鼠標(biāo)右鍵點(diǎn)擊項(xiàng)目名稱,選擇“屬性”菜單項(xiàng),在項(xiàng)目屬性頁(yè)對(duì)話框中,將“應(yīng)用程序”選項(xiàng)卡中的“目標(biāo)框架”設(shè)置為.NET Framework 4,將“調(diào)試”選項(xiàng)卡中的“啟動(dòng)外部程序”設(shè)置為AutoCAD Civil 3D 2013主程序acad.exe的路徑。
(4)加入命名空間和添加命令。根據(jù)實(shí)現(xiàn)功能要求,加入需要的命名空間(可以使用“對(duì)象瀏覽器”瀏覽加入的程序集所提供的類獲?。?,使用CommandMethod屬性,注冊(cè)CreateCurveCC命令。聲明命令:
[CommandMethod(“CreateCurveCC”)]
public void CreateCurveCC () {}
(5)程序編譯與加載運(yùn)行。程序編寫(xiě)完成之后,按快捷鍵F7或者選擇“生成/生成解決方案”菜單項(xiàng)進(jìn)行編譯,編譯成功后,在工程目錄的binDebug文件夾下生成SDPortal3D.dll文件。
打開(kāi)AutoCAD Civil 3D,在命令行中輸入NETLOAD命令,在“選擇.NET程序集”對(duì)話框中選擇編譯好的SDPortal3D.dll文件,執(zhí)行CreateCurveCC命令,出現(xiàn)軟件“從原始地形圖生成三維曲面”模塊主界面,點(diǎn)擊“生成曲面”按鈕,生成曲面模型,截屏見(jiàn)圖1。
圖1 曲面模式截屏
隨著B(niǎo)IM技術(shù)在勘察設(shè)計(jì)行業(yè)應(yīng)用中的不斷深化,基于BIM平臺(tái)進(jìn)行二次開(kāi)發(fā)以此擴(kuò)展專業(yè)功能勢(shì)在必行。以C#作為開(kāi)發(fā)語(yǔ)言,對(duì)基于.NET API的AutoCAD Civil 3D二次開(kāi)發(fā)作了較詳細(xì)的介紹,并應(yīng)用于實(shí)際的鐵路隧道洞口位置選擇軟件的開(kāi)發(fā)中,所開(kāi)發(fā)的軟件具有模塊性好、使用方便、內(nèi)部功能高效等特點(diǎn),取得很好的效果,進(jìn)而驗(yàn)證了利用.NET API可以在AutoCAD Civil 3D平臺(tái)上開(kāi)發(fā)出實(shí)用、高效、簡(jiǎn)潔的應(yīng)用程序。
[1] 秦洪現(xiàn),崔惠嵐,孫劍,等. Autodesk系列產(chǎn)品開(kāi)發(fā)培訓(xùn)教程[M]. 北京:化工工業(yè)出版社,2008.
[2] 曾洪飛,盧擇臨,張帆. AutoCAD VBA&VB.NET 開(kāi)發(fā)基礎(chǔ)與實(shí)例教程[M]. 北京:電力出版社,2013.
[3] 王田煜,徐剛. 基于ObjectARX的AutoCAD二次開(kāi)發(fā)技術(shù)[J]. 河北能源職業(yè)技術(shù)學(xué)院學(xué)報(bào),2003(2).
何守望:中鐵第一勘察設(shè)計(jì)院集團(tuán)有限公司,工程師,陜西 西安,710043
責(zé)任編輯楊倩
U231+.4;TP319
A
1001-683X(2014)05-0042-03