Тема: Добавление вершин к AcDb3dPolyline :=(

Есть самая обычная AcDb3dPolyline
К ней с помощью кода

AcDb3dPolylineVertex *pVtxNew = new AcDb3dPolylineVertex(newPt);
es = pPoly->insertVertexAt(prevVtxId, nextVtxId, pVtxNew);

добавляется вершина, причем Z не 0!
И ACAD правильно отображает изменения в геометрии объекта.
НО, при попытке получить отметку на участке линии между новой точкой и одной из существующей (их Z стали разные), ничего не получается!
Т.е. методы getСlosestPoint и intersectWiht как бы игнорируют новую точку.
Все стает ok после передвижения любой из gripPoint.
Вызов метода moveGripPointAt после добавления вершины не помогает (Даже если закрыть линию а потом открыть ее повторно и вызвать moveGripPointAt)
Может, есть, какая то функция которую требуется вызывать? Хотя после долгого изучение справки ничего подобного не обнаружил

Re: Добавление вершин к AcDb3dPolyline :=(

Очень странно. Похоже это все-таки у тебя ошибка. Попробуй этот примерчик для добавления вершины в 3DPOLY. После добавления им вершины я нормально получаю координаты точек на сегментах полилинии с правильным Z. Проверял в AutoCAD 2006.

  static void AddVertex(void)
  {
    // Add your code for command InsertNewpoint.AddVertex here
    ads_point p; ads_name  entPoly;
    resbuf view; acedGetVar ("VIEWSIZE", &view);
    double gsize = view.resval.rreal * 0.03;
    AcDbObjectId vertexAfterId;
    AcGePoint3d  pointAfter;
    if (acedEntSel("\nSelect 3DPoly: ", entPoly, p) == RTNORM) {
      AcDbObjectId pObjId;
      if (acdbGetObjectId(pObjId,entPoly) == Acad::eOk) {
        AcDbObjectPointer<AcDb3dPolyline> poly3d(pObjId,AcDb::kForWrite);
        if (poly3d.openStatus() != Acad::eOk) return;
        AcDbObjectIterator *pVertIter= poly3d->vertexIterator();
        AcDbObjectId vertexObjId;
        for (;!pVertIter->done();pVertIter->step()) {
          vertexObjId = pVertIter->objectId();
          AcDbObjectPointer<AcDb3dPolylineVertex> pVertex(vertexObjId,AcDb::kForRead);
          AcGePoint3d vPts = pVertex->position();
          acdbWcs2Ucs(asDblArray(vPts),asDblArray(vPts),0);
          acedGrDraw(asDblArray(vPts - AcGeVector3d(gsize,gsize,0)),asDblArray(vPts + AcGeVector3d(gsize,gsize,0)),1,1);
          acedGrDraw(asDblArray(vPts - AcGeVector3d(gsize,-gsize,0)),asDblArray(vPts + AcGeVector3d(gsize,-gsize,0)),1,1);
          acedInitGet(RSG_OTHER,"Yes No _ Yes No");
          char ans[512];
          int rc = 0;
          if ((rc = acedGetKword("\nInsert new vertex after this vertex? [Yes/No] <No>: ",ans)) == RTNORM) {
            if (!strcmp(ans,"") || !stricmp(ans,"YES")) {
              vertexAfterId = vertexObjId;
              pointAfter = vPts;
              acedRedraw(NULL,1);
              break;
            }
          } else if (rc == RTCAN) {
            acedRedraw(NULL,1);
            break;
          }
          acedRedraw(NULL,1);
        }
        delete pVertIter;
        if (!vertexAfterId.isNull()) {
          acedInitGet(1,NULL);
          if (acedGetPoint(asDblArray(pointAfter),"\nSelect point: ",asDblArray(pointAfter)) == RTNORM) {
            acdbUcs2Wcs(asDblArray(pointAfter),asDblArray(pointAfter),0);
            AcDb3dPolylineVertex *vertex = new AcDb3dPolylineVertex(pointAfter);
            AcDbObjectId newVertexId;
            poly3d->insertVertexAt(newVertexId,vertexAfterId,vertex);
            vertex->close();
          }
        }
      }
    }
  }

Re: Добавление вершин к AcDb3dPolyline :=(

К сожалению ошибка не пропала.
ACAD рисует правильно, и отметки на вершинах дает правильно, НО попробуйте использовать ARXDBG для получения точки на линии - результат вас по меньшей мере удивит.
Ф-я getClosestPoint новых вершин просто не замечает
Кроме того, bug возникает не всегда!
Один из вариантов последовательности для его возникновения: создаем 3d полилинию, добавляем с помощью выше указанной ф-и вершину, добавляем вторую.
Если отметка(Z) второй вершины будет меньше 0, ф-и intersectWith, getClosestPoint будут работать не правильно.
Все становится на свои места после перелвижения любого из gripPoint

Re: Добавление вершин к AcDb3dPolyline :=(

Примера прислать не могу, поскольку после закрытия-открытия чертежа все работает как надо

Re: Добавление вершин к AcDb3dPolyline :=(

Если использовать комаду pedit, то ничего подобного не возникает

Re: Добавление вершин к AcDb3dPolyline :=(

Роман. Я проверил точно по твоему примеру. У меня все работает. Вот протокол:

Command: 3dpoly
Specify start point of polyline: 1000,0,100
Specify endpoint of line or [Undo]: 2000,500,-200
Specify endpoint of line or [Undo]: 2600,1200,300
Specify endpoint of line or [Close/Undo]: 1200,1500,-400
Specify endpoint of line or [Close/Undo]:
Command: addvertex
Select 3DPoly:  <Snap off>
Insert new vertex after this vertex? [Yes/No] <No>: N
Insert new vertex after this vertex? [Yes/No] <No>: Y
Select point:  <Coords on> 1350,1005,500
Command:  ADDVERTEX
Select 3DPoly:
Insert new vertex after this vertex? [Yes/No] <No>: n
Insert new vertex after this vertex? [Yes/No] <No>: n
Insert new vertex after this vertex? [Yes/No] <No>: Y
Select point: 1010,1225,-300
Command: ArxDbgTestCurve
Testing getClosestPointTo(const AcGePoint3d& givenPoint, AcGePoint3d&
pointOnCurve, Adesk::Boolean extend = Adesk::kFalse)...
Select AcDbCurve:
Point:
PT                   : (1083, 1224, -273)
Select AcDbCurve:
Point:
PT                   : (1142, 1139, 11)
Select AcDbCurve:
Point:
PT                   : (1530, 865, 306)
Select AcDbCurve:
Point: _endp of
PT                   : (1010, 1225, -300)
Select AcDbCurve:
Point: _endp of
PT                   : (1350, 1005, 500)
Select AcDbCurve:

На всякий случай могу посоветовать выполнить acdbEntUpd(ent), где ent метка примитива полилинии, после закрытия полилинии.

Re: Добавление вершин к AcDb3dPolyline :=(

Если к линии подцепить reactor с помощью ARXDBG то при выполнении команды (ф-я выше) получим
{ENT T-REACTOR} : {Open For Modify   : AcDb3dPolyline, 6C}
{ENT T-REACTOR} : {Modified          : AcDb3dPolyline, 6C}
{ENT T-REACTOR} : {Object Closed     : }
А при выполнении pedit следующее:
{ENT T-REACTOR} : {Open For Modify   : AcDb3dPolyline, 6C}
{ENT T-REACTOR} : {Modified          : AcDb3dPolyline, 6C}
{ENT T-REACTOR} : {Object Closed     : }
{ENT T-REACTOR} : {Sub-Obj Modified  : AcDb3dPolyline, 6C}
                : {Sub Object        : AcDb3dPolylineVertex, 71}
Т.е модифицируется вершина.
Bug обошли следующим образом: после изменения открываю одну из вершин для write и все работает ok.

Re: Добавление вершин к AcDb3dPolyline :=(

Отлично!