Удаление границы штриховки
Класс AcDbHatch предоставляет методы для получения границ и для удаления границ. Каждая граница представляет собой так называемый цикл. С помощью методов класса AcDbHatch вы можете выполнять итерацию всех циклов. Затем вы можете получить все объекты, принадлежащие одному циклу. Все, что вам нужно сделать, это сравнить метки объектов цикла с меткой граничного объекта, который должен быть удален из объекта штриховки. Если у одного из объектов цикла есть дескриптор, который вы ищете, вы можете использовать AcDbHatch :: removeLoopAt (), чтобы удалить петлю из штриховки.
Следующая функция делает именно это. Параметр handleRemove является меткой примитива, принадлежащего к циклу, который следует удалить.
- void removeHandleFromHatch(const ACHAR* handleRemove)
- {
- // Создаём AcDbHandle по переданной строке-метке
- AcDbHandle removeHandle(handleRemove);
- //
- // Запрашиваем штриховку
- //
- ads_point dummy;
- ads_name ename;
- if (RTNORM != ads_entsel(L"\nВыберите штриховку: ", ename, dummy))
- return; AcDbObjectId hatchId;
- AcDbHatch *pHatch;
- if (Acad::eOk != acdbGetObjectId(hatchId, ename))
- {
- ads_printf(L"\nНе можем получить objectId штриховки.");
- return;
- }
- if (Acad::eOk != acdbOpenObject(pHatch, hatchId, AcDb::kForRead))
- {
- ads_printf(L"\nНе можем открыть штриховку ");
- return;
- }
- //
- // Анализируем штриховку
- //
- int loops = pHatch->numLoops(); // число циклов
- ads_printf(L"\nЧисло циклов: %i", loops);
- // Получаем все циклы
- AcDbObjectIdArray loopIds;
- for (int i = 0; i < loops; ++i)
- {
- // Получаем objectID всех объектов цикла
- pHatch->getAssocObjIdsAt(i, loopIds);
- // Получаем все объекты цикла
- int numOfObjects = loopIds.logicalLength();
- AcDbEntity *pEnt; AcDbHandle handle;
- for (int j = 0; j < numOfObjects; ++j)
- {
- if (Acad::eOk != acdbOpenObject(pEnt, loopIds[j],
- AcDb::kForRead))
- {
- ads_printf(L"\nНе могу получить объект цикла %i.", i);
- continue;
- }
- // Получаем метку примитива текущего цикла
- // и сравниваем её с меткой параметра
- pEnt->getAcDbHandle(handle);
- pEnt->close();
- // Больше не нужен
- if (handle == removeHandle)
- {
- ads_printf(L"\nЭлемент границы найден.");
- // Удаляем цикл из штриховки
- pHatch->upgradeOpen();
- pHatch->removeLoopAt(i);
- pHatch->downgradeOpen();
- break;
- }
- }
- loopIds.setLogicalLength(0);
- }
- // Закрываем штриховку
- pHatch->close();
- }
Источник: 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