Изменение группы

Автор Тема: Изменение группы  (Прочитано 3411 раз)

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

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Изменение группы
« : 07-11-2017, 00:34:38 »
Необходимо изменить последовательность элементов в группе и добавить новые объекты
Как правильно изменить группу?

Группа корректно создается, изменяется имя и описание группы. В группе делается реверс последовательности элементов.

Но возникнет ошибка при - изменении последовательности элементов группы (transfer) и добавление новых элементов в группу
(append, prepend, insertAt)

Пример кода ниже

Если заменить строку
Res=pGroup->append(entId);
функциями  prepend, insertAt - результат одинаковый
При выполнении функция возвращает код ошибки - 83 - eWasOpenForWrite

При использовании функции transfer перемещаемый объект просто пропадает из группы, а не перемещается.

Как правильно сделать эти операции?

Код - C++ [Выбрать]
  1. //Добавить объект в конец группы
  2. int appendObjectGroup(LPCTSTR NameGroup, AcDbObjectId entId)
  3. {
  4.         int Res;
  5.         AcDbDictionary *pGroupDict=NULL;
  6.        
  7.     acdbHostApplicationServices()->workingDatabase()
  8.         ->getGroupDictionary(pGroupDict, AcDb::kForWrite);   //получить адрес словаря
  9.  
  10.         if (pGroupDict->has(NameGroup) == TRUE) {//Если группа с таким именем существует -добавить в нее примитив
  11.                 AcDbGroup *pGroup;
  12.                 AcDbObjectId  groupId;
  13.                  
  14.                 pGroupDict->getAt(NameGroup, groupId);  //получить индентификатор группы по ее имени
  15.                 acdbOpenObject(pGroup, groupId, AcDb::kForWrite); //открыть группу для записи
  16.  
  17.                 Res=pGroup->append(entId);              //добавить новый объект в конец группы
  18.                 if (Res != Acad::eOk) {
  19.                         acutPrintf(_T("\n\n*** pGroup->append Error=%i \n\n"), Res);
  20.                 }
  21.                                
  22.                 pGroupDict->close();
  23.                 pGroup->close();
  24.                 Res=0;
  25.         }
  26.         else {//словаря с таким именем не найдено
  27.                 Res=pGroupDict->close();
  28.                 Res=1;
  29.         }
  30.  
  31.         return Res;
  32. }
  33.  

Отмечено как Решение Александр Ривилис 07-11-2017, 01:58:17

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Изменение группы
« Ответ #1 : 07-11-2017, 01:17:45 »
При выполнении функция возвращает код ошибки - 83 - eWasOpenForWrite
1. Примитив, у которого objectId == entId в этот момент закрыт?
2. Зачем открывать GroupDictionary AcDb::kForWrite, если не собираешься создавать новую группу?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Re: Изменение группы
« Ответ #2 : 07-11-2017, 01:46:23 »
Заработало. Спасибо!!!

Цитировать
Примитив, у которого objectId == entId в этот момент закрыт?
Действительно проблема была в том, что добавляемый объект был открыт на запись в начале вызывающей функции.
Закрыл объект и все сработало.

Цитировать
Зачем открывать GroupDictionary AcDb::kForWrite, если не собираешься создавать новую группу?
Согласен, достаточно только для чтения.
Выдавало ошибку записи, поэтому для теста открыл для записи все объекты

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Изменение группы
« Ответ #3 : 07-11-2017, 01:49:08 »
1. Пользуйся интеллектуальными указателями и количество таких ошибок уменьшится в разы.
2. Как только объект/примитив становится ненужен - сразу же закрывай его.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Re: Изменение группы
« Ответ #4 : 07-11-2017, 01:57:09 »
Цитировать
Пользуйся интеллектуальными указателями и количество таких ошибок уменьшится в разы.
А что это такое и  как ими пользоваться?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Изменение группы
« Ответ #5 : 07-11-2017, 01:59:02 »
А что это такое и  как ими пользоваться?

А вот это оставим на завтра...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Изменение группы
« Ответ #6 : 07-11-2017, 13:40:11 »
А что это такое и  как ими пользоваться?
Воспользуйся поиском по этому форуму и сайту AcDbObjectPointer - найдёшь много полезных примеров.
Главное свойство этих интеллектуальных указателей - как только экземпляр выходит из области видимости - вызывается его деструктор. А деструктор в зависимости от того объект в базе или в памяти или вызывает для него метод close или вызывает delete для этого объекта.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Re: Изменение группы
« Ответ #7 : 07-11-2017, 21:37:38 »
Спасибо, я посмотрю