Тема: TotalAngle Arc

Подскажите пожалуйста как получить полный центральный угол дуги. Вроде функция есть, а вот как она выглядит в коде не понятно.

Re: TotalAngle Arc

Вроде так

ads_name en; ads_point p;
if (acedEntSel(_T("\nВыберите дугу: "),en,p) == RTNORM)
{
    AcDbObjectId eId; acdbGetObjectId(eId,en);
    AcDbObjectPointer<AcDbArc> pArc(eId,AcDb::kForRead);
    if (pArc.openStatus() == Acad::eOk)
    {
        AcGePoint3d ptStart;
        AcGePoint3d ptEnd;
        AcGePoint3d ptCenter = pArc->center();
        pArc->getStartPoint(ptStart);
        pArc->getEndPoint(ptEnd);
                
        double angleStart = acutAngle(asDblArray(ptCenter),asDblArray(ptStart));
        double angleEnd = acutAngle(asDblArray(ptCenter),asDblArray(ptEnd));
        double angle = angleEnd - angleStart; // здесь угол в радианах
        ACHAR angleStr[28] = _T("\0");
        acdbAngToS(angle, 1, 4, angleStr);
        acutPrintf(_T("\nУгол: %s"),angleStr);
    }
}

Re: TotalAngle Arc

Просто в документации ObjectARX в свойствах Arc есть свойство
TotalAngle (Read-only)
  Type
  System.Double
Angle sweep of arc segment.
в Delphi и VBA данный угол можно было получить на прямую. Вопрос в том как это сделать в ObjectARX (это касается и свойство lenhtg)

Re: TotalAngle Arc

это касается и свойство length

Re: TotalAngle Arc

> Алексей
Что-то я не нашел в AcDbArc ни свойства length, ни TotalAngle.
Кстати искал в ObjectARX 2004-2008.
Может приснилось? :)

Re: TotalAngle Arc

Когда искал Arc propertis в \ObjectARX 2008\docs
Получил
Autodesk.AutoCAD.DatabaseServices.Arc Properties
Center (Read/write)
Type
Autodesk.AutoCAD.Geometry.Point3d
--------------------------------------------------------------------------------
EndAngle (Read/write)
Type
System.Double
--------------------------------------------------------------------------------
Length (Read-only)
Type
System.Double
Length of arc segment.
--------------------------------------------------------------------------------
Normal (Read/write)
Type
Autodesk.AutoCAD.Geometry.Vector3d
--------------------------------------------------------------------------------
Radius (Read/write)
Type
System.Double
--------------------------------------------------------------------------------
StartAngle (Read/write)
Type
System.Double
--------------------------------------------------------------------------------
Thickness (Read/write)
Type
System.Double
--------------------------------------------------------------------------------
TotalAngle (Read-only)
Type
System.Double
Angle sweep of arc segment.
--------------------------------------------------------------------------------
В VB6 вот так выглядело:
Set actdoc = acadapp.ActiveDocument
Dim pSS As AcadSelectionSet
PrepareSelSet actdoc, "ss", pSS
Set pSS = objSelSet
For Each pE In pSS
Select Case TypeName(pE)
Case "IAcadArc"
Set pArc = pE
pV = pArc.ArcLength
pV = pArc.TotalAngle
Неужели в ObectARX нет?

Re: TotalAngle Arc

Так ObjectARX или .NET? И если .NET то прямо или через COM-модель, как в VBA,VB6,Delpi и т.д.?

Re: TotalAngle Arc

Именно через ObjectARX.

Re: TotalAngle Arc

Длина дуги:

static void ArcLength(void)
{
  ads_name en; ads_point p;
  if (acedEntSel(_T("\nВыберите дугу: "),en,p) == RTNORM) {
    AcDbObjectId eId; acdbGetObjectId(eId,en);
    AcDbObjectPointer<AcDbArc> pArc(eId,AcDb::kForRead);
    if (pArc.openStatus() == Acad::eOk) {
      double parmStart=0, parmEnd=0, arclength=0;
      if (pArc->getStartParam(parmStart) == Acad::eOk && pArc->getEndParam(parmEnd) == Acad::eOk) {
        pArc->getDistAtParam(parmEnd,arclength);
        acutPrintf(_T("\nДлина дуги=%g"),arclength);
      }
    }
  }
}

Re: TotalAngle Arc

Центральный угол:

#define _USE_MATH_DEFINES
#include <math.h>
static void ArcAngle(void)
{
  ads_name en; ads_point p;
  if (acedEntSel(_T("\nВыберите дугу: "),en,p) == RTNORM) {
    AcDbObjectId eId; acdbGetObjectId(eId,en);
    AcDbObjectPointer<AcDbArc> pArc(eId,AcDb::kForRead);
    if (pArc.openStatus() == Acad::eOk) {
      double startAngle = pArc->startAngle(), endAngle = pArc->endAngle();
      double totalAngle = (endAngle > startAngle) ? (endAngle-startAngle): (endAngle-startAngle)+2*M_PI;
      // Значение угла будет отформатировано в текущие угловые единицы с установленной точностью
      ACHAR buf[32]=_T(""); acdbAngToS(totalAngle,-1,-1,buf);
      acutPrintf(_T("\nЦентральный угол дуги=%s"),buf);
    }
  }
}

Re: TotalAngle Arc

Спасибо всем за помощь.