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

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

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

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

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

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

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

  • 用Transaction类的GetObject()函数获得块表对象;
  • 创建BlockTableRecord对象并设置块名称;
  • 创建组成块的实体对象;
  • 调用BlockTableRecord类的AppendEntity函数将组成块的实体写入块表记录中;
  • 调用BlockTable类的Add函数将创建的块表记录写入当前图形的块表中。
  1. 简单块的创建
  • 创建如下图所示的由3条直线和1个圆弧组成的名为Door的块。
  • 实现代码
[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倍,不进行旋转。
  • 实现代码
[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)最后,在事务中添加块参照对象。
  • 16
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值