Civil 3D 二次开发 创建Civil 3D 对象—— 00 ——
本节中我们通过创建几何空间点、曲面和采样线了解Civil 3D对象的创建方法。因Civil 3D对象的创建方法相比AutoCAD对象创建要简单的多,比如创建一个几何空间点,最简单的情况采用一行代码(没写错,就是一行)就能实现,类似的操作,您完全可以去Developer’s Guide中查看,因此在本节加入了类的继承及多态的一些知识,这是让程序更加高效、使代码更为简洁的有效方式。我自己在学习Civil 3D二次开发之初,按照Developer’s Guide中的样例去写,结果发现存在大量的重复代码,究其原因,是对类没有很好的理解和应用,所以,即使会给您阅读本节内容造成不小的困难,我也要把您往面向对象程序设计的路上引领。如果您只想采用结构化程序设计,可以只关注我对Civil 3D对象创建方法的分析及帮助文档查询方法的介绍就行了,之后参考Developer’s Guide其他的示例。
上一节中,我们在同一个类CreateEntityDemo中创建了三个方法,分别创建了直线、图层、布局,这一节我们将创建一个名为CivilCreateEntityDemo的基类和三个名称分别为CivilCreateCogoPoint、CivilCreateTinSurface、CivilCreateSampleLine的派生类,在每个类中的采用重写(override)基类方法CivilCreateEntity的方式完成相应的操作。在完成命令方法的时候,通过多态来完成不同的操作。
下面就让我先来创建基类CivilCreateEntityDemo:
在解决方案按中添加类,名称CivilCreateEntityDemo,并添加4个字段、构造函数及方法CivilCreateEntity及GetString(从editor获取字符串)。为了实现派生类能够访问基类的字段,需要采用protected关键字来修饰。为了派生类能够重写基类的方法,方法CivilCreateEntity需要用virtual关键字修饰。在构造函数中初始化各个字段,在GetString方法中添加相应代码。现在你的代码应该类似如下:
01 class CivilCreateEntityDemo 02 { 03 protected Document doc; 04 protected Database db; 05 protected Editor ed; 06 protected CivilDocument civilDoc; 07 public CivilCreateEntityDemo() //构造函数 08 { 09 doc = Application.DocumentManager.MdiActiveDocument; 10 ed = doc.Editor; 11 db = doc.Database; 12 civilDoc = CivilApplication.ActiveDocument; 13 } 14 virtual public void CivilCreateEntity() //可重写的虚方法 15 { 16 ed.WriteMessage("\n我什么也没做!"); 17 } 18 public void GetString(string mess, ref string stringOut) //获取字符串 19 { 20 PromptStringOptions pso = new PromptStringOptions(mess); 21 pso.UseDefaultValue = true; 22 pso.DefaultValue = stringOut; 23 PromptResult pr = ed.GetString(pso); 24 if (pr.Status == PromptStatus.OK) 25 { 26 stringOut = pr.StringResult; 27 } 28 } 28 }
再次强调如下:注意第3-6行的protected关键字,注意第14行的virtual关键字。第16行中代码是为了测试用的,如果您有兴趣想测试一下调用基类方法或在派生类中没有重写相应方法时,可以向命令行输出相应的信息。
字段应设为私有(用private来修饰)更合适,这里为了简化代码,采用了protected来修饰。如果采用来private修饰,需要增加属性,以便派生类能顺利访问基类的字段。关于属性,您可以查阅C#相关书籍获取更多信息。
一个简单的基类准备完成,下面我们就创建多个派生类来完成创建Civil 3D对象。