using System;
using System.Linq;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
namespace XdataXrecordSample
{
public class CommandMethods
{
[CommandMethod("SET")]
public void Set()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
PromptEntityResult per = ed.GetEntity("\nSelect an object: ");
if (per.Status != PromptStatus.OK) return;
ResultBuffer data
= new ResultBuffer
( new TypedValue
(1,
"Test"),
new TypedValue
(40,
3.14159));
using (Transaction tr = db.TransactionManager.StartTransaction())
{
DBObject obj = tr.GetObject(per.ObjectId, OpenMode.ForWrite);
SetData(obj, data, "TestRegAppName", "TestXrecKey");
tr.Commit();
}
}
[CommandMethod("GET")]
public void Get()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
TypedValue
[] filter
= { new TypedValue
(1001,
"TestRegAppName") }; PromptSelectionResult psr
= ed
.SelectAll(new SelectionFilter
(filter
)); if (psr.Status != PromptStatus.OK) return;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
foreach (ObjectId id in psr.Value.GetObjectIds())
{
Entity ent = (Entity)tr.GetObject(id, OpenMode.ForRead);
ResultBuffer data = GetData(ent, "TestRegAppName");
Application.ShowAlertDialog(string.Format(
"{0}\n{1}",
ent.GetType().Name,
String.Join("\n", data.AsArray().Select(tv => tv.Value.ToString()))));
}
}
}
private void SetData(DBObject obj, ResultBuffer data, string regAppName, string xrecKey)
{
Database db = obj.Database;
Transaction tr = db.TransactionManager.TopTransaction;
if (tr == null)
throw new Autodesk
.AutoCAD.Runtime.Exception(ErrorStatus
.NoActiveTransactions); RegAppTable rat = (RegAppTable)tr.GetObject(db.RegAppTableId, OpenMode.ForRead);
if (!rat.Has(regAppName))
{
RegAppTableRecord ratr
= new RegAppTableRecord
(); ratr.Name = regAppName;
rat.UpgradeOpen();
rat.Add(ratr);
tr.AddNewlyCreatedDBObject(ratr, true);
}
ResultBuffer xdata
= new ResultBuffer
(new TypedValue
(1001, regAppName
),
new TypedValue
(1000, xrecKey
)); obj.XData = xdata;
if (obj.ExtensionDictionary == ObjectId.Null)
{
obj.UpgradeOpen();
obj.CreateExtensionDictionary();
}
DBDictionary xdict = (DBDictionary)tr.GetObject(obj.ExtensionDictionary, OpenMode.ForWrite);
Xrecord xrec;
if (xdict.Contains(xrecKey))
{
xrec = (Xrecord)tr.GetObject((ObjectId)xdict[xrecKey], OpenMode.ForWrite);
}
else
{
xdict.UpgradeOpen();
xdict.SetAt(xrecKey, xrec);
tr.AddNewlyCreatedDBObject(xrec, true);
}
xrec.Data = data;
}
private ResultBuffer GetData(DBObject obj, string regAppName)
{
Transaction tr = obj.Database.TransactionManager.TopTransaction;
if (tr == null)
throw new Autodesk
.AutoCAD.Runtime.Exception(ErrorStatus
.NoActiveTransactions); ResultBuffer xdata = obj.GetXDataForApplication(regAppName);
if (xdata == null)
return null;
string xrecKey = (string)xdata.AsArray()[1].Value;
if (obj.ExtensionDictionary == ObjectId.Null)
return null;
DBDictionary xdict = (DBDictionary)tr.GetObject(obj.ExtensionDictionary, OpenMode.ForRead);
if (!xdict.Contains(xrecKey))
return null;
Xrecord xrec = (Xrecord)tr.GetObject((ObjectId)xdict[xrecKey], OpenMode.ForRead);
return xrec.Data;
}
}
}