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在某些场景下可以替代扩展数据进行图元持久化定位!