1.引入的两个托管类库
使用ObjectARX.NET开发AutoCAD程序需要引用acdbmgd.dll和acmgd.dll两个托管程序集。acdbmgd.dll包含ObjectDBX托管类,而acmgd.dll包含AutoCAD托管类。
2.程序调试
将项目属性调试中的启动动作设为启动程序设为:
C:"Program Files"AutoCAD 2009"acad.exe
将项目属性调试中的工作目录设为C:"Program Files"AutoCAD 2009,否则加载程序集后输入程序集中的命令会不能执行。
注意:(1)导出命令的类必须为public。新建的类没有这个属性,即使使用[CommandMethod]属性导出命令也无法识别。
3.事务管理
l 通过事务处理管理器的GetObject()函数来获取块表对象。GetObject()函数的作用是获取驻留在AutoCAD数据库中的对象,因为这些对象是不能直接访问的。GetObject()函数有不同的形式,这里使用的是最复杂的形式,一共有3个参数。第一个参数表示要获取对象的ObjectId,对于块表或层表之类的符号表,它们的ObjectId可以通过当前数据库对象的相关属性获得,如块表就是BlockTableId,层表就是LayerTableId。第二个参数表示访问对象的方式,它是一个OpenMode的枚举,有3个取值,分别为ForRead(读)、ForWrite(写)和ForNotify(通知)。第三个参数表示是否打开已删除的对象。要注意的是GetObject()函数的返回值为DBObject类型,因此你要把返回值使用强制类型转换化成符合的对象类型。
l 通过事务处理管理器的GetObject()函数来获取模型空间所在的块表记录。模型空间所在块表记录的ObjectId可以通过调用上面获得的块表的索引器来获取,索引器的参数为BlockTableRecord.ModelSpace。对于GetObject()函数其它参数的设置,请参考上面的解释。
l 在块表记录中加入上面创建的实体对象,并通知事务处理管理器。
l 提交事务处理。在事务处理没有被提交之前,直线是不会被加入到AutoCAD中。
l 一个事务中只能提交一次事务(调用事务的Commit()函数)。
4.优化AutoCAD.NET程序的载入
[assembly:ExtensionApplication(typeof(InitClass))] //用于声明该类是ExtensionApplication
[assembly:CommandClass(typeof(CmdClss))]] //用于声明该类是CommandClass
这两个属性对程序的运行并不是重要的,但如果是在大型的.NET模块中,用这两个属性显示告诉AutoCAD哪些对象类是ExtensionApplication,哪些类是CommandClass,则会加快AutoCAD载入.NET模块的速度。这两个属性是程序级的,在命名空间外进行声明。在VS2005使用托管ARX程序向导会自动为Command.cs创建属性。
如果在程序集中使用了上述两个属性,则未使用上述两个类显示声明的类中导出的类中的命令无法识别。