今天是本篇内容的第二节,在上一节的基础上继续排兵布阵,来扩充在CAD二次开发中可能用到的图块。这一节介绍一下属性块,属性块与普通的图块相比,多了一个字典作为一组属性来存储信息。我们在图纸中看到的这种表格就是一个属性块:
这是一个自控设计中代表一个可燃气体探测器标注信息的图块,其中TAG代表位号,EL是安装标高,JB是接线箱号,MED是检测介质,我们可以在增强属性编辑器中编辑对应的值来标注探测器的信息。这里的属性是一个字典,也就是一组键值对,这里的值属于AttributeDefinition类,它派生自DBText
它的构造函数里面:position代表该数值显示的位置;value是数值;tag是标签,即属性的名称;prompt是提示信息,可以再增强属性编辑器中起到提示作用;style是显示值的文字的特性。
这一节的目标是封装方法并且注册命令,来制作一个类似的属性块,可能代码比较多,限于篇幅,部分代码的解释详见注释。
首先封装方法,为块表记录添加属性,作为ObjectId的拓展方法,同时需要一个列表存储插入的属性,代码如下:
//为块表记录添加属性public static void AddAttsToBlock(this ObjectId blockId, List atts){
Database db = blockId.Database;//获取数据库对象 //打开块表记录为写的状态 BlockTableRecord btr = (BlockTableRecord)blockId.GetObject(OpenMode.ForWrite); //遍历属性定义对象列表 foreach (AttributeDefinition att in atts) {
btr.AppendEntity(att);//为块表记录添加属性 db.TransactionManager.AddNewlyCreatedDBObject(att, true);//事务处理 } btr.DowngradeOpen();//为了安全,将块表记录的状态改为读}
老规矩,这里重载方法,使其可以接受很多属性而不需要转换为列表:
public static void AddAttsToBlock(this ObjectId blockId, params AttributeDefinition[] atts){
blockId.AddAttsToBlock(atts.ToList());}
接下来插入属性块参照的方法,上一节介绍的插入简单块的方法是一个没有返回值的方法,这里因为需要插入属性,所以需要块定义的ObjectId来传递,所以这里以ObjectId为返回类型,返回添加的块参照的Id以便之后的使用:
public static ObjectId InsertBlockReference(this ObjectId spaceId, string layer, string blockName, Point3d position, Scale3d scale, double rotateAngle){
ObjectId blockRefId;//存储要插入的块参照的Id Database db = spaceId.Database;//获取数据库对象 //以读的方式打开块表 BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead); //如果