zhf7878 发表于 2004-7-14 10:20:00

[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&reg;提供了托管封装类(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&reg; 数据库有所了解。



<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>

wxiaohong 发表于 2005-6-16 14:46:00

大家就不要再讨论C#和VB.net谁优谁劣了,呵呵还是把主要的精力放在如何用.net来开发AutoCAD上来。我觉得能用C#的就一定看得懂VB.net的代码,反之亦然。

netarx 发表于 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环境下打不开,这样也不通用.顺便问一下,自定义实体有什么好处?

LucasLynn 发表于 2005-7-2 08:42:00

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。

netarx 发表于 2005-7-10 21:12:00

如果你用过autodesk在acad基础上开发的诸如civil3d之类的东西就知道自定义实体是什么了。比如你可以定义真正的抛物线(从任何x坐标可得到精确的y坐标而不是用pline插值的坐标)但是一旦acad没有加载你的自定义实体类的dll它就只好代以proxy实体,自定义实体仍然可以看见和打印但是其他种种功能(放在dll中的)就没了。

lufan82 发表于 2005-12-7 21:48:00

晕做软件都因该知道VB,VB.NET迟早是要被微软件放气的为什么还想着用呢

mickey 发表于 2006-5-12 18:02:00

VB.net只是给 VB程序员的一个过渡,最终将主力发展C#,并支持VC++的底层功能。这是microsoft的发展战略.目前,VB.net中已经开始大量渗入C#.

tcsl9621 发表于 2006-5-12 20:54:00

VB和C#有什么区别。我觉得没有任何区别。我学VB但我能看懂大多数的C#程序。调论这个一点意义也没有。什么顺手就用什么?没有优劣之分。
页: [1]
查看完整版本: [ARX]ObjectARX managed wrapper classes参考中文档(1)