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

ADN Club => ObjectARX => Тема начата: Sergey_K от 11-03-2019, 18:53:41

Название: Explode AcDbBlockReference
Отправлено: Sergey_K от 11-03-2019, 18:53:41
Есть AcDbBlockReference
Как разбить его на примитивы, аналогично команде Acad "explode" и удалить определение блока?
Название: Re: Explode AcDbBlockReference
Отправлено: Александр Ривилис от 11-03-2019, 18:57:27
Метод AcDbBlockReference::explodeToOwnerSpace тебе в помощь. А для удаления определения блока (AcDbBlockTableRecord) открой его "для записи" и вызови метод erase. Впрочем желательно сначала убедиться, что на него нет ссылок.
Название: Re: Explode AcDbBlockReference
Отправлено: Sergey_K от 11-03-2019, 19:13:39
Спасибо. как я его не заметил... )
А полученный набор примитивов получить можно для дальнейших действий?
Или создать ещё тему?
Название: Re: Explode AcDbBlockReference
Отправлено: Александр Ривилис от 11-03-2019, 19:23:53
А полученный набор примитивов получить можно для дальнейших действий?
Если нужен набор примитивов для дальнейших действий, то лучше вместо метода AcDbBlockReference::explodeToOwnerSpace использовать метод AcDbBlockReference::explode. Ты как раз в AcDbVoidPtrArray и получишь набор примитивов. Только их еще нужно будет добавить в пространство модели/листа.
Название: Re: Explode AcDbBlockReference
Отправлено: Sergey_K от 11-03-2019, 19:32:50
Только их еще нужно будет добавить в пространство модели/листа

Не ясен формат этого AcDbVoidPtrArray. Что там ссылки на Entity или objectId ?
Название: Re: Explode AcDbBlockReference
Отправлено: Александр Ривилис от 11-03-2019, 19:44:05
Только их еще нужно будет добавить в пространство модели/листа

Не ясен формат этого AcDbVoidPtrArray. Что там ссылки на Entity или objectId ?
Там ссылки на AcDbObject (в частности AcDbEntity):
Код - C++ [Выбрать]
  1. AcDbVoidPtrArray arr;
  2. bref->explode(arr); // Это наш AcDbBlockReference
  3. int nArr = arr.length();
  4. if (nArr > 0) {
  5.         for (int i=0; i < nArr; i++) {
  6.                 AcDbObject *pObj = (AcDbObject*)arr[i];
  7.                 AcDbEntity *pEnt = AcDbEntity::cast(pObj);
  8.                 if (pEnt) {
  9.                         // Дальше делаешь с ним то, что считаешь нужным.
  10.                         // В том числе и добавляешь в нужное пространство.
  11.                 }
  12.  
  13.         }
  14. }