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

ADN Club => ObjectARX => Тема начата: Sergey P от 15-08-2015, 22:53:15

Название: Добавить вершину в 3дполилинию. Пример.
Отправлено: Sergey P от 15-08-2015, 22:53:15
Друзья.
А нет ли у кого простого примера, где показано как добавить в конец 3дполилинии вершину с заданными координатами?
Форум облазил,не нашел.
Пытался через insertVertexAt не получилось.
Гугл показывает примеры на .NET
Если не по теме удалите.
Название: Re: Добавить вершину в 3дполилинию. Пример.
Отправлено: Александр Ривилис от 16-08-2015, 01:19:20
Когда-то много лет назад я написал такой код. Посмотри. Может подойдёт:
Код - C++ [Выбрать]
  1. static void RivilisInsertVertex () {
  2.   ads_point p; ads_name  entPoly;
  3.   resbuf view; acedGetVar (_T("VIEWSIZE"), &view);
  4.   double gsize = view.resval.rreal * 0.03;
  5.   AcDbObjectId vertexAfterId;
  6.   AcDbObjectId newVertexId;
  7.   AcGePoint3d  pointAfter;
  8.   if (acedEntSel(_T("\nВыберите 3D-полилинию: "), entPoly, p) == RTNORM) {
  9.     AcDbObjectId pObjId;
  10.     if (acdbGetObjectId(pObjId,entPoly) == Acad::eOk) {
  11.       AcDbObjectPointer<AcDb3dPolyline> poly3d(pObjId,AcDb::kForWrite);
  12.       if (poly3d.openStatus() != Acad::eOk) return;
  13.       AcDbObjectIterator *pVertIter= poly3d->vertexIterator();
  14.       AcDbObjectId vertexObjId;
  15.       for (;!pVertIter->done();pVertIter->step()) {
  16.         vertexObjId = pVertIter->objectId();
  17.         AcDbObjectPointer<AcDb3dPolylineVertex> pVertex(vertexObjId,AcDb::kForRead);
  18.         AcGePoint3d vPts = pVertex->position();
  19.         acdbWcs2Ucs(asDblArray(vPts),asDblArray(vPts),0);
  20.         acedGrDraw(asDblArray(vPts - AcGeVector3d(gsize,gsize,0)),
  21.                            asDblArray(vPts + AcGeVector3d(gsize,gsize,0)),1,1);
  22.         acedGrDraw(asDblArray(vPts - AcGeVector3d(gsize,-gsize,0)),
  23.                            asDblArray(vPts + AcGeVector3d(gsize,-gsize,0)),1,1);
  24.         acedInitGet(RSG_OTHER,_T("Да Нет Yes No _ Yes No Yes No"));
  25.         ACHAR ans[512];
  26.         int rc = 0;
  27.         if ((rc = acedGetKword(_T("\nВставить вершину после этой вершины? [Да/Нет] <Нет>: "),ans)) == RTNORM) {
  28.           if (!_tcsicmp(ans,_T("")) || !_tcsicmp(ans,_T("YES"))) {
  29.             vertexAfterId = vertexObjId;
  30.             pointAfter = vPts;
  31.             acedRedraw(NULL,1);
  32.             break;
  33.           }
  34.         } else if (rc == RTCAN) {
  35.           acedRedraw(NULL,1);
  36.           break;
  37.         }
  38.         acedRedraw(NULL,1);
  39.       }
  40.       delete pVertIter;
  41.       if (!vertexAfterId.isNull()) {
  42.         acedInitGet(1,NULL);
  43.         if (acedGetPoint(asDblArray(pointAfter),_T("\nУкажите точку: "),asDblArray(pointAfter)) == RTNORM) {
  44.           acdbUcs2Wcs(asDblArray(pointAfter),asDblArray(pointAfter),0);
  45.           AcDb3dPolylineVertex *vertex = new AcDb3dPolylineVertex(pointAfter);
  46.           poly3d->insertVertexAt(newVertexId,vertexAfterId,vertex);
  47.           vertex->close();
  48.         }
  49.       }
  50.     }
  51.     if (!newVertexId.isNull()) {
  52.       AcDbObjectPointer<AcDb3dPolylineVertex> pVertex(newVertexId,AcDb::kForWrite);
  53.       pVertex->setPosition(pointAfter);
  54.     }
  55.   }
  56. }
Название: Re: Добавить вершину в 3дполилинию. Пример.
Отправлено: Sergey P от 16-08-2015, 10:02:41
Спасибо огромное Александр! То, что нужно.