接续上文。通过上一篇文章,您可以实现对一个实体属性的添加。下面就跟大家聊聊读取属性的实现。
就像世间没有两片相同的叶子,读取实体属性的方式也各种各样,公司或者个人也彰显出了自己的编码风格以及特点。个人认为,读取实体属性的核心代码只有一条:
ResultBuffer rb=ent.XData;此时,即可获取实体属性。不过本人有个癖好。凡是通用性强的东西,都想自己提个方法。以便日后使用。
刚开始读写属性的时候比较茫然,各种分割ResulteBuffer。之后才知道有方法可以直接获取resultbuffer中的各个项。
初始时的代码:
#region 拆分实体的属性名称和值
/// <summary>
/// 拆分实体的属性名称和值
/// </summary>
/// <param name="objId">Id</param>
/// <param name="AppName">属性名称</param>
/// <returns></returns>
public Dat AttributeGet(ObjectId objId, string AppName)
{
Dat dt = new Dat();
dt.Columns.Add("AttributeName", typeof(string));
dt.Columns.Add("AttributValue", typeof(string));
ResultBuffer rb = RXData(objId, AppName);
if (rb != null)
{
string str1 = null;
str1 = rb.ToString();
string[] strRb1 = new string[] { };
strRb1 = str1.Split(',');
string str2 = strRb1[1].ToString();
string[] strRb2 = new string[] { };
strRb2 = str2.Split(')');
string appName = strRb2[0];
string str3 = strRb1[2].ToString();
string[] strRb3 = new string[] { };
strRb3 = str3.Split(')');
string appValue = strRb3[0];
DataRow dr = dt.NewRow();
dr["AttributeName"] = appName;
dr["AttributeValue"] = appValue;
dt.Rows.Add(dr);
}
return dt;
}
public ResultBuffer RXData(ObjectId objId, string AppName)
{
ResultBuffer rb = null;
try
{
using (Database db = HostApplicationServices.WorkingDatabase)
{
using (Transaction trans = db.TransactionManager.StartTransaction())
{
Entity en = (Entity)trans.GetObject(objId, OpenMode.ForRead);
rb = en.GetXDataForApplication(AppName);
}
}
}
catch
{
return null;
}
return rb;
}
#endregion
以上是获取实体XData属性。之后按照其构造形式直接拆分字符串。存储到新建的DataTable中。新手时,对CAD不甚了解,现在看来此种方法比较笨。
用rbTemp.AsArray()[i].Value;可以规避拆分字符串的麻烦,直接获得对应位置的属性名,属性值。
以下是改进的方法:
/// <summary>
/// 获得指定实体的属性名称属性值
/// </summary>
/// <param name="oid"></param>
/// <returns></returns>
private Dat GetXData(ObjectId oid)
{
Dat dtblTemp = new System.Data.DataTable();
dtblTemp.Columns.Add(new System.Data.DataColumn("name", typeof(string)));
dtblTemp.Columns.Add(new System.Data.DataColumn("value", typeof(string)));
try
{
using (Transaction trans = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction())
{
Entity ent = (Entity)trans.GetObject(oid, OpenMode.ForWrite);
ResultBuffer rbTemp = ent.XData;
int intAttributeCount = rbTemp.AsArray().Length;
for (int i = 0; i < intAttributeCount; i += 2)
{
DataRow dr = dtblTemp.NewRow();
dr[0] = rbTemp.AsArray()[i].Value;
dr[1] = rbTemp.AsArray()[i + 1].Value;
dtblTemp.Rows.Add(dr);
}
}
}
catch (Exception ex)
{
return dtblTemp;
}
return dtblTemp;
}
随着今后经验的逐渐积累。理应会写出更好的方法实现该功能。若各位大侠手里有更好的方法,请顺便贴一下,谢谢。
如有问题:请加qq1419226548或QQmail给我。 若转载,请注明出处。谢谢。