对CAD二次开发的程序员来说,实现操作实体XData属性的方法想必已经烂熟于心了。不过,本人在这里在赘述一下。晒晒自己的代码,如果大家有更好的方法和逻辑,请大家提出来,让我这个新手也学习一下,本人将不胜感激。
方法一如下:
输入参数为:
实体主键:需要写入(修改)属性的对象;
外部属性名:属性名称
属性:属性值 ,和外部属性名称构成键值对。
返回是否写属性成功
#region "写属性"
/// <summary>
/// 对一个实体进行写属性。
/// </summary>
/// <param name="objId">实体的ID</param>
/// <param name="appName">外部数据名</param>
/// <param name="rb">属性</param>
/// <returns>true:成功 false:失败</returns>
public bool AddXdata(ObjectId objId, string appName, ResultBuffer rb)
{
bool retureValue = false;
try
{
using (Database db = HostApplicationServices.WorkingDatabase)
{
using (Transaction trans = db.TransactionManager.StartTransaction())
{
RegAppTable rAt = (RegAppTable)trans.GetObject(db.RegAppTableId, OpenMode.ForWrite);
RegAppTableRecord rAtr;
ObjectId rAtrId = ObjectId.Null;
if (rAt.Has(appName))
{
rAtrId = rAt[appName];
}
else
{
rAtr = new RegAppTableRecord();
rAtr.Name = appName;
rAtrId = rAt.Add(rAtr);
trans.AddNewlyCreatedDBObject(rAtr, true);
}
Entity en;
en = (Entity)trans.GetObject(objId, OpenMode.ForWrite);
en.XData = rb;
trans.Commit();
retureValue = true;
}
}
}
catch
{
retureValue = false;
}
return retureValue;
}
#endregion
代码说明:
启用数据库,事务,获得注册属性表
新建一条注册属性记录RegAppTableRecord
当注册表中不存在属性时,实例化注册属性记录,添加属性名称。
将resultbuffer 写入实体XData中。
提交事务。
添加实体属性即可实现。
注:如果实体中已经有属性,调用本方法的时候,会将编辑的属性放置到XData数据的最后。如下图所示的管点编号。请注意。
下面还有该方法的变形:
一、只需输入实体ID 属性名称 属性值即可
/// <summary>
/// 对实体进行写属性
/// </summary>
/// <param name="objId">实体id</param>
/// <param name="appName">外部数据名</param>
/// <param name="proStr">属性</param>
/// <returns>true: 成功 false: 失败</returns>
public bool AddXdata(ObjectId objId, string appName, string proStr)
{
bool retureValue = false;
try
{
using (Database db = HostApplicationServices.WorkingDatabase)
{
using (Transaction trans = db.TransactionManager.StartTransaction())
{
RegAppTable rAt = (RegAppTable)trans.GetObject(db.RegAppTableId, OpenMode.ForWrite);
RegAppTableRecord rAtr;
ObjectId rAtrId = ObjectId.Null;
TypedValue tvName = new TypedValue
(DxfCode.ExtendedDataRegAppName.GetHashCode(), appName);
TypedValue tvPro = new TypedValue
(DxfCode.ExtendedDataAsciiString.GetHashCode(), proStr);
ResultBuffer rb = new ResultBuffer(tvName, tvPro);
if (rAt.Has(appName))
{
rAtrId = rAt[appName];
}
else
{
rAtr = new RegAppTableRecord();
rAtr.Name = appName;
rAtrId = rAt.Add(rAtr);
trans.AddNewlyCreatedDBObject(rAtr, true);
}
Entity en;
en = (Entity)trans.GetObject(objId, OpenMode.ForWrite);
en.XData = rb;
trans.Commit();
retureValue = true;
}
}
}
catch
{
retureValue = false;
}
return retureValue;
}
如有问题:请加qq1419226548或QQmail给我。 若转载,请注明出处。谢谢。