Тема: Как перенести текст в середину линии или дуги?

У меня проблемы с привязками. Пользуюсь функцией AcDbEntity::getOsnapPoints. В качестве объекта у меня текст, пытаюсь его перенести в середину линии или дуги, а функция не возращает никаких точек.
Как правильно задаются параметры? Зачем нужна lastPoint.
Если кто выложит кусок кода буду рад.
Заранее спасибо.

Re: Как перенести текст в середину линии или дуги?

Совершенно не понятно зачем в данном случае нужна функция getOsnapPoints. Текст имеет только одно точку привязки - точку вставки текста, которая для центрирования текста относительно линии или дуги не удобна. Значительно удобнее пользоваться функцией getGeomExtents и находить среднюю (и по вертикали, и по горизонтали) точку текста:

  static void GetOsnaps(void)
  {
    // Add your code for command GetOsnapPoints.GetOsnaps here
    ads_name en;
    ads_point p;
    if (acedEntSel("\nУкажите текстовую строку:",en,p) == RTNORM) {
      AcDbObjectId objId; acdbGetObjectId(objId,en);
      AcDbObjectPointer<AcDbText> pTxt(objId,AcDb::kForRead);
      if (pTxt.openStatus() == Acad::eOk) {
        AcGePoint3d pickPoint = pTxt->position(),
                    lastPoint = pickPoint;
        AcGeMatrix3d mat; mat.setToIdentity();
        AcDbIntArray geomIds;
        AcGePoint3dArray pSnaps;
        pTxt->getOsnapPoints(AcDb::kOsModeIns,0,pickPoint,lastPoint,mat,pSnaps,geomIds);
        for (int i=0; i< pSnaps.length(); i++) {
          acutPrintf("\np[%d]=(%g,%g,%g)",i+1,pSnaps[i][X],pSnaps[i][Y],pSnaps[i][Z]);
        }
        AcDbExtents exts;
        pTxt->getGeomExtents(exts);
        AcGePoint3d midPoint = exts.minPoint() + (exts.maxPoint()-exts.minPoint())*0.5;
        acutPrintf("\nСредняя точка текста=(%g,%g,%g)",midPoint[X],midPoint[Y],midPoint[Z]);
      } else {
        acutPrintf("\nВыбран не текст или примитив нельзя открыть для чтения!");
      }
    }
  }

Re: Как перенести текст в середину линии или дуги?

А так этот текст можно перенести в середину произвольной кривой:

  static void CenterTextToCurve(void)
  {
    ads_name en;
    ads_point p;
    if (acedEntSel("\nУкажите текстовую строку:",en,p) == RTNORM) {
      AcDbObjectId objId; acdbGetObjectId(objId,en);
      AcDbObjectPointer<AcDbText> pTxt(objId,AcDb::kForRead);
      if (pTxt.openStatus() == Acad::eOk) {
        AcGeMatrix3d mat; mat.setToIdentity();
        AcDbExtents exts;
        pTxt->getGeomExtents(exts);
        AcGePoint3d midPoint = exts.minPoint() + (exts.maxPoint()-exts.minPoint())*0.5;
        // acutPrintf("\nСредняя точка текста=(%g,%g,%g)",midPoint[X],midPoint[Y],midPoint[Z]);
        if (acedEntSel("\nУкажите кривую, в середину которой нужно поместить текст:",en,p) == RTNORM) {
           AcDbObjectId objcurvId; acdbGetObjectId(objcurvId,en);
           AcDbObjectPointer<AcDbCurve> pCurv(objcurvId,AcDb::kForRead);
           if (pCurv.openStatus() == Acad::eOk) {
              double p1=0,p2=0,start,end;
              AcGePoint3d pCurvMiddle;
              if (pCurv->getStartParam(p1) == Acad::eOk &&
                  pCurv->getDistAtParam(p1,start) == Acad::eOk &&
                  pCurv->getEndParam(p2) == Acad::eOk &&
                  pCurv->getDistAtParam(p2,end) == Acad::eOk) {
                  if (pCurv->getPointAtDist((end-start)*0.5,pCurvMiddle) == Acad::eOk) {
                    mat.setToTranslation(pCurvMiddle-midPoint);
                    if (pTxt->upgradeOpen() == Acad::eOk) {
                      pTxt->transformBy(mat);
                    } else {
                      acutPrintf("\nТекст нельзя открыть для записи!");
                    }
                  } else {
                    acutPrintf("\nНе могу найти середину кривой!");
                  }
                } else {
                  acutPrintf("\nНе могу найти начало и/или конец кривой!");
                }
           } else {
              acutPrintf("\nВыбрана не кривая или примитив нельзя открыть для чтения!");
           }
        }
      } else {
        acutPrintf("\nВыбран не текст или примитив нельзя открыть для чтения!");
      }
    }
  }

С углами поворота и т.д. играйся сам. smile

Re: Как перенести текст в середину линии или дуги?

Большое спасибо за помощь.