29/05/2013
Площадь пересечения двух AcDbRegion
Следующий пример показывает использование метода AcDbRegion::booleanOper() для пересечения двух примитивов область (AcDbRegion). Если выбранные примитивы не области, то они конвертируются в области при помощи метода AcDbRegion::createFromCurves(). Так как пересечение областей обрабатывается ACIS, то оно достаточно медленное для большого числа областей.
Код - C++: [Выделить]
- static void regionBoolean()
- {
- // TODO: Реализуем команду
- ads_name e1;
- ads_name e2;
- ads_point p1;
- if (RTNORM != acedEntSel(L"\nВыберите первую область: ",e1,p1))
- {
- acutPrintf(L"\nОшибка при выборе первого примитива ");
- return;
- }
- if (RTNORM != acedEntSel(L"\nВыберите вторую область: ",e2,p1))
- {
- acutPrintf(L"\nОшибка при выборе второго примитива ");
- return;
- }
- AcDbObjectId objId1 = NULL;
- AcDbObjectId objId2 = NULL;
- Acad::ErrorStatus es;
- es = acdbGetObjectId (objId1 , e1);
- if (Acad::eOk != es)
- {
- acutPrintf(L"\nОшибка получения ObjectID первого примитива");
- return;
- }
- es = acdbGetObjectId (objId2 , e2);
- if (Acad::eOk != es)
- {
- acutPrintf(L"\nОшибка получения ObjectID второго примитива");
- return;
- }
- // Если выбранные примитивы не области – конвертируем их в области
- AcDbRegion* pReg1=NULL;
- AcDbRegion* pReg2=NULL;;
- es = acdbOpenObject (pReg1,
- objId1,
- AcDb::kForWrite,
- Adesk::kFalse);
- if(Acad::eOk != es)
- {
- acutPrintf(L"\nПервый примитив не область – конвертируем его в область");
- }
- es = acdbOpenObject
- (pReg2,objId2,AcDb::kForWrite,Adesk::kFalse);
- if(Acad::eOk != es)
- {
- acutPrintf(L"\nВторой примитив не область – конвертируем его в область");
- }
- AcDbVoidPtrArray curves;
- AcDbVoidPtrArray regions;
- AcDbEntity *pEnt1 = NULL;
- AcDbEntity *pEnt2 = NULL;
- if (pReg1 == NULL) // Не область
- {
- es =acdbOpenAcDbEntity(pEnt1,objId1,
- AcDb::kForRead,Adesk::kFalse);
- if(Acad::eOk != es)
- {
- acutPrintf(L"\nОшибка открытия первого примитива для записи");
- return;
- }
- curves.append(pEnt1);
- pEnt1->close();
- }
- if (pReg2 == NULL) // Не область
- {
- es =acdbOpenAcDbEntity(pEnt2,objId2,
- AcDb::kForRead,Adesk::kFalse);
- if(Acad::eOk != es)
- {
- acutPrintf(L"\nОшибка открытия второго примитива для записи")
- return;
- }
- curves.append(pEnt2);
- pEnt2->close();
- }
- if (pReg1 == NULL || pReg2 == NULL)
- es=AcDbRegion::createFromCurves(curves,regions);
- if (pReg1 == NULL)
- pReg1 = AcDbRegion::cast((AcRxObject*)regions[0]);
- if (pReg2 == NULL && regions.length() > 1)
- pReg2 = AcDbRegion::cast((AcRxObject*)regions[1]);
- if (pReg2 == NULL && regions.length() == 1)
- pReg2 = AcDbRegion::cast((AcRxObject*)regions[0]);
- // после операции вторая область удаляется, а первая
- // становится результатом пересечения
- es = pReg1->booleanOper( AcDb::kBoolIntersect, pReg2);
- if(Acad::eOk == es)
- {
- double rarea;
- es = pReg1->getArea(rarea);
- if(Acad::eOk != es)
- {
- acutPrintf(L"\nОшибка получения площади ");
- }
- else
- {
- acutPrintf(L"\nПлощадь области пересечения = %lf",
- rarea);
- }
- }
- else
- {
- acutPrintf(L"\nОшибка при пересечении областей ");
- }
- pReg1->close();
- pReg2->close();
- }
Источник: 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
Отредактировано 08.06.2013 в 00:40:51