在方法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,并在其他资源搜索关键字:递归。

Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线的更多相关文章

  1. Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点

    这一小节,我们创建派生于CivilCreateEntityDemo的类CivilCreateCogoPoint,来创建几何空间点. 1 创建类并添加字段及方法 首先在项目资源管理器中向本项目中添加类, ...

  2. 学习 Civil 3D二次开发从哪儿开始?

    1.1 从哪儿开始 对于多数的工程设计人员,不完全具备上节所述的各种条件.对于Civil 3D的应用可能比较熟悉:但对于计算机语言,只限于上学时所学的一点基础知识,步入工作岗位后与计算机语言基本无缘: ...

  3. Civil 3D 二次开发 创建AutoCAD对象—— 00 ——

    不积跬步无以至千里,不积小流无以成江海.虽然创建一条直线.添加一个图层这样的小程序没有什么实际意义(内部命令很简单就可以完成),但对于初学二次开发的您来说,这可是一大步,这一步跨出去,您就跨进了二次开 ...

  4. Civil 3D 二次开发 创建Civil 3D 对象—— 00 ——

    本节中我们通过创建几何空间点.曲面和采样线了解Civil 3D对象的创建方法.因Civil 3D对象的创建方法相比AutoCAD对象创建要简单的多,比如创建一个几何空间点,最简单的情况采用一行代码(没 ...

  5. Civil 3D 二次开发 事务

    事务,一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 对于初学者来说,从字面上难以理解什么是事务.下面我试着通过讲述事务的作用及特性来帮 ...

  6. Civil 3D 二次开发 名称模板不能正常工作

    using Autodesk.AECC.Interop.Land; using Autodesk.AECC.Interop.UiLand; using Autodesk.AutoCAD.Applica ...

  7. Civil 3D 二次开发 新建CLR项目出现错误C2143

    新建CLR项目出现错误C2143 按照Objectarx Training创建.net混合项目,编译时出现一下错误: 原因不明: 解决方法: 在Stdafx.h文件中添加: #define WIN32 ...

  8. Civil 3D 二次开发 翻转曲面高程分析颜色

    不解释,直接上代码及截图. [CommandMethod("RvsSEA")] public void ReverseSurfaceElevationAnalysis() { Ci ...

  9. C#/AutoCAD 2018/ObjectArx/二次开发添加圆对象的的例子(五)

    C#/AutoCAD 2018/ObjectArx/二次开发添加圆对象的的例子(五) 1.创建一个图形对象的步骤如下见上一篇博客(三)2.添加删除实体的工具函数见上一篇博客(四) 3.添加圆的例子(完 ...

随机推荐

  1. LOJ6036 编码 2-SAT、Trie

    传送门 每个串只有一个?,?还只能填0或者1,不难想到2-SAT求解. 一个很暴力的想法是枚举?填0或者1,然后对所有可能的前缀连边.这样边数是\(O(n^2)\)的,需要优化. 看到前缀不难想到Tr ...

  2. .NET下日志系统的搭建——log4net+kafka+elk

    .NET下日志系统的搭建--log4net+kafka+elk 前言     我们公司的程序日志之前都是采用log4net记录文件日志的方式(有关log4net的简单使用可以看我另一篇博客),但是随着 ...

  3. 如何写出没有BUG的代码

    1947年9月9日,美国海军准将 Grace Hopper 在哈佛学院计算机实验室里使用 Mark II 和 Mark III 计算机进行研究工作.她的团队跟踪到 Mark II 上的一个错误,操作人 ...

  4. 腾讯 Omi 5.0 发布 - Web 前端 MVVM 王者归来,mappingjs 强力加持

    写在前面 腾讯 Omi 框架正式发布 5.0,依然专注于 View,但是对 MVVM 架构更加友好的集成,彻底分离视图与业务逻辑的架构. 你可以通过 omi-cli 快速体验 MVVM: $ npm ...

  5. 腾讯发布新版前端组件框架 Omi,全面拥抱 Web Components

    Omi - 合一 下一代 Web 框架,去万物糟粕,合精华为一 → https://github.com/Tencent/omi 特性 4KB 的代码尺寸,比小更小 顺势而为,顺从浏览器的发展和 AP ...

  6. [WPF]何如在Win7使用Aero2主题

    1. 问题 假设我在Windows10的环境新建一个4.6的WPF项目,添加一个ComboBox,并用Blend在这个ComboBox上右键"编辑模板"->"编辑副 ...

  7. Golang中进行reslice时的注意事项

    先看下面代码: package main import "fmt" func main() { slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8} ...

  8. MySQL Limit优化(转)

    原文:http://bbs.landingbj.com/t-0-240894-1.html 首先,我们看一个分页SQL: SELECT time,pageFROM `l_not_200_page`WH ...

  9. JS刷新当前页面的几种方法总结

    reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页 ...

  10. React Native之FlatList的介绍与使用实例

    React Native之FlatList的介绍与使用实例 功能简介 FlatList高性能的简单列表组件,支持下面这些常用的功能: 完全跨平台. 支持水平布局模式. 行组件显示或隐藏时可配置回调事件 ...