zhf7878 发表于 2004-7-16 14:14:00

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

<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT color=#ff0000>开始使用ObjectARX托管封装类</FONT>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">不管你是使用Microsoft Visual C# .NET 或Visual Basic .NET,通过Visual Stutio和ObjectARX托管封装类建立一个.NET解决方案的基本步骤是一样的。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">        <o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT color=#ff0000>开始通过Microsoft Visual Studio使用ObjectARX托管封装类<o:p></o:p></FONT>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">1.在Visual Studio .NET中,创建一个类库解决方案和工程。<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">2.从工种菜单或解决方案浏览器中选择添加引用<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">3.浏览\Program Files\AutoCAD 2005目录,然后选择acdbmgd.dll和acmgd.dll。<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">4.在主类文件中,添加你要使用的命名空间。<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">例如,在C#中:<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">using Autodesk.AutoCAD.ApplicationServices;<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">using Autodesk.AutoCAD.DatabaseServices;<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">using Autodesk.AutoCAD.Runtime;<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">或在VB.NET中:<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">Imports Autodesk.AutoCAD.ApplicationServices<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">Imports Autodesk.AutoCAD.DatabaseServices<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">Imports Autodesk.AutoCAD.Runtime<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">ObjectARX SDK 在\samples\dotNet目录下提供了几个基本的 VB .NET的例子。<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">在托管程序中定义 AutoCAD命令<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">建立好.NET工程后,你就可以定义实现应用程序功能的类了。在“注册命令”部分中曾提到过,你必须遵循AutoCAD特殊的协议来注册AutoCAD命令。<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">对于每一个定义的AutoCAD命令来说,在程序中必须对所对应的方法标识CommandMethod属性。这个属性可以有一个或几个参数。最简单的形式是只赋于一个全局命令名。以下的代码定义了一个名为XRECORD的AutoCAD命令,它是由XrecCommand方法(C#)/子程序(VB.NET)来处理的。<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">//C#<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">public static void XrecCommand(){<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">...<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">}<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">        <o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">‘VB.NET<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&lt;CommandMethod("XRECORD")&gt; _<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">Public Shared Sub XRecCommand()<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">'...<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">End Sub<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">重载CommandMethod属性可以定义一个命令名,一个本地化名以及命令标识符。下面的代码演示了一个带有命令标识符的CommandMethod属性:<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">        <o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">//C#<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">public static void ComInteropCommand(){<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">...<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">}<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">        <o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">‘VB.NET<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&lt;CommandMethod("COMINTEROP", CommandFlags.Session)&gt; _<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">Public Shared Sub ComInteropCommand(){<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">        <o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">'...<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">End Sub<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">这个属性声明定义了一个名为COMINTEROP的AutoCAD命令,使用ComInteropCommand方法(C#)/子程序(VB.NET)作为命令处理的方法。CommandFlags.Session命令标识符表明这个命令应当在session中运行。注意,这个方法被声明为static(C#)/Shared(VB.NET)。<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">和ObjectARX 一样,一个命令处理器必须是一个无返回值和参数的公有方法。<o:p></o:p>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT color=#ff0000>实例命令方法和静态命令方法<o:p></o:p></FONT>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">命令方法可以被声明为实例方法或静态方法。静态命令方法在C#中用static关键字声明,而在VB.NET中是Shared. 实例命令方法是没有用static或Shared关键字声明的类的公有成员。<o:p></o:p>


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体>对于实例命令方法来说,每一个打开的文档都会实例化方法内包含的类。也就是说每一个文档都会得到命令的实例数据的一个私有拷贝。这样的话,当用户切换文档时就不会存在覆盖文档数据的危险。如果实例方法需要共享数据,它可以通过声明static或Shared成员变量来进行。<o:p></o:p></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体><FONT size=3>对于静态</FONT>命令方法来说,托管封装运行模块不需要实例化方法内包含的类。不管文档的情况如何,只有一个方法数据的拷贝被使用。<FONT size=3>静态</FONT>命令通常不使用基于文档的数据,而且不需要专门考虑MDI模式。<o:p></o:p></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体>实例命令和静态命令可以通过定义命令标识符来适应不同的需求。例如,一个实例方法可以声明一个带有CommandFlags.Session标识的属性。这意味着这个命令运行在程序级的情况,但它仍保持基于文档的数据。一个这种命令的AutoCAD例子是PROPERTIES命令。<o:p></o:p></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体>相应地,静态方法可以被声明为不带CommandFlags.Session标识。这样声明对于运行在基于文档的命令是有用的,但是它不须保持基于文档的数据。</FONT>


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体>命令标识在ObjectARX参考中的<A href="arxref.chm::/AcEd/AcEdCommandStack/addCommand.htm" target="_blank" >AcEdCommandStack::addCommand()</A>主题中有详细的描述。<o:p></o:p></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体><FONT color=#ff0000>在AutoCAD中装载托管程序<o:p></o:p></FONT></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体>要装载一个托管程序,在AutoCAD命令提示行中键入NETLOAD,然后选择需要的<FONT size=3>DLL</FONT>文件。托管程序只有在AutoCAD退出时才会卸载。<o:p></o:p></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体><FONT color=#ff0000>处理托管程序中的异常<o:p></o:p></FONT></FONT>

多数情况下,ObjectARX托管API应当在异常处理的try块被调用。许多API要么产生自己的异常,要么使用内在的对象来把没有处理的异常传递给另外的程序。如果没有捕获异常,命令可能会非正常终止,并且有可能在同一个AutoCAD过程中产生不可预见的后果。
页: [1]
查看完整版本: [ARX]ObjectARX managed wrapper classes参考中文档(2)