(изменено: Олег Бевз, 5 февраля 2010г. 13:09:45)

Тема: Отображение нескольких контуров

Добрый день. Имеется несколько контуров (заданы координаты точек).Один из контуров внешний, другие контура лежат внутри. Требуется отобразить на чертеже все эти контура как единый обьект.
С помощью средств Автокада достигал этого следующим способом: Отображал контура на чертеже как полилинии, преобразовывал полилинии в области, вычитал из одной области другие с помощью функции "ВЫЧИТАНИЕ".
Не могу найти как это сделать программно. Что нужно использовать: AcDb3dPolyline,AcDbHatch или AcDbRegion? Если можно, то алгоритм поподробнее.

Re: Отображение нескольких контуров

Олег Бевз пишет:

AcDb3dPolyline,AcDbHatch или AcDbRegion?

AcDbRegion

Re: Отображение нескольких контуров

То есть нужно:
1.Построить полилинии.
2.Преобразовать их в регионы.
3.Выполнить вычитание регионов?
Можете обьяснить если не трудно является ли регион только математической моделью или его можно отобразить на чертеже?

Re: Отображение нескольких контуров

Олег Бевз пишет:

То есть нужно: 1.Построить полилинии. 2.Преобразовать их в регионы. 3.Выполнить вычитание регионов?

Да.

Олег Бевз пишет:

является ли регион только математической моделью или его можно отобразить на чертеже?

Регион (AcDbRegion) - это примитив AutoCAD, который отображается в чертеже.

(изменено: Николай, 5 февраля 2010г. 17:40:34)

Re: Отображение нескольких контуров

ну по поводу програмной части

// функция для создания региона из полилинии. передать 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");