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

ADN Club => AutoCAD .NET API => Тема начата: avc от 12-06-2016, 18:20:09

Название: Где внутри dwg-файла сохранить небольшую базу данных
Отправлено: avc от 12-06-2016, 18:20:09
Обычно храню свои данные в xData объектов чертежа. Но мне этого уже мало. Планирую в xData оставить только ссылки,  а сами данные хранить где-то отдельно. Объем небольшой, несколько таблиц (детали, сборки, материалы и т.п.) , потянет на сотню килобайт. Но где оптимальней сохранить? Отдельный файл не годится. Внешние БД - тем более. Затолкать построчно в свойства чертежа? Но там только текстовые строки. Или преобразовать все данные в бинарную запись xData у какого-то глобального объекта? Не могу придумать, какого объекта? И размер xData сильно ограничен. Есть еще какое-то xRecord,  пользовательские словари, именованные объекты, OLE... Я ни с чем таким пока не работал. Подскажите, знатоки, как оптимальней, где копать?
Спасибо
Название: Re: Где внутри dwg-файла сохранить небольшую базу данных
Отправлено: Вильдар от 12-06-2016, 18:26:19
Если нужно хранить уникальные данные для объектов чертежа, то можно использовать расширенные данные объектов ExtensionDictionary (примеров много в сети).
Если данные одинаковые для объектов в разных чертежа, то наверно лучше единую внешнюю базу использовать, а цепляться к объектам через xdata.
Расширенные данные использовал, но в небольших объемах (чтобы пару параметров хранить).
Название: Re: Где внутри dwg-файла сохранить небольшую базу данных
Отправлено: avc от 12-06-2016, 18:34:51
Да, есть данные идентичные для многих графических объектов, поэтому и возникла мысль не дублировать их в каждом. С внешними базами я давно работаю, тут у меня вопросов нет. Но сейчас задача стоит все сохранить в одном DWG
Название: Re: Где внутри dwg-файла сохранить небольшую базу данных
Отправлено: Александр Ривилис от 12-06-2016, 21:26:52
Есть еще какое-то xRecord
Это и следует использовать.
Название: Re: Где внутри dwg-файла сохранить небольшую базу данных
Отправлено: Дмитрий Загорулькин от 13-06-2016, 15:34:06
Или преобразовать все данные в бинарную запись xData у какого-то глобального объекта?
Есть такой объект - NOD: http://aucache.autodesk.com/au2012/sessionsFiles/2146/2646/handout_2146_CP2146.pdf
Название: Re: Где внутри dwg-файла сохранить небольшую базу данных
Отправлено: Привалов Дмитрий от 13-06-2016, 18:17:21
Да, есть данные идентичные для многих графических объектов, поэтому и возникла мысль не дублировать их в каждом
Вертикальные приложения обычно, как указал Дмитрий, используют NOD. С помощью него можно создать древовидную структуру для хранения общих данных в чертеже

Есть второй вариант, немного непривычный для чистого Autocad NET Api.
Использовать OD - Object Data  из Autocad Map 3D.
В чертеже создаются таблицы данных и идет привязка к примитивам. Это ближе к ГИС, таким как MapInfo.
Map API доступно в Autocad, нужно лишь подключить соответствующую dll в составе автокада. По крайней мере в 2012 версии dll был в составе и скорее всего он там появился с какой-то определенной версии.
 
Описание можно поискать на сайте автодеска, что-то типа:
AutoCAD Map 3D SDK
AutoCAD Map 3D NET API
Название: Re: Где внутри dwg-файла сохранить небольшую базу данных
Отправлено: Привалов Дмитрий от 13-06-2016, 20:26:36
OD - Object Data  из Autocad Map 3D
Похоже дезинформировал о доступности OD.
Для AutoCAD Map 3D NET API нужно подключать ManagedMapApi.dll
В 2014 автокаде его не нашел. Скорее всего когда я прибегал к Map Api использовал Civil 3D в составе которого и был этот файл.
Поэтому вариант не для всех.

Скорее всего механизм OD использует в итоге NOD для сохранения данных,  но не проверял.
В нем стандартизована работа по созданию таблиц данных и привязка их с примитивами и для этого доступен готовый API.
Название: Re: Где внутри dwg-файла сохранить небольшую базу данных
Отправлено: avc от 14-06-2016, 12:32:03
Есть такой объект - NOD
Спасибо. Почитал. Весьма доходчиво. Получается, чтоб сохранить мои данные я должен:
-Создать свой словарь
-Затолкать его в NOD
-Создать xRecord
-Затолкать ее в словарь
-Создать ResultBuffer записать в него мои бинарные данные
-Записать буфер в xRecord
Хм, не скажу что путь короткий, но в общем одолимо. Тем более, что прочитать все это надо 1 раз при открытии файла. А при изменении можно уже будет не шарить по словарям, а просто перезаписывать данные в xRecord. Да?
Всем ответившим - спасибо!

Название: Re: Где внутри dwg-файла сохранить небольшую базу данных
Отправлено: Дмитрий Загорулькин от 14-06-2016, 12:51:33
Да, все верно.
Название: Re: Где внутри dwg-файла сохранить небольшую базу данных
Отправлено: Александр Ривилис от 14-06-2016, 12:58:27
Да?
Да. Тем более, что ты можешь создать сервисные классы/методы для этого, чтобы облегчить процедуру записи/чтения информации.