![]() |
【转帖】[arx]objectarx managed wrapper classes参考中文档(1)
[arx]objectarx managed wrapper classes参考中文档(1)
www.dimcax.com [arx]objectarx managed wrapper classes参考中文档(1)本人曾写过“利用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属性。 c#最适合开发autocad,因为它拥有vb容易的特点,却具有vc++的强大功能。 【精华】好文章 积分+1 金钱+10 经验+5 魅力+5 [mccad | 大家就不要再讨论c#和vb.net谁优谁劣了,呵呵还是把主要的精力放在如何用.net来开发autocad上来。我觉得能用c#的就一定看得懂vb.net的代码,反之亦然。 【送花】送上鲜花一朵 鲜花+1 [francoldh | 翻译的不错,请问是手工翻译还是借助什么软件? 对于选择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的补充更合适。请记住,在具备相同能力的前提下,越是简单的工具干出的活才越漂亮,开发人员才更有精力增加软件的可靠性和功能。 严重同意netarx的观点,用vb.net进可用arx方式,退可用ax方式,虽然不能自定义实体,但自定义实体听说在脱离了应用程序的cad环境下打不开,这样也不通用.顺便问一下,自定义实体有什么好处? 以下是引用wxiaohong在 |
所有的时间均为北京时间。 现在的时间是 03:42 PM. |