ну по поводу програмной части
// функция для создания региона из полилинии. передать ObjectId полилинии
// на выход AcDbRegion. если NULL, то передана была не замкнутая полилиния.
AcDbRegion * createRegion(AcDbObjectId id)
{
AcDbVoidPtrArray lines1;
AcDbVoidPtrArray regions1;
AcDbCurve * pCurve;
if(acdbOpenObject(pCurve, id, AcDb::kForRead)!= Acad::eOk) return NULL;
pCurve->close();
lines1.append(pCurve);
AcDbRegion::createFromCurves(lines1, regions1);
if (regions1.isEmpty())return NULL;
AcDbRegion * pCurRegion = AcDbRegion::cast((AcRxObject*)regions1[0]);
return pCurRegion;
}
// фунция для создания общего региона вычитаний.
// на вход передаем массив ObjectId замкнутых полилиний.
// причем первой должна стоять та полилиния, из которой будет все вычитаться.
// на возврат результирующий AcDbRegion или NULL, если что-то пошло не так.
AcDbRegion * createSubtractRegion(AcDbObjectIdArray idArr)
{
if (idArr.isEmpty()) return NULL;
AcDbRegion * pCurRegion = createRegion(idArr.first());
if (pCurRegion == NULL) return NULL;
for (int i = 1; i < idArr.length(); i++)
{
AcDbRegion * pTmpRegion = createRegion(idArr.at(i));
if (pTmpRegion != NULL)
Acad::ErrorStatus es = pCurRegion->booleanOper(AcDb::kBoolSubtract,pTmpRegion);
else return NULL;
if (es != Acad::eOk) return NULL; // тут можно вставить дополнительный контроль или просто выпасть из функции
}
return pCurRegion;
}
ну и пример вызова
AcDbObjectIdArray idArr;
//... заполнить idArr ...
AcDbRegion * pResRegion = createSubtractRegion(idArr);
if (pResRegion == NULL) acutPrintf(L"\nне получилось создать область");
else acutPrintf(L"\nвсе OK");