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

ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 11-07-2016, 12:36:01

Название: Насколько уникален ObjectId? Буферизация данных об объекте.
Отправлено: Дмитрий Загорулькин от 11-07-2016, 12:36:01
Здравствуйте!
Насколько я знаю, 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>>
Название: Re: Насколько уникален ObjectId? Буферизация данных об объекте.
Отправлено: Андрей Бушман от 11-07-2016, 12:49:50
Насколько я знаю, 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.
Т.о. если я верно понимаю документацию, то речь идёт об адресе в памяти, а у каждого объекта она своя. Соответственно в разных документах не может одновременно существовать объект под одним и тем же адресом в памяти.
Название: Re: Насколько уникален ObjectId? Буферизация данных об объекте.
Отправлено: Дмитрий Загорулькин от 11-07-2016, 12:56:29
Да, логично. Но тогда теоретически не исключена ситуация, что документ был закрыт, адреса в памяти освободились, открыт другой документ и его объекты расположились по освободившимся адресам.
P.S. Хотя, если сохранять в памяти ObjectId, то простая проверка покажет, что он был в уже закрытом документе и данные нужно обновить.
Название: Re: Насколько уникален ObjectId? Буферизация данных об объекте.
Отправлено: Андрей Бушман от 11-07-2016, 12:59:38
Да, логично. Но тогда теоретически не исключена ситуация, что документ был закрыт, адреса в памяти освободились, открыт другой документ и его объекты расположились по освободившимся адресам.
И что? Конфликтов-то ведь это не создаст. Использовать освободившуюся память никто не запрещает.
Цитировать
P.S. Хотя, если сохранять в памяти ObjectId, то простая проверка покажет, что он был в уже закрытом документе и данные нужно обновить.
Именно.
Название: Re: Насколько уникален ObjectId? Буферизация данных об объекте.
Отправлено: Александр Ривилис от 11-07-2016, 13:03:00
Но тогда теоретически не исключена ситуация, что документ был закрыт, адреса в памяти освободились, открыт другой документ и его объекты расположились по освободившимся адресам.
Да. Но ObjectId - это не совсем указатель в памяти. ObjectId.Database возвращает базу в которой этот ObjectId содержится.
Название: Re: Насколько уникален ObjectId? Буферизация данных об объекте.
Отправлено: Александр Ривилис от 11-07-2016, 13:05:57
Этот буфер будет общим для всех открытых документов. Вот и встал вопрос: достаточно ли этого, или нужно еще дополнительно ввести разделение по базам данных или документам?:
Достаточно, ибо по ObjectId однозначно определяется Database.