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

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

<P class=body style="MARGIN: auto 0cm"><FONT face=宋体><FONT color=#ff0000>在托管程序中使用事务处理<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体>和ObjectARX程序一样,托管程序总是在数据库事务处理环境下对DWG数据库执行操作。你应当使用下述的异常处理技<FONT size=3>巧</FONT>:<o:p></o:p></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体><FONT color=#ff0000>使用带异常处理的事务处理<o:p></o:p></FONT></FONT>


<P class=body style="MARGIN: auto 0cm auto 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo5; tab-stops: list 18.0pt"><FONT face=宋体>1.</FONT>                               <FONT face=宋体>通过调用<FONT size=3>Transaction.StartTransaction()方法,在try块之前启动一个</FONT>事务处理<o:p></o:p></FONT>


<P class=body style="MARGIN: auto 0cm auto 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo5; tab-stops: list 18.0pt"><FONT face=宋体>2.</FONT>                               <FONT face=宋体>在try块内,使用事务处理对象来进行和数据库有关的操作。<o:p></o:p></FONT>


<P class=body style="MARGIN: auto 0cm auto 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo5; tab-stops: list 18.0pt"><FONT face=宋体>3.</FONT>                               <FONT face=宋体>通过调用<FONT size=3>Transaction.Commit()方法,在try块的末尾提交事务处理。<o:p></o:p></FONT></FONT>


<P class=body style="MARGIN: auto 0cm auto 18pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo5; tab-stops: list 18.0pt"><FONT face=宋体>4.</FONT>                               <FONT face=宋体>通过调用<FONT size=3>Transaction.Dispose()方法在finally块中销毁事务处理。<o:p></o:p></FONT></FONT>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto">上述步骤保证事务处理对象被销毁,<FONT face="Times New Roman"> </FONT>而不管在<FONT face="Times New Roman">try</FONT>块中可能出现的任何异常。下面的例子描述了这一技巧:


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体 size=3>//C#</FONT>

<PRE><FONT face=黑体 size=2>public static void HyperCommand(){</FONT></PRE><PRE><FONT face=黑体 size=2>Database db = Application.DocumentManager.MdiActiveDocument.Database;</FONT></PRE><PRE><FONT face=黑体 size=2>DBTransMan tm = db.TransactionManager;</FONT></PRE><PRE><FONT size=2><FONT face=黑体>//</FONT>开始一个事务处理</FONT></PRE><PRE><FONT face=黑体 size=2>Transaction myT = tm.StartTransaction();</FONT></PRE><PRE><FONT face=黑体 size=2>Try<BR>
{</FONT></PRE><PRE style="TEXT-INDENT: 24pt"><FONT face=黑体 size=2>//创建一条直线</FONT></PRE><PRE><FONT face=黑体 size=2>Line line=new Line(New Point3d(0, 0, 0), New Point3d(1, 1, 0));</FONT></PRE><PRE><FONT face=黑体 size=2>BlockTable bt = CType(tm.GetObject(_</FONT></PRE><PRE><FONT size=2>                                                                <FONT face=黑体>db.BlockTableId, OpenMode.ForRead, False), BlockTable);</FONT></FONT></PRE><PRE><FONT face=黑体 size=2>BlockTableRecord btr = </FONT></PRE><PRE><FONT size=2>                                                                <FONT face=黑体>CType(tm.GetObject(bt(BlockTableRecord.ModelSpace),</FONT></FONT></PRE><PRE><FONT size=2>                                                                <FONT face=黑体>OpenMode.ForWrite, False), BlockTableRecord);</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>'把直线加入到model space block table record</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>btr.AppendEntity(line);</FONT></FONT></PRE><PRE style="TEXT-INDENT: 24pt"><FONT face=黑体 size=2>'确定事务处理知道这个新加入的对象</FONT></PRE><PRE style="TEXT-INDENT: 24pt"><FONT face=黑体 size=2>tm.AddNewlyCreatedDBObject(line, true);</FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>'添加一些超链接 </FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>HyperLink hyper=</FONT>new <FONT face=黑体>HyperLink();</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>hyper.Name = "www.autodesk.com";</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>line.Hyperlinks.Add(hyper);</FONT></FONT></PRE><PRE style="TEXT-INDENT: 24pt"><FONT face=黑体 size=2>If(line.Hyperlinks.Contains(hyper))</FONT></PRE><PRE style="TEXT-INDENT: 24pt"><FONT size=2>                                                                <FONT face=黑体>hyper.Name = "www.gotdotnet.com";</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>line.Hyperlinks.Add(hyper)</FONT></FONT></PRE><PRE style="TEXT-INDENT: 24pt"><FONT face=黑体 size=2>int i;</FONT></PRE><PRE style="TEXT-INDENT: 24pt"><FONT face=黑体 size=2>for(i =0; i &lt; line.Hyperlinks.Count; i ++)</FONT></PRE><PRE><FONT size=2>                                                                                <FONT face=黑体>Debug.WriteLine(line.Hyperlinks(i).ToString());</FONT></FONT></PRE><PRE><FONT size=2>                        <FONT face=黑体>//提交事务处理</FONT></FONT></PRE><PRE style="TEXT-INDENT: 24pt"><FONT face=黑体 size=2>myT.Commit();</FONT></PRE><PRE><FONT face=黑体 size=2>}</FONT></PRE><PRE><FONT size=2>f<FONT face=黑体>inally</FONT></FONT></PRE><PRE><FONT face=黑体 size=2>{</FONT></PRE><PRE style="TEXT-INDENT: 24pt"><FONT face=黑体 size=2>myT.Dispose();</FONT></PRE><PRE><FONT face=黑体 size=2>}</FONT></PRE><PRE><FONT face=黑体 size=2>}</FONT></PRE><PRE><FONT face=黑体><FONT size=2>        <o:p></o:p></FONT></FONT></PRE><PRE><FONT size=2><FONT face=黑体>'</FONT>VB.NET<o:p></o:p></FONT></PRE><PRE><FONT face=黑体 size=2>Public Shared Sub HyperCommand()</FONT></PRE><PRE><FONT face=黑体 size=2>Dim db As Database =</FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>Application.DocumentManager.MdiActiveDocument.Database</FONT></FONT></PRE><PRE><FONT face=黑体 size=2>Dim tm As DBTransMan = db.TransactionManager</FONT></PRE><PRE><FONT face=黑体 size=2>'start a transaction</FONT></PRE><PRE><FONT face=黑体 size=2>Dim myT As Transaction = tm.StartTransaction()</FONT></PRE><PRE><FONT face=黑体 size=2>Try</FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>'create a line</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>Dim line As New Line(New Point3d(0, 0, 0), New Point3d(_</FONT></FONT></PRE><PRE><FONT size=2>                                                                <FONT face=黑体>1, 1, 0))</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>Dim bt As BlockTable = CType(tm.GetObject(_</FONT></FONT></PRE><PRE><FONT size=2>                                                                <FONT face=黑体>db.BlockTableId, OpenMode.ForRead, False), BlockTable)</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>Dim btr As BlockTableRecord =</FONT></FONT></PRE><PRE><FONT size=2>                                                                <FONT face=黑体>CType(tm.GetObject(bt(BlockTableRecord.ModelSpace),</FONT></FONT></PRE><PRE><FONT size=2>                                                                <FONT face=黑体>OpenMode.ForWrite, False), BlockTableRecord)</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>'add it to the model space block table record</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>btr.AppendEntity(line)</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>'make sure that the transaction knows about this new object</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>tm.AddNewlyCreatedDBObject(line, True)</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>'add some hyperlinks </FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>Dim hyper As New HyperLink()</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>hyper.Name = "www.autodesk.com"</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>line.Hyperlinks.Add(hyper)</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>If line.Hyperlinks.Contains(hyper) Then</FONT></FONT></PRE><PRE><FONT size=2>                                                                <FONT face=黑体>hyper.Name = "www.gotdotnet.com"</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>End If</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>line.Hyperlinks.Add(hyper)</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>Dim i As Integer</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>For i = 0 To line.Hyperlinks.Count - 1</FONT></FONT></PRE><PRE><FONT size=2>                                                                <FONT face=黑体>Debug.WriteLine(line.Hyperlinks(i).ToString())</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>Next i 'commit transaction</FONT></FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>myT.Commit()</FONT></FONT></PRE><PRE><FONT face=黑体 size=2>Finally</FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>myT.Dispose()</FONT></FONT></PRE><PRE><FONT face=黑体 size=2>End Try</FONT></PRE><PRE><FONT face=黑体 size=2>End Sub 'HyperCommand</FONT></PRE>
<P class=body style="MARGIN: auto 0cm"><FONT size=3><FONT face=宋体><FONT color=#ff0000>使用ResultBuffer类</FONT></FONT></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT size=3><FONT face=宋体>在ObjectARX中,resbuf结构给AutoCAD专门数据提供了一个灵活的存储器。在托管API中,这个结构被映射在Autodesk.AutoCAD.DatabaseServices.ResultBuffer类中。</FONT></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT size=3><FONT face=宋体>一个ResultBuffer类对象使用的方法与resbuf数据链相同。你要定义一个ResultBuffer并使它产生一系列的数据对。每一对数据由一个数据类型描述和一个值组成。在托管API中,这些数据对是Autodesk.AutoCAD.DatabaseServices.TypedValue类的实例。这个类实现的功能与resbuf结构的restype和resval成员一样。<o:p></o:p></FONT></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT size=3><FONT face=宋体>TypedValue.TypeCode属性是一个16位的整数值,它表示TypedValue.Value属性的数据类型。可以使用的TypeCode值取决于ResultBuffer实例的具体使用情况。例如,适合于xrecord定义的TypeCode的值就不一定适用于xdata。Autodesk.AutoCAD.DatabaseServices.DxfCode枚举定义的代码精确地描述了所有可能的ResultBuffer数据类型的范围。<o:p></o:p></FONT></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT size=3><FONT face=宋体>因为TypedValue.Value属性与System.Object的一个实例相对应,所以它可以包含任何数据类型。但是,Value数据必须与TypeCode所表示的类一致,以保证结果的可用性。</FONT></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT size=3><FONT face=宋体>你可以通过给ResultBuffer的构造函数传递一个TypedValue对象数组来提前产生一个ResultBuffer,或者可以先构造一个空的ResultBuffer,然后通过调用ResultBuffer::Add()方法来加入新的TypedValue对象。一个典型的ResultBuffer构造函数的用法如下例所示:<o:p></o:p></FONT></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT size=3><FONT face=宋体>//C#<o:p></o:p></FONT></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体 size=3>Xrecord rec=new Xrecord();</FONT>

<PRE><FONT face=黑体 size=2>rec.Data = New ResultBuffer( _</FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.Text), "This is a test"), _</FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.Int8), 0), _</FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.Int16), 1), _</FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.Int32), 2), _</FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.HardPointerId),</FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>db.BlockTableId), _</FONT></FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.BinaryChunk), </FONT></PRE><PRE><FONT face=黑体 size=2>New Byte(){0, 1, 2, 3, 4}), _</FONT></PRE><PRE><FONT size=2><FONT face=黑体>New TypedValue(CInt(DxfCode.ArbitraryHandle), </FONT>                                <FONT face=黑体>db.BlockTableId.Handle), _</FONT></FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.UcsOrg), New Point3d(0, 0, 0)));</FONT></PRE>
<P class=body style="MARGIN: auto 0cm"><FONT face=宋体 size=3>'VB.NET</FONT>

<PRE><FONT face=黑体 size=2>Dim rec As New Xrecord()</FONT></PRE><PRE><FONT face=黑体 size=2>rec.Data = New ResultBuffer( _</FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.Text), "This is a test"), _</FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.Int8), 0), _</FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.Int16), 1), _</FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.Int32), 2), _</FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.HardPointerId),</FONT></PRE><PRE><FONT size=2>                                <FONT face=黑体>db.BlockTableId), _</FONT></FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.BinaryChunk), </FONT></PRE><PRE><FONT face=黑体 size=2>New Byte(){0, 1, 2, 3, 4}), _</FONT></PRE><PRE><FONT size=2><FONT face=黑体>New TypedValue(CInt(DxfCode.ArbitraryHandle), </FONT>                                <FONT face=黑体>db.BlockTableId.Handle), _</FONT></FONT></PRE><PRE><FONT face=黑体 size=2>New TypedValue(CInt(DxfCode.UcsOrg), New Point3d(0, 0, 0)))</FONT></PRE>
<P class=body style="MARGIN: auto 0cm"><FONT size=3><FONT face=宋体>        <o:p></o:p></FONT></FONT>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT color=#ff0000>托管程序的初始化和运行时优化<o:p></o:p></FONT>


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">托管程序如果要执行初始化或结束任务,那么可以通过实现可选的<FONT face="Times New Roman">Autodesk.AutoCAD.Runtime.IextensionApplication</FONT>接口来进行。这个接口提供<FONT face="Times New Roman">Initialize()</FONT>和<FONT face="Times New Roman">Terminate()</FONT>方法。因为托管程序不能手动卸载,<FONT face="Times New Roman">Terminate()</FONT>方法只有当<FONT face="Times New Roman">AutoCAD</FONT>运行的时候才能调用。<o:p></o:p>


<P class=body style="MARGIN: auto 0cm"><FONT size=3><FONT face=宋体>如果程序中定义了大量的类,那么你可以通过实现IextensionApplication接口和使用两个可选的通用属性来优化程序。这两个属性是:ExtensionApplication和CommandClass,它们可以帮助AutoCAD找到程序的初始化路径和命令处理器。</FONT></FONT>


<P class=body style="MARGIN: auto 0cm"><FONT face=宋体 size=3>任何托管程序都可以使用这两个属性。但是,只有在大型程序中才能体现它们的优化效果。</FONT>


<P class=body style="MARGIN: auto 0cm"><FONT size=3><FONT face=宋体>        <o:p></o:p></FONT></FONT>


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


<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">        <o:p></o:p>
页: [1]
查看完整版本: [ARX]ObjectARX managed wrapper classes参考中文档(3)