17/12/2014
Создание 3DSolid из набора SubDMesh
Если у вас имеется коллекция subDMesh и вы хотите создать из неё 3DSolid, сначала нужно сконвертировать каждую из сетей в поверхность. Если поверхности вместе образуют замкнутый объём, тогда из них можно создать твердое тело. Ниже пример кода:
Код - C++: [Выделить]
- // Для работы с SubDMesh
- #include "dbSubD.h"
- static void AdskMeshToSolid()
- {
- Acad::ErrorStatus es;
- int ret;
- // Выбираем сети для создания 3DSolid
- AcArray<AcDbObjectId> meshIdArray;
- do
- {
- ads_name entName;
- ads_point pt;
- ret = acedEntSel(L"Выберите сеть : " ,
- entName, pt);
- if (RTNORM != ret)
- break ;
- AcDbObjectId objId = AcDbObjectId::kNull;
- if ( Acad::eOk != acdbGetObjectId(objId, entName))
- break ;
- if (objId.objectClass() == AcDbSubDMesh::desc())
- {
- meshIdArray.append(objId);
- }
- } while (ret == RTNORM);
- // Преобразуем сети в поверхности
- AcArray<AcDbEntity*> surfacesArray;
- AcGeIntArray limits;
- AcDbSurface *pSurface = NULL;
- for (int mesh = 0; mesh < meshIdArray.length(); mesh++)
- {
- AcDbEntity *pEntity = NULL;
- if (acdbOpenAcDbEntity(pEntity, meshIdArray[mesh],
- AcDb::kForRead) != Acad::eOk)
- {
- return ;
- }
- AcDbSubDMesh *pMesh = AcDbSubDMesh::cast(pEntity);
- if (pMesh)
- {
- es = pMesh->convertToSurface(
- false ,
- false ,
- pSurface);
- if (es != Acad::eOk)
- return ;
- if ( es == Acad::eOk &&
- pSurface->isKindOf(AcDbSurface::desc()))
- {
- surfacesArray.append(pSurface);
- }
- }
- pEntity->close();
- }
- // Создаем скульптурное 3DSolid из поверхностей
- AcDb3dSolid *pSolid = new AcDb3dSolid();
- pSolid->setDatabaseDefaults();
- es = pSolid->createSculptedSolid(
- surfacesArray,
- limits);
- if (es == Acad::eOk)
- {
- // Добавляем 3DSolid в базу
- AcDbObjectId solidOid = AcDbObjectId::kNull;
- postToDb(pSolid, &solidOid);
- // Чтобы увидеть новое тело перенесём его
- AcDbEntity *pSolidEnt;
- es = acdbOpenAcDbEntity(
- pSolidEnt, solidOid, AcDb::kForWrite);
- if (es == Acad::eOk &&
- pSolidEnt->isKindOf(AcDb3dSolid::desc()))
- {
- AcGeVector3d vec(15.0, 15.0, 0.0);
- AcGeMatrix3d transform
- = transform.setToTranslation(vec);
- es = pSolidEnt->transformBy(transform);
- pSolidEnt->close();
- acutPrintf(ACRX_T("3DSolid создан из сетей !" ));
- }
- else
- {
- acutPrintf(ACRX_T("Ошибка создания 3DSolid!" ));
- }
- }
- else
- {
- acutPrintf(ACRX_T("3DSolid создан из сетей !" ));
- delete pSolid;
- }
- // Чистим за собой
- // Поверхности нам больше не нужны
- int surfCnt = 0;
- for (;surfCnt < surfacesArray.length(); surfCnt++)
- {
- AcDbEntity *pEnt = surfacesArray[surfCnt];
- delete pEnt;
- }
- }
- static void postToDb( AcDbEntity* pEnt, AcDbObjectId *pOid)
- {
- AcDbBlockTable* pBlockTable;
- AcDbDatabase *pDb =
- acdbHostApplicationServices()->workingDatabase();
- pDb->getBlockTable(pBlockTable, AcDb::kForRead);
- AcDbBlockTableRecord* pModelSpaceBTR = NULL;
- pBlockTable->getAt(
- ACDB_MODEL_SPACE,
- pModelSpaceBTR,
- AcDb::kForWrite);
- AcDbObjectId oid = AcDbObjectId::kNull;
- if (pOid != NULL)
- {
- pModelSpaceBTR->appendAcDbEntity(*pOid, pEnt);
- }
- else
- {
- pModelSpaceBTR->appendAcDbEntity(oid, pEnt);
- }
- pEnt->close();
- pModelSpaceBTR->close();
- pBlockTable->close();
- }
Источник: 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