Где хранить ссылку на примитив в другом примитиве?

Автор Тема: Где хранить ссылку на примитив в другом примитиве?  (Прочитано 7391 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Спасибо. Немного не по теме вопрос. Что бы в xdata сохранить ссылку на обьект и что бы она работала при последующем открытии чертежа. Я должен сохранить там AcDbHandle handle? так как AcDbObjectId меняется при повторном открытии или какие-то еще варианты есть?
Нашел еще вариант в xrecord хранить (как я понял при повторном открытии тоже будет работать) http://adn-cis.org/kak-soxranit-identifikator-obekta-v-slovare-rasshireniya-drugogo-obekta.html

Отмечено как Решение Vt 05-10-2018, 07:56:45

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Сохраняй AcDbHandle в xdata в виде строки. Можно сохранить в группе 1005, но с ней иногда случаются хитрости, так что сохраняй в группе 1000.
« Последнее редактирование: 04-10-2018, 21:17:07 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Нашел еще вариант в xrecord хранить (как я понял при повторном открытии тоже будет работать) http://adn-cis.org/kak-soxranit-identifikator-obekta-v-slovare-rasshireniya-drugogo-obekta.html
Можно и так, но тебе придётся еще и следить за словарями, чтобы они не потерялись.
« Последнее редактирование: 04-10-2018, 21:17:18 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Можно и так, но тебе придётся еще и следить за словарями, чтобы они не потерялись.
А как такие словари могут потеряться и как следить?
« Последнее редактирование: 04-10-2018, 21:17:30 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно и так, но тебе придётся еще и следить за словарями, чтобы они не потерялись.
А как такие словари могут потеряться и как следить?
Ну например при копировании из одного чертежа в другой. Лучше остановись на xdata. Они практически всегда копируются вместе с примитивом.
« Последнее редактирование: 04-10-2018, 21:17:41 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Для моей конкретной задачи остановился на xRecord. Механика работы следующая: при копировании объекта и связанного объекта, сохраненный objectId в связанном объекте пересчитывается на новый. Если копируем только связанный обьект, то objectid в xrecord становится равен NULL.
Пример шаблонной функции для записи в xRecord а так же пример записи objectId, может кому пригодится:
Код - C++ [Выбрать]
  1. ....
  2. //шаблонная функция для записи в xRecord
  3. template<typename T>
  4. bool xRecordXdataHelper::setXrecordParameter(const AcDbObjectId &objectId, const ACHAR * paramerName, const int &parameterType, const T &parameter)
  5. {
  6.         //create or get extension dictionary
  7.         AcDbObjectId dictId;
  8.         {
  9.                 AcDbObjectPointer<AcDbObject> pobj(objectId, AcDb::kForWrite);
  10.                 if (pobj.openStatus() != Acad::eOk) return false;
  11.                 pobj->createExtensionDictionary();
  12.                 dictId = pobj->extensionDictionary();
  13.         }
  14.  
  15.         //Add xrecord to extension dictionary
  16.         AcDbObjectId xrecid;
  17.         AcDbXrecord * pXrec;
  18.         {
  19.                 AcDbObjectPointer<AcDbDictionary> pDict(dictId, AcDb::kForWrite);
  20.                 if (pDict.openStatus() != Acad::eOk) return false;
  21.                 pXrec = new AcDbXrecord;
  22.                 pDict->setAt(paramerName, pXrec, xrecid);
  23.         }
  24.  
  25.         //add resbuf to xrecord
  26.         struct resbuf * head = NULL;
  27.         head = acutBuildList(parameterType, parameter, 0);
  28.         pXrec->setFromRbChain(*head);
  29.         pXrec->close();
  30.         acutRelRb(head);
  31.  
  32.         return true;
  33. }
  34. .....
  35. //сохраняем objectId в xRecord
  36. bool MleaderController::setObjectId(const AcDbObjectId &MLeaderId, const AcDbObjectId &objId){
  37.         ads_name adsName;
  38.         acdbGetAdsName(adsName, objId);
  39.         return setXrecordParameter(MLeaderId, MLeaderID, AcDb::kDxfHardPointerId, adsName);
  40. }
  41. .....
  42.