ADN Open CIS
Сообщество программистов Autodesk в СНГ

25/04/2014

Сохранение и получение значений enum в ResBuf в .NET

Если вы сохраняете значение перечисления (enum) в resbuf как "ExtendedDataInteger16", тогда вы можете получить исключение неверного типа при попытке прочитать сохраненное значение из resbuf в перечисление.

Чтобы исключить эту ошибку, нужно сохранять значение как "ExtendedDataIneger32" или использовать "Enum.ToObject" как показано ниже:

Код - C#: [Выделить]
  1. public enum MyEnumType  
  2. {  
  3.     spring,    
  4.     summer,  
  5.     fall,  
  6.     winter
  7. };
  8.  
  9. [CommandMethod("ADDXDATA")]
  10. static public void AddXdata()
  11. {
  12.     Database db = HostApplicationServices.WorkingDatabase;
  13.     Editor ed
  14.         = Application.DocumentManager.MdiActiveDocument.Editor;
  15.  
  16.     // Попросим пользователя выбрать примитив
  17.     PromptEntityResult per = ed.GetEntity("Выберите примитив ");
  18.     if (per.Status != PromptStatus.OK)
  19.         return;
  20.  
  21.     using(Transaction tr = db.TransactionManager.StartTransaction())
  22.     {
  23.         RegAppTable regTable
  24.                 = (RegAppTable)tr.GetObject(
  25.                                                 db.RegAppTableId,
  26.                                                 OpenMode.ForWrite,
  27.                                                 false
  28.                                             );
  29.  
  30.         String appName = "ADSK";
  31.         if (regTable.Has(appName) == false)
  32.         {
  33.             RegAppTableRecord app = new RegAppTableRecord();
  34.             app.Name = appName;
  35.             regTable.Add(app);
  36.             tr.AddNewlyCreatedDBObject(app, true);
  37.         }
  38.  
  39.         Entity ent = tr.GetObject(
  40.                                     per.ObjectId,
  41.                                     OpenMode.ForWrite
  42.                                  ) as Entity;
  43.  
  44.         //ent.XData = new ResultBuffer(
  45.         //    new TypedValue(1001, appName),
  46.         //    new TypedValue((int)DxfCode.ExtendedDataInteger32, MyEnumType.winter));
  47.  
  48.         ent.XData = new ResultBuffer(
  49.             new TypedValue(1001, appName),
  50.             new TypedValue((int)DxfCode.ExtendedDataInteger16, MyEnumType.winter));
  51.  
  52.         tr.Commit();
  53.     }
  54. }
  55.  
  56. [CommandMethod("READXDATA")]
  57. static public void ReadXdata()
  58. {
  59.     Database db = HostApplicationServices.WorkingDatabase;
  60.     Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  61.  
  62.     // Попросим пользователя выбрать примитив
  63.     PromptEntityResult per = ed.GetEntity("Выберите примитив ");
  64.     if (per.Status != PromptStatus.OK)
  65.         return;
  66.  
  67.     using(Transaction tr = db.TransactionManager.StartTransaction())
  68.     {
  69.         Entity ent
  70.             = (Entity)tr.GetObject(per.ObjectId, OpenMode.ForWrite);
  71.  
  72.         using (ResultBuffer buf = ent.XData)
  73.         {
  74.             if (buf != null)
  75.             {
  76.                 TypedValue[] tvArr = buf.AsArray();
  77.                 foreach (TypedValue tv in tvArr)
  78.                 {
  79.                    if (tv.TypeCode == (int)DxfCode.ExtendedDataInteger16)
  80.                     {
  81.                         // Работает только если значение enum value в
  82.                         // Xdata было сохранено как ExtendedDataInteger32
  83.                         // MyEnumType enumValue = (MyEnumType)tv.Value;
  84.  
  85.                         // Работает в обоих случаях
  86.                         // если перечисление в Xdata было
  87.                         // сохранено как ExtendedDataInteger16
  88.                         // или как ExtendedDataInteger32
  89.                         MyEnumType enumValue
  90.                             = (MyEnumType)Enum.ToObject(typeof(MyEnumType), tv.Value);
  91.  
  92.                         ed.WriteMessage("\n" + enumValue.ToString());
  93.                     }
  94.                 }
  95.             }
  96.         }
  97.         tr.Commit();
  98.     }
  99. }

 

Источник: http://adndevblog.typepad.com/autocad/2012/12/store-and-retrieve-enum-values-in-a-resbuf-using-net.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=701

Опубликовано 25.04.2014