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

Статьи => Тестирование статей => Тема начата: Дмитрий Загорулькин от 02-12-2017, 02:20:51

Название: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Дмитрий Загорулькин от 02-12-2017, 02:20:51
Описание задачи.

Как известно, XData имеют ограничение по объёму записываемой информации в 16 КБайт. В AutoLISP и ObjectARX API есть даже специальные инструменты для проверки свободного места в XData, тогда как в .NET API, насколько мне известно, таких инструментов нет.
Помимо этого, в XData есть ограничение на длину строки данных - 255 символов. Записать можно и больше, но первый же Audit обрежет эти данные (подробнее - тут (http://spiderinnet1.typepad.com/blog/2012/11/autocad-net-xdata-xdata-string-length-limit-physical-and-theoretical.html)).
Добавление 1 (14.12.2018):В чём-то похожее ограничение есть на запись вещественных чисел. API позволяет записывать и извлекать значение Double.NaN, но AUDIT считает эти данные некорректными и при проверке переписывает все эти значения на 0.0 (подробнее - тут (http://adn-cis.org/forum/index.php?topic=8966.0)).

Само по себе число 16 Кбайт мало о чём говорит - много это или мало? Также, для лучшего понимания, с чем имеем дело, хочется получить ответы на такие вопросы:
1. Сколько может быть зарегистрированных приложений в чертеже?
2. Как влияет длина названия приложения на занимаемый объём?
3. Как влияет длина строки данных на занимаемый объём?
4. Сколько ориентировочно данных различных приложений можно поместить в XData?
5. Сколько ориентировочно данных одного приложения можно поместить в XData?

Условия и используемые инструменты

Платформа: AutoCAD Civil 3D 2014 как AutoCAD (x64)
Объект, в который записываются данные: отрезок, окружность или любой другой простой графический объект. Объект создавался каждый раз непосредственно перед запуском команды записи данных.
Типы записываемых данных: строка, целое и вещественное число.
Используемый код:
Извините, вам запрещён просмотр содержимого спойлеров.

Для проверки записанных данных использовался инструмент ARXDBG: http://adn-cis.org/forum/index.php?topic=7274.0

Результаты исследования.

1. Сколько может быть зарегистрированных приложений в чертеже?
Миллион приложений команда зарегистрировала без ошибок. Правда, при попытке посмотреть данные по базе, AutoCAD завис намертво. При 10000 приложений удалось посмотреть данные в базе:
(https://s8.postimg.org/e3ojz504h/Reg_Apps1.png) (https://postimg.org/image/e3ojz504h/)
(https://s8.postimg.org/k4m8w7ugh/Reg_Apps2.png) (https://postimg.org/image/k4m8w7ugh/)
Вывод: ограничений на количество зарегистрированных приложений нет. Но большое их количество сильно затормаживает работу с чертежом.

2. Как влияет длина названия приложения на занимаемый XData объём?
Название приложения - 8 символов, строка данных – 1 символ. В XData поместилось 2047 записей:
(https://s8.postimg.org/cbvl4b92p/Reg_App_Name1.png) (https://postimg.org/image/cbvl4b92p/)
Название приложения – 255 символов, строка данных – 1 символ. В XData поместилось снова 2047 записей:
(https://s8.postimg.org/9vtrpyj4x/Reg_App_Name2.png) (https://postimg.org/image/9vtrpyj4x/)
Вывод: Длина названия приложения не влияет на размер XData.

3. Как влияет длина строки данных на занимаемый XData объём?
Если строка данных имеет длину 1 символ, то в XData помещается 2047 записей:
(https://s8.postimg.org/cbvl4b92p/Reg_App_Name1.png) (https://postimg.org/image/cbvl4b92p/)
Если длину строки данных увеличить до 255 – только 31:
(https://s8.postimg.org/6c7u09j0x/Data_String_Length.png) (https://postimg.org/image/6c7u09j0x/)
А может быть, если записать строки в рамках одного приложения, то получится их больше уместить? Ничего подобного:
(https://s8.postimg.org/71qmcr1lt/Max_Strings_Count.png) (https://postimg.org/image/71qmcr1lt/)
То есть, как ни комбинируй, в XData помещается всего 31 строка максимальной длины!
Вывод: чем больше длины записываемых строк, тем больше места занимают данные в XData.

4. Сколько ориентировочно данных различных приложений можно поместить в XData?
Записываются следующие данные: строка длиной 20 символов, вещественное число и целое число. Числа для каждой записи выбираются случайным образом. Это позволит косвенно оценить: будут ли различаться размеры данных в зависимости от различных значений чисел? В результате, было выполнено 273 записи:
(https://s8.postimg.org/8i24ulmfl/Data_Count.png) (https://postimg.org/image/8i24ulmfl/)
(https://s8.postimg.org/60qdncxe9/Data_Count_ARXMGD.png) (https://postimg.org/image/60qdncxe9/)
При повторных проверках результат не менялся.
Вывод: при небольшом объёме записываемых данных, вместимость XData довольно большая – места хватает для размещения данных 200-300 приложений.
Дополнительный вывод: при различных числовых значениях размер данных не меняется.

5. Сколько ориентировочно данных одного приложения можно поместить в XData?
С теми же данными, что и в предыдущем тесте, циклов записи получилось больше - 287:
(https://s8.postimg.org/radzyb8kx/One_App_Data_Count.png) (https://postimg.org/image/radzyb8kx/)
Вывод: при записи данных в одно приложение, данных помещается больше, чем если эти данные распределять по разным приложениям. Но эту разницу нельзя назвать существенной.

Общий вывод

XData действительно имеют ощутимый лимит по объёму записываемых данных. Особенно, если записываемые данные содержат строки большой длины. Если же записывать небольшой объём данных, то места может хватить на пару сотен записей.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Александр Ривилис от 02-12-2017, 16:32:50
Отличное исследование!
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Александр Ривилис от 02-12-2017, 16:39:51
В AutoLISP и ObjectARX API есть даже специальные инструменты для проверки свободного места в XData, тогда как в .NET API, насколько мне известно, таких инструментов нет.
Можно при необходимости воспользоваться P/Invoke для acdbXdRoom и acdbXdSize.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Дмитрий Загорулькин от 04-12-2017, 12:24:18
Спасибо!
Можно при необходимости воспользоваться P/Invoke для acdbXdRoom и acdbXdSize.
Я вот как раз раздумываю: а есть ли такая необходимость? Смысл проверять текущий размер XData - быть уверенным, что данные поместятся. Так ведь, если возникает исключение eXDataSizeExceeded, то уже понятно, что данные не помещаются. Или в чём-то другом есть смысл использования этих методов? Мне пока в голову не пришла ни одна такая ситуация, где они бы понадобились.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Александр Ривилис от 04-12-2017, 12:28:04
Так ведь, если возникает исключение eXDataSizeExceeded, то уже понятно, что данные не помещаются.
Обработка исключений в .NET - это достаточно ресурсоёмкая операция, требующая еще и временных затрат. Впрочем не уверен, что использование P/Invoke для acdbXdRoom и acdbXdSize даст прирост скорости.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Дмитрий Загорулькин от 04-12-2017, 12:38:55
Я, честно говоря, пока что даже не знаю, что делать, если данные не будут помещаться :)
Была надежда на то, что этого никогда не случится. В принципе, шанс такой есть - если другие приложения не будут писать свои данные в XData нужного мне объекта, а если будут, то не кучу строк максимальной длины... Но, не исключаю, что эти если не выполнятся однажды. И вот как тогда быть? То ли просто уведомлять пользователя: "Не могу записать данные", но тогда надо предложить какой-то альтернативный вариант. А вот какой? "А давайте удалим другие данные из объекта? [Да/Нет/Мневсёравно]"? :)
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Александр Ривилис от 04-12-2017, 12:47:08
И вот как тогда быть? То ли просто уведомлять пользователя: "Не могу записать данные", но тогда надо предложить какой-то альтернативный вариант. А вот какой? "А давайте удалим другие данные из объекта? [Да/Нет/Мневсёравно]"? :)
Тут следует учесть, что эти данные могут быть данными AutoCAD (например, размерные данные) и их крайне нежелательно удалять...
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Алексей Кулик от 04-12-2017, 17:49:36
Мне кажется, что будет проще и надежнее использовать словарные записи. Могу и ошибаться :)
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Дмитрий Загорулькин от 04-12-2017, 17:58:42
Столкнулся с тем, что не надёжнее :(
Подробности - тут (Материальчик специфический): http://adn-cis.org/forum/index.php?topic=816.msg29255#msg29255
Беда в том, что словарь является отдельным объектом базы данных чертежа, поэтому, гораздо легче "теряется". В то время как XData хранятся внутри объекта и "потерять" их сложнее. Но вот это ограничение по объёму немного напрягает, конечно.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Алексей Кулик от 04-12-2017, 18:39:37
Может, это баг самого Civil? Я сколько ни использовал подобное, ни разу не ловил потери словарных данных :( Может быть, конечно, я настолько далеко и глубоко не влезал...
Кстати, в чистом ACAD подобное повторяется?
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Дмитрий Загорулькин от 04-12-2017, 18:52:09
Может, это баг самого Civil?
Практически на 100% уверен, что это баг. Отправил запрос в DevHelp, посмотрим, что скажут.
Я сколько ни использовал подобное, ни разу не ловил потери словарных данных
Я вот тоже до недавнего времени не сомневался в надёжности словарей...
Кстати, в чистом ACAD подобное повторяется?
В чистом автокаде такое не повторить, потому что проблемы возникают при использовании механизма сивила под названием "быстрая ссылка" и соответствующей команды синхронизации таких быстрых ссылок. В автокаде такого нет. Ближайший аналог в чистом автокаде - внешняя ссылка. В принципе, можно проверить, как будут вести себя словари объектов из внешней ссылки при вставке и обновлении. Думаю, что не будет таких проблем.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Дмитрий Загорулькин от 15-12-2017, 20:19:46
И снова здравствуйте!
Называется: "дошло до утки на третьи сутки"...
Озаботился проблемой сохранения данных других приложений в XData при записи/перезаписи моих данных. Сделал громоздкую обработку всех данных в XData "до" и "после" моих данных, чтобы затем сформировать один общий ResultBuffer и передать его в XData. А сейчас с удивлением для себя обнаружил, что API "всё делает за нас". Оказывается, что при присвоении значения XData не происходит его полная замена! Вроде бы, ожидается именно такое поведение, когда видишь присвоение значения свойству XData (7-я строка):
Код - C# [Выбрать]
  1. using (ResultBuffer rb = new ResultBuffer(new TypedValue(1001, appName)))
  2. {
  3.     foreach (TypedValue tVal in values)
  4.     {
  5.         rb.Add(tVal);
  6.     }
  7.     obj.XData = rb;
  8. }
  9.  
Однако, записываются/перезаписываются только данные приложения appName. Существующие данные других приложений сохраняются! Крайне неочевидным оказалось для меня такое поведение. Хотя, должен был раньше догадаться. Если бы это было не так, моё исследование споткнулось бы на постоянной перезаписи данных :)
Логично было бы, наверное, делать это с помощью вспомогательного метода SetXDataForApplication (по аналогии с имеющимся GetXDataForApplication). Тогда бы не возникло такого недопонимания, по крайней мере у меня. И что самое печальное - в справке об этом ни слова...
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Александр Ривилис от 15-12-2017, 20:31:06
Однако, записываются/перезаписываются только данные приложения appName.
Более того. Они и удаляются таким же образом. Т.е. если тебе нужно из Xdata удалить приложение appName, то удалять следует так:
Код - C# [Выбрать]
  1. using (ResultBuffer rb = new ResultBuffer(new TypedValue(1001, appName)))
  2. {
  3.     obj.XData = rb;
  4. }
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Дмитрий Загорулькин от 15-12-2017, 20:36:27
Это же надо так придумать! Ну ладно, придумать... Но хотя бы задокументировали столь неочевидное поведение! Сразу вспоминается цитата с баша: http://bash.im/quote/409943
Я надеюсь, хотя бы, что если null задать, то это удалит все данные у объекта? :)
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Александр Ривилис от 15-12-2017, 21:07:25
Я надеюсь, хотя бы, что если null задать, то это удалит все данные у объекта? :)
Нет. И не надейся. :) Чтобы удалить все расширенные данные объекта нужно найти все приложения, которые есть в объекте и для каждого из этих приложений выполнить удаление, как я писал выше.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Алексей Терно от 22-05-2018, 20:25:29
Столкнулся я c исключением eXdataSizeExceeded - нехватка места в хранилище XData. Потом выяснил, что славные парни из Автодеска для таких вот случаев придумали XRecord:
Цитировать
The Xrecord class is a data storage class that was implemented primarily to allow ADSRX and AutoLISP programs a means to store data in pieces larger than the xdata's 16KB-per-object limit. Each Xrecord object is capable of storing up to 2GB. By establishing an object's extension dictionary as the xrecord's owner, it's possible to associate large amounts of data with that object.

Решил проверить...

Вот пример кода для записи и чтения данных:
Извините, вам запрещён просмотр содержимого спойлеров.

Если кратко, то я создал отрезок и записал в него 10 000 строк по 10 000 символов (я немного ошибся и по факту оказалось на одну итерацию меньше в каждом цикле).
Вот результаты:

UPD: после команды AUDIT длина строк не обрезается.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Алексей Кулик от 23-05-2018, 09:32:18
Расширенные данные имеют ограничение в 16 кб, если не ошибаюсь. И РД не на каждый примитив можно добавлять / удалять / изменять )
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: АлексЮстасу от 09-07-2018, 20:13:18
размер чертежа - 1,5 Мб (без данных файл весит 31,5 Кб)
Интересно бы еще посмотреть на анализ скорости работы с большой загруженностью модели XData или XRecord. Некоторые мнения и тесты вроде бы за то, что на скорость "обычной" работы с моделью (копирование, перенос, выбор и пр.) даже большие объемы XData или XRecord существенно не влияют. Что радует, конечно.

Столкнулся с тем, что не надёжнее :(
Тоже интересно было бы узнать, как влияет на копирование данных из другого чертежа порядок/последовательность описания полей данных в одноименных XData и XRecord?
Например, варианты:
1. не влияет, копируются с той последовательностью полей, что описана в чертеже, в который копируется,
2. влияет - графические элементы копируются, а их XData или XRecord не копируются, если последовательность полей разная,
3. влияет - вообще копирование не выполняется, если последовательность полей XData или XRecord разная,
4. влияет - копируются, но создаются XData или XRecord с новыми названиями (с дописыванием номера или т.п.).
Или еще как-то?

Еще вариант, что не только порядок описания полей в чертежах разный, но и состав полей разный в одноименных XData или XRecord. Еще вариант - одноименные поля имеют разный тип данных.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Александр Ривилис от 09-07-2018, 20:19:08
Тоже интересно было бы узнать, как влияет на копирование данных из другого чертежа порядок/последовательность описания полей данных в одноименных XData и XRecord?
Ни в XData ни в XRecord нет понятия "описание полей". И то и другое  - неструктурированные данные, которые программист может условно структурировать по своему усмотрению. Так что всё остальное выглядит как бессмысленный набор слов.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: АлексЮстасу от 12-12-2019, 18:33:48
И РД не на каждый примитив можно добавлять / удалять / изменять )
Что имеется в виду? XData не совместимы с какими-то типами примитивов?
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Алексей Кулик от 12-12-2019, 18:49:22
С видовыми экранами, насколько я помню - у них уже все забито.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: АлексЮстасу от 12-12-2019, 19:34:43
С видовыми экранами
Команда XDATA из Express Tools не добавляет Xdata к объектам Civil.
Это из-за ограничений Xdata или ограничение только этой команды?
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Александр Ривилис от 12-12-2019, 20:06:26
Команда XDATA из Express Tools не добавляет Xdata к объектам Civil.
Перепроверь. Без подтверждающего видео не поверю.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: АлексЮстасу от 12-12-2019, 20:59:56
Перепроверь. Без подтверждающего видео не поверю.
Перепроверил на свежесозданных COGO-точках, на TIN Surface из них. В 2014 и 2019.
Покадровое видео:
Цитировать
Command: xdata
Select object:
Enter application name: surf
SURF new application.
Enter an option [3Real/DIR/DISP/DIST/Hand/Int/LAyer/LOng/Pos/Real/SCale/STr/eXit] <eXit>: R
Enter real number: 9999.99
Enter an option [3Real/DIR/DISP/DIST/Hand/Int/LAyer/LOng/Pos/Real/SCale/STr/eXit] <eXit>:
Command:
Command: xdlist
Select object:
Enter application name <*>:
No Xdata associated with Application Name(s).
ArxDbg тоже Xdata у этих объектов не показывает.
Пробовал на чужих трубах, колодцах, коридорах и т.п. - Xdata не добавляются.
После eXit нет "New xdata appended".
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Александр Ривилис от 12-12-2019, 21:23:45
АлексЮстасу,
В Express Tools добавление Xdata к объектам идёт при помощи функции (entmod). Судя по всему она не работает с объектами Civil 3D. Другие способы прекрасно добавляют Xdata. Пример из ARXDBG: команда ArxDbgTestXdata
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: АлексЮстасу от 12-12-2019, 22:17:02
Другие способы прекрасно добавляют Xdata. Пример из ARXDBG: команда ArxDbgTestXdata
Это хорошо, я на это и надеялся, что дело не в особенностях Xdata, а в команде ET.

Но какие-то ограничения на типы примитивов и объектов у Xdata есть?
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Александр Ривилис от 12-12-2019, 22:20:52
Но какие-то ограничения на типы примитивов и объектов у Xdata есть?
Нет. Для никоторых объектов/примитивов некоторые группы зарезервированы и используются самим AutoCAD. Например, "ACAD". Сразу скажу, что полного списка нет.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: АлексЮстасу от 13-12-2019, 17:22:41
Спасибо!
В т.ч. за TestXdata.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: АлексЮстасу от 05-07-2021, 21:05:22
добавление Xdata к объектам идёт при помощи функции (entmod). Судя по всему она не работает с объектами Civil 3D. Другие способы прекрасно добавляют Xdata.
Средствами LISP добавлять Xdata к объектам вертикальных приложений в принципе возможно?
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: Александр Ривилис от 05-07-2021, 21:30:19
АлексЮстасу,
А проверить самостоятельно?
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: АлексЮстасу от 07-07-2021, 20:09:11
А проверить самостоятельно?
О!  ;D

Для никоторых объектов/примитивов некоторые группы зарезервированы и используются самим AutoCAD. Например, "ACAD". Сразу скажу, что полного списка нет.
Пока еще нашлось:
GradientColor2ACI - Hatch
GradientColor1ACI - Hatch
PE_URL - Hyperlink
IRD - топологические данные в Map 3D.
Название: Re: AutoCAD .NET API: Исследование возможностей расширенных данных (XData)
Отправлено: АлексЮстасу от 11-10-2021, 18:35:29
Может быть пригодится инструмент для общей информации об XData в dwg и у указанных объектов - XDTOOLS_STAT.lsp.
И инструмент для обнаружения некорректностей или возможных проблем с XData в dwg - XDTOOLS_CHECK.lsp.