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

11/07/2013

Как использовать метод AcDbRegion::getAreaProp()

Первые три параметра метода описываются как:

  • origin — Возвращает начальную точку области
  • xAxis — Возвращает ось X области
  • yAxis — Возвращает ось Y области

Но учитывая объявления этих параметров как const :

virtual Acad::ErrorStatus getAreaProp(
          const AcGePoint3d& origin,
          const AcGeVector3d& xAxis,
          const AcGeVector3d& yAxis, ... );

В действительности эти три параметра не выходные, а входные. Если использовать не инициализированные правильно значения, то мы получим в качестве результата код ошибки Acad::eInvalidInput.

Вот правильное использование метода AcDbRegion::getAreaProp():

Код - C++: [Выделить]
  1. // Заметим, что для краткости кода
  2. // часть проверок на ошибки пропущена
  3. //
  4. void getRegionAreaProp()
  5. {
  6.     ads_name eNam;
  7.     ads_point pt;
  8.     AcDbObjectId eId;
  9.  
  10.     if (acedEntSel(L"\nВыберите область: ", eNam, pt) != RTNORM)
  11.     {
  12.         acutPrintf(L"\nНичего не выбрано.");
  13.         return;
  14.     }
  15.     acdbGetObjectId(eId, eNam);
  16.  
  17.     AcDbEntity* pEnt = NULL;
  18.     if(acdbOpenAcDbEntity(pEnt, eId, AcDb::kForRead) != Acad::eOk)
  19.     {
  20.         acutPrintf(L"\nОшибка открытия примитива.");
  21.         return;
  22.     }
  23.     AcDbRegion* pReg = AcDbRegion::cast(pEnt);
  24.     if(!pReg)
  25.     {
  26.         pEnt->close();
  27.         return;
  28.     }   
  29.     double perimeter, area, momInertia[2],
  30.            prodInertia, prinMoments[2],   
  31.            radiiGyration[2];
  32.     AcGePoint2d centroid, extentsLow, extentsHigh;
  33.     AcGeVector2d prinAxes[2];
  34.  
  35.     AcGePoint3d origin;
  36.     AcGeVector3d xAxis;
  37.     AcGeVector3d yAxis;
  38.  
  39.     // Инициализируем три аргумента
  40.     AcGePlane plane;
  41.     pReg->getPlane(plane);
  42.     plane.getCoordSystem(origin, xAxis, yAxis);
  43.  
  44.     Acad::ErrorStatus es = pReg->getAreaProp(
  45.         // Эти три параметра входные
  46.         origin, xAxis, yAxis,
  47.         perimeter,
  48.         area,
  49.         centroid,
  50.         momInertia,
  51.         prodInertia,
  52.         prinMoments,
  53.         prinAxes,
  54.         radiiGyration,
  55.         extentsLow,
  56.         extentsHigh);
  57.  
  58.     assert(es == Acad::eOk);
  59.     // Вы можете сами решить что будете
  60.     // делать с результатами.
  61.     // Я же только напечатаю сообщение:
  62.     acutPrintf(L"\nУспешно получены свойства области.");
  63.     pReg->close();
  64. }

Источник: http://adndevblog.typepad.com/autocad/2012/05/how-to-use-acdbregiongetareaprop.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=130.0

Опубликовано 11.07.2013
Отредактировано 04.08.2013 в 16:36:20