Добавить вершину в 3дполилинию. Пример.

Автор Тема: Добавить вершину в 3дполилинию. Пример.  (Прочитано 6531 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Sergey PАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
  • ObjectArx C++
Друзья.
А нет ли у кого простого примера, где показано как добавить в конец 3дполилинии вершину с заданными координатами?
Форум облазил,не нашел.
Пытался через insertVertexAt не получилось.
Гугл показывает примеры на .NET
Если не по теме удалите.

Отмечено как Решение Sergey P 16-08-2015, 10:02:51

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Когда-то много лет назад я написал такой код. Посмотри. Может подойдёт:
Код - 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. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey PАвтор темы

  • ADN OPEN
  • Сообщений: 17
  • Карма: 0
  • ObjectArx C++
Спасибо огромное Александр! То, что нужно.