Где внутри dwg-файла сохранить небольшую базу данных

Автор Тема: Где внутри dwg-файла сохранить небольшую базу данных  (Прочитано 8887 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Обычно храню свои данные в xData объектов чертежа. Но мне этого уже мало. Планирую в xData оставить только ссылки,  а сами данные хранить где-то отдельно. Объем небольшой, несколько таблиц (детали, сборки, материалы и т.п.) , потянет на сотню килобайт. Но где оптимальней сохранить? Отдельный файл не годится. Внешние БД - тем более. Затолкать построчно в свойства чертежа? Но там только текстовые строки. Или преобразовать все данные в бинарную запись xData у какого-то глобального объекта? Не могу придумать, какого объекта? И размер xData сильно ограничен. Есть еще какое-то xRecord,  пользовательские словари, именованные объекты, OLE... Я ни с чем таким пока не работал. Подскажите, знатоки, как оптимальней, где копать?
Спасибо

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Если нужно хранить уникальные данные для объектов чертежа, то можно использовать расширенные данные объектов ExtensionDictionary (примеров много в сети).
Если данные одинаковые для объектов в разных чертежа, то наверно лучше единую внешнюю базу использовать, а цепляться к объектам через xdata.
Расширенные данные использовал, но в небольших объемах (чтобы пару параметров хранить).

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

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Да, есть данные идентичные для многих графических объектов, поэтому и возникла мысль не дублировать их в каждом. С внешними базами я давно работаю, тут у меня вопросов нет. Но сейчас задача стоит все сохранить в одном DWG

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Или преобразовать все данные в бинарную запись xData у какого-то глобального объекта?
Есть такой объект - NOD: http://aucache.autodesk.com/au2012/sessionsFiles/2146/2646/handout_2146_CP2146.pdf

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Да, есть данные идентичные для многих графических объектов, поэтому и возникла мысль не дублировать их в каждом
Вертикальные приложения обычно, как указал Дмитрий, используют 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

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
OD - Object Data  из Autocad Map 3D
Похоже дезинформировал о доступности OD.
Для AutoCAD Map 3D NET API нужно подключать ManagedMapApi.dll
В 2014 автокаде его не нашел. Скорее всего когда я прибегал к Map Api использовал Civil 3D в составе которого и был этот файл.
Поэтому вариант не для всех.

Скорее всего механизм OD использует в итоге NOD для сохранения данных,  но не проверял.
В нем стандартизована работа по созданию таблиц данных и привязка их с примитивами и для этого доступен готовый API.

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

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Есть такой объект - NOD
Спасибо. Почитал. Весьма доходчиво. Получается, чтоб сохранить мои данные я должен:
-Создать свой словарь
-Затолкать его в NOD
-Создать xRecord
-Затолкать ее в словарь
-Создать ResultBuffer записать в него мои бинарные данные
-Записать буфер в xRecord
Хм, не скажу что путь короткий, но в общем одолимо. Тем более, что прочитать все это надо 1 раз при открытии файла. А при изменении можно уже будет не шарить по словарям, а просто перезаписывать данные в xRecord. Да?
Всем ответившим - спасибо!


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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да, все верно.

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

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