今天在cnblog上发现了这个blog,内容不错,但作者已经不更新了,为了方便阅读,把所有文章转载过来,同时向原作者致敬。
原文地址 Civil3D Development
Civil3D作为Autodesk在土木行业的旗舰软件,其二次开发的资料一直以来都非常的少,不管是英文还是中文。一直想写些文章,系统的介绍一下Civil3D的二次开发,或许对于Civil3D在中国的普及能有所帮助。一直因为种种的原因不能实现。今年,定下了这个小小的目标,希望能够坚持下去完整的写完。
先列一下大概会写的内容
-
什么是Civil3D
-
Civil3D跟AutoCAD是什么关系
- Civil3D二次开发能做些什么
-
Civil3D有哪些API
- 开发需要的工具
(1) Visual Studio
(2) Reflector
(3) Visual Assist
(4) ReSharper
(5) Git
(6) BitBucket
(7) ObjectArx
(8) ArxDBG
-
Civil3D API概况
-
Surface
-
Point
-
Alignment
-
Profile/ProfileView
-
SampleLine
-
Section/SectionView
-
Subassembly/Assembly
-
Corridor
Civil3D跟AutoCAD是什么关系
Civil3D是基于AutoCAD平台开发的土木工程设计软件。AutoCAD作为一个平台,提供了画图和显示的功能,并且提供了大量的API供二次开发使用,是一个非常好的基础平台。AutoCAD没有行业Feature的概念,Civil3D基于AutoCAD提供了土木工程的各种设计工具。Civil3D的界面基本继承了AutoCAD的界面。
Civil3D的实现主要是基于AutoCAD的API – ObjectArx,同时采用了Autodesk的另一个基于ObjectArx的开发框架OMF。AutoCAD,ObjectArx,OMF和Civil3D关系类似于Window平台开发的各种组件。
AutoCAD的API通过ObjectArx对外提供,OMF是对ObjectArx的封装,简化了ObjectArx的使用。Civil3D同时使用这两套API。
因为Civil3D是基于AutoCAD开发的,实际上,Civil3D包含了完整的AutoCAD,因此AutoCAD的所有功能都可以在Civil3D中使用。Civil3D = AutoCAD + Civil3D功能模块。
Civil3D二次开发能做些什么
Civil3D 提供的API主要在AeccDbMgd.dll和AeccPressurePipesMgd.dll中。主要是提供了操作DB的API,不提供任何UI的API。也就是说,通过Civil3D二次开发,我可以修改Civil3D drawing中的数据,例如创建一个Surface,修改一个Alignment,删除一个CogoPoint,获取一个Profile的几何信息,但是不提API来跟AutoCAD交互。因为Civil3D是基于AutoCAD的,因此所有的交互操作都需要通过AutoCAD API来实现。
学习Civil3D二次开发,一定要首先掌握AutoCAD二次开发的基本知识。
编程语言的选择
Civil3D只提供了.NET API,不提供C++ API (AutoCAD同时有.NET API和C++ API,.NET API封装了C++ API),因此支持.NET的语言都可以使用。常见的语言如C#,VB.NET,C++/CLI,F#。语言选择的首要选择是找自己熟悉的,比如本来就会VB.NET的,那么就选择VB.NET。
C++/CLI功能强大,同时兼顾了C++和.NET的功能,但是用起来麻烦,没什么特别的理由,不要去选这个。
F#是微软推的函数式语言,同样功能强大,但是估计没几个人会,大多数情况也不要去选这个。
在没有任何语言倾向,没有什么基础的情况下从头开始学,那么推荐C#。对于专业开发人员来说,只有C/C++/C#这套才是正统,其他像VB什么的都是乱七八糟的东西。。。
Civil3D有哪些API
Civil3D主要有两种API:COM和.NET
COM API已经处于维护阶段,不再进行新Feature的开发以及Bug的修复。Civil3D二次推荐使用的是.NET API,后文中使用的都是.NET API。
.NET基本上覆盖了大部分的Civil3D的feature,但是还是会有部分功能的缺失,碰到这种情况怎么办呢?
第一步,用Reflector仔细查找所有暴露的属性和方向,看看有没有理解错误的情况。同时,可以在相关的feature里去查找一下,例如需要找某个Profile的属性,有可能会在Alignment里面找到。
第二步,.NET API没有暴露,看看COM API有没有。如果有,混合着使用也是一种推荐的方法。
第三步,看看通过AutoCAD的方法能不能实现。例如我需要拿到Database中某一类Civil3D的entity,如果Civil3D的API没有暴露简单的方法,那么可以自己用AutoCAD API实现。方法也很简单,遍历Database的BlockTableRecord,打开每个对象并查看它的类型(GetType()),找出所有需要的类型的对象。另外也可以通过字符串来查找,例如DxfName,Civil3D TinSurface的DxfName是AECC_TIN_SURFACE。
第四步,尝试通过发命令的形式看看能不能做到,Document类里面有函数SendStringToExecute可以使用。例如你希望把某个Entity导出每个文件,但是没有这种API确有命令可以这样做,那么就通过发命令好了。
第五步,其他方法。我看到过的一个巧妙方法是,有个人需要拿到ViewFrame的四个角的坐标值,但是Civil3D的.NET和COM API都没有暴露,那么他就尝试着把ViewFrame炸开(Explode,AutoCAD有这个API),把炸开后得到的线段的端点拿出来,就是ViewFrame的坐标值。
还有其他办法吗?可以联系欧特克,让他们加。
开发工具 - Visual Studio
Visual Studio是Windows平台上最好用的IDE,这个应该没有人有异议吧。
对于Civil3D 2018二次开发,我们需要Visual Studio 2017及之后的版本。
对于个人开发者,可以使用Visual Studio 2017 Community Version,针对个人开发者是免费的。这个其实就是Visual Studio Profession,功能完整。
下载地址是https://www.visualstudio.com/vs/community/
开发工具 - ObjectArx
虽然Civil3D .NET API是基于AutoCAD .NET API开发的,但是做Civil3D二次开发的时候,我们并不直接需要用到ObjectArx。Civil3D Plugin project需要reference 的DLL是
o AcDbMgd.dll
o AcCoreMgd.dll
o AcMgd.ll
o AecBaseMgd.dll
o AeccDbMgd.dll
其中,Ac开头的DLL是AutoCAD的API,Aec开头的是ACA的API,Aecc开头的是Civil3D的API。这些DLL,我们在Civil3D的安装目录下面都能找到,直接拷到project里就能使用了,并不需要从ObjectArx里找。
那么为什么Civil3D二次开发还是需要ObjectArx呢?
最重要的是需要ObjectArx的文档。因为Civil3D API只提供了数据层的API,而一个plugin不可能没有用户交互,这些都是通过AutoCAD API来完成的。AutoCAD的API相对来说比较复杂,因此我们经常需要仔细查找和阅读ObjectArx的文档。
另一个作用是里面有一些Sample project也是非常值得学习了。
还有一个作用就是里面提供的一个小工具ArxDBG,这个后文会仔细介绍。
另外,虽然Civil3D二次开发是基于.NET API开发的,但是有时候可能会需要定义自定义实体(Custom Entity),那么这个就完全是基于ObjectArx C++ API来实现了,这就一定需要ObjectArx了。高级一点的二次开发,可以先用C++定义自定义实体,然后用C++/CLI封装自己的.NET API,再用C#来进行各种操作,这就需要开发人员熟悉各种语言。
开发工具 - Reflector
Civil3D二次开发主要有两份参考文档,只有英文版没有中文版
Developer’s Guide主要是像教程一样的介绍了Civil3D API的情况并且对于一些典型API给出了示例。对于初学者来说,这份文档需要仔细完整的阅读完,对于自己可能会用到的Feature例如PipeNetwork,更是需要仔细的把所有示例程序阅读完并且理解里面的所有语句。
Developer Reference Help基本上是一份Civil3D API的参考手册,在基本入门了Civil3D 二次开发之后开始实际编程的时候,经常需要去查看这份文档,了解API的功能,返回值,Exception等信息。
在我们比较了解了Civil3D二次开发的时候,我们用的更多的可能是Reflection工具来查找我们所需要的API。
大概有这么几个工具可以选择
Ø Visual Studio 自带的Object Browser
这个只能看当前Project reference的DLL,感觉不是很方便,我不怎么喜欢用。
Ø .NET Reflector
这个我用下来感觉最好用,6.0之前的版本还是免费的,现在已经收费了。收费了我就没用过新的版本,也没去研究过他加了什么新的功能。但是6.0版对于我来说已经足够了,方便好用。同时他还能Decompile出一些代码的实现来,通过看这些代码也能对API的实现有些了解。
推荐使用这个版本作为日常查找API的工具。
最新版的下载地址是:
http://www.red-gate.com/products/dotnet-development/reflector/
Ø JustDecompile
这也是一个免费工具,界面简洁清晰,不好的地方是他的查找需要在一个单独跳出的对话框中操作,而查找对我来说是用的最多的功能,因此用起来感觉比较繁琐麻烦。给他们反馈过这个问题,一直没有解决。
软件的下载地址是:
https://www.telerik.com/download-trial-file/v2/justdecompile
Ø JetBrains dotPeek
dotPeek也是免费软件。JetBrains是非常知名的IDE厂商,它推出的产品在非Windows平台都有极高的声望。
软件的下载地址是
https://www.jetbrains.com/decompiler/?fromMenu
结论:用.NET Reflector 6.0来查找API。