Копирование словарей

Автор Тема: Копирование словарей  (Прочитано 2737 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Копирование словарей
« : 03-05-2020, 13:09:01 »
Всех приветствую.
Есть вот такая тема https://adndevblog.typepad.com/autocad/2014/06/copy-extension-dictionary.html как я понимаю автор просто клонирует объекты в базе данных и ассоциирует с новым объектом.

Если я правильно понимаю, то словарь это просто объект в базе данных, который "присоединён" к какому-то объекту. А есть ли возможность отцепить существующий словарь и прицепить к другому объекту без всяких танцев с бубнами, с созданием новых словарей для объекта-цели, клонирования новых словарей/записей и последующим удалением старого объекта, словарей/записей, если мне ух надо удалить?

И ещё вопрос. В чём отличие моего кода от кода по ссылке? А то может я опять что-то неправильно делаю?

Код - C# [Выбрать]
  1. namespace Test
  2. {
  3.     public class Commands
  4.     {
  5.         [CommandMethod("TESTCOPYDICTIONARY")]
  6.         public static void CopyDictionary()
  7.         {
  8.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  9.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  10.  
  11.             PromptEntityResult prEntResSrc = ed.GetEntity("\nВыберете источник");
  12.             PromptEntityResult prEntResTrg = ed.GetEntity("\nВыберете приёмник");
  13.  
  14.             if (prEntResSrc.Status != PromptStatus.OK && prEntResTrg.Status != PromptStatus.OK) return;
  15.  
  16.             using (Transaction tr = db.TransactionManager.StartTransaction())
  17.             {
  18.                 BlockReference source = tr.GetObject(prEntResSrc.ObjectId, OpenMode.ForRead) as BlockReference;
  19.                 ObjectId srcDictId = source.ExtensionDictionary;
  20.                 DBDictionary srcDict = tr.GetObject(srcDictId, OpenMode.ForRead) as DBDictionary;
  21.  
  22.                 BlockReference target = tr.GetObject(prEntResTrg.ObjectId, OpenMode.ForWrite) as BlockReference;
  23.                 ObjectId trgDictId = target.ExtensionDictionary;
  24.                 if (trgDictId == ObjectId.Null) target.CreateExtensionDictionary();
  25.                 else return;
  26.                 trgDictId = target.ExtensionDictionary;
  27.                 DBDictionary trgDict = tr.GetObject(trgDictId, OpenMode.ForWrite) as DBDictionary;
  28.  
  29.                 foreach(DBDictionaryEntry entry in srcDict)
  30.                 {
  31.                     ObjectId xRecId = entry.Value;
  32.                     Xrecord xRec = tr.GetObject(xRecId, OpenMode.ForWrite) as Xrecord;
  33.                     trgDict.SetAt(entry.Key, xRec);
  34.                 }
  35.  
  36.                 tr.Commit();
  37.             }
  38.         }
  39.     }
  40. }
« Последнее редактирование: 03-05-2020, 13:45:33 от Lemieux »

Отмечено как Решение Lemieux 03-05-2020, 16:25:06

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Копирование словарей
« Ответ #1 : 03-05-2020, 16:19:44 »
А есть ли возможность отцепить существующий словарь и прицепить к другому объекту без всяких танцев с бубнами, с созданием новых словарей для объекта-цели, клонирования новых словарей/записей и последующим удалением старого объекта, словарей/записей, если мне ух надо удалить?
Нет.
В чём отличие моего кода от кода по ссылке? А то может я опять что-то неправильно делаю?
Делаешь неправильно. С учетом того, что словари могут иметь древовидную (а на линейную) структуру, твой код не выполнит полное копирование.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Копирование словарей
« Ответ #2 : 03-05-2020, 16:26:06 »
С учетом того, что словари могут иметь древовидную (а на линейную) структуру
Это когда словарь в словаре?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Копирование словарей
« Ответ #3 : 03-05-2020, 16:38:39 »
Это когда словарь в словаре?
Да. И так может (теоретически) быть много раз.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Копирование словарей
« Ответ #4 : 03-05-2020, 17:39:11 »
Это когда словарь в словаре?
Да. И так может (теоретически) быть много раз.
Теперь смысл всех манипуляций понятен, большое спасибо!  :)