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

26/05/2015

Копирование словаря расширения (ExtDictionary)

Следующий код показывает как скопировать словарь расширения одного примитива в другой примитив. Специальная логика устанавливает в конце имена словаря как у исходного примитива, так как “DeepCloneObjects” копирует их с другими именами в целевой примитив.

Код - C#: [Выделить]
  1. [CommandMethod("copyExtDic")]
  2. public void copyExtDic()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Editor ed = doc.Editor;
  7.  
  8.     PromptEntityResult surRes =
  9.                 ed.GetEntity("Выберите исходный примитив: ");
  10.  
  11.     if (surRes.Status != PromptStatus.OK)
  12.         return;
  13.  
  14.     PromptEntityResult tarRes =
  15.                 ed.GetEntity("Выберите целевой примитив: ");
  16.  
  17.     if (tarRes.Status != PromptStatus.OK)
  18.         return;
  19.  
  20.     ObjectIdCollection ids = new ObjectIdCollection();
  21.     ObjectId tarId = ObjectId.Null;
  22.     ObjectId surId = ObjectId.Null;
  23.  
  24.     using (Transaction tr =
  25.             db.TransactionManager.StartTransaction())
  26.     {
  27.         DBObject dbObj = tr.GetObject(surRes.ObjectId,
  28.                                        OpenMode.ForRead);
  29.  
  30.         surId = dbObj.ExtensionDictionary;
  31.  
  32.         if (surId != ObjectId.Null)
  33.         {
  34.             DBDictionary dbExt =
  35.                       (DBDictionary)tr.GetObject(surId,  
  36.                                     OpenMode.ForRead);
  37.  
  38.             foreach (DBDictionaryEntry entry in dbExt)
  39.             {
  40.                 ids.Add(entry.Value);
  41.             }
  42.         }
  43.         else
  44.         {
  45.             ed.WriteMessage("Нет словаря для копирования ");
  46.             return;
  47.         }
  48.         // Есть ли у целевого примитива словарь?
  49.         DBObject target = tr.GetObject(tarRes.ObjectId,
  50.                                           OpenMode.ForRead);
  51.         tarId = target.ExtensionDictionary;
  52.  
  53.         if (tarId == ObjectId.Null)
  54.         {
  55.             target.UpgradeOpen();
  56.             target.CreateExtensionDictionary();
  57.             tarId = target.ExtensionDictionary;
  58.         }
  59.  
  60.         tr.Commit();
  61.     }
  62.  
  63.     IdMapping mapping = new IdMapping();
  64.     db.DeepCloneObjects(ids, tarId, mapping, false);
  65.  
  66.     //
  67.     using (Transaction tr =
  68.             db.TransactionManager.StartTransaction())
  69.     {
  70.         DBDictionary dbExt =
  71.          (DBDictionary)tr.GetObject(surId, OpenMode.ForRead);
  72.  
  73.         DBDictionary dbTarg =
  74.             (DBDictionary)tr.GetObject(tarId, OpenMode.ForWrite);
  75.  
  76.         foreach (IdPair pair in mapping)
  77.         {
  78.             DBObject target = tr.GetObject(pair.Value,
  79.                                               OpenMode.ForRead);
  80.             dbTarg.SetName(
  81.                 dbTarg.NameAt(pair.Value),
  82.                 dbExt.NameAt(pair.Key));
  83.         }
  84.         tr.Commit();
  85.     }
  86. }

 

Источник: http://adndevblog.typepad.com/autocad/2014/06/copy-extension-dictionary.html

Автор перевода: Александр Ривилис

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

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