Тема: AcDbArc set startpoint и endpoint

Привет,
Сноба еще одна проблема, я хочу изменит AcDbArc старт поинт, центер поинт и енд поинт координати, на VB или VBA ето бозможно но как ето сделать на ObjectARX
спасибо
Дариус

Re: AcDbArc set startpoint и endpoint

> Darius
В общем случае поставленная задача решения не имеет. Если расстояния от центра до новых конечной и начальной точкек отличается, то очевидно, что дуга получится не может.
Вот пример, как можно изменить дугу изменяя конечные точки и промежуточную точку дуги. Может это пример натолкнет тебя на мысль как поступить в твоем случае.

static void SetArcStartEndMiddle(void)
{
  ads_name en; ads_point p;
  if (acedEntSel(_T("\nВыберите дугу: "),en,p) == RTNORM)
  {
    AcDbObjectId id; acdbGetObjectId(id,en);
    AcDbObjectPointer<AcDbArc> pArc(id,AcDb::kForRead);
    Acad::ErrorStatus es;
    if ((es = pArc.openStatus()) == Acad::eNotThatKindOfClass) {
      acutPrintf(_T("\nЭто не дуга!")); return;
    } else if (es != Acad::eOk) {
      acutPrintf(_T("\npArc.openStatus()=%s"),acadErrorStatusText(es));
      return;
    }
    AcGePoint3d pStart, pEnd, pMid;
    pArc->getStartPoint(pStart);
    pArc->getEndPoint(pEnd);
    double par1 = 0, par2 = 0;
    pArc->getEndParam(par1); pArc->getStartParam(par2);
    pArc->getPointAtParam(0.5*(par1+par2),pMid);
    acdbWcs2Ucs(asDblArray(pStart),asDblArray(pStart),false);
    acdbWcs2Ucs(asDblArray(pEnd),asDblArray(pEnd),false);
    acdbWcs2Ucs(asDblArray(pMid),asDblArray(pMid),false);
    if (acedGetPoint(asDblArray(pStart),_T("\nУкажите начальную точку: "),asDblArray(pStart)) == RTNORM &&
        acedGetPoint(asDblArray(pEnd),_T("\nУкажите конечную точку: "),asDblArray(pEnd)) == RTNORM &&
        acedGetPoint(asDblArray(pMid),_T("\nУкажите промежуточную точку: "),asDblArray(pMid)) == RTNORM)
    {
      acdbUcs2Wcs(asDblArray(pStart),asDblArray(pStart),false);
      acdbUcs2Wcs(asDblArray(pEnd),asDblArray(pEnd),false);
      acdbUcs2Wcs(asDblArray(pMid),asDblArray(pMid),false);
      AcGeCircArc3d geArc(pStart,pMid,pEnd);
      if ((es = pArc->upgradeOpen()) != Acad::eOk) {
        acutPrintf(_T("\npArc->upgradeOpen()=%s"),acadErrorStatusText(es));
        return;
      }
      AcGeVector3d refVec = geArc.refVec();
      AcGePlane plane = AcGePlane(geArc.center(), geArc.normal());
      double ang = refVec.angleOnPlane(plane);
      pArc->setCenter(geArc.center());
      pArc->setNormal(geArc.normal());
      pArc->setStartAngle(geArc.startAng()+ang);
      pArc->setEndAngle(geArc.endAng()+ang);
    }
  }
}