1、炸开块,获取块内AttributeDefinition类型对象
DBObjectCollection subObjCol = new DBObjectCollection();
block.Explode(subObjCol);
List<AttributeDefinition> AttriDefList = new List<AttributeDefinition>();
for (int i = 0; i < subObjCol.Count; i++)
{
DBObject obj = subObjCol[i];
if (obj is AttributeDefinition == true)
AttriDefList.Add((AttributeDefinition)obj);
}
此方法无法获得属性的文本数据,你会发现所有炸开后的AttributeDefinition对象文本属性为空。
此方法无法改变原块的属性,Explode接口炸开后输出的对象是一个新的对象
2、通过块参照的AttributeCollection属性访问属性集合
AttributeCollection attriCol = block.AttributeCollection;
不要用for循环来遍历attriCol集合,因为索引器[]输出的类型为ObjectId类型,当block不在模型空间时,得到的ID为空
使用ForEach遍历,当block不在模型空间,元素为AttributeReference类型,当block在模型空间,元素为ObjectId类型
AttributeCollection attriCol = block.AttributeCollection;
foreach(var attri in attriCol)
{
AttributeReference pAttri = null;
if (attri is ObjectId)
pAttri = trans.GetObject((ObjectId)attri, OpenMode.ForWrite) as AttributeReference;
else if (attri is AttributeReference)
pAttri = (AttributeReference)attri;
pAttri.TextString = "hello";
}