сохранение данных в NamedObjectsDictionary

Автор Тема: сохранение данных в NamedObjectsDictionary  (Прочитано 8043 раз)

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

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Здравствуйте!
Столкнулся с необходимостью сохранения некоторой информации в Named Objects Dictionary (NOD).
Создаю свой словарь:
Код - C# [Выбрать]
  1.  
  2.         DBDictionary nod = (DBDictionary)tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite);
  3.         DBDictionary dic = null;
  4.         if (!nod.Contains(dicName))
  5.         {
  6.            dic = new DBDictionary();
  7.            nod.SetAt(dicName, dic);
  8.            tr.AddNewlyCreatedDBObject(dic, true);
  9.            dic.TreatElementsAsHard = true;
  10.          }
  11.         else dic = tr.GetObject(nod.GetAt(dicName), OpenMode.ForWrite) as DBDictionary;
  12.  
Заполняю его:
Код - C# [Выбрать]
  1.         Xrecord xRec = null;
  2.         if (!dic.Contains(recName))
  3.         {
  4.           xRec = new Xrecord();
  5.           dic.SetAt(recName, xRec);
  6.           tr.AddNewlyCreatedDBObject(xRec, true);
  7.         }
  8.         else xRec = tr.GetObject(dic.GetAt(recName), OpenMode.ForWrite, false) as Xrecord;
  9.         ResultBuffer rb = new ResultBuffer();
  10.         foreach (ObjectId id in idsOs) rb.Add(new TypedValue((int)DxfCode.SoftPointerId, id));
  11.         xRec.Data = rb;
  12.  

Все работает, словарь сохраняется в NOD. Вопрос в том, что пользователи иногда чистят чертеж при помощи _WBLOCK
или (в случае с Civil3d) _AecExportToAutoCAD... и мой словарь не переносится в новый чертеж. Хотя если я сохраняю эти же
данные в словарь ExtensionDictionary какого-либо примитива, то они остаются даже после экспорта чертежа. Но мне нужно
сохранить данные именно в NOD. Возможно ли создать не удаляемый словарь в NOD средствами .net?
« Последнее редактирование: 16-03-2014, 12:26:29 от Gennadiy »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: сохранение данных в NamedObjectsDictionary
« Ответ #1 : 14-03-2014, 17:27:07 »
Возможно ли создать не удаляемый словарь в NOD средствами .net?
Ничего не удаляемого создать нельзя. Но! Если твоё приложение загружено, то в обработчиках событий ты можешь попытаться скопировать в новую базу и свою информацию из NOD.
Как сделать это средствами ObjectARX есть в документации: ObjectARX for AutoCAD: Developer Guide > Advanced Topics > Advanced Topics > Deep Cloning > Implementing deepClone() for Custom Classes > Named Object Dictionary
Аналогичная возможность в AutoCAD .NET API должна реализовываться Database.BeginDeepCloneTranslation
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: сохранение данных в NamedObjectsDictionary
« Ответ #2 : 14-03-2014, 21:35:30 »
Цитировать
Ничего не удаляемого создать нельзя.
Я имел ввиду не удаляемого при экспорте.
Цитировать
Аналогичная возможность в AutoCAD .NET API должна реализовываться Database.BeginDeepCloneTranslation
Действительно, только таким способом и можно спасти данные. Проверял на _WBlock, Civil установлен на работе, поэтому реакцию на
_AecExportToAutoCAD проверю позже. ИМХО это большая недоработка AutoDesk, т.к. теперь семантику я вынужден привязывать к графическим примитивам,
чтобы не потерять при экспорте (а там может быть очень важная информация, и, если не загружено моё приложение, она бесследно исчезнет, даже не выдав
предупреждения). А к примитивам я не хочу привязывать, потому что их можно копировать (тогда информация дублируется и возникает путаница с
однозначной идентификацией графики и семантики). В любом случае спасибо за информацию.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: сохранение данных в NamedObjectsDictionary
« Ответ #3 : 14-03-2014, 21:45:29 »
создай невидимую точку и пиши все в нее

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: сохранение данных в NamedObjectsDictionary
« Ответ #4 : 14-03-2014, 22:06:15 »
Цитировать
создай невидимую точку и пиши все в нее
Я тоже думал об этом, хотя невидимый объект и не мешает при работе, но его тоже можно выбрать через _.QSELECT и случайно удалить ничего не подозревая.
Да и как-то криво всё это. Но, видимо, придется так сделать, дополнительно придумав еще какие-то хитрости.

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: сохранение данных в NamedObjectsDictionary
« Ответ #5 : 15-03-2014, 15:02:30 »
Цитировать
Аналогичная возможность в AutoCAD .NET API должна реализовываться Database.BeginDeepCloneTranslation
В AutoCAD 2010 BeginDeepCloneTranslation даже не отреагировал на _WBLOCK, до этого проверял в AutoCAD 2014 -
все работало.

Сейчас решил цеплять свои данные в словарь, который добавляю к ExtensionDictionary ModelSpace.
Способ работает и данные сохраняются при экспорте.
Может уважаемые гуру подскажут на сколько это правильно и безопасно?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: сохранение данных в NamedObjectsDictionary
« Ответ #6 : 15-03-2014, 17:58:24 »
Сейчас решил цеплять свои данные в словарь, который добавляю к ExtensionDictionary ModelSpace.
У меня тоже была такая мысль. Я не вижу противопоказаний. Наверное можно цеплять и к BlockTable. Но! Что будет происходить при операции копирования из одного чертежа в другой? Как поступать в этом случае с твоими данными?
« Последнее редактирование: 15-03-2014, 18:26:22 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: сохранение данных в NamedObjectsDictionary
« Ответ #7 : 15-03-2014, 22:13:12 »
Цитировать
Но! Что будет происходить при операции копирования из одного чертежа в другой? Как поступать в этом случае с твоими данными?
Не совсем понял вопрос. Если имелось ввиду при копировании примитивов из одного чертежа в другой, то мне как раз и нужно, чтобы мои данные не зависели от графики, они останутся привязанными к ModelSpace и будут использоваться только в конкретной базе данных для дальнейших расчетов на их основе. Если пользователь захочет экспортировать весь чертеж, то данные перейдут вместе с ним. Или имелось ввиду что то другое?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: сохранение данных в NamedObjectsDictionary
« Ответ #8 : 16-03-2014, 02:00:47 »
Хорошо. Объясню что я имел в виду. В AutoCAD открыт чертеж с твоими данными. Пользователь создает новый пустой чертеж (команда _NEW), и копирует всё (!!!) содержимое твоего чертежа в новый чертеж. Что в этой ситуации нужно делать с твоими данными? По сути в этой ситуации я не вижу разницу между копированием и экспортом. Вот над этим и следует подумать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: сохранение данных в NamedObjectsDictionary
« Ответ #9 : 16-03-2014, 12:15:51 »
На этот случай, в справке к моей программе будет сказано, что в чертеже есть не только графика но и другие данные, которые не переносятся в другой чертеж простым копированием и если очень хочется так сделать, то нужно нажать соответствующую кнопочку (которая будет для этого предусмотрена). Но если моя программа вдруг не загружена, то очистить чертеж все-таки можно путем экспорта.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: сохранение данных в NamedObjectsDictionary
« Ответ #10 : 16-03-2014, 15:33:23 »
На этот случай, в справке к моей программе будет сказано, что в чертеже есть не только графика но и другие данные, которые не переносятся в другой чертеж простым копированием и если очень хочется так сделать, то нужно нажать соответствующую кнопочку (которая будет для этого предусмотрена).
Согласен. Хотя практика показывает, что инструкцию почти никто не читает до того момента, пока не возникает проблема.
Но если моя программа вдруг не загружена, то очистить чертеж все-таки можно путем экспорта.
А вот это уже я не понял.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: сохранение данных в NamedObjectsDictionary
« Ответ #11 : 16-03-2014, 16:19:55 »
Цитировать
А вот это уже я не понял.
Ну я имел ввиду то что говорил выше, что пользователи иногда чистят чертеж при помощи _WBLOCK или _AecExportToAutoCAD..., так вот данные теперь не потеряются, если привязаны к ModelSpace.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: сохранение данных в NamedObjectsDictionary
« Ответ #12 : 16-03-2014, 16:20:59 »
Теперь понятно. На всякий случай информация. Обе эти команды приводят к изменению меток (Handle) примитивов. Так что если в твоих данных есть метки объектов/примитивов в чертеже, то они станут неправильными.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: сохранение данных в NamedObjectsDictionary
« Ответ #13 : 16-03-2014, 16:54:56 »
Если мне не изменяет память (сейчас нет возможности посмотреть), то по моему есть возможность перехвата копирования в буфер, в общем имеет смысл добавить туда то же предупреждение, что и в инструкцию.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: сохранение данных в NamedObjectsDictionary
« Ответ #14 : 16-03-2014, 17:23:08 »
Если мне не изменяет память (сейчас нет возможности посмотреть), то по моему есть возможность перехвата копирования в буфер, в общем имеет смысл добавить туда то же предупреждение, что и в инструкцию.
Конечно. Это обычный командный реактор. Но представь себе как это предупреждение будет доставать пользователя. В любом случае в каждой операции копирования  буфер этого делать не следует...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: сохранение данных в NamedObjectsDictionary
« Ответ #15 : 16-03-2014, 17:36:51 »
Так то не обязательно алерт вешать - можно из трея всплыть, или просто на экране прописать не на долго, в общем есть и не брутальные варианты с опцией отключить.