zoukankan      html  css  js  c++  java
  • Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线

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

    01 public void CreateLine()
    
    02 {
    
    03     PromptPointOptions ppo = new PromptPointOptions("
    拾取直线起点:");
    
    04     PromptPointResult ppr = ed.GetPoint(ppo);
    
    05     if (ppr.Status != PromptStatus.OK) return;
    
    06     Point3d startPt = ppr.Value;
    
    07     ppo.Message = "
    拾取直线终点: ";
    
    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,并在其他资源搜索关键字:递归。

  • 相关阅读:
    MVC+EF 理解和实现仓储模式和工作单元模式 MVC+EF 理解和实现仓储
    ANDROID中BROADCASTRECEIVER的两种注册方式(静态和动态)详解
    企业微信通讯录组件一个机制
    linq查询DataTable中的某列去重数据
    C# 判断文件流类型
    js中使用settimeout的问题
    一个做流程的开源库
    javascript判断两个日期是否相等
    开发小贴士
    zepto.js与jquery.js
  • 原文地址:https://www.cnblogs.com/myzw/p/7060271.html
Copyright © 2011-2022 走看看