今天在cnblog上发现了这个blog,内容不错,但作者已经不更新了,为了方便阅读,把所有文章转载过来,同时向原作者致敬。

原文地址 Civil3D Development

Civil3D作为Autodesk在土木行业的旗舰软件,其二次开发的资料一直以来都非常的少,不管是英文还是中文。一直想写些文章,系统的介绍一下Civil3D的二次开发,或许对于Civil3D在中国的普及能有所帮助。一直因为种种的原因不能实现。今年,定下了这个小小的目标,希望能够坚持下去完整的写完。

先列一下大概会写的内容

  1. 什么是Civil3D

  2. Civil3D跟AutoCAD是什么关系

  3. Civil3D二次开发能做些什么
  4. Civil3D有哪些API

  5. 开发需要的工具

(1) Visual Studio

(2) Reflector

(3) Visual Assist

(4) ReSharper

(5) Git

(6) BitBucket

(7) ObjectArx

(8) ArxDBG

  1. Civil3D API概况

  2. Surface

  3. Point

  4. Alignment

  5. Profile/ProfileView

  6. SampleLine

  7. Section/SectionView

  8. Subassembly/Assembly

  9. 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二次开发主要有两份参考文档,只有英文版没有中文版

Ø API Developer’s Guide

Developer’s Guide主要是像教程一样的介绍了Civil3D API的情况并且对于一些典型API给出了示例。对于初学者来说,这份文档需要仔细完整的阅读完,对于自己可能会用到的Feature例如PipeNetwork,更是需要仔细的把所有示例程序阅读完并且理解里面的所有语句。

Ø Developer Reference Help

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。