Момент вызова обработчика события

Я бы хотел, чтобы функция 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();
                }
            }
        }
    }

Код является концептуальным. Там могут быть некоторые незначительные синтаксические ошибки.

0 ответов

Другие вопросы по тегам