扩展数据

CAD二次开发中,当需要对图形做某种持久化标记时,就需要用到扩展数据;同时,扩展数据与DXF文件拥有相同的组织方式,在某些情况下可用于修改图形属性。
本文针对扩展数据封装若干常用的二次开发接口。

添加扩展数据

扩展数据必须与某个注册应用名绑定在一起,因此添加扩展数据之前要创建相应的注册应用,初次接触会觉得很奇怪!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static void AppendXData(this ObjectId id, string regAppName, List<TypedValue> values)
{
var db = id.Database;
using (DocumentLock docLock = DwgOperators.ThisDocument.LockDocument())
{
using (Transaction transaction = db.TransactionManager.StartTransaction())
{
RegAppTable regAppTable = db.RegAppTableId.GetObject(OpenMode.ForWrite) as RegAppTable;
if (!regAppTable.Has(regAppName))
{
RegAppTableRecord regAppTableRecord = new RegAppTableRecord();
regAppTableRecord.Name = regAppName;
regAppTable.Add(regAppTableRecord);
db.TransactionManager.AddNewlyCreatedDBObject(regAppTableRecord, true);
}
DBObject obj = id.GetObject(OpenMode.ForWrite);
values.Insert(0, new TypedValue((int)DxfCode.ExtendedDataRegAppName, regAppName));

ResultBuffer resultBuffer = new ResultBuffer();
foreach (var item in values)
resultBuffer.Add(item);
obj.XData = resultBuffer;
regAppTable.DowngradeOpen();
transaction.Commit();
}
}
}

移除扩展数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void RemoveXData(this ObjectId id, string regAppName)
{
Database db = id.Database;
using (Transaction transaction = db.TransactionManager.StartTransaction())
{
DBObject obj = id.GetObject(OpenMode.ForWrite);
ResultBuffer rb = obj.GetXDataForApplication(regAppName);

if (rb != null)
{
ResultBuffer resultBuffer = new ResultBuffer();
resultBuffer.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, regAppName));
obj.XData = resultBuffer;
}
obj.DowngradeOpen();
transaction.Commit();
}
}

获取扩展数据

1
2
3
4
5
6
7
8
9
10
11
public static List<TypedValue> GetXData(this ObjectId id, string regAppName)
{
List<TypedValue> values = new List<TypedValue>();
DBObject obj = id.GetObject(OpenMode.ForRead);
var res = obj.GetXDataForApplication(regAppName);
if(res==null)
return values;
foreach (var item in res)
values.Add(new TypedValue(item.TypeCode, item.Value));
return values;
}

为实体绑定信息

可以借助扩展数据机制为图元绑定持久化信息,接口实现如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void AttachEntityInfo(this ObjectId id, List<Tuple<string, string>> blockInfos)
{
Database db = id.Database;
using (Transaction transaction = db.TransactionManager.StartTransaction())
{
foreach (var item in blockInfos)
{
List<TypedValue> values = new List<TypedValue>();
values.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, item.Item2));
AppendXData(id, item.Item1, values);
}
transaction.Commit();
}
}

图元Handle的作用

在AutoCAD中,图元的Handle是一个在DWG文件中用于唯一标识每个实体的持久化标识符。

由于这种持久化特性,Handle在某些场景下可以替代扩展数据进行图元持久化定位!

评论