基于C#的AutoCAD二次开发之块操作

基于C#的AutoCAD二次开发之块操作基于C#的AutoCAD二次开发之块操作什么是块?块由多个在逻辑上相关的图形对象所定义的整体。块的优点有哪些统一作业标准、提高作业效率压缩图形文件便于修改和维护块的分类块的分类简单块、属性块、动态块块的操作主要由哪些?块的定义(命令Block)块的插入(命令Insert)块的编辑块的操作方法块是存储于块表记录中的实体对象集合;模型空间是存储于块表记…

基于C#的AutoCAD二次开发之块操作

  1. 什么是块?
    块由多个在逻辑上相关的图形对象所定义的整体。

  2. 块的优点有哪些
    统一作业标准、提高作业效率
    压缩图形文件
    便于修改和维护
    块的分类

  3. 块的分类
    简单块、属性块、动态块

  4. 块的操作主要由哪些?
    块的定义(命令Block)
    块的插入(命令Insert)
    块的编辑

  5. 块的操作方法
    块是存储于块表记录中的实体对象集合;模型空间是存储于块表记录中的一种特殊的块;普通块中实体操作方法与模型空间中实体操作一致。
    6.如何用程序来定义块

  • 用Transaction类的GetObject()函数获得块表对象;
  • 创建BlockTableRecord对象并设置块名称;
  • 创建组成块的实体对象;
  • 调用BlockTableRecord类的AppendEntity函数将组成块的实体写入块表记录中;
  • 调用BlockTable类的Add函数将创建的块表记录写入当前图形的块表中。
  1. 简单块的创建
  • 创建如下图所示的由3条直线和1个圆弧组成的名为Door的块。
基于C#的AutoCAD二次开发之块操作
  • 实现代码
[CommandMethod("blockCreate02")]
public void BlockCreate02()
{ 
   
    AddEntityByDB aedb = new AddEntityByDB();
    Database db = HostApplicationServices.WorkingDatabase;

    String blockName = "door";
    List<Entity> list = new List<Entity>();
    //创建图形,设置门框的左边线 
    Point3d pt1 = Point3d.Origin;
    Point3d pt2 = new Point3d(0, 1, 0);
    Point3d pt3 = new Point3d(1, 0, 0);
    Line leftLine = new Line(pt1, pt2);
    Line rightLine = new Line(pt1, pt3);
    Arc arc = new Arc(new Point3d(0, 0, 0), 1, 0, Math.PI / 2.0);
    list.Add(leftLine);
    list.Add(rightLine);
    list.Add(arc);
    //调用抽取的公共代码块
    AddBlockThroughDB(db, blockName, list);
}

/** * 以事务的方式,创建块对象 * */
 public void AddBlockThroughDB(Database db, String blockName, List<Entity> ents)
 { 
   
     Transaction trans = db.TransactionManager.StartTransaction();
     BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForWrite);
     if (!bt.Has(blockName))
     { 
   
         BlockTableRecord btr = new BlockTableRecord();
         btr.Name = blockName;
         for (int ii = 0; ii < ents.Count; ii++)
         { 
   
             Entity ent = ents[ii];
             btr.AppendEntity(ent);
         }
         bt.Add(btr);
         trans.AddNewlyCreatedDBObject(btr, true);
         trans.Commit();
     }
 }
  1. 块的插入
  • 几个要素
    块名、插入位置、旋转角度和缩放比例、Database命名空间下的BlockReference类
    在这里插入图片描述在这里插入图片描述与实体插入方法一致
  • 块的插入示例
    将上例创建的名为Door的块,插入到当前视图中,位置为(0,0,0),尺寸为原来2倍,不进行旋转。
基于C#的AutoCAD二次开发之块操作
  • 实现代码
[CommandMethod("InsertDoor")]
public void InsertDoor()
{ 
   
    Database db = HostApplicationServices.WorkingDatabase;

    using (Transaction trans = db.TransactionManager.StartTransaction())
    { 
   
        BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);
        BlockTableRecord space = db.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
        //判断名为“door”的块是否存在
        if(! bt["door"].IsNull)
        { 
   
            BlockReference br = new BlockReference(Point3d.Origin, bt["door"]);
            br.ScaleFactors = new Scale3d(2.0);//设置尺寸为原来2倍
            space.AppendEntity(br);
            trans.AddNewlyCreatedDBObject(br, true);

            trans.Commit();
        }
        else
        { 
   
            return;
        }
        
    }
}
  1. 属性块
    属性块是包含图形和属性信息的块定义
  • 软件中的属性块操作
    1)属性的模式(可见方式、验证方式等)
    2)属性提示
    3)属性标签名(Tag)
    4)属性的默认值
    5)属性文字的插入点、宽高度、旋转角、对齐

  • 属性字段的定义步骤
    1)创建AttributeDefinition对象,并设置属性值。
    2)将创建的属性字段作为块中的实体,通过块表记录类的成员函数AppendEntity 将其附加到块表记录中。

  • 属性块的定义实现代码

[CommandMethod("makeAttDoor")]
public void makeAttDoor()
{ 
   
    Database db = HostApplicationServices.WorkingDatabase;
    using (Transaction trans = db.TransactionManager.StartTransaction())
    { 
   
        BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
        BlockTableRecord btr = new BlockTableRecord();
        btr.Name = "DOOR";

        Line line = new Line(new Point3d(0, 0, 0), new Point3d(0, 1, 0));
        Arc arc = new Arc(new Point3d(0, 0, 0), 1, 0, Math.PI / 2.0);
        btr.AppendEntity(line);
        btr.AppendEntity(arc);

        //属性添加
        AttributeDefinition cjAd = new AttributeDefinition(Point3d.Origin, "喜临门", "厂家", "请输入厂家", ObjectId.Null);
        AttributeDefinition jgAd = new AttributeDefinition(Point3d.Origin + new Vector3d(0, 0.25, 0),
            "2000", "价格", "请输入价格", ObjectId.Null);
        cjAd.Height = 0.15; jgAd.Height = 0.15;
        btr.AppendEntity(cjAd);
        btr.AppendEntity(jgAd);

        bt.Add(btr);
        trans.AddNewlyCreatedDBObject(btr, true);
        trans.Commit();
    }
}
  • 属性块的插入
    1)根据块名或块定义ID,创建块参照对象,并添加至块表记录中;
    2)根据块定义ID获得块表记录对象,及其属性定义;
    3)根据块表记录对象中的属性定义,来定义属性参照
    4)并将属性参照添加到块表参照的属性集合和事务中;
    5)最后,在事务中添加块参照对象。

今天的文章基于C#的AutoCAD二次开发之块操作分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/27859.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注