欢迎来到我的博客
Civil 3D开发与应用,欢迎加入QQ群:484124761
AutoCAD开发,欢迎加入QQ群:193522571

Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线

在方法CreateLine内完成以下代码:

01 public void CreateLine()

02 {

03     PromptPointOptions ppo = new PromptPointOptions("\n拾取直线起点:");

04     PromptPointResult ppr = ed.GetPoint(ppo);

05     if (ppr.Status != PromptStatus.OK) return;

06     Point3d startPt = ppr.Value;

07     ppo.Message = "\n拾取直线终点: ";

08     ppo.UseBasePoint = true;

09     ppo.BasePoint = startPt;

10     ppr = ed.GetPoint (ppo);

11     if (ppr.Status != PromptStatus.OK) return;

12     Point3d endPt = ppr.Value;

13     Entity line = new Line(startPt, endPt);

14     AddEntToModelSpace(line);

15 }

 

 

01 声明方法CreateLine()

02 {

03     定义ppo变量,“拾取直线起点:”将出现在命令行向用户发出提示

04     从editor获取点

05     判断输入结果,如果结果不ok,退出

06     直线起点

07     修改ppo提示文本,为获取终点做准备

08     设置使用基点属性为真,拾取终点时可从起点拉一根橡皮筋

09     设置基点

10     从editor获取点

11     判断输入结果,如果结果不ok,退出

12     直线终点

13     创建line实体

14     将line实体添加到模型空间

15 }

在这里提出一个问题: Entity line = new Line(startPt, endPt);为什么可以这样写呢?可不可以写成Line line = new Line(startPt, endPt);呢?还有没有其他的方式可以呢?这个问题留给您去思考。

暂时搞不明白也不影响什么,让我接着实现方法AddEntToModelSpace。这个方法在您以后的代码中可能会多次出现。

01 private void AddEntToModelSpace(Entity ent)

02 {

03     using (Transaction tr = db.TransactionManager.StartTransaction())

04     {

05             BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;

06             BlockTableRecord btr = bt[BlockTableRecord.ModelSpace]

07                  .GetObject(OpenMode.ForWrite) as BlockTableRecord;

08             btr.AppendEntity(ent);

09             tr.AddNewlyCreatedDBObject(ent, true);

10             tr.Commit();

11     }

12 }

 

 

01 声明方法,输入参数为entity类型

02 {

03     定义tr变量,开启事务

04     {

05               获取块表,打开方式为只读

06               获取模型空间块表记录,打开方式为写入

07               接上一行

08               将ent添加到块表记录(模型空间)中

09               将新创建的实体添加到事务中

10               事务提交

11     }

12 }

上述代码实现了将实体对象添加至模型空间的操作,这是一个简化版本,有时我们可能需要返回新建对象的ObjectId,或者需要将对象添加到布局(图纸空间)或其他块表记录(图块定义)中,您可以查找相关资料自行完成。

至此,创建一条直线的代码就完成了,接下来让我们完善命令相关的代码。打开另一个类文件myCommands.cs,如果您是用向导创建的项目,一定会有这个文件的。添加或复制修改原有方法,使其与下面的类似:

01 public class MyCommands

02 {

03     [CommandMethod("MyGroup", "CreateLine","CreateLineLocal",CommandFlags.Modal)]

04     public void CreateLine()

05     {

06             CreateEntityDemo ced = new CreateEntityDemo();

07             ced.CreateLine();

08     }

09 }

 

注意这里的CreateLine方法名称与CreateEntityDemo类中的方法名称是一样的,会不会混淆呢?如果不明白,请翻阅命名空间相关章节,重复加深一下印象。

编译、加载,在命令行中输入命令CreateLine,拾取起点、终点,不出意外的话,成功创建一条直线。接下来可以试着在拾取点的过程中按下Esc键,或者直接用键盘输入点的坐标,看一下是什么效果。

5‑2 创建直线

对比一下内部命令Line,看有什么区别,怎样才能跟内部命令类似呢?您可以在AutoCAD Managed .NET Developer's Guide 中搜索关键字:keyword,并在其他资源搜索关键字:递归。

posted @ 2017-06-21 16:32  david96007  阅读(884)  评论(0编辑  收藏  举报