Тема: TotalAngle Arc
Подскажите пожалуйста как получить полный центральный угол дуги. Вроде функция есть, а вот как она выглядит в коде не понятно.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → TotalAngle Arc
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите пожалуйста как получить полный центральный угол дуги. Вроде функция есть, а вот как она выглядит в коде не понятно.
Вроде так
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); } }
Просто в документации ObjectARX в свойствах Arc есть свойство
TotalAngle (Read-only)
Type
System.Double
Angle sweep of arc segment.
в Delphi и VBA данный угол можно было получить на прямую. Вопрос в том как это сделать в ObjectARX (это касается и свойство lenhtg)
> Алексей
Что-то я не нашел в AcDbArc ни свойства length, ни TotalAngle.
Кстати искал в ObjectARX 2004-2008.
Может приснилось? :)
Когда искал 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 нет?
Так ObjectARX или .NET? И если .NET то прямо или через COM-модель, как в VBA,VB6,Delpi и т.д.?
Длина дуги:
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); } } } }
Центральный угол:
#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); } } }
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → TotalAngle Arc
Форум работает на PunBB, при поддержке Informer Technologies, Inc