30/05/2013
Удаление вершины у 3D-полилинии (AcDbPolyline3d) средствами ObjectARX
Удаление вершины у 3D-полилинии несколько сложнее, чем вы можете себе представить. AcDbPolyline3d – это составной тип примитива, данные ее вершин содержатся в отдельных внешних примитивах AcDbVertex3d. Так что для того, чтобы удалить вершину её нужно найти, а затем удалить при помощи метода erase().
Вот что имеется в виду:
Код - C++: [Выделить]
- #include <dbobjptr.h>
- void deleteVertex()
- {
- ads_name polyName;
- ads_point pt;
- if(acedEntSel(_T("\nВыберите a 3D-полилинию: "), polyName, pt) != RTNORM)
- return;
- AcDbObjectId polyId;
- acdbGetObjectId(polyId, polyName);
- // получим полилинию как интеллектуальный указатель
- AcDbObjectPointer<AcDb3dPolyline> pPoly(polyId, AcDb::kForRead);
- Acad::ErrorStatus es = pPoly.openStatus();
- // если не открылась
- if(es != Acad::eOk)
- {
- if (es == Acad::eNotThatKindOfClass)
- acutPrintf(_T("\nВы выбрали не 3D-полилинию."));
- else
- acutPrintf(_T("\nОшибка открытия примитива."));
- return;
- }
- // Добавим все вершины к массиву AcDbObjectId
- AcDbObjectIdArray vertexArray;
- AcDbObjectIterator *pIter = pPoly->vertexIterator();
- for(pIter->start(); !pIter->done(); pIter->step())
- vertexArray.append(pIter->objectId());
- delete pIter;
- // Указываем и находим вершину для удаления
- ACHAR prompt[256];
- acutPrintf(prompt,_T( "\nУкажите номер удаляемой вершины (1-%d): "), vertexArray.length());
- int delVertex = -1;
- if(acedGetInt(prompt, &delVertex) != RTNORM)
- return;
- if(delVertex < 1 || delVertex > vertexArray.length())
- {
- acutPrintf(_T("\nНедопустимый номер вершины."));
- return;
- }
- // Открываем вершину и удаляем её
- AcDbObjectPointer<AcDbObject> pObj(vertexArray[delVertex-1], AcDb::kForWrite);
- if(pObj.openStatus() != Acad::eOk)
- {
- acutPrintf(_T("\nОшибка открытия вершины: %d"), delVertex);
- return;
- }
- pObj->erase();
- }
ЗАМЕЧАНИЕ: Если вы используете AutoCAD .NET API – следуйте этой же логике.
Обсуждение: http://adn-cis.org/forum/index.php?topic=87.0
Опубликовано 30.05.2013
Отредактировано 08.06.2013 в 02:36:43
Отредактировано 08.06.2013 в 02:36:43