基于.NET的AutoCAD Civil 3D二次开发技术及应用
2014-01-18何守望
■ 何守望
基于.NET的AutoCAD Civil 3D二次开发技术及应用
■ 何守望
以.NET API为工具,介绍在AutoCAD Civil 3D进行二次开发的技术与实现过程,并以铁路隧道洞口位置选择软件实例说明.NET API开发技术的实际应用,进一步验证利用.NET API可以扩展AutoCAD Civil 3D专业功能,使其达到一个新的专业深度。
.NET API;AutoCAD Civil 3D;初始化与优化;铁路隧道;二次开发
0 引言
AutoCAD Civil 3D软件是美国Autodesk公司推出的面向土木工程行业的建筑信息模型(BIM)解决方案,适用于勘察测绘、土地规划、交通运输工程、市政基础设置、水利水电、地质矿产等多个不同的行业领域。它基于AutoCAD构建,包含了AutoCAD全部的功能,并且包含了GIS桌面端产品Map 3D的全部功能,此外还具有用于项目协作的Vault的功能,它能够在工程设计对象之间建立智能化关系,从而使设计变更实现动态更新。它的功能非常强大,可以分析与调整测量数据,创建精确三维地形,设计各种路线及纵断面,生成道路模型并计算土方量等,能够帮助项目团队更加高效地设计、分析和可视化项目。它具有开放的体系结构,允许用户根据自己的专业特点,进行定制开发,扩展和延伸专业功能,从而满足专业设计需求。
AutoCAD Civil 3D提供COM API 和.NET API以及CustomDraw API,利用这些可以创建、存取和操作绝大多数Civil 3D对象,包括点、曲面、地块、路线、纵断面、横断面、道路、管道、测量等。COM API主要以ActiveX 接口的方式提供,从托管代码或者非托管代码访问COM API,可以采用任何支持COM的开发语言和开发环境,如VB(VBA)、C++、.NET(C# 、VB.NET)等。.NET API创建基于Civil 3D的NET应用程序,可以使用.NET框架所支持的任何语言来编写,如VB.NET、C# 和Managed C++等。CustomDraw API是对ObjectARX的扩展,能定制Civil 3D渲染对象的方式,提高图形的绘制显示,该接口仅对C++开发语言提供支持。
1 .NET API概述
.NET是微软面向XML Web服务的平台,是一个可以作为平台支持下一代Internet的可编程结构,允许应用程序通过Internet进行通讯和共享数据。使用.NET开发的应用程序具有统一的面向对象开发平台、内存自动管理、一致的异常处理、支持多种开发语言等好处。AutoCAD Civil 3D的.NET API提供了一系列操纵或者访问Civil 3D对象的类、结构、方法及事件,使开发人员在.NET框架下,使用任何支持.NET的语言对Civil 3D进行二次开发。其优点是完全面向对象,除了拥有.NET开发应用程序的好处的同时,还具有方便易用的特点,一般而言,.NET API的性能要比COM API快得多。另外,它包含的Map 3D与土木工程对象相关的最新的API只提供.NET API,所以是较理想的Civil 3D二次开发工具,也是今后的发展方向。利用.NET API可以实现:(1)与AutoCAD Civil 3D进行交互操作,监控/编辑AutoCAD Civil 3D标准的行为;(2)访问内部图形数据库;(3)定制命令或者用户UI;(4)开发面向工程实际的专业的模块或解决方案;(5)使工作流程自动化,简化应用操作,提高工作效率。
2 利用.NET API进行AutoCAD Civil 3D的二次开发
2.1 构建开发环境
利用.N E T A P I进行定制开发,虽然不像利用ObjectARX对AutoCAD进行二次开发时需要严格遵守编译环境与SDK版本的对应关系,但是依然还存在运行没有问题,但不能用来调试加载等版本问题,所以需要考虑开发环境。开发环境包括目标平台、开发包以及开发工具,一般来说,开发AutoCAD Civil 3D 2012/2013/2014 .NET API项目,需要使用Visual Studio 2010与Microsoft .NET Framework 4.0;开发AutoCAD Civil 3D 2010/2011 .NET API项目,需要使用Visual Studio 2008与Microsoft .NET Framework 3.5;开发AutoCAD Civil 3D 2007/2008/2009 .NET API项目,需要使用Visual Studio 2005与Microsoft .NET Framework 2.0或2.0以上。从一个版本迁移到另一个版本,几乎不用修改代码,只需要加载不同版本的.NET API库文件和选择不同的.NET框架重新编译程序即可。
2.2 .NET API的初始化与优化
通常,AutoCAD Civil 3D在载入程序模块时,需要执行一些代码,在卸载程序或AutoCAD Civil 3D终止时,需要做一些清理工作。.NET API通过IExtensionApplication接口实现对程序的初始化和清理工作,该接口包含Initialize与Terminate两个函数,其中Initialize实现加载程序时的初始化操作,Terminate实现卸载程序时的清理操作。在Initialize中,一般要设置系统变量和可能调用命令来执行一些预先存在的程序的初始化代码。AutoCAD Civil 3D终止时.NET程序才会被卸载,这意味着在Terminate被调用时,AutoCAD Civil 3D已经在关闭进程了,所以Terminate可用来实现关闭任何打开的文件、数据库连接等清理工作。
对于大型的程序,需要考虑优化工作,使得程序更快地被载入到AutoCAD Civil 3D中。通常的做法是在类的声明语句之前加入以下语句:
[assembly: ExtensionApplication(typeof(InitClass))]
[assembly: CommandClass(typeof(CmdClass))]
这样在AutoCAD Civil 3D载入程序时,将与ExtensionApplication属性相关的类型做为程序的入口点,并在Initialize中进行初始化。否则,AutoCAD Civil 3D将搜索程序中所有输出类型的IExtensionApplication实现,以此进行初始化,如果找不到则不进行初始化。同样,通过CommandClass属性,AutoCAD Civil 3D也会直接到类中搜索要注册的命令。当程序中包含的类数目较多时,通过ExtensionApplication和CommandClass这两个属性可显著地加快程序的加载速度。
2.3 程序的调试、加载和运行
在程序的开发过程中,需要进行大量的调试工作,.NET API程序的调试可以跟普通的C#程序一样通过设置断点跟踪。.NET API程序的跟踪调试首先需要设置调试版本的编译环境,选择AutoCAD Civil 3D程序的位置,编译完成后,设置断点,点击F5进行跟踪调试,调试开始时会自动打开AutoCAD Civil 3D进程,加载运行.NET API应用程序后,到达断点的位置,进入调试界面,可以查询程序中变量的当前值,点击F5可以继续调试。程序运行完成后,退出AutoCAD Civil 3D,结束调试。
.NET API应用程序编译完成后,就可以在AutoCAD Civil 3D上加载运行,加载方式主要有使用NETLOAD命令的手动方式和基于注册表的自动载入方式,其中自动载入机制基于注册表中描述条件的信息,说明在何种条件下哪些模块会被载入以及如何载入,基本上信息被存储在HKEY_LOCAL_MACHINE下或HKEY_ CURRENT_USER下,主要是在AutoCAD Civil 3D相应版本下的Application项下创建一个新项,并在里面设四个键值: “DESCRIPTION”(应用程序描述)、“LOADCTRLS”(应用程序随AutoCAD Civil 3D加载的方式)、“LOADER”(应用程序路径)、“MANAGED”(应用程序形式)。定义一个后缀名为.reg的文件,文件内容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREAutodesk AutoCADR16.0ACAD-B000:804Applications SDPortal3D(注:这个名称可以自己定义)]
“DESCRIPTION”=“Tunnel Portal”
“LOADCTRLS”=dword:00000002(注:此处表示随AutoCAD Civil 3D启动时一起启动)
“LOADER”=“D:\SDPortal3D\Debug\ SDPortal3D.dll”(注:此处为应用程序SDPortal3D.dll所在路径)
“MANAGED”=dword:00000001(注:此处表示为托管程序)
完成以后,双击此文件,将注册信息导入注册表,即可实现启动AutoCAD Civil 3D时应用程序自动加载。
执行.NET API应用程序仅需在AutoCAD Civil 3D命令行中输入程序中所注册的命令即可。
2.4 利用CustomDraw API提高图形的绘制
为了提高图形的显示,需要借助CustomDraw API,该接口仅对C++开发语言提供支持,它通过使用在模块程序加载时注册生效的回调函数实现,传入回调函数的是要绘制对象和匿名块的COM接口指针,可实现曲面、路线、纵断面、道路、地块、管道等的定制绘制。在工程设置中需要添加对其头文件和库文件路径的支持,它们在AutoCAD Civil 3D安装目录下Sample文件夹下可以找到。
2.5 应用事例
根据前面叙述的方法,在AutoCAD Civil 3D平台上利用.NET API进行铁路隧道洞口位置选择软件的开发(下文讨论基于AutoCAD Civil 3D 2013,Visual Studio 2010,Microsoft .NET Framework 4.0, C#进行)。
(1)新建项目。启动Visual Studio 2010,选择“文件/新建/项目”菜单项,在项目类型中选择Visual C#语言,然后在模板列表中选择“类库”项目,最后输入项目名称及项目存储位置,单击“OK”按钮,完成新建项目。
(2)添加引用。添加对acdbmgd.dll、acmgd.dll、accoremgd.dll 、AecBaseMgd.dll、AeccDbMgd.dll程序集的引用。在“解决方案资源管理器”标签项中,用鼠标右键单击项目名称下面的“引用”节点,然后选择“添加引用”菜单项,在“添加引用”对话框中选择“浏览”选项卡,然后选择AutoCAD Civil 3D安装目录下的上述五个DLL库文件,并把引用的DLL库文件的“复制本地”属性设置为False。
(3)项目属性设置。在“解决方案资源管理器”标签项中,用鼠标右键点击项目名称,选择“属性”菜单项,在项目属性页对话框中,将“应用程序”选项卡中的“目标框架”设置为.NET Framework 4,将“调试”选项卡中的“启动外部程序”设置为AutoCAD Civil 3D 2013主程序acad.exe的路径。
(4)加入命名空间和添加命令。根据实现功能要求,加入需要的命名空间(可以使用“对象浏览器”浏览加入的程序集所提供的类获取),使用CommandMethod属性,注册CreateCurveCC命令。声明命令:
[CommandMethod(“CreateCurveCC”)]
public void CreateCurveCC () {}
(5)程序编译与加载运行。程序编写完成之后,按快捷键F7或者选择“生成/生成解决方案”菜单项进行编译,编译成功后,在工程目录的binDebug文件夹下生成SDPortal3D.dll文件。
打开AutoCAD Civil 3D,在命令行中输入NETLOAD命令,在“选择.NET程序集”对话框中选择编译好的SDPortal3D.dll文件,执行CreateCurveCC命令,出现软件“从原始地形图生成三维曲面”模块主界面,点击“生成曲面”按钮,生成曲面模型,截屏见图1。
图1 曲面模式截屏
3 结束语
随着BIM技术在勘察设计行业应用中的不断深化,基于BIM平台进行二次开发以此扩展专业功能势在必行。以C#作为开发语言,对基于.NET API的AutoCAD Civil 3D二次开发作了较详细的介绍,并应用于实际的铁路隧道洞口位置选择软件的开发中,所开发的软件具有模块性好、使用方便、内部功能高效等特点,取得很好的效果,进而验证了利用.NET API可以在AutoCAD Civil 3D平台上开发出实用、高效、简洁的应用程序。
[1] 秦洪现,崔惠岚,孙剑,等. Autodesk系列产品开发培训教程[M]. 北京:化工工业出版社,2008.
[2] 曾洪飞,卢择临,张帆. AutoCAD VBA&VB.NET 开发基础与实例教程[M]. 北京:电力出版社,2013.
[3] 王田煜,徐刚. 基于ObjectARX的AutoCAD二次开发技术[J]. 河北能源职业技术学院学报,2003(2).
何守望:中铁第一勘察设计院集团有限公司,工程师,陕西 西安,710043
责任编辑杨倩
U231+.4;TP319
A
1001-683X(2014)05-0042-03