Насколько уникален ObjectId? Буферизация данных об объекте.

Автор Тема: Насколько уникален ObjectId? Буферизация данных об объекте.  (Прочитано 6529 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Здравствуйте!
Насколько я знаю, ObjectId уникален для объекта в документе в рамках сессии. А как дела обстоят, если открыто несколько документов? Возможна ли ситуация, когда одинаковые ObjectId.OldIdPtr имеют объекты в разных чертежах? Если да, то что вернет тогда метод ObjectId.Equals для них (Database-то разные)? В документации я не смог найти ответа на этот вопрос, поиск в интернете пока тоже не дал результата.
В связи с чем этот вопрос. Для увеличения быстродействия хочу сделать буферизацию часто вычисляемых данных в статическом словаре вида:
Код - C# [Выбрать]
  1. static Dictionary<ObjectId, MyObjectData>
Этот буфер будет общим для всех открытых документов. Вот и встал вопрос: достаточно ли этого, или нужно еще дополнительно ввести разделение по базам данных или документам?:
Код - C# [Выбрать]
  1. static Dictionary<Database, Dictionary<ObjectId, MyObjectData>>
  2. // или
  3. static Dictionary<Document, Dictionary<ObjectId, MyObjectData>>

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Насколько я знаю, ObjectId уникален для объекта в документе в рамках сессии.
Насколько я понимаю, он уникален сразу для всех документов, открытых в AutoCAD в рамках текущей сессии, а не только для текущего документа:
Цитировать
When an object or entity is first added to the database, a new stub object is created and set to point to the object or entity being added to the database. The address of this stub in memory is used as the ads_name and the AcDbObjectId value for the object or entity added to the database. The same mechanism applies when a database is read into memory from disk.
...
An AcDbObjectId object is a container for the address of a database-resident object's stub. As such, it is an extremely important object because it contains the only session-persistent locator for the database-resident object.
Т.о. если я верно понимаю документацию, то речь идёт об адресе в памяти, а у каждого объекта она своя. Соответственно в разных документах не может одновременно существовать объект под одним и тем же адресом в памяти.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да, логично. Но тогда теоретически не исключена ситуация, что документ был закрыт, адреса в памяти освободились, открыт другой документ и его объекты расположились по освободившимся адресам.
P.S. Хотя, если сохранять в памяти ObjectId, то простая проверка покажет, что он был в уже закрытом документе и данные нужно обновить.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Да, логично. Но тогда теоретически не исключена ситуация, что документ был закрыт, адреса в памяти освободились, открыт другой документ и его объекты расположились по освободившимся адресам.
И что? Конфликтов-то ведь это не создаст. Использовать освободившуюся память никто не запрещает.
Цитировать
P.S. Хотя, если сохранять в памяти ObjectId, то простая проверка покажет, что он был в уже закрытом документе и данные нужно обновить.
Именно.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Но тогда теоретически не исключена ситуация, что документ был закрыт, адреса в памяти освободились, открыт другой документ и его объекты расположились по освободившимся адресам.
Да. Но ObjectId - это не совсем указатель в памяти. ObjectId.Database возвращает базу в которой этот ObjectId содержится.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Дмитрий Загорулькин 11-07-2016, 13:22:03

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Этот буфер будет общим для всех открытых документов. Вот и встал вопрос: достаточно ли этого, или нужно еще дополнительно ввести разделение по базам данных или документам?:
Достаточно, ибо по ObjectId однозначно определяется Database.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение