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

29/07/2018

Удаление границы штриховки

Класс AcDbHatch предоставляет методы для получения границ и для удаления границ. Каждая граница представляет собой так называемый цикл. С помощью методов класса AcDbHatch вы можете выполнять итерацию всех циклов. Затем вы можете получить все объекты, принадлежащие одному циклу. Все, что вам нужно сделать, это сравнить метки объектов цикла с меткой граничного объекта, который должен быть удален из объекта штриховки. Если у одного из объектов цикла есть дескриптор, который вы ищете, вы можете использовать AcDbHatch :: removeLoopAt (), чтобы удалить петлю из штриховки.

Следующая функция делает именно это. Параметр handleRemove является меткой примитива, принадлежащего к циклу, который следует удалить.

Код - C++: [Выделить]
  1. void removeHandleFromHatch(const ACHAR* handleRemove)
  2. {
  3.   // Создаём AcDbHandle по переданной строке-метке
  4.   AcDbHandle removeHandle(handleRemove);
  5.   //
  6.   //  Запрашиваем штриховку
  7.   //
  8.   ads_point dummy;
  9.   ads_name ename;
  10.   if (RTNORM != ads_entsel(L"\nВыберите штриховку: ", ename, dummy)) 
  11.     return; AcDbObjectId hatchId;
  12.   AcDbHatch *pHatch;
  13.   if (Acad::eOk != acdbGetObjectId(hatchId, ename))
  14.   { 
  15.     ads_printf(L"\nНе можем получить objectId штриховки."); 
  16.     return;
  17.   }
  18.   if (Acad::eOk != acdbOpenObject(pHatch, hatchId, AcDb::kForRead))
  19.   {  
  20.     ads_printf(L"\nНе можем открыть штриховку ");
  21.     return;
  22.   }
  23.   //
  24.   // Анализируем штриховку
  25.   //
  26.   int loops = pHatch->numLoops();   // число циклов
  27.   ads_printf(L"\nЧисло циклов: %i", loops);
  28.   // Получаем все циклы
  29.   AcDbObjectIdArray loopIds;
  30.   for (int i = 0; i < loops; ++i)
  31.   {
  32.     // Получаем objectID всех объектов цикла
  33.     pHatch->getAssocObjIdsAt(i, loopIds);
  34.     // Получаем все объекты цикла
  35.     int numOfObjects = loopIds.logicalLength();
  36.     AcDbEntity *pEnt;   AcDbHandle handle; 
  37.     for (int j = 0; j < numOfObjects; ++j)
  38.     { 
  39.       if (Acad::eOk != acdbOpenObject(pEnt, loopIds[j],
  40.         AcDb::kForRead))
  41.       {  
  42.         ads_printf(L"\nНе могу получить объект цикла %i.", i); 
  43.         continue; 
  44.       }    
  45.       // Получаем метку примитива текущего цикла 
  46.       // и сравниваем её с меткой параметра 
  47.       pEnt->getAcDbHandle(handle); 
  48.       pEnt->close();
  49.       // Больше не нужен 
  50.       if (handle == removeHandle)
  51.       { 
  52.         ads_printf(L"\nЭлемент границы найден.");
  53.         // Удаляем цикл из штриховки
  54.         pHatch->upgradeOpen();  
  55.         pHatch->removeLoopAt(i); 
  56.         pHatch->downgradeOpen();
  57.         break;    
  58.       }  
  59.     } 
  60.     loopIds.setLogicalLength(0);
  61.   }
  62.   // Закрываем штриховку
  63.   pHatch->close();
  64. }

Источник: http://adndevblog.typepad.com/autocad/2012/12/remove-a-boundary-from-a-hatch.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 29.07.2018
Отредактировано 29.07.2018 в 01:11:17