开发工具 - ArxDbg

ArxDBG实际上ObjectArx自带的一个sample程序,它系统的演示了通过ObjectArx怎么样来读取和操作AutoCAD的Database。但是它做的又是如此的好,我们可以把它作为一个有用的工具经常使用。

这个project在ObjectArx的这个目录ObjectARX2017\samples\database\ARXDBG。直接用Visual Studio 2015打开并且切换成Release|x64编出来就可以得到这个工具。然后在Civil3D(也就是AutoCAD)中通过命令arx或者appload来加载这个ARX。

加载之后,右键菜单中就会多一个菜单项ArxDbg。

通过这些菜单,我们可以查看Database中所有的信息。例如里面的entity,layer,style之类的信息。这个对我们深刻理解AutoCAD Database的结构是非常有帮助的。很多时候更是能帮助我们解决一些问题。通过观察数据库里的信息可以查找排除很多问题。

我现在的做法是,把ArxDbg编出来之后,放到AutoCAD根目录下(跟acad.exe同一级目录),然后新建一个文件 acad.rx,把ArxDbg.arx加到这个文件中,这样每次AutoCAD启动的时候ArxDbg都可以自动被加载。

开发工具 - Civil3DSnoop

Civil3DSnoop 是Autodesk AND开发的一个Civil3D开发辅助工具。他通过.NET Reflection的机制,将Civil3D Database里面的元素(实体对象,Style等)及其属性值都直观的列出来,对于开发人员了解Database的结构非常的有帮助。作用和形式非常类似ObjectArx中提供的ArxDBG,只不过这个工具是专门针对Civil3D的,不会显示AutoCAD的实体如Polyline等。实际上从代码上看,他就是取出所有CivilDocument里的内容。

这个工具的代码都是github上,开源的。

https://github.com/ADN-DevTech/Civil3DSnoop

拿到代码之后,自己去把里面的solution编一下,注意一般需要更新一下reference(AeccDbMgd.dll这些)的路径。

编好之后,在Civil3D中用命令 NETLOAD 加载这个编出来的DLL,右键菜单中就会多出来一项

使用也很简单,主要就是用来查看当前Database中的元素及其属性值。

获取对象ObjectId

Civil3D二次开发的API都是应用在DB对象上的,因此我们在plugin中一般都会需要得到所需要操作的DB对象。需要得到DB对象,我们需要首先得到它的ObjectId然后用Transaction打开得到。

得到ObjectId有几种方法:

(1) 通过名字或者Index从Civil3D API定义的集合中获得。例如,我们需要得到一个PointGroup的ObjectId,则可以从PointGroupCollection 获得,代码类似

var civilDoc = CivilDocument.GetCivilDocument(db);

var pgId = civilDoc.PointGroups[“MyPointGroup”];

或者

var civilDoc = CivilDocument.GetCivilDocument(db);

var pgId = civilDoc.PointGroups[0];

(2) 通过UI交互,提示用户选择一个对象,例如

var editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
var result = editor.GetEntity("Select an alignment:");
if (result.Status == PromptStatus.OK)
{
var alignId = result.ObjectId;
}

(3) 根据Handle值,直接获得ObjectId。例如我们知道需要操作哪个对象,那么可以首先选择这个对象,然后输入命令list,例如

代码如下:

Handle hdl = new Handle(0x6580);

var alignId = db.GetObjectId(false, hdl, 0);

Civil API的分类

Civil3D API大概分为这些功能:

创建

Civil3D通过API来创建对象(例如Alignment,Surface等)并不是通过new来构造对象,大多数情况是通过

例如Alignment的Create函数

public static ObjectId Create(CivilDocument document, string alignmentName, ObjectId siteId, ObjectId layerId, ObjectId styleId, ObjectId labelSetId);

例如PointGroupCollection的Add函数

public ObjectId Add(string name);

属性

属性值是对象的各种信息,例如Style,Geometry等到。有些属性的获取是通过函数来得到的,这种情况一般是因为需要有传入参数。如果get函数并没有传入值,一般说明这个函数并不是简单的返回一个内部存储值,一般需要内部计算,也就是说如果多次使用,最好把它预先存到变量中,而不是在使用的地方每次都直接去调用。而对于普通的Property来说,则可以在需要的地方就直接使用。

例如Surface的GetGeneralProperties函数

public virtual GeneralSurfaceProperties GetGeneralProperties();

操作

操作一般是修改对象的值,例如Alignment可以修改起始和终止桩号,Surface可以添加新的数据进去。

删除

一般都不会实现特定的删除操作,直接利用AutoCAD的Erase函数就可以了。

FeatureLine API

FeatureLine API 是在Civil3D 2016 SP1中新增加的API (http://adndevblog.typepad.com/infrastructure/2015/08/civil-3d-2016-sp-1-new-feature-line-api.html),这部分内容在Civil3D 官方的Developer’s Guide没有覆盖到,因此在接下去的内容中我们会首先介绍FeatureLine的.NET API.