Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 12-11-2017, 10:56:19

Название: Получить площадь объекта Face
Отправлено: Алексей (IdeaSoft) от 12-11-2017, 10:56:19
Подскажите, что-то не найду метода Arae у класса
Autodesk.AutoCAD.DatabaseServices.Face

Использую API acad 2012
Как же мне получить площадь этой фигуры?
Фигура плоская четырехгранная.

У меня пока только одна идея
преобразовать в объект PolyLine3d и взять у него Area
Название: Re: Получить площадь объекта Face
Отправлено: Александр Ривилис от 12-11-2017, 11:01:17
Вот так я делаю в ObjectARX:
Код - C++ [Выбрать]
  1. static double calcArea(AcGePoint3d p1, AcGePoint3d p2, AcGePoint3d p3)
  2. {
  3.         AcGeVector3d v1 = p3 - p1, v2 = p2 - p1;
  4.         return fabs(v2.crossProduct(v1).length() * 0.5);
  5. }
  6.  
  7. static double calc3DFaceArea(AcDbFace *pFace)
  8. {
  9.         if (!pFace) return 0.0;
  10.         AcGePoint3d vts[4];
  11.         for (int i = 0; i <= 3; i++) pFace->getVertexAt(i,vts[i]);
  12.         if (vts[3].isEqualTo(vts[2])) {
  13.                 return calcArea(vts[0],vts[1],vts[2]);
  14.         } else {
  15.                 return calcArea(vts[0],vts[1],vts[3]) + calcArea(vts[1],vts[2],vts[3]);
  16.         }
  17. }
  18.  
Думаю, что на C# ты переведёшь одной левой.
Название: Re: Получить площадь объекта Face
Отправлено: Алексей (IdeaSoft) от 12-11-2017, 11:16:18
return fabs(v2.crossProduct(v1).length() * 0.5);
А в С# метод fabs где живет?
Или аналог ему есть какой?
Это Math.Abs что-ли?
Название: Re: Получить площадь объекта Face
Отправлено: Алексей (IdeaSoft) от 12-11-2017, 11:25:54
Код на C#

Код - C# [Выбрать]
  1.         public static double calcArea(Point3d p1, Point3d p2, Point3d p3)  {
  2.             Vector3d v1 = p3 - p1;
  3.             Vector3d v2 = p2 - p1;
  4.             return Math.Abs(v2.CrossProduct(v1).Length * 0.5);
  5.         }
  6.         public static double calc3DFaceArea(Face f) {
  7.             if (f == null ) return 0.0;
  8.             Point3d[] vts = new Point3d[4];
  9.             for (short i = 0; i <= 3; i++)
  10.                 vts[i] = f.GetVertexAt(i);
  11.             if (vts[3].IsEqualTo(vts[2])) {
  12.                 return calcArea(vts[0],vts[1],vts[2]);
  13.             } else {
  14.                 return calcArea(vts[0], vts[1], vts[3]) + calcArea(vts[1], vts[2], vts[3]);
  15.             }
  16.         }
Название: Re: Получить площадь объекта Face
Отправлено: Александр Ривилис от 12-11-2017, 16:24:42
Это Math.Abs что-ли?
Угу. Работает?