Как правильно удалить xRecord

Автор Тема: Как правильно удалить xRecord  (Прочитано 3529 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Хотел спросить правильно ли я удаляю xRecord:
Код - C++ [Выбрать]
  1. bool xRecordXdataHelper::removeXrecord(const AcDbObjectId &objectId, const ACHAR * paramName)
  2. {
  3.         //create or get extension dictionary
  4.         AcDbObjectId dictId;
  5.         {
  6.                 AcDbObjectPointer<AcDbObject> pobj(objectId, AcDb::kForWrite);
  7.                 if (pobj.openStatus() != Acad::eOk) return false;
  8.                 dictId = pobj->extensionDictionary();
  9.         }
  10.  
  11.         //Remove xrecord from extension dictionary
  12.         AcDbObjectId xrecid;
  13.         {
  14.                 AcDbObjectPointer<AcDbDictionary> pDict(dictId, AcDb::kForWrite);
  15.                 if (pDict.openStatus() != Acad::eOk) return false;
  16.                 pDict->remove(paramName);
  17.         }
  18.         return true;
  19. }

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как правильно удалить xRecord
« Ответ #1 : 08-10-2018, 12:34:34 »
Для удаления Xrecord должно быть достаточно вызвать её метод erase(). Впрочем pDict->remove() тоже не помешает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Re: Как правильно удалить xRecord
« Ответ #2 : 08-10-2018, 14:35:51 »
тоесть так?
Код - C++ [Выбрать]
  1. ....
  2. //Remove xrecord from extension dictionary
  3.         AcDbObjectId xrecid;
  4.         {
  5.                 AcDbObjectPointer<AcDbDictionary> pDict(dictId, AcDb::kForWrite);
  6.                 if (pDict.openStatus() != Acad::eOk) return false;
  7.                 AcDbXrecord * pXrec;
  8.                 pDict->getAt(paramName, (AcDbObject*&)pXrec,
  9.                         AcDb::kForWrite);
  10.                pXrec->erase();
  11.          }
  12. ....
  13.  
Или того кода что я написал выше достаточно?

Отмечено как Решение Vt 08-10-2018, 17:08:15

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как правильно удалить xRecord
« Ответ #3 : 08-10-2018, 16:53:00 »
Вот так:
Код - C++ [Выбрать]
  1. //////////////////////////////////////////////////////////////////////////
  2. // Функция удаляет по ключу запись в словаре AcDbDictionary,
  3. // Словарь передается как AcDbObjectId, а ключ как строка.
  4. //////////////////////////////////////////////////////////////////////////
  5. static Acad::ErrorStatus DelSubkey(AcDbObjectId dictId, const ACHAR * key)
  6. {
  7.   Acad::ErrorStatus es = Acad::eOk;
  8.   AcDbObjectId keyId;
  9.   {
  10.     AcDbObjectPointer<AcDbDictionary> pDict(dictId, AcDb::kForRead);
  11.     if ((es = pDict.openStatus()) != Acad::eOk)
  12.       return es;
  13.     if ((es = pDict->getAt(key, keyId)) != Acad::eOk)
  14.       return es;
  15.   }
  16.   if (!keyId.isNull())
  17.   {
  18.     AcDbObjectPointer<AcDbObject> pObj(keyId, AcDb::kForWrite);
  19.     if ((es = pObj.openStatus()) != Acad::eOk)
  20.       return es;
  21.     return pObj->erase();
  22.   }
  23.   return es;
  24. }
  25. //////////////////////////////////////////////////////////////////////////
  26. // Пример использования DelSubkey
  27. //////////////////////////////////////////////////////////////////////////
  28.  
  29. static void RivilisDelXrec () {
  30.   Acad::ErrorStatus es = Acad::eOk;
  31.   ads_name en; ads_point p;
  32.   if (acedEntSel(ACRX_T("\nВыберите примитив: "), en, p) == RTNORM)
  33.   {
  34.     ACHAR buf[512];
  35.     if (acedGetString(TRUE, ACRX_T("\nУкажите ключ в ExtDict: "), buf) == RTNORM)
  36.     {
  37.       AcDbObjectId extDictId;
  38.       AcDbObjectId id; acdbGetObjectId(id, en);
  39.       {
  40.         AcDbEntityPointer pEnt(id, AcDb::kForRead);
  41.         if ((es = pEnt.openStatus()) != Acad::eOk)
  42.         {
  43.           acutPrintf(ACRX_T("\nОшибка: %s"), acadErrorStatusText(es));
  44.           return;
  45.         }
  46.         extDictId = pEnt->extensionDictionary();
  47.       }
  48.       if (!extDictId.isNull())
  49.       {
  50.         if ((es = DelSubkey(extDictId, buf)) != Acad::eOk)
  51.         {
  52.           acutPrintf(ACRX_T("\nОшибка: %s"), acadErrorStatusText(es));
  53.           return;
  54.         }
  55.       }
  56.       else
  57.       {
  58.         acutPrintf(ACRX_T("\nУ выбранного примитива нет ExtDict!"));
  59.       }
  60.     }
  61.   }
  62. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 1
Re: Как правильно удалить xRecord
« Ответ #4 : 08-10-2018, 17:11:19 »
Спасибо большое за такой исчерпывающий ответ. Вы так скурпулезно подходите к ответам что мне немного не ловко  :).

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как правильно удалить xRecord
« Ответ #5 : 08-10-2018, 17:21:16 »
Спасибо большое за такой исчерпывающий ответ. Вы так скурпулезно подходите к ответам что мне немного не ловко  :).
Чем меньше ошибок в моих примерах - тем меньше ошибок в программах у тех, кто мои примеры использует...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение