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

30/05/2013

Удаление вершины у 3D-полилинии (AcDbPolyline3d) средствами ObjectARX

Удаление вершины у 3D-полилинии несколько сложнее, чем вы можете себе представить. AcDbPolyline3d – это составной тип примитива, данные ее вершин содержатся в отдельных внешних примитивах AcDbVertex3d. Так что для того, чтобы удалить вершину её нужно найти, а затем удалить при помощи метода erase().

Вот что имеется в виду:

Код - C++: [Выделить]
  1. #include <dbobjptr.h>
  2. void deleteVertex()
  3. {  
  4.   ads_name polyName;   
  5.   ads_point pt;  
  6.   if(acedEntSel(_T("\nВыберите a 3D-полилинию: "), polyName, pt) != RTNORM)       
  7.     return;   
  8.   AcDbObjectId    polyId;   
  9.   acdbGetObjectId(polyId, polyName);   
  10.   // получим полилинию как интеллектуальный указатель
  11.   AcDbObjectPointer<AcDb3dPolyline> pPoly(polyId, AcDb::kForRead);
  12.   Acad::ErrorStatus es = pPoly.openStatus();
  13.   // если не открылась
  14.   if(es != Acad::eOk)
  15.   {
  16.     if (es == Acad::eNotThatKindOfClass)
  17.       acutPrintf(_T("\nВы выбрали не 3D-полилинию."));       
  18.     else
  19.       acutPrintf(_T("\nОшибка открытия примитива."));      
  20.     return;  
  21.  
  22.   }  
  23.   // Добавим все вершины к массиву AcDbObjectId  
  24.   AcDbObjectIdArray vertexArray;  
  25.   AcDbObjectIterator *pIter = pPoly->vertexIterator();  
  26.   for(pIter->start(); !pIter->done(); pIter->step())       
  27.     vertexArray.append(pIter->objectId());  
  28.   delete pIter;   
  29.   // Указываем и находим вершину для удаления
  30.   ACHAR prompt[256];  
  31.   acutPrintf(prompt,_T( "\nУкажите номер удаляемой вершины (1-%d): "), vertexArray.length());  
  32.   int delVertex = -1;  
  33.   if(acedGetInt(prompt, &delVertex) != RTNORM)     
  34.     return;  
  35.   if(delVertex < 1 || delVertex > vertexArray.length())
  36.   {      
  37.     acutPrintf(_T("\nНедопустимый номер вершины."));      
  38.     return;  
  39.   } 
  40.   // Открываем вершину и удаляем её
  41.   AcDbObjectPointer<AcDbObject> pObj(vertexArray[delVertex-1], AcDb::kForWrite);
  42.   if(pObj.openStatus() != Acad::eOk)
  43.   {     
  44.     acutPrintf(_T("\nОшибка открытия вершины: %d"), delVertex);      
  45.     return;  
  46.   } 
  47.   pObj->erase();  
  48. }
  49.  

 

ЗАМЕЧАНИЕ: Если вы используете AutoCAD .NET API – следуйте этой же логике.

 

Источник: http://adndevblog.typepad.com/autocad/2012/12/deleting-a-vertex-from-an-acdbpolyline3d-using-objectarx.html

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

Опубликовано 30.05.2013
Отредактировано 08.06.2013 в 02:36:43