EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

萧闫子 发表于 2014-1-8 15:20:41

[资料] 我们能用AutoCAD .NET API做什么



AutoCAD 2005在.NET诞生4、5年之后终于仓促推出了.NET API,虽然功能很少,但当我们能用纯.NET语言(C#等)在ACAD真的绘制出一条Line,而不是只能简单的打出一个“Hello World!”时,我们开始有了期待。
MS兴冲冲的抱着Visual Studio .NET 2002向全球程序员而来时,我们正使用Visual Studio 98中的VC6兴致勃勃的和R14、R2000/2鏖战。一个自认为好的ObjectARX程序员,不只是对当时的ARX的近200个.H文件熟悉就行的,还为能在Windows平台上使用VC6做出花里胡哨的界面而自矜。R14的开发工具自动桌子公司官方要求使用VC4.2a,由于VC4.2到VC5、VC6,MFC的动态库都叫MFC42.dll,所以开发R14-R2002都能使用VC6,只要发布时把VC6的MFC库发布就行,开发用的VC6使用sp几,发布的MFC库就用sp几(这和之后版本的AutoCAD开发,对应MFC库的发布原理是一样的,如果哪位发布出去之后发现用户机器上程序不能加载,就从此琢磨一下)。
MS的广告效果很好,面对VS2002带来了一个叫C#(C Sharp)的语言,我一猛子扎下去,发现真是扎猛了,对于C++程序员来讲,C#上手比想象中容易得多。同时.NET比MS一直爱不释手的VB提倡的RAD还RAD,并且发现编写小型网站也变得容易。于是我用.NET 1.0开始开发着商品软件(与ACAD无关)之后,一边琢磨能不能把.NET应用到ACAD的二次开发中去。一切都是摸索,我做了一个VC++(7.0)和VC++.NET混编的一个Bridge,使ACAD的二次开发软件与.NET开发的软件之间交换数据,使ARX程序使用.NET 做的界面。那一年透着兴奋,ACAD软件界面花哨了,但与VC6的数据交互却是复杂了。最头疼却是.NET 1.0的安装,因为针对不同的操作系统.NET 1.0需要安装不同的补丁。为了解决这个问题,我做了个安装光盘,包含Win98、Win98SE、Win2000和Win XP的不同的补丁,当用户插入光盘后能根据操作系统不同自动安装补丁再安装.NET 1.0。一堆同事面色凝重的看演示的同事把光盘放入光驱,然后在睡梦中听到安装完的欢呼后醒来,此时45分钟已过去。感谢同事们的支持,软件努力推向市场,而我只关心安装是否成功,答案没有辜负我的努力。
ACAD2005推出.NET API的时候,我早已不再为安装.NET烦心,更不会为某些人还在担心的.NET运行速度慢而烦恼,因为在解决完自动安装.NET 1.0后,我已让我的.NET程序快起来。可惜ACAD2005的.NET API功能非常有限,许多功能其实是通过COM实现,这没有意义。隔了一年ACAD2006发布,2006的.NET API功能要多不少,不过和2005同样具有的一个毛病就是BUG。(本文老何原创,转载请注明,QQ: 501733682)
我们在耍VC6开发ObjectARX的时候,我们很开心,因为我们可以近似认为ARX是没有BUG的,因为ACAD就是使用ObjectARX在以MFC为Windows程序框架上开发出来的,在每一版ACAD发布之前会进行相当复杂和完备的测试,这样我们在使用ARX开发包的时候,已接近无BUG状态。可.NET API不是这样,因为自动桌子公司的开发人员没有用来做ACAD中组件、命令的开发,所以我们拿到手是一个非久经考验的开发包。我在ACAD2006的时候开始试着把一些程序开始使用.NET API,当然痛苦就开始了,不可预知的结果时有发生,好在.NET程序可以反编,adbmgd.dll和acmgd.dll就在此过程中了然。有的BUG能绕过,有的不能绕过的就自己用VC7写,然后通过VC++.NET供.NET调用。如果有的朋友发现使用低版本的.NET API结果和想象不一样,那就多个心眼:这狗东西有BUG吧?!(本文老何原创,转载请注明,QQ: 501733682)
可喜的是到ACAD2008,.NET API相对稳定和完备,BUG也变得稀少,实在个别功能没有可以通过VC8++和C++/CLI混合编程来解决。目前最新的版本是ACAD2012,使用.NET API如果不做自定义对象,那是几乎什么都能做了。其实如果不做自定义对象的话,并且可以在ACAD2006以上版本开发,我个人觉得还是应该使用.NET API这个高效的工具,C#的逐渐增加的var、lambda、linq、dynamic难道不眼前一亮?!另外还有个原因就是要看到自动桌子公司在.NET API上的努力,比如之前要用System.Collections.SortedList或者System.Collections.Generic.SortedList<ObjectId,xxxx>,是不对的,因为ObjectId没有提供比较,而从ACAD2010开始就可以直接使用了,因为ObjectId从IComparable<ObjectId>派生了。
其实从ACAD2010开始,自定义对象的部分功能可以通过overrule来实现。自定义对象是什么呢,其实就是自己做个从AcDbEntity(有图面显示,也是从AcDbObject派生)/AcDbObject(无图面显示)的派生类,然后注册到ACAD(先调用派生类的rxInit()静态函数再调用acrxBuildClassHierarchy(),这个注册在高版本ACAD都不用自己写代码,ARX Wizrad会做),这样ACAD就认识了,就和ACAD自己提供的AcDbLine(直线)等一视同仁。在此派生类中你可保存数据,可以实现夹点、捕捉、绘制等等。而到ACAD2010开始,你可以只保存数据,夹点、捕捉、绘制等等可以通过overrule交给.NET API去做。(本文老何原创,转载请注明,QQ:501733682)自定义对象编辑和查看,首要的肯定是使用OMP,但VC++实现OPM非常的繁琐,代码臃肿,没有难度,只有烦度。(使用OMP.net解决此问题,见本网站:http://www.objectarx.net/forum.p ... &extra=page%3D1)
.NET API又是怎么工作的呢?我们都知道ACAD的功能其实是通过ObjectARX来实现的,所以.NET API其实就通过VC++和C++/CLI(原来的VC++.NET)混合编程把ARX功能包装一下以.NET类的形式展示出来。也就是说使用.NET API其实使用的是ARX,而.NET API能实现多少功能就取决于包装的程度,也就是包装了多少ARX的功能。了解ARX的朋友都知道,使用ARX库,由于C++语言的特点,我们经常需要派生ARX类。但使用.NET就不必了,我们经常只需对对应的event来个delegate就行了,相比而言简洁得一塌糊涂(比如:Autodesk.AutoCAD.ApplicationServices.Application.BeginQuit等event)。根据前边对自定义对象的描述,现在就清楚了,.NET API除了部分自定义对象功能外,基本能代替ARX。
想想,原来写ACAD二次开发程序,最早用LISP时函数不多,到了ACAD 11.0有了可以使用C/C++使用的ADS函数,也就60来个,不过几乎是LISP函数的翻板,只是可以用C/C++了而已。想想当年以TC++ 3.0为IDE,Watcom C++9 为编译器,恍如隔世。转自 ObjectARX编程站

页: [1]
查看完整版本: [资料] 我们能用AutoCAD .NET API做什么