zhf7878 发表于 2005-5-15 15:02:00

.NET 开发AutoCAD2006指南(二)

本帖最后由 作者 于 2005-5-22 18:25:28 编辑 <br /><br /> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><FONT face="Times New Roman">.NET </FONT>开发<FONT face="Times New Roman">AutoCAD2006</FONT>指南(二)



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><FONT face="Times New Roman">C#</FONT>才鸟



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">                                               </FONT></SPAN>在上一篇文章中向大家简单讲了<FONT face="Times New Roman">.NET</FONT>开发<FONT face="Times New Roman">AutoCAD</FONT>的流程,其中介绍了我编写的一个简化程序开发的<FONT face="Times New Roman">ZHFARX</FONT>库。下面向大家介绍<FONT face="Times New Roman">ZHFARX</FONT>库中的主要函数及如何用它来编写<FONT face="Times New Roman">.NET</FONT>程序。关于<FONT face="Times New Roman">ZHFARX</FONT>库的所有函数的说明,请大家参考本章附件中的<FONT face="Times New Roman">ZHFARX</FONT>帮助文档。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">                                               </FONT></SPAN>在介绍<FONT face="Times New Roman">ZHFARX</FONT>库之前,让我们首先来了解一下有关的基本概念。你可以把<FONT face="Times New Roman">AutoCAD</FONT>看作为一个数据库,而<FONT face="Times New Roman">AutoCAD</FONT>中有关的东西都放在这个数据库的相关表中。例如,你用<FONT face="Times New Roman">Line</FONT>命令在<FONT face="Times New Roman">AutoCAD</FONT>的模型空间中添加了一条直线,那么<FONT face="Times New Roman">AutoCAD</FONT>会创建一个直线类的实例并把它加入到数据库的模型空间块表记录中。在传统的<FONT face="Times New Roman">C++</FONT>编写<FONT face="Times New Roman">ObjectARX</FONT>程序的时候,你必须首先打开当前数据库的块表(因为模型空间是在块表中的),然后打开模型空间对应的块表记录,在记录中加入直线类的实例,然后分别关闭块表和模型空间块表记录。而在<FONT face="Times New Roman">.NET</FONT>程序中,相应的代码编写是这样的:



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">Database db= Application.DocumentManager.MdiActiveDocument.Database;<?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">DBTransMan tm=db.TransactionManager;<o:p></o:p>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">//获取事务处理<o:p></o:p>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>using(<SPAN style="COLOR: black">Transaction trans=tm.StartTransaction())//开始事务处理<o:p></o:p></SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>{<o:p></o:p>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><SPAN style="mso-tab-count: 3">                                                                                                                                      BlockTable bt=(BlockTable)tm.GetObject(db.BlockTableId,OpenMode.ForRead,false);<o:p></o:p></SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>//打开当前数据库的块表<o:p></o:p>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><SPAN style="mso-tab-count: 3">                                                                                                                                      BlockTableRecord btr=(BlockTableRecord)tm.GetObject(bt,OpenMode.ForWrite,false);<o:p></o:p></SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>//打开模型空间块表记录<o:p></o:p>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><SPAN style="mso-tab-count: 3">                                                                                                                                      btr.AppendEntity(ent);//在记录中加入实体<o:p></o:p></SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><SPAN style="mso-tab-count: 3">                                                                                                                                      tm.AddNewlyCreatedDBObject(ent,true);//<o:p></o:p></SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><SPAN style="mso-tab-count: 3">                                                                                                                                      trans.Commit();//提交事务<o:p></o:p></SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="mso-tab-count: 3">                                                                                                       }<o:p></o:p></SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">从上面的代码中可以看到,<FONT face="Times New Roman">.net</FONT>用事务处理代替了<FONT face="Times New Roman">C++</FONT>中的打开和关闭操作(当然你也可以像<FONT face="Times New Roman">C++</FONT>一样使用相应的<FONT face="Times New Roman">Open</FONT>和<FONT face="Times New Roman">Close</FONT>函数来进行打开和关闭的操作,但<FONT face="Times New Roman">ObjectARX</FONT>托管封装类已把这两个函数标记成了过时的函数,也就是说不建议用户使用它们)。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">                                               </FONT></SPAN>有一点要大家注意的是,对象没有被加入到<FONT face="Times New Roman">AutoCAD</FONT>数据库之前,你可以对它进行直接的操作(如改变颜色,移动,设置实体的几何属性等)。但一旦对象被加入到<FONT face="Times New Roman">AutoCAD</FONT>数据库中,你就必须使用事务处理来打开它然后进行相应的操作。比如说,你在<FONT face="Times New Roman">AutoCAD</FONT>中加入了上面的直线,而你想改变这条直线的颜色,你不能直接调用直线的<FONT face="Times New Roman">Color</FONT>或<FONT face="Times New Roman">ColorIndex</FONT>属性来进行设置,你必须首先用事务处理的<FONT face="Times New Roman">GetObject()</FONT>函数打开这个直线对象,然后你才能调用<FONT face="Times New Roman">Color</FONT>或<FONT face="Times New Roman">ColorIndex</FONT>属性来对直线设置颜色。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">                                               ZHFARX</FONT></SPAN>库的作用正是为了简化以上这些操作,有了它你在<FONT face="Times New Roman">AutoCAD</FONT>中加入对象的时候就不必再打开<FONT face="Times New Roman">AutoCAD</FONT>数据库的表,也可以直接对已加入到数据库中的对象进行操作,它还包括了以下这些功能:更为方便地创建<FONT face="Times New Roman">AutoCAD</FONT>实体的构造函数,遍历数据库表,添加组和扩展字典及其它一些常用的函数。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman">                                               </FONT></SPAN>首先向大家介绍<FONT face="Times New Roman">ZHFARX</FONT>库中的<FONT face="Times New Roman">Tools</FONT>类。这个类是<FONT face="Times New Roman">ZHFARX</FONT>库的主要类,上面介绍的<FONT face="Times New Roman">ZHFARX</FONT>库的主要功能都是在这个库中实现的。下面介绍这个类中的主要成员<FONT face="Times New Roman">(</FONT>这个类的成员都是静态的<FONT face="Times New Roman">)</FONT>:



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt">l<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>属性



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">包括<FONT face="Times New Roman">3</FONT>个:<FONT face="Times New Roman">Database</FONT>(获取当前数据库),<FONT face="Times New Roman">Editor</FONT>(获取<FONT face="Times New Roman">AutoCAD</FONT>命令行),<FONT face="Times New Roman">TransactinManager(</FONT>获取事务处理管理器<FONT face="Times New Roman">)</FONT>。通过这三个属性,你就不要再输入诸如Application.<SPAN style="COLOR: black">DocumentManager.MdiActiveDocument.Database</SPAN>这么长的代码了,而只要简单地写为<FONT face="Times New Roman">Tools.Database</FONT>。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt">l<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>函数



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt">按照函数的功能可以分为以下几类:



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 39.0pt"><FONT face="Times New Roman">1.<SPAN style="FONT: 7pt 'Times New Roman'">                                               </FONT></SPAN>加入对象



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt">包括以下几个:



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static ObjectId AddEntity(Entity ent);</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">这个函数向<FONT face="Times New Roman">AutoCAD</FONT>数据库加入实体类对象(如直线、圆等),下面的代码向数据库加入一条直线:



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt"><FONT face="Times New Roman">Line line;</FONT>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt"><FONT face="Times New Roman">…….</FONT>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt"><FONT face="Times New Roman">Tools.AddEntity(line);</FONT>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static ObjectId AddSymbolTableRecord(SymbolTableRecord str,ObjectId symbolTableId)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">这个函数向<FONT face="Times New Roman">AutoCAD</FONT>数据库加入符号表记录,符号表是<FONT face="Times New Roman">AutoCAD</FONT>数据库中的一系列表如层、线型等。函数的输入参数一个为要加入的符号表记录对象(<FONT face="Times New Roman">str</FONT>),另一个是符号表记录要加入的符号表的对象<FONT face="Times New Roman">Id</FONT>(可以通过访问数据库的属性获得,如<FONT face="Times New Roman">LayerTableId</FONT>属性就表示数据库的层表)。下面的代码向数据库添加一个新层:



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt"><FONT face="Times New Roman">LayerTableRecord ltr;</FONT>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt"><FONT face="Times New Roman">……</FONT>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt"><FONT face="Times New Roman">Tools.AddSymbolTableRecord(ltr,Tools.Database.LayerTableId);</FONT>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt"><FONT face="Times New Roman">        <o:p></o:p></FONT>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static ObjectId AddDictionaryObject(string searchKey)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">加入字典对象。关于字典对象的有关介绍,请看我以后写的文章。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static ObjectId AddDictionaryObject(string searchKey,DBObject newValue,ObjectId ownerId)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">加入字典类对象,如扩展对象、组等。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 39.0pt"><FONT face="Times New Roman">2.<SPAN style="FONT: 7pt 'Times New Roman'">                                               </FONT></SPAN>设置或读取对象的通用属性



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">通用属性包括:颜色(<FONT face="Times New Roman">Color</FONT>),颜色索引<FONT face="Times New Roman">(ColorIndex)</FONT>,层<FONT face="Times New Roman">(Layer)</FONT>,线型<FONT face="Times New Roman">(Linetype)</FONT>,线型比例<FONT face="Times New Roman"> (LinetypeScale)</FONT>,线宽<FONT face="Times New Roman">(LineWeight)</FONT>,打印样式名<FONT face="Times New Roman">(PlotStyleName)</FONT>和可见性<FONT face="Times New Roman">(Visible)</FONT>。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">设置通用属性的函数都以<FONT face="Times New Roman">Put</FONT>开头再加上对应的通用属性名,如设置对象颜色的函数为<FONT face="Times New Roman">PutColor</FONT>。设置每一种通用属性的函数都有两种形式,下面以设置颜色的函数为例来进行说明。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">第一种形式为<FONT face="Times New Roman">PutColor(Entity ent,Color color)</FONT>,第一个参数为对象的实例,第二个参数则是要设置的值。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">第二种形式为<FONT face="Times New Roman">PutColor</FONT>(<FONT face="Times New Roman">ObjectId id,Color color</FONT>),第一个参数为对象实例的<FONT face="Times New Roman">Id</FONT>,第二个参数则是要设置的值。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">获取通用属性的函数都以<FONT face="Times New Roman">Get</FONT>开头再加上对应的通用属性名,如获取对象颜色的函数为<FONT face="Times New Roman">GetColor</FONT>。也有两种形式,下面以获取颜色的函数为例来进行说明。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">第一种形式为<FONT face="Times New Roman">GetColor(Entity ent)</FONT>,输入参数为对象的实例。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">第二种形式为<FONT face="Times New Roman">GetColor</FONT>(<FONT face="Times New Roman">ObjectId id</FONT>),输入参数为对象实例的<FONT face="Times New Roman">Id</FONT>。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 39.0pt"><FONT face="Times New Roman">3.<SPAN style="FONT: 7pt 'Times New Roman'">                                               </FONT></SPAN>变换操作



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">令人非常不解的是在<FONT face="Times New Roman">ObjectARX </FONT>托管封装类中,实体类<FONT face="Times New Roman">(Entity)</FONT>没有诸如旋转、平移、缩放之类的函数,你只能通过实体类的<FONT face="Times New Roman">TransformBy()</FONT>函数来实现这些变化操作。而<FONT face="Times New Roman">TransformBy()</FONT>函数由于要使用到一个矩阵参数,用起来不是很方便。在<FONT face="Times New Roman">ZHFARX</FONT>库中,已经给大家重新编写了用于变换操作的函数,你可以使用它们来方便地进行相关的变换操作。变换操作函数有两种形式,区别是第一个输入函数可以是实体对象的实例,也可以是实体对象的<FONT face="Times New Roman">Id</FONT>,在下面的介绍中我只介绍输入参数是实体对象的实例的那一种,对于另一种形式,你只要把相应的输入参数改成实体对象的<FONT face="Times New Roman">Id</FONT>就可以了。变换操作函数如下:



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static void Move(Entity ent,Point3d fromPoint,Point3d toPoint)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">把实体<FONT face="Times New Roman">ent</FONT>从点<FONT face="Times New Roman">fromPoint</FONT>移动到点<FONT face="Times New Roman">toPoint</FONT>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static void Rotate(Entity ent,Point3d basePoint,double rotationAngle)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">以点<FONT face="Times New Roman">basePoint</FONT>为基准点,把实体<FONT face="Times New Roman">ent</FONT>旋转<FONT face="Times New Roman">rotationAngle</FONT>角度(为弧度值)。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static void Scale(Entity ent,Point3d basePoint,double scaleFactor)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">以点<FONT face="Times New Roman">basePoint</FONT>为基准点,把实体<FONT face="Times New Roman">ent</FONT>缩放<FONT face="Times New Roman">scaleFactor</FONT>倍<FONT face="Times New Roman">(&gt;1</FONT>为放大,<FONT face="Times New Roman">&lt;1</FONT>为缩小<FONT face="Times New Roman">)</FONT>。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static ObjectId Mirror(Entity ent,Point3d mirrorPoint1,Point3d mirrorPoint2,bool eraseSourceObject)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">对实体<FONT face="Times New Roman">ent</FONT>以由点mirrorPoint1和点mirrorPoint2组成的直线线进行镜像拷贝,参数eraseSourceObject表示是否删除源对象。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 39.0pt"><FONT face="Times New Roman">4.<SPAN style="FONT: 7pt 'Times New Roman'">                                               </FONT></SPAN>其它一些常用的操作函数



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static ObjectId Copy(Entity ent)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">对实体<FONT face="Times New Roman">ent</FONT>进行复制,还有一个重载函数,输入参数为实体的<FONT face="Times New Roman">Id</FONT>。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static void Erase(Entity ent)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">删除实体<FONT face="Times New Roman">ent</FONT>,还有一个重载函数,输入参数为实体的<FONT face="Times New Roman">Id</FONT>。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static Entity GetEntity(ObjectId id)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">通过对象<FONT face="Times New Roman">Id</FONT>来获得实体对象(而获得实体的对象<FONT face="Times New Roman">Id</FONT>,你只要访问它的<FONT face="Times New Roman">ObjectId</FONT>属性就可以了)。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static DBObject GetDBObject(ObjectId id)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">通过对象<FONT face="Times New Roman">Id</FONT>来获得非实体类对象。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static DBObjectCollection GetIteratorForSymbolTable(ObjectId id)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">获取用于遍历符号表(由<FONT face="Times New Roman">id</FONT>表示)的遍历器(对象集合)。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static ObjectIdCollection GetIteratorForSymbolTableID(ObjectId id)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">获取用于遍历符号表(由<FONT face="Times New Roman">id</FONT>表示)的遍历器(对象<FONT face="Times New Roman">Id</FONT>集合)。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo2; tab-stops: list 63.0pt">&Oslash;<SPAN style="FONT: 7pt 'Times New Roman'">                                                               </SPAN>public <SPAN style="COLOR: blue">static Point3d GetMidPoint(Point3d pt1,Point3d pt2)</SPAN>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt">获取两点表示的线段的中点。(呵呵,本来还想写诸如求交点、判断是否平行、垂直等的数学函数,但<FONT face="Times New Roman">ObjectARX</FONT>托管封装类都有相关的函数,就没有写)。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">终于介绍完了<FONT face="Times New Roman">Tools</FONT>类的成员,再来介绍<FONT face="Times New Roman">ZHFARX</FONT>库中其它的类。<FONT face="Times New Roman">Tools</FONT>类外的其它类都是一些对<FONT face="Times New Roman">AutoCAD</FONT>实体类如直线、圆等的改写,以方便<FONT face="Times New Roman">.NET</FONT>程序的编写。到目前的<FONT face="Times New Roman">ZHFARX</FONT>版本为止,我改写的实体类有:直线<FONT face="Times New Roman">(Line)</FONT>,圆<FONT face="Times New Roman">(Circle)</FONT>,圆弧<FONT face="Times New Roman">(Arc)</FONT>,椭圆<FONT face="Times New Roman">(Ellipse)</FONT>,多段线<FONT face="Times New Roman">(Polylines</FONT>,这个多段线是二维的,也就轻量多段线<FONT face="Times New Roman">)</FONT>,单行文本<FONT face="Times New Roman">(DBText</FONT>,请大家注意,在<FONT face="Times New Roman">ObjectARX</FONT>托管封装类中单行文本所在的类不是<FONT face="Times New Roman">Text</FONT>,而是<FONT face="Times New Roman">DBText)</FONT>,多行文本(<FONT face="Times New Roman">MText</FONT>),表格<FONT face="Times New Roman">(Table)</FONT>,填充<FONT face="Times New Roman">(Hatch)</FONT>,各种标注<FONT face="Times New Roman">(</FONT>包括对齐标注<FONT face="Times New Roman">AlignedDimension</FONT>、直径标注<FONT face="Times New Roman">DiametricDimension</FONT>、角度标注<FONT face="Times New Roman">LineAngularDimension2</FONT>、半径标注<FONT face="Times New Roman">RadialDimension</FONT>和旋转标注<FONT face="Times New Roman">RotatedDimension)</FONT>。改写的实体类都是由这些实体类派生的,实体类的所有函数和属性改写类都可以使用。改写类的名字为实体类原名后加上<FONT face="Times New Roman">s</FONT>,如改写的直线类就是<FONT face="Times New Roman">Lines</FONT>,而改写的圆类就是<FONT face="Times New Roman">Circles</FONT>。你可能要说了,改写这些类有什么用?呵呵,答案有两个。一个是为了方便创建实体,另外一个就是你可以方便地修改实体的属性,不管它有没有加入到数据库中。<FONT face="Times New Roman">ObjectARX</FONT>的托管封装类中创建<FONT face="Times New Roman">AutoCAD</FONT>实体的函数,也就是构造函数,通常只有一种形式,如圆只能通过圆心、半径还有一个基本上不需要使用的法向量来创建。而我们知道在<FONT face="Times New Roman">AutoCAD</FONT>中有许多种创建圆的方式,如通过三点、通过二点的直径来创建圆。在<FONT face="Times New Roman">ZHFARX</FONT>库的<FONT face="Times New Roman">Circles</FONT>类中就包含了这些创建圆的构造函数。下面的例子说明了通过三点来创建一个圆:



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><FONT face="Times New Roman">Circles circle=new Circles(pt1,pt2,pt3);</FONT>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">关于这些构造函数的说明,大家可以参考附件中的帮助文档,里面有详细的说明。



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">通过前面的介绍,你已经知道加入到数据库中的实体是不能直接访问的,而这些改写的类就可以。下面就以两段代码作比较来说明<FONT face="Times New Roman">(</FONT>以圆为例<FONT face="Times New Roman">)</FONT>,首先来看一般的实体类:



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><FONT face="Times New Roman">Circle circle=new Circle (center,normal,radius);</FONT>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><FONT face="Times New Roman">circle.Radius=1;//</FONT>由于圆还没有加入到数据库中,改变圆的半径属性是允许的



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><FONT face="Times New Roman">Tools.AddEntity(circle);//</FONT>利用<FONT face="Times New Roman">ZHFARX</FONT>库的简化函数把圆加入到数据库中



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><FONT face="Times New Roman">circle. Radius =2;</FONT>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><FONT face="Times New Roman">//</FONT>这句是错误的,因为圆已经加入到数据库中,你必须首先打开它,然后再进行相关



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><FONT face="Times New Roman">//</FONT>的操作,不能这样直接访问圆



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><FONT face="Times New Roman">        <o:p></o:p></FONT>



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">下面是改写类的代码:



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">                                               Circles circle =new Circles (center, radius);//</FONT></SPAN>呵呵,连构造函数也比上面的简单了



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">                                               circle. Radius =1;//</FONT></SPAN>在圆没有加入到数据库之前,改变圆的半径属性



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">                                               Tools.AddEntity(circle);//</FONT></SPAN>利用<FONT face="Times New Roman">ZHFARX</FONT>库的简化函数把圆加入到数据库中



<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">                                               circle. Radius =2;// </FONT></SPAN>圆虽然已加入到数据库中,但你仍然可以直接修改它的属性


还有一点大家要注意的是,对于诸如颜色、层等的通用属性,请使用Tools类的Get类和Put类函数(关于这些函数,请大家参考前面的内容),这些函数对于一般类和改写类都是适用的。        


最新版本的ZHFARX库(版本1.1)





ZHFARX库函数的说明文档










ahlzl 发表于 2005-5-15 18:16:00

<A name=31589><FONT color=#990000><B>zhf7878</B></FONT></A>斑竹,这个库是用C#封装的,还是用VC++。NET封装的?如果是前者,能否给出一部分源代码,如Circle类。另,帮助文件好象有点问题:\ZHFARX帮助文档\ZHFARX\ZHFARX.HTM和\ZHFARX帮助文档\ZHFCAD\ZHFCAD.HTM都是空文件!

zhf7878 发表于 2005-5-16 20:19:00

帮助文档在解压后的根目录下,有个名字为ZHFARX帮助文档的就是了。


这个库是用C#封装的。

ahlzl 发表于 2005-5-16 20:26:00

zhf7878发表于2005-5-16 20:19:00static/image/common/back.gif这个库是用C#封装的。

<BR>方便的话,能否介绍一下封装的方法,举一个例子,发一些代码上来。如:Circles类。

zhf7878 发表于 2005-5-22 18:29:00

请大家重新下载最新的帮助文档,为chm格式
页: [1]
查看完整版本: .NET 开发AutoCAD2006指南(二)