明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5675|回复: 8

[ARX]ObjectARX managed wrapper classes参考中文档(1)

    [复制链接]
发表于 2004-7-14 10:20:00 | 显示全部楼层 |阅读模式
本人曾写过“利用C#进行AutoCAD的二次开发”,所采用的是AutoCAD提供的ActiveX接口。但我总觉得它与AutoCAD不能很能好的兼容,现在好了,有了最新的ObjectARX Managed wrapper classes(呵呵,就是专门为.NET量身定做的用于AutoCAD的二次开发)。从现在开始,广大.NET程序员就可以不必羡慕ObjectARX的强大功能,不需要再使用学起来比较难的C++了,只要用自己喜欢的C#或VB.NET就可以进行AutoCAD的二次开发了。 好了,闲话少说,现在进入正题,我这次翻译的是ObjectARX Managed wrapper classes的中文参考。

ObjectARX托管封装类(ObjectARX Managed Wrapper Classes)

ObjectARX®提供了托管封装类(managed wrapper classes)来使程序员能使用Microsoft .NET Framework并利用VB .NET 和 C#等.NET语言来进行编程。你可以通过查看ObjectARX帮助文件的托管封装类(managed wrapper classes)部分来获取托管封装类(managed wrapper classes)的详细列表。要了解.NET Framework的相关信息,请查看Microsoft的有关文档。

这一章假定你对ObjectARX和AutoCAD® 数据库有所了解。

ObjectARX托管封装类(the ObjectARX Managed Wrapper Classes)概览

托管封装类(managed wrapper classes)由ObjectARX SDK提供,它使你能够利用任何一种Microsoft .NET Framework所支持的语言来进行编程。托管类主要的功能与数据库有关,它可以用来编制读写DWG文件的应用程序。

你可以通过查看ObjectARX帮助文件的托管封装类(managed wrapper classes)部分来获取托管封装类(managed wrapper classes)的详细列表。

ObjectARX托管封装类(the ObjectARX Managed Wrapper Classes)存放在下面两个组件中:

  • acdbmgd.dll 包含ObjectDBX API。这个dll是ObjectDBX SDK 的一部分,随AutoCAD 一起发售。
  • acmgd.dll包含AutoCAD API。这个dll随AutoCAD 一起发售。

C++和ObjectARX中定义的数据类型在.net中有相应的部分。例如,C++中的Bool型在.net中是System::Boolean,而ObjectARX中的Adesk::Boolean在.net中是System::Bool。

ObjectARX类和托管封装类(managed wrapper classes)是相对应的。下表显示了ObjectARX类和.net命名空间(namespace)的映射关系:

ObjectARX类 .net命名空间

AcDb Autodesk.AutoCAD.DatabaseServices

AcRx Autodesk.AutoCAD.Runtime

AcEd Autodesk.AutoCAD.ApplicationServices

AcUt Autodesk.AutoCAD.DatabaseServices,

Autodesk.AutoCAD.ApplicationServices

AcCm Autodesk.AutoCAD.Colors

AcGe Autodesk.AutoCAD.Geometry

AcGi Autodesk.AutoCAD.GraphicsInterface

AcLy Autodesk.AutoCAD.LayerManager

AcPl Autodesk.AutoCAD.PlottingServices

C++和.NET的编程差异

下面的主题讨论ObjectARX类和对应的.NET部分之间的不同,并对托管封装类(managed wrapper classes)的使用提出一些有用的建议。

这一部分的主题:

内存管理和回收模式

C++使用销毁器来清理资源。ObjectARX托管封装类以实现IDisposable接口来做同样的事情。托管封装类派生于通用基础类DisposableWrapper,DisposableWrapper的作用是来管理非托管内存。

由于被ObjectARX托管封装类使用的内在资源是非托管类,因此你必须明确调用托管封装类的销毁器函数Dispose。这样可以释放所有继承的基类所拥有的资源。不要指望.NET垃圾搜集器来回收被非托管资源所占用的内存。

对象的唯一性

ObjectARX托管封装类不能保证你每次访问一个C++对象时得同一个.NET对象。例如,连续打开数据库中的同一个对象两次将会产生两个不同的.NET对象。但是,通用基础类DisposableWrapper重载了Equals和GetHashCode方法。Equals比较内在的非托管指针,而GetHashCode返回内在的非托管指针。这一点保证了.NET客户端可以把这两个不同的托管封装对象视为同一个。

错误处理

ObjectARX利用函数的返回值来表示不同的错误情况。在.NET中标识错误的比较好的方法是产生一个异常(exception)。ObjectARX托管封装类用异常来表示ObjectARX错误代码。一些错误代码和.NET本身的异常相对应,而其他的错误代码和ObjectARX托管封装类提供的通用异常类相对应。

Get和Set方法与属性

在C++中对象的属性被封装为Get和Set方法。而.NET则使用属性。ObjectARX托管封装类的属性与Get和Set方法相对应。

反应器与事件

ObjectARX使用反应器来封装事件。因为.NET使用事件,所以ObjectARX托管封装类的事件与反应器相对应。

非托管反应器需要两个类:事件源类和抽象反应器类。事件源类由系统实例化,并提供addReactor()和removeReactor()函数。客户端从抽象反应器得到一个具体的反应器类,并实例化这个具体的反应器,然后把它加入事件源。当事件发生时,事件源调用具体的反应器中的虚函数。

ObjectARX托管封装类把反应器模式封装成一个带有托管事件的事件源类。

集合和遍历

在ObjectARX中,遍历在类中没有被标准化。而对于托管封装类来说,两个接口使遍历能够进行。集合实现了IEnumerable接口。由GetEnumerator方法返回的Iterators实现了IEnumerator接口。

注册命令

ObjectARX允许扩展应用程序在AutoCAD中注册命令。这个注册是隐含的:应用程序运行时必须找到它想注册的命令。

.NET让应用程序使用声明的形式来定义程序的行为。ObjectARX托管封装类使用声明的形式来注册命令。通用属性被用来指明命令。请参阅“在托管程序中定义AutoCAD命令”这一部分来看具体的代码和详细的信息。

全局函数

ObjectARX托管封装类中没有全局函数,所以许多ObjectARX全局函数被映射成新的.NET对象或已存在的.NET对象的属性。

例如,在程序中用于和AutoCAD命令行提示相交互的ObjectARX全局函数,在ObjectARX托管封装类中使用一个新的CommandLinePrompt类进行这一类封装。

另一类ObjectARX全局函数返回实例对象的指针。例如,ObjectARX使用acdbTransactionManagerPtr()函数为返回AcDbTransactionManager的指针。像这一类函数在.NET中已被映射成对象的属性,所以数据库有一个TransactionManager属性。

评分

参与人数 1威望 +1 金钱 +10 贡献 +5 激情 +5 收起 理由
mccad + 1 + 10 + 5 + 5 【精华】好文章

查看全部评分

发表于 2005-6-16 14:46:00 | 显示全部楼层
大家就不要再讨论C#和VB.net谁优谁劣了,呵呵还是把主要的精力放在如何用.net来开发AutoCAD上来。我觉得能用C#的就一定看得懂VB.net的代码,反之亦然。
发表于 2005-6-18 17:01:00 | 显示全部楼层
翻译的不错,请问是手工翻译还是借助什么软件?


对于选择vb还是c#,我感觉还是vb.net更好些,原因如下:


1. 从.net方面,vb和c#有相同的能力和编译水平,vb的IDE搞开发更省事些。


2. 工程上用的软件最主要的就是健壮、和开发省力运行速度在其次,至于采用的是什么技术就更无人关心了。从activex方面,我觉得相比arx来说activex做不到的就是定义acad命令和jig夹具,好像arx不是无所不能,比如我还每找到如何实现zoom功能以及访问acad菜单的方法,倒是activex能做到。虽然activex限制多些,但是arx中80%的功能都具备并且用起来比arx省事也健壮,而使用activex当然是vb更方便。。arx作为activex的补充更合适。请记住,在具备相同能力的前提下,越是简单的工具干出的活才越漂亮,开发人员才更有精力增加软件的可靠性和功能。
发表于 2005-6-29 13:39:00 | 显示全部楼层
严重同意netArx的观点,用vb.net进可用arx方式,退可用ax方式,虽然不能自定义实体,但自定义实体听说在脱离了应用程序的cad环境下打不开,这样也不通用.顺便问一下,自定义实体有什么好处?
发表于 2005-7-2 08:42:00 | 显示全部楼层
wxiaohong发表于2005-6-16 14:46:00大家就不要再讨论C#和VB.net谁优谁劣了,呵呵还是把主要的精力放在如何用.net来开发AutoCAD上来。我觉得能用C#的就一定看得懂VB.net的代码,反之亦然。


...



VB.NET和C#.NET本来就没太多本质性区别,只是为了便于老程序员沿袭习惯,减少再学习成本而并存的。C#嘛……压根就是个JAVA。
发表于 2005-7-10 21:12:00 | 显示全部楼层
如果你用过autodesk在acad基础上开发的诸如civil3d之类的东西就知道自定义实体是什么了。比如你可以定义真正的抛物线(从任何x坐标可得到精确的y坐标而不是用pline插值的坐标)但是一旦acad没有加载你的自定义实体类的dll它就只好代以proxy实体,自定义实体仍然可以看见和打印但是其他种种功能(放在dll中的)就没了。
发表于 2005-12-7 21:48:00 | 显示全部楼层
晕做软件都因该知道VB,VB.NET迟早是要被微软件放气的为什么还想着用呢
发表于 2006-5-12 18:02:00 | 显示全部楼层
VB.net只是给 VB程序员的一个过渡,最终将主力发展C#,并支持VC++的底层功能。这是microsoft的发展战略.目前,VB.net中已经开始大量渗入C#.
发表于 2006-5-12 20:54:00 | 显示全部楼层
VB和C#有什么区别。我觉得没有任何区别。我学VB但我能看懂大多数的C#程序。调论这个一点意义也没有。什么顺手就用什么?没有优劣之分。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 08:18 , Processed in 0.193023 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表