1 AttributeBlock介绍

AttributeBlock这个名称并不存在于.net开发文档中,是我根据中文名称“属性块”直译的,可能不对,只是叫起来顺口。开发文档中与属性块相关的类有四个,分别是AttributeDefinition(属性定义)、AttributeReference(属性参照)、BlockReference(块参照)、BlockTableRecord(块)。如果一个BlockTableRecord包含了AttributeDefinition对象,则称为AttributeBlock。

其中AttributeDefinition、AttributeReference同属于DBText的子类,说明它们本质上是DBText,即单行文本,具有所有单行文本的特征,不同之处是它们的存储位置,AttributeDefinition要放入BlockTableRecord中,而AttributeReference要放入BlockReference的AttributeCollection中。

BlockReference父类为Entity,是众多实体(如DBText、Line)中的一员,代表对某个BlockTableRecord的引用,用户对BlockReference只能做平移、旋转、缩放的操作,而不能修改引用的内容,要修改只能对BlockTableRecord进行操作。如果在BlockTableRecord定义有AttributeDefinition,那么在BlockTableRecord的副本BlockReference中就可以修改AttributeDefinition的副本AttributeReference。

BlockReference、AttributeDefinition应放在不同的BlockTableRecord中,每个BlockTableRecord代表一个块,所有的BlockTableRecord都存储在BlockTable中。Record(记录)和Table(表)是构成关系型数据库的基本元素,关系型数据库一般由多个Table组成,每个Table又由多个Record组成。AutoCAD的数据存储文件(dwg文件)也叫图形数据库文件,是关系型数据库中较为复杂的一种。

dwg文件在新建时会初始化创建一些Table和Record,例如创建BlockTable(块表)、DimStyleTable(标注样式表)、TextStyleTable(文字样式表)、LayerTable(图层表)。每个表也会初始化一些Record,如BlockTable会默认新建ModelSpace、PaperSpace1、PaperSpace2这三个BlockTableRecord,分别代表“模型”、“布局1”、“布局2”选项卡。当我们在“模型”里面绘制直线、文字等实体后,程序会在BlockTable中查找名称为ModelSpace的BlockTableRecord,并向其中添加Entity实体。BlockTableRecord的父类为SymbolTableRecord。

AttributeReference对AttributeDefinition并不是引用的关系,虽然字面意思上是。AttributeDefinition对AttributeReference的某些属性进行了只读限制,如Constant、Preset、Verifiable、LockPositionInBlock这些属性只能在AttributeDefinition修改,而在AttributeReference是不能修改的。可以将AttributeDefinition比喻为一个模板,里面有一部分属性是不能修改的,还有一部分是可以修改的,这样才能保证AttributeReference的多样性,也是属性块的意义所在。

2 AttributeBlock实例

用属性块的好处是不用频繁定义块,我们只需要将块中需要改变的文字定义为属性,这样在插入块后可以对这些文字进行修改,使每个块都可以显示不同的文本。在路线设计中我们一般将百米桩号定义为属性块,块中文字表示相应位置的桩号,由于路线一般很长,桩号非常多,定义为属性块可以方便修改,但是在绘制桥型图的时候我们又需要将这些属性块炸开以方便调整比例。下面的实例展示了属性块的炸开。

3 主要代码

主要代码如下:

[CommandMethod("bat_zsk")]
public void Sub24()
{ObjectId[] ids = new ObjectId[] { };if (InputHelper.GetEntityIds(ref ids, "\n选择属性块", TypeValueHelper.Insert)){List<Entity> list = new List<Entity>();List<BlockReference> blockReferences = ids.Select(l => EntityHelper.GetEntityById(l) as BlockReference).ToList();foreach (var item in blockReferences){list.AddRange(ExplodeBlockReference(item.Id));if (list.Count > 0) EntityHelper.DeleteById(item.Id);}EntityHelper.Post2CurrentSpace(list);}
}/// <summary>
/// 分解块引用
/// </summary>
/// <param name="blockReferenceId"></param>
/// <returns></returns>
private List<Entity> ExplodeBlockReference(ObjectId blockReferenceId)
{List<Entity> ret = new List<Entity>();List<AttributeDefinition> attributeDefinitions = new List<AttributeDefinition>();BlockReference blockReference = EntityHelper.GetEntityById(blockReferenceId) as BlockReference;BlockTableRecord blockTableRecord = EntityHelper.GetSymbolTableRecordById(blockReference.BlockTableRecord) as BlockTableRecord;//如果块中有属性定义if (blockTableRecord.HasAttributeDefinitions){DBObjectCollection dBObjectCollection = new DBObjectCollection();//分解BlockReferenceblockReference.Explode(dBObjectCollection);//删除AttributeDefinition,仅保留Entityforeach (var item in dBObjectCollection){if (item is AttributeDefinition){EntityHelper.DeleteById((item as AttributeDefinition).Id);}else if (item is Entity){ret.Add(item as Entity);}}//将AttributeReference转为DBTextforeach (ObjectId item in blockReference.AttributeCollection){AttributeReference attributeReference = EntityHelper.GetEntityById(item) as AttributeReference;DBText dbText = new DBText();dbText.TextString = attributeReference.TextString;dbText.Position = attributeReference.Position;dbText.HorizontalMode = attributeReference.HorizontalMode;dbText.VerticalMode = attributeReference.VerticalMode;if (attributeReference.HorizontalMode != TextHorizontalMode.TextLeft ||attributeReference.VerticalMode != TextVerticalMode.TextBase ||attributeReference.Justify != AttachmentPoint.BaseLeft)dbText.AlignmentPoint = attributeReference.AlignmentPoint;dbText.Height = attributeReference.Height;dbText.WidthFactor = attributeReference.WidthFactor;dbText.Rotation = attributeReference.Rotation;dbText.TextStyleId = attributeReference.TextStyleId;dbText.LayerId = attributeReference.LayerId;dbText.ColorIndex = attributeReference.ColorIndex;dbText.SetDatabaseDefaults();dbText.AdjustAlignment(EntityHelper.GetActiveDatabase());ret.Add(dbText);}}else{MessageHelper.WriteMsg("\n非属性块不分解:" + blockTableRecord.Name);}return ret;
}

AutoCAD.net AttributeBlock实例3 炸属性块相关推荐

  1. 为什么有时候CAD属性块的中的属性文字不能显示呢?

    在AutoCAD中,有时候无法看到属性块中的属性值文字,这是因为系统变量 attmode 被设置为0了. 在命令行输入 attmode 后,将参数设置为1就可以了. 系统变量 Attmode 的作用是 ...

  2. AUTOCAD——创建可编辑属性块

    CAD如何创建可编辑属性块? 执行方式 1.打开AUTOCAD,使用REC绘制矩形命令,绘制一个长方形. 2.然后输入属性定义命令"ATTDEF"(快捷键:ATT),按下空格键. ...

  3. autocad.netQQ群:193522571属性块中属性文字宽度比例自动调整到格子宽度内,比例因子小于标准比例因子的自动设置为标准比例因子...

    #region 属性自动缩进/// <summary>/// 属性比例因子设置/// </summary>/// <param name="br"&g ...

  4. cass怎么把块打散命令_分解cass高程点即属性块

    *分解cass高程点即属性块* (defun c:fj() (prompt "选择cass高程点!") (setq s (ssget '((0 . "INSERT&quo ...

  5. 画图控件_用CAD画图,还不会用属性块?你不加班谁加班

    很多使用AutoCAD的人都知道图块,图块可以重复插入.做成图库,减少重复操作,因此被广泛使用.但是大家却不太了解属性块.简单的说,属性块就是在图块上附加一些文字属性(Attribute),这些文字可 ...

  6. cad.net 属性块(二)

    AutoCAD .Net 通过块参照获取块名 https://blog.csdn.net/hisinwang/article/details/78764581 CAD.NET调整属性块中文字宽度 ht ...

  7. python处理cad_python3读取autocad图形文件.py实例

    废话不多说,看代码吧! ''' 待完善. 此代码实现了,根据标注文本的 属性,数值,位置,及 容差, 去判断 设计 和 实测两图中的同一位置的尺寸. 如果是同一位置的尺寸,则进行比较, 并把结果存成表 ...

  8. python读取cad_python3读取autocad图形文件.py实例

    废话不多说,看代码吧! ''' 待完善. 此代码实现了,根据标注文本的 属性,数值,位置,及 容差, 去判断 设计 和 实测两图中的同一位置的尺寸. 如果是同一位置的尺寸,则进行比较, 并把结果存成表 ...

  9. Kean专题:拖动一个属性块(JIG拖拽)

    原文转载自:http://through-the-interface.typepad.com/through_the_interface/jigs/(该口已无法访问) 可访问转载入口:http://b ...

最新文章

  1. unigui中弹出对话框原窗体是没有了_最前线 | 微信对话框“搜一搜”功能上线,独辟蹊径的腾讯打着什么算盘?...
  2. LiveVideoStackCon深圳 - 洞察多媒体技术生态趋势与机会
  3. MongoDB升级导致启动失败
  4. ubuntupython损坏_修复损坏的Python3.2安装(Ubuntu)
  5. linux下oracle10g安装配置说明,Linux下oracle10g安装配置说明(ZT)
  6. xml TO json
  7. 为什么把持久化放到Domain Object是不OO的.
  8. 讨论需求时组里都是怎么做的
  9. springmvc jsp java_java-jsp springmvc-controller 传值到页面的方法
  10. 原生js写简单轮播图方式1-从左向右滑动
  11. 微型计算机原理考试试卷,微机原理试题集题库带答案
  12. linux修改默认22端口失败,【原创文章】修改亚马逊AWS EC2 LINUX系统SSH默认22端口失败的原因和解决办法...
  13. window 和linux系统分隔符的不同
  14. 全网最易懂的Flink背压问题,看不懂你打我~
  15. html 苹果 地图,为什么苹果手机自带的地图是高德而不是谷歌?
  16. JAVA编写单例(Singleton)模式
  17. HA状态下防火墙损坏处理
  18. xml转pdf xsl取值问题 语法问题
  19. WordPress自定义分页代码
  20. 软件测试教程 自动化测试appium篇

热门文章

  1. 普元微服务架构封闭式开发实战经验
  2. JavaWeb_SQL
  3. 游戏开发制作流程与分工
  4. python 实现时间转换 秒单位转换为时分秒表示
  5. 高通公布骁龙835关键规格:集成首款X16千兆基带
  6. android10不能熄屏,骁龙835不支持息屏唤醒 华为EMUI 10发布时间确定
  7. 2018长三角数据智能峰会—上海·7·17—新零售专场
  8. C语言重来28:如何离开多重循环
  9. 市面上各类网盘(百度网盘、腾讯微云、亿方云、坚果云等)对比 2016年10月
  10. JZOJ3296. 【SDOI2013】刺客信条