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

ADN Club => ObjectARX => Тема начата: Vt от 04-10-2018, 18:29:17

Название: Где хранить ссылку на примитив в другом примитиве?
Отправлено: Vt от 04-10-2018, 18:29:17
Спасибо. Немного не по теме вопрос. Что бы в xdata сохранить ссылку на обьект и что бы она работала при последующем открытии чертежа. Я должен сохранить там AcDbHandle handle? так как AcDbObjectId меняется при повторном открытии или какие-то еще варианты есть?
Нашел еще вариант в xrecord хранить (как я понял при повторном открытии тоже будет работать) http://adn-cis.org/kak-soxranit-identifikator-obekta-v-slovare-rasshireniya-drugogo-obekta.html
Название: Re: Где хранить ссылку на примитив в другом примитиве?
Отправлено: Александр Ривилис от 04-10-2018, 18:57:23
Сохраняй AcDbHandle в xdata в виде строки. Можно сохранить в группе 1005, но с ней иногда случаются хитрости, так что сохраняй в группе 1000.
Название: Re: Где хранить ссылку на примитив в другом примитиве?
Отправлено: Александр Ривилис от 04-10-2018, 18:58:54
Нашел еще вариант в xrecord хранить (как я понял при повторном открытии тоже будет работать) http://adn-cis.org/kak-soxranit-identifikator-obekta-v-slovare-rasshireniya-drugogo-obekta.html
Можно и так, но тебе придётся еще и следить за словарями, чтобы они не потерялись.
Название: Re: Где хранить ссылку на примитив в другом примитиве?
Отправлено: Vt от 04-10-2018, 19:03:39
Можно и так, но тебе придётся еще и следить за словарями, чтобы они не потерялись.
А как такие словари могут потеряться и как следить?
Название: Re: Где хранить ссылку на примитив в другом примитиве?
Отправлено: Александр Ривилис от 04-10-2018, 19:05:47
Можно и так, но тебе придётся еще и следить за словарями, чтобы они не потерялись.
А как такие словари могут потеряться и как следить?
Ну например при копировании из одного чертежа в другой. Лучше остановись на xdata. Они практически всегда копируются вместе с примитивом.
Название: Re: Где хранить ссылку на примитив в другом примитиве?
Отправлено: Vt от 08-10-2018, 00:53:45
Для моей конкретной задачи остановился на 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.