[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的中文参考。
<P class=MsoNormal><FONT color=#ff0000>ObjectARX托管封装类(ObjectARX Managed Wrapper Classes)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT>
<FONT color=#ff0000></FONT>
<P class=MsoNormal>ObjectARX®提供了托管封装类(managed wrapper classes)来使程序员能使用Microsoft .NET Framework并利用VB .NET 和 C#等.NET语言来进行编程。你可以通过查看ObjectARX帮助文件的托管封装类(managed wrapper classes)部分来获取托管封装类(managed wrapper classes)的详细列表。要了解.NET Framework的相关信息,请查看Microsoft的有关文档。
<P class=MsoNormal>这一章假定你对ObjectARX和AutoCAD® 数据库有所了解。
<P class=MsoNormal> <o:p></o:p>
<P class=MsoNormal><FONT color=#ff0000>ObjectARX托管封装类(the ObjectARX Managed Wrapper Classes)概览<o:p></o:p></FONT>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>托管封装类(managed wrapper classes)由ObjectARX SDK提供,它使你能够利用任何一种Microsoft .NET Framework所支持的语言来进行编程。托管类主要的功能与数据库有关,它可以用来编制读写DWG文件的应用程序。<o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>你可以通过查看ObjectARX帮助文件的托管封装类(managed wrapper classes)部分来获取托管封装类(managed wrapper classes)的详细列表。<o:p></o:p>
<P class=MsoNormal>ObjectARX托管封装类(the ObjectARX Managed Wrapper Classes)存放在下面两个组件中:
<UL type=disc>
<LI class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo1; tab-stops: list 36.0pt">acdbmgd.dll 包含ObjectDBX API。这个dll是ObjectDBX SDK 的一部分,随AutoCAD 一起发售。
<LI class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo1; tab-stops: list 36.0pt">acmgd.dll包含AutoCAD API。这个dll随AutoCAD 一起发售。</LI></UL>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>C++和ObjectARX中定义的数据类型在.net中有相应的部分。例如,C++中的Bool型在.net中是System::Boolean,而ObjectARX中的Adesk::Boolean在.net中是System::Bool。<o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>ObjectARX类和托管封装类(managed wrapper classes)是相对应的。下表显示了ObjectARX类和.net命名空间(namespace)的映射关系:
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>ObjectARX类 .net命名空间<B><o:p></o:p></B>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>AcDb Autodesk.AutoCAD.DatabaseServices <o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>AcRx Autodesk.AutoCAD.Runtime <o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>AcEd Autodesk.AutoCAD.ApplicationServices <o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>AcUt Autodesk.AutoCAD.DatabaseServices,
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left> Autodesk.AutoCAD.ApplicationServices <o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>AcCm Autodesk.AutoCAD.Colors <o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>AcGe Autodesk.AutoCAD.Geometry <o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>AcGi Autodesk.AutoCAD.GraphicsInterface <o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>AcLy Autodesk.AutoCAD.LayerManager <o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>AcPl Autodesk.AutoCAD.PlottingServices <o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><FONT color=#ff0000>C++和.NET的编程差异<o:p></o:p></FONT>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>下面的主题讨论ObjectARX类和对应的.NET部分之间的不同,并对托管封装类(managed wrapper classes)的使用提出一些有用的建议。<o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>这一部分的主题:<o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><FONT color=#ff0000>内存管理和回收模式<o:p></o:p></FONT>
<P class=body>C++使用销毁器来清理资源。ObjectARX托管封装类以实现IDisposable接口来做同样的事情。托管封装类派生于通用基础类DisposableWrapper,DisposableWrapper的作用是来管理非托管内存。
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>由于被ObjectARX托管封装类使用的内在资源是非托管类,因此你必须明确调用托管封装类的销毁器函数Dispose。这样可以释放所有继承的基类所拥有的资源。不要指望.NET垃圾搜集器来回收被非托管资源所占用的内存。<o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><FONT color=#ff0000>对象的唯一性<o:p></o:p></FONT>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>ObjectARX托管封装类不能保证你每次访问一个C++对象时得同一个.NET对象。例如,连续打开数据库中的同一个对象两次将会产生两个不同的.NET对象。但是,通用基础类DisposableWrapper重载了Equals和GetHashCode方法。Equals比较内在的非托管指针,而GetHashCode返回内在的非托管指针。这一点保证了.NET客户端可以把这两个不同的托管封装对象视为同一个。<o:p></o:p>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><FONT color=#ff0000>错误处理<o:p></o:p></FONT>
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left>ObjectARX利用函数的返回值来表示不同的错误情况。在.NET中标识错误的比较好的方法是产生一个异常(exception)。ObjectARX托管封装类用异常来表示ObjectARX错误代码。一些错误代码和.NET本身的异常相对应,而其他的错误代码和ObjectARX托管封装类提供的通用异常类相对应。<o:p></o:p>
<P class=body><FONT color=#ff0000>Get和Set方法与属性<o:p></o:p></FONT>
<P class=body>在C++中对象的属性被封装为Get和Set方法。而.NET则使用属性。ObjectARX托管封装类的属性与Get和Set方法相对应。
<P class=body><FONT color=#ff0000>反应器与事件<o:p></o:p></FONT>
<P class=body>ObjectARX使用反应器来封装事件。因为.NET使用事件,所以ObjectARX托管封装类的事件与反应器相对应。
<P class=body>非托管反应器需要两个类:事件源类和抽象反应器类。事件源类由系统实例化,并提供addReactor()和removeReactor()函数。客户端从抽象反应器得到一个具体的反应器类,并实例化这个具体的反应器,然后把它加入事件源。当事件发生时,事件源调用具体的反应器中的虚函数。
<P class=body>ObjectARX托管封装类把反应器模式封装成一个带有托管事件的事件源类。
<P class=body><FONT color=#ff0000>集合和遍历<o:p></o:p></FONT>
<P class=body>在ObjectARX中,遍历在类中没有被标准化。而对于托管封装类来说,两个接口使遍历能够进行。集合实现了IEnumerable接口。由GetEnumerator方法返回的Iterators实现了IEnumerator接口。<o:p></o:p>
<P class=body><FONT color=#ff0000>注册命令<o:p></o:p></FONT>
<P class=body>ObjectARX允许扩展应用程序在AutoCAD中注册命令。这个注册是隐含的:应用程序运行时必须找到它想注册的命令。
<P class=body>.NET让应用程序使用声明的形式来定义程序的行为。ObjectARX托管封装类使用声明的形式来注册命令。通用属性被用来指明命令。请参阅“在托管程序中定义AutoCAD命令”这一部分来看具体的代码和详细的信息。
<P class=body><FONT color=#ff0000>全局函数<o:p></o:p></FONT>
<P class=body>ObjectARX托管封装类中没有全局函数,所以许多ObjectARX全局函数被映射成新的.NET对象或已存在的.NET对象的属性。
<P class=body>例如,在程序中用于和AutoCAD命令行提示相交互的ObjectARX全局函数,在ObjectARX托管封装类中使用一个新的CommandLinePrompt类进行这一类封装。
<P class=body>另一类ObjectARX全局函数返回实例对象的指针。例如,ObjectARX使用acdbTransactionManagerPtr()函数为返回AcDbTransactionManager的指针。像这一类函数在.NET中已被映射成对象的属性,所以数据库有一个TransactionManager属性。
<P class=MsoNormal style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left> <o:p></o:p> 大家就不要再讨论C#和VB.net谁优谁劣了,呵呵还是把主要的精力放在如何用.net来开发AutoCAD上来。我觉得能用C#的就一定看得懂VB.net的代码,反之亦然。 翻译的不错,请问是手工翻译还是借助什么软件?
对于选择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发表于2005-6-16 14:46:00static/image/common/back.gif大家就不要再讨论C#和VB.net谁优谁劣了,呵呵还是把主要的精力放在如何用.net来开发AutoCAD上来。我觉得能用C#的就一定看得懂VB.net的代码,反之亦然。
...
VB.NET和C#.NET本来就没太多本质性区别,只是为了便于老程序员沿袭习惯,减少再学习成本而并存的。C#嘛……压根就是个JAVA。 如果你用过autodesk在acad基础上开发的诸如civil3d之类的东西就知道自定义实体是什么了。比如你可以定义真正的抛物线(从任何x坐标可得到精确的y坐标而不是用pline插值的坐标)但是一旦acad没有加载你的自定义实体类的dll它就只好代以proxy实体,自定义实体仍然可以看见和打印但是其他种种功能(放在dll中的)就没了。 晕做软件都因该知道VB,VB.NET迟早是要被微软件放气的为什么还想着用呢 VB.net只是给 VB程序员的一个过渡,最终将主力发展C#,并支持VC++的底层功能。这是microsoft的发展战略.目前,VB.net中已经开始大量渗入C#. VB和C#有什么区别。我觉得没有任何区别。我学VB但我能看懂大多数的C#程序。调论这个一点意义也没有。什么顺手就用什么?没有优劣之分。
页:
[1]