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

29/05/2013

Площадь пересечения двух AcDbRegion

Следующий пример показывает использование метода AcDbRegion::booleanOper() для пересечения двух примитивов область (AcDbRegion). Если выбранные примитивы не области, то они конвертируются в области при помощи метода AcDbRegion::createFromCurves(). Так как пересечение областей обрабатывается ACIS, то оно достаточно медленное для большого числа областей.

Код - C++: [Выделить]
  1. static void regionBoolean()
  2. {
  3.       // TODO: Реализуем команду
  4.       ads_name e1;
  5.       ads_name e2;
  6.       ads_point p1;
  7.       if (RTNORM != acedEntSel(L"\nВыберите первую область: ",e1,p1))
  8.       {
  9.        acutPrintf(L"\nОшибка при выборе первого примитива ");
  10.        return;
  11.       }
  12.       if (RTNORM != acedEntSel(L"\nВыберите вторую область: ",e2,p1))
  13.       {
  14.        acutPrintf(L"\nОшибка при выборе второго примитива ");
  15.        return;
  16.       }
  17.  
  18.       AcDbObjectId objId1 = NULL;       
  19.       AcDbObjectId objId2 = NULL;
  20.       Acad::ErrorStatus es;
  21.       es = acdbGetObjectId (objId1 , e1);
  22.       if (Acad::eOk != es)
  23.       {
  24.        acutPrintf(L"\nОшибка получения ObjectID первого примитива");
  25.        return;
  26.       }
  27.  
  28.       es = acdbGetObjectId (objId2 , e2);
  29.       if (Acad::eOk != es)
  30.       {
  31.        acutPrintf(L"\nОшибка получения ObjectID второго примитива");
  32.        return;
  33.       }
  34.       // Если выбранные примитивы не области – конвертируем их в области
  35.       AcDbRegion* pReg1=NULL;
  36.       AcDbRegion* pReg2=NULL;;
  37.  
  38.       es = acdbOpenObject (pReg1,
  39.                             objId1,
  40.                             AcDb::kForWrite,
  41.                             Adesk::kFalse);
  42.       if(Acad::eOk != es)
  43.       {
  44.        acutPrintf(L"\nПервый примитив не область – конвертируем его в область");
  45.       }
  46.  
  47.       es = acdbOpenObject
  48.               (pReg2,objId2,AcDb::kForWrite,Adesk::kFalse);
  49.       if(Acad::eOk != es)
  50.       {
  51.        acutPrintf(L"\nВторой примитив не область – конвертируем его в область");
  52.       }
  53.       AcDbVoidPtrArray curves;
  54.       AcDbVoidPtrArray regions;
  55.       AcDbEntity *pEnt1 = NULL;
  56.       AcDbEntity *pEnt2 = NULL;
  57.       if (pReg1 == NULL) // Не область
  58.       {
  59.        es =acdbOpenAcDbEntity(pEnt1,objId1,
  60.         AcDb::kForRead,Adesk::kFalse);
  61.        if(Acad::eOk != es)
  62.        {
  63.         acutPrintf(L"\nОшибка открытия первого примитива для записи");
  64.         return;
  65.        }
  66.        curves.append(pEnt1);   
  67.        pEnt1->close();
  68.       }
  69.       if (pReg2 == NULL) // Не область
  70.       {
  71.            es =acdbOpenAcDbEntity(pEnt2,objId2,
  72.             AcDb::kForRead,Adesk::kFalse);
  73.            if(Acad::eOk != es)
  74.            {
  75.             acutPrintf(L"\nОшибка открытия второго примитива для записи")
  76.             return;
  77.            }
  78.            curves.append(pEnt2);   
  79.            pEnt2->close();
  80.       }
  81.       if (pReg1 ==  NULL || pReg2 ==    NULL)
  82.        es=AcDbRegion::createFromCurves(curves,regions);
  83.       if (pReg1 ==  NULL)
  84.        pReg1 = AcDbRegion::cast((AcRxObject*)regions[0]);
  85.       if (pReg2 ==  NULL && regions.length() > 1)
  86.        pReg2 = AcDbRegion::cast((AcRxObject*)regions[1]);
  87.       if (pReg2 ==  NULL && regions.length() == 1)
  88.        pReg2 = AcDbRegion::cast((AcRxObject*)regions[0]);
  89.  
  90.       // после операции вторая область удаляется, а первая
  91.       // становится результатом пересечения
  92.       es = pReg1->booleanOper( AcDb::kBoolIntersect, pReg2);
  93.       if(Acad::eOk == es)
  94.       {
  95.        double rarea;
  96.        es = pReg1->getArea(rarea);
  97.        if(Acad::eOk != es)
  98.        {
  99.         acutPrintf(L"\nОшибка получения площади ");   
  100.        }   
  101.        else
  102.        {
  103.         acutPrintf(L"\nПлощадь области пересечения = %lf",
  104.          rarea);
  105.        }   
  106.       }
  107.       else
  108.       {
  109.        acutPrintf(L"\nОшибка при пересечении областей ");
  110.       }
  111.       pReg1->close();
  112.       pReg2->close();
  113. }

 

Источник: http://adndevblog.typepad.com/autocad/2012/06/the-area-of-an-intersection-of-two-acdbregion.html

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

Опубликовано 29.05.2013
Отредактировано 08.06.2013 в 00:40:51