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

26/05/2014

Создание твердых тел выдавливанием полилинии

Примитив твердого тела может быть получен выдавливанием объекта область. Таким образом мы можем создать временную область, ограниченную существующей полилинией. Здесь мы расчленяем полилинию на отдельные кривые, составляющие границу, а затем создаем область из этих кривых.

Посмотрите на следующий пример кода:

Код - C++: [Выделить]
  1. void CreateExtrude()
  2. {
  3.  Acad::ErrorStatus es;
  4.  
  5.  ads_name polyName;
  6.  ads_point ptres;
  7.  
  8.  // Выбор полилинии
  9.  if( acedEntSel(L"\nВыберите полилинию: ", polyName, ptres) != RTNORM)
  10.  {
  11.   acutPrintf(L"Ошибка при выборе полилинии");
  12.   return;
  13.  }
  14.  
  15.  // Получение границ из полилинии
  16.  AcDbObjectId idPoly;
  17.  acdbGetObjectId(idPoly, polyName);
  18.  
  19.  
  20.  AcDbEntity *pEntity = NULL;
  21.  if(acdbOpenAcDbEntity(pEntity, idPoly, AcDb::kForRead) != Acad::eOk)
  22.  {
  23.      return;
  24.  }
  25.  
  26.  AcDbPolyline *pPoly = AcDbPolyline::cast(pEntity);
  27.  
  28.  if(pPoly == NULL)
  29.  {
  30.      pEntity->close();
  31.      return;
  32.  }
  33.  
  34.  AcDbVoidPtrArray lines;
  35.  pPoly->explode(lines);
  36.  pPoly->close();
  37.  
  38.  // Создаем область из набора кривых.
  39.  AcDbVoidPtrArray regions;
  40.  es  =  AcDbRegion::createFromCurves(lines, regions);
  41.  
  42.  if(Acad::eOk != es)
  43.  {
  44.      pPoly->close();
  45.      acutPrintf(L"\nОшибка при создании области");
  46.      return;
  47.  }
  48.  
  49.  AcDbRegion *pRegion = AcDbRegion::cast((AcRxObject*)regions[0]);
  50.  
  51.  // Выдавливаем область для получения тела.
  52.  AcDb3dSolid *pSolid = new AcDb3dSolid();
  53.  
  54.  es  =  pSolid->extrude(pRegion, 10.0, 0.0);
  55.  
  56.  for (int i = 0; i < lines.length(); i++)
  57.  {
  58.   delete (AcRxObject*)lines[i];
  59.  }
  60.  
  61.  for (int ii = 0; ii < regions.length(); ii++)
  62.  {
  63.   delete (AcRxObject*)regions[ii];
  64.  }
  65.  
  66.  AcDbObjectId savedExtrusionId = AcDbObjectId::kNull;
  67.  
  68.  if(Acad::eOk == es)
  69.  {
  70.     AcDbDatabase *pDb = curDoc()->database();
  71.     AcDbObjectId modelId;
  72.     modelId = acdbSymUtil()->blockModelSpaceId(pDb);
  73.  
  74.     AcDbBlockTableRecord *pBlockTableRecord;
  75.     acdbOpenAcDbObject((AcDbObject*&)pBlockTableRecord,
  76.                                     modelId, AcDb::kForWrite);
  77.  
  78.     pBlockTableRecord->appendAcDbEntity(pSolid);
  79.     pBlockTableRecord->close();
  80.     pSolid->close();
  81.  }
  82.  else
  83.  {
  84.      delete pSolid;
  85.  }
  86.  
  87. }

 

Источник: http://adndevblog.typepad.com/autocad/2012/08/create-3d-solid-by-extruding-a-polyline.html

 

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

Опубликовано 26.05.2014
Отредактировано 28.05.2014 в 16:52:44