Момент вызова обработчика события
Я бы хотел, чтобы функция OnObjectModified вызывалась до того, как программа войдет в функцию entMod. В настоящее время кажется, что он вызывается позже, потому что он не получает никакого значения из словаря.
В момент редактирования полилинии вызывается функция entMod. В течение этого времени я перепишу измененный узел с сохраненной информацией об редактируемом объекте. Что я делаю неправильно?
public class Main
{
public static Document doc = Application.DocumentManager.MdiActiveDocument;
public static DBDictionary nod = null;
public static Database db = doc.Database;
public static Editor ed = doc.Editor;
public static Polyline myEntDel = null;
[CommandMethod("MyMethod")]
public static void MyMethod()
{
PromptSelectionResult psr = ed.GetSelection();
using (Transaction tr = db.TransactionManager.StartTransaction())
{
if (psr.Status == PromptStatus.OK)
{
SelectedObject so = psr.Value[0];
Entity ent = (Entity)tr.GetObject(so.ObjectId, OpenMode.ForWrite);
myEnt = ent as Polyline;
nod = tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite) as DBDictionary;
if (!nod.Contains("dict"))
{
DBDictionary dbd = new DBDictionary();
nod.SetAt("dict", dbd);
tr.AddNewlyCreatedDBObject(dbd, true);
Xrecord xrec = new Xrecord();
ResultBuffer data = new ResultBuffer();
data.Add(new TypedValue((int)DxfCode.Handle, myEnt.ObjectId.Handle));
xrec.Data = data;
dbd.SetAt(myEnt.Length.ToString(), xrec);
tr.AddNewlyCreatedDBObject(xrec, true);
}
}
myEnt.Modified += new EventHandler(entMod);
tr.Commit();
}
}
public static void entMod(object senderObj, EventArgs evtArgs)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
nod = tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite) as DBDictionary;
db.ObjectModified += new ObjectEventHandler(OnObjectModified);
if (nod.Contains("TEMP"))
{
Xrecord xr = tr.GetObject(nod.GetAt("TEMP"), OpenMode.ForRead, false) as Xrecord;
ResultBuffer data = new ResultBuffer();
data = xr.Data;
foreach (TypedValue tv in data.AsArray())
{
if (tv.TypeCode == (int)DxfCode.Handle)
{
long ln = Convert.ToInt64(tv.Value.ToString(), 16);
Handle poi = new Handle(ln);
ObjectId id = db.GetObjectId(false, poi, 0);
Entity obj = id.GetObject(OpenMode.ForWrite) as Entity;
myEntDel = obj as Polyline;
}
}
}
if (nod.Contains("dict"))
{
ed.WriteMessage("a02 ");
foreach (DBDictionaryEntry de in nod)
{
if (de.Key == "dict")
{
DBDictionary dbd = tr.GetObject(de.Value, OpenMode.ForRead, false) as DBDictionary;
foreach (DBDictionaryEntry de2 in dbd)
{
Xrecord xrec = tr.GetObject(de2.Value, OpenMode.ForRead, false) as Xrecord;
ResultBuffer data = new ResultBuffer();
data = xrec.Data;
List<TypedValue> arr = new List<TypedValue>();
arr.AddRange(data.AsArray());
foreach (TypedValue tv in arr)
{
if (tv.TypeCode == (int)DxfCode.Handle && tv.Value.ToString() != myEntDel.Handle.Value.ToString())
{
long ln = Convert.ToInt64(tv.Value.ToString(), 16);
Handle hn = new Handle(ln);
ObjectId id = db.GetObjectId(false, hn, 0);
Entity obj = id.GetObject(OpenMode.ForRead) as Entity;
Polyline pl = obj as Polyline;
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
Polyline np = new Polyline();
for (int i = 0; i < pl.NumberOfVertices; i++)
{
acCircClone.AddVertexAt(i, myEntDel.GetPoint2dAt(i), 0, 0, 0);
}
btr.AppendEntity(np);
tr.AddNewlyCreatedDBObject(np, true);
}
}
arr.Clear();
}
}
}
}
tr.Commit();
tr.Dispose();
}
}
public static void OnObjectModified(object senderObj, ObjectEventArgs e)
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
nod = tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite) as DBDictionary;
Entity ent = e.DBObject as Entity;
Polyline pl = null;
if (ent is Polyline)
{
pl = ent as Polyline;
}
if (nod.Contains("TEMP"))
{
nod.Remove("TEMP");
}
if (!nod.Contains("TEMP"))
{
Xrecord xrec = new Xrecord();
ResultBuffer data = new ResultBuffer();
data.Add(new TypedValue((int)DxfCode.Handle, pl.ObjectId.Handle));
xrec.Data = data;
nod.SetAt("TEMP", xrec);
tr.AddNewlyCreatedDBObject(xrec, true);
}
tr.Commit();
tr.Dispose();
}
}
}
}
Код является концептуальным. Там могут быть некоторые незначительные синтаксические ошибки.