Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点
这一小节,我们创建派生于CivilCreateEntityDemo的类CivilCreateCogoPoint,来创建几何空间点。
1 创建类并添加字段及方法
首先在项目资源管理器中向本项目中添加类,名称为CivilCreateCogoPoint,转到文本编辑器,先为类添加几个字段:
01 static int PointNumber = 1;
02 static string PointName = "CogoPoint";
03 static string PointDesc = "手动创建的几何空间点";
04 CogoPointCollection cps;
这里需要注意的是关键字static,表示这几个字段为静态字段,关于静态字段的您可以查询C#相关书籍获取更多资料。在声明静态字段的同时为其赋值初始化。
接下来添加构造函数,可以在文本编辑器中直接键入构造函数,也可以通过以下方式进行添加:查看该类的类图,鼠标右键菜单中添加→构造函数。如下图:
5‑8 添加构造函数
返回文本编辑器,添加基类。在类名称后面添加:“冒号 基类名称”,之后看起来应该像下面这样:
class CivilCreateCogoPoint : CivilCreateEntityDemo
鼠标悬停在基类名称处,出现 图标后单击或直接采用快捷键Shift+Alt+Q弹出如下窗口:
5‑9 实现虚方法
单击Implement Virtual Methods,出现如下对话框,并按下图进行勾选:
5‑10 选择要实现的虚方法
现在文本编辑器中的的代码应该与下面类似:
01 class CivilCreateCogoPoint : CivilCreateEntityDemo 02 { 03 static long PointNumber = 1; 04 static string PointName = "CogoPoint"; 05 static string PointDesc = "手动创建的几何空间点"; 06 CogoPointCollection cps; 07 public CivilCreateCogoPoint() //构造函数 08 { 09 throw new System.NotImplementedException(); 10 } 11 override public void CivilCreateEntity() //重写基类方法 12 { 13 throw new NotImplementedException(); 14 } 15 }
1 实现方法
这里需要注意的是第11行代码中的关键字override,这表示该方法将重写基类中的方法。接下来我们完成这两个方法:
首先是构造函数,有时派生类的构造函数需要调用基类的构造函数,可在派生类构造函数后面输入“冒号 base(相应的参数列表)”,本例中基类构造函数只有一个,所以只需添加“: base()”。在构造函数中添加以下代码:
01 public CivilCreateCogoPoint() : base()
02 {
03 GetString("\n输入几何空间点名称前缀", ref PointName);
04 GetString("\n输入几何空间点描述", ref PointDesc);
05 cps = civilDoc.CogoPoints;
06 }
代码第3、4行用于在类初始化过程中从命令行获取几何空间点名称前缀及描述文本。第5行,是Civil 3D二次开发中经常要用到的方法——从Civil 3D文档中获取特定的集合。下面先来看一下civilDoc这个字段,这个字段是基类的字段,为了使派生类能够访问,使用了protected关键字来修饰。其值是什么?我们可以回到基类的构造函数看一看:
civilDoc = CivilApplication.ActiveDocument;
有关更详细的信息可以回到Civil 3D对象层次结构相关章节进行再此进行消化。
字段CogoPointCollection cps为几何空间点集,我们可以直接从civilDoc中使用属性CogoPoints来获取。这是Civil 3D中各种几何获取的常用方法,在后续文章中曲面等对象集合,也是通过类似方法获取的,您要注意分析总结。
接下来我们看一看本节的核心内容,方法CivilCreateEntity,在此方法中,我们将通过在屏幕上拾取点,来创建几何空间点。
01 override public void CivilCreateEntity() 02 { 03 PromptPointOptions ppo = new PromptPointOptions("\n拾取点:"); 04 PromptPointResult ppr = ed.GetPoint(ppo); 05 if (ppr.Status != PromptStatus.OK) return; 06 Point3d pt = ppr.Value; 07 ObjectId pointId = cps.Add(pt, false); 08 using (Transaction tr = db.TransactionManager.StartTransaction()) 09 { 10 CogoPoint cp = pointId.GetObject(OpenMode.ForWrite) as CogoPoint; 11 cp.PointName = PointName + PointNumber; 12 cp.RawDescription = PointDesc; 13 tr.Commit(); 14 } 15 PointNumber++; 16 CivilCreateEntity(); 17 }
第3-6行代码之前章节多次出现,从屏幕上获取点,不再解释。
第7行代码,是Civil 3D创建对象的常用方法——很多对象的创建都是通过向其集合中添加新对象的方式来实现的。该方法返回值为创建对象的ObjectId。
第8-14行,对新创建的几何空间点的属性进行了设置,在设置前,需要开启事务将其打开,因为这个几何空间点已经添加到数据库中了。
第15行,对点号进行了递增,这个点编号与Civil 3D的点编号不同,这里只是为了演示类的静态字段如何工作,可能会引起混淆。程序加载后,用这个程序创建了多少个几何空间点,将由这个静态字段来统计。
第16行,调用自己——递归,重复执行操作,以便连续创建多个点。在拾取点的过程中,按下Esc键将退出。
完成命令,转到MyCommands类中,添加方法如下:
01 [CommandMethod("MyGroup", "CCCP", CommandFlags.Modal)]
02 public void CivilCreateCogoPoint()
03 {
04 CivilCreateEntityDemo cced = new CivilCreateCogoPoint();
05 cced.CivilCreateEntity();
06 }
注意代码的第4行,等号左侧变量类型为基类CivilCreateEntityDemo,而等号右侧却是新建的派生类CivilCreateCogoPoint。
编译加载,输入命令CCCP,输入点名称及描述,拾取点、拾取点……按下ESC。
我第一次执行命令过程中没有改变点名称及描述,在第二次执行时修改了这两个值,如果第三次执行该命令,这两个值是什么呢?您可以试验一下,然后体会静态字段的用处。命令执行完后,在工具空间中找到点编组→所有点,查看一下刚创建的几个点。
现在再次回忆一下创建几何空间点的步骤:获取CivilDocument,获取CogoPoints,然后Add。就这么简单,在MyCommands类中添加如下方法:
01 [CommandMethod("MyGroup", "Test", CommandFlags.Modal)]
02 public void Test()
03 {
04 CivilApplication.ActiveDocument.CogoPoints.Add(new Point3d(),false);
05 }
编译加载,输入命令,test,看能否在原点创建一个几何空间点。方法中的代码是不是只有一行?
文档→集合→Add,记住了吗?
对比一下AutoCAD对象的创建过程,Civil 3D对象的创建是不是很简单呢?
有没有更多的方法创建几何空间点呢?来让我们查看一下Civil 3D .NET API Reference,能够找到如下信息,这里有6种重载的方法,我们可以根据不同的情况选择适合的方法,具体的用法查看API Reference,以后类似情况将不再介绍。
5‑12 CogoPointCollection.Add重载方法
问题:有哪些对象的创建方法与创建几何空间点类似?