UNDO удаляет обновленные записи словаря
У меня есть команда, которая добавляет новую запись в Словарь Именованных Объектов (NOD) или обновляет значение существующего.
Проблема в том, что когда я запускаю команду дважды (во второй раз запись уже есть, так что в этот раз только обновляется ее значение) и когда мы запускаем команду _UNDO, тогда вместо того, чтобы вернуть предыдущее значение записи NOD, она удаляется полностью.
- using System;
- using Autodesk.AutoCAD.Runtime;
- using acApp = Autodesk.AutoCAD.ApplicationServices.Application;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.EditorInput;
- namespace CsMgdAcad1
- {
- public class AEN1Commands
- {
- [CommandMethod("UpdateXrecord")]
- static public void UpdateXrecord()
- {
- const string kMyData = "MYDATA";
- Editor ed = acApp.DocumentManager.MdiActiveDocument.Editor;
- Database db = HostApplicationServices.WorkingDatabase;
- using (Transaction tr =
- db.TransactionManager.StartTransaction())
- {
- DBDictionary nod =
- (DBDictionary)tr.GetObject(
- db.NamedObjectsDictionaryId, OpenMode.ForRead);
- if (nod.Contains(kMyData))
- {
- // Обновляем данные
- Xrecord xrec =
- (Xrecord)tr.GetObject(
- nod.GetAt(kMyData), OpenMode.ForRead);
- int val = (int)xrec.Data.AsArray()[0].Value;
- Xrecord newXrec = new Xrecord();
- newXrec.Data = new ResultBuffer(
- new TypedValue[]
- {
- new TypedValue((int)LispDataType.Int32, val + 1)
- });
- nod.UpgradeOpen();
- nod.SetAt(kMyData, newXrec);
- tr.AddNewlyCreatedDBObject(newXrec, true);
- ed.WriteMessage(
- "Обновляем данные " + (val + 1).ToString());
- }
- else
- {
- // Инициализируем данные
- Xrecord xrec = new Xrecord();
- xrec.Data = new ResultBuffer(
- new TypedValue[]
- {
- new TypedValue((int)LispDataType.Int32, 1)
- });
- nod.UpgradeOpen();
- nod.SetAt(kMyData, xrec);
- ed.WriteMessage("Инициализируем данные 1");
- }
- tr.Commit();
- }
- }
- }
- }
Решение
Есть два метода для решения:
a) Когда обновляете существующую запись – обновляйте и существующую Xrecord, относящуюся к этой записи – просто изменяйте её данные:
- Xrecord xrec =
- (Xrecord)tr.GetObject(nod.GetAt(kMyData), OpenMode.ForWrite);
- int val = (int)xrec.Data.AsArray()[0].Value;
- xrec.Data = new ResultBuffer(
- new TypedValue[]
- {
- new TypedValue((int)LispDataType.Int32, val + 1)
- });
- ed.WriteMessage("Данные обновлены " + (val + 1).ToString());
b) Когда обновляете запись словаря, тогда перед обновлением её новой Xrecord, тогда удалите сначала существующую запись:
- Xrecord xrec =
- (Xrecord)tr.GetObject(nod.GetAt(kMyData), OpenMode.ForRead);
- int val = (int)xrec.Data.AsArray()[0].Value;
- Xrecord newXrec = new Xrecord();
- newXrec.Data = new ResultBuffer(
- new TypedValue[]
- {
- new TypedValue((int)LispDataType.Int32, val + 1)
- });
- nod.UpgradeOpen();
- // Сначала удаляем существующую запись
- nod.Remove(kMyData);
- nod.SetAt(kMyData, newXrec);
- tr.AddNewlyCreatedDBObject(newXrec, true);
- ed.WriteMessage("Данные обновлены " + (val + 1).ToString());
Источник: http://adndevblog.typepad.com/autocad/2012/07/undo-removes-updated-dictionary-entry.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=712
Опубликовано 30.04.2014