乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 116|回复: 8

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

[复制链接]

30

主题

54

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2004-7-14 10:20:00 | 显示全部楼层 |阅读模式
本人曾写过“利用C#进行的二次开发”,所采用的是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)存放在下面两个组件中:[U]
acdbmgd.dll 包含ObjectDBX API。这个dll是ObjectDBX SDK 的一部分,随AutoCAD 一起发售。
acmgd.dll包含AutoCAD API。这个dll随AutoCAD 一起发售。[/U]
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属性。       
回复

使用道具 举报

0

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
3
发表于 2005-6-16 14:46:00 | 显示全部楼层
大家就不要再讨论C#和VB.net谁优谁劣了,呵呵还是把主要的精力放在如何用.net来开发AutoCAD上来。我觉得能用C#的就一定看得懂VB.net的代码,反之亦然。
回复

使用道具 举报

6

主题

9

帖子

2

银币

初来乍到

Rank: 1

铜币
33
发表于 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的补充更合适。请记住,在具备相同能力的前提下,越是简单的工具干出的活才越漂亮,开发人员才更有精力增加软件的可靠性和功能。
回复

使用道具 举报

1

主题

8

帖子

1

银币

初来乍到

Rank: 1

铜币
12
发表于 2005-6-29 13:39:00 | 显示全部楼层
严重同意netArx的观点,用vb.net进可用arx方式,退可用ax方式,虽然不能自定义实体,但自定义实体听说在脱离了应用程序的cad环境下打不开,这样也不通用.顺便问一下,自定义实体有什么好处?
回复

使用道具 举报

1

主题

20

帖子

2

银币

初来乍到

Rank: 1

铜币
24
发表于 2005-7-2 08:42:00 | 显示全部楼层

VB.NET和C#.NET本来就没太多本质性区别,只是为了便于老程序员沿袭习惯,减少再学习成本而并存的。C#嘛……压根就是个JAVA。
回复

使用道具 举报

6

主题

9

帖子

2

银币

初来乍到

Rank: 1

铜币
33
发表于 2005-7-10 21:12:00 | 显示全部楼层
如果你用过autodesk在acad基础上开发的诸如civil3d之类的东西就知道自定义实体是什么了。比如你可以定义真正的抛物线(从任何x坐标可得到精确的y坐标而不是用pline插值的坐标)但是一旦acad没有加载你的自定义实体类的dll它就只好代以proxy实体,自定义实体仍然可以看见和打印但是其他种种功能(放在dll中的)就没了。
回复

使用道具 举报

5

主题

7

帖子

2

银币

初来乍到

Rank: 1

铜币
27
发表于 2005-12-7 21:48:00 | 显示全部楼层
晕做软件都因该知道VB,VB.NET迟早是要被微软件放气的为什么还想着用呢
回复

使用道具 举报

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
7
发表于 2006-5-12 18:02:00 | 显示全部楼层
VB.net只是给 VB程序员的一个过渡,最终将主力发展C#,并支持VC++的底层功能。这是microsoft的发展战略.目前,VB.net中已经开始大量渗入C#.
回复

使用道具 举报

15

主题

195

帖子

9

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
255
发表于 2006-5-12 20:54:00 | 显示全部楼层
VB和C#有什么区别。我觉得没有任何区别。我学VB但我能看懂大多数的C#程序。调论这个一点意义也没有。什么顺手就用什么?没有优劣之分。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 05:56 , Processed in 0.179859 second(s), 70 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表