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

17/12/2014

Создание 3DSolid из набора SubDMesh

Если у вас имеется коллекция subDMesh и вы хотите создать из неё 3DSolid, сначала нужно сконвертировать каждую из сетей в поверхность. Если поверхности вместе образуют замкнутый объём, тогда из них можно создать твердое тело. Ниже пример кода:

Код - C++: [Выделить]
  1. // Для работы с SubDMesh 
  2. #include  "dbSubD.h"
  3.  
  4. static  void  AdskMeshToSolid()
  5. {
  6.   Acad::ErrorStatus es;
  7.   int  ret;
  8.  
  9.   // Выбираем сети для создания 3DSolid
  10.   AcArray<AcDbObjectId> meshIdArray;
  11.   do
  12.   {
  13.     ads_name entName;
  14.     ads_point pt;
  15.     ret = acedEntSel(L"Выберите сеть : " ,
  16.       entName, pt);
  17.  
  18.     if (RTNORM != ret)
  19.       break ;
  20.  
  21.     AcDbObjectId objId = AcDbObjectId::kNull;
  22.     if ( Acad::eOk != acdbGetObjectId(objId, entName))
  23.       break ;
  24.  
  25.     if (objId.objectClass() == AcDbSubDMesh::desc())
  26.     {
  27.       meshIdArray.append(objId);
  28.     }
  29.   } while (ret == RTNORM);
  30.  
  31.   // Преобразуем сети в поверхности
  32.   AcArray<AcDbEntity*> surfacesArray;
  33.   AcGeIntArray limits;
  34.   AcDbSurface *pSurface = NULL;
  35.  
  36.   for (int  mesh = 0; mesh < meshIdArray.length(); mesh++)
  37.   {
  38.     AcDbEntity *pEntity = NULL;
  39.     if (acdbOpenAcDbEntity(pEntity, meshIdArray[mesh],
  40.       AcDb::kForRead) != Acad::eOk)
  41.     {
  42.       return ;
  43.     }
  44.  
  45.     AcDbSubDMesh *pMesh = AcDbSubDMesh::cast(pEntity);
  46.     if (pMesh)
  47.     {
  48.       es = pMesh->convertToSurface(
  49.         false ,
  50.         false ,
  51.         pSurface);
  52.  
  53.       if (es != Acad::eOk)
  54.         return ;
  55.  
  56.       if  ( es == Acad::eOk &&
  57.         pSurface->isKindOf(AcDbSurface::desc()))
  58.       {
  59.         surfacesArray.append(pSurface);
  60.       }
  61.     }
  62.  
  63.     pEntity->close();
  64.   }
  65.  
  66.   // Создаем скульптурное 3DSolid из поверхностей
  67.   AcDb3dSolid *pSolid = new  AcDb3dSolid();
  68.   pSolid->setDatabaseDefaults();
  69.  
  70.   es = pSolid->createSculptedSolid(
  71.     surfacesArray,
  72.     limits);
  73.  
  74.   if (es == Acad::eOk)
  75.   {
  76.     // Добавляем 3DSolid в базу
  77.     AcDbObjectId solidOid = AcDbObjectId::kNull;
  78.     postToDb(pSolid, &solidOid);
  79.  
  80.     // Чтобы увидеть новое тело перенесём его
  81.     AcDbEntity *pSolidEnt;
  82.     es = acdbOpenAcDbEntity(
  83.       pSolidEnt, solidOid, AcDb::kForWrite);
  84.     if   (es == Acad::eOk &&
  85.       pSolidEnt->isKindOf(AcDb3dSolid::desc()))
  86.     {
  87.       AcGeVector3d vec(15.0, 15.0, 0.0);
  88.       AcGeMatrix3d transform
  89.         = transform.setToTranslation(vec);
  90.       es = pSolidEnt->transformBy(transform);
  91.       pSolidEnt->close();
  92.       acutPrintf(ACRX_T("3DSolid создан из сетей !" ));
  93.     }
  94.     else
  95.     {
  96.       acutPrintf(ACRX_T("Ошибка создания 3DSolid!" ));
  97.     }
  98.   }
  99.   else
  100.   {
  101.     acutPrintf(ACRX_T("3DSolid создан из сетей !" ));
  102.     delete  pSolid;
  103.   }
  104.  
  105.   // Чистим за собой
  106.   // Поверхности нам больше не нужны
  107.   int  surfCnt = 0;
  108.   for (;surfCnt < surfacesArray.length(); surfCnt++)
  109.   {
  110.     AcDbEntity *pEnt = surfacesArray[surfCnt];
  111.     delete  pEnt;
  112.   }
  113. }
  114.  
  115. static  void  postToDb( AcDbEntity* pEnt, AcDbObjectId *pOid)
  116. {
  117.   AcDbBlockTable* pBlockTable;
  118.   AcDbDatabase *pDb =
  119.     acdbHostApplicationServices()->workingDatabase();
  120.   pDb->getBlockTable(pBlockTable, AcDb::kForRead);
  121.  
  122.   AcDbBlockTableRecord* pModelSpaceBTR =  NULL;
  123.   pBlockTable->getAt(
  124.     ACDB_MODEL_SPACE,
  125.     pModelSpaceBTR,
  126.     AcDb::kForWrite);
  127.  
  128.   AcDbObjectId oid = AcDbObjectId::kNull;
  129.   if (pOid != NULL)
  130.   {
  131.     pModelSpaceBTR->appendAcDbEntity(*pOid, pEnt);
  132.   }
  133.   else
  134.   {
  135.     pModelSpaceBTR->appendAcDbEntity(oid, pEnt);
  136.   }
  137.   pEnt->close();
  138.  
  139.   pModelSpaceBTR->close();
  140.   pBlockTable->close();
  141. }

 

Источник: http://adndevblog.typepad.com/autocad/2014/12/creating-a-solid-from-a-set-of-subdmesh.html

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

Опубликовано 17.12.2014
Отредактировано 22.12.2014 в 03:28:33