10/03/2014
Получение изолиний поверхности (Surface)
Это пример кода получающий изолинии вдоль направлений U и V поверхности. Полученные кривые изолиний добавляются в базу данных чертежа.
Код - C++: [Выделить]
- // 1) Включаем поддержку BRep API в StdAfx.h
- #define _BREP_SUPPORT_ //- Поддержка BRep API
- // 2) Код получения изолиний поверхности
- Acad::ErrorStatus es;
- ads_point pt;
- ads_name ename;
- if (RTNORM != acedEntSel(L"\nВыберите поверхность: ", ename, pt))
- return;
- AcDbEntity *pEnt = NULL;
- AcDbObjectId id;
- es = acdbGetObjectId(id, ename);
- es = acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite);
- AcDbSurface *pSurface = AcDbSurface::cast(pEnt);
- if(NULL == pSurface)
- {
- acutPrintf(ACRX_T("\nПожалуйста выберите поверхность."));
- return;
- }
- AcDbNurbSurfaceArray nsArray;
- es = pSurface->convertToNurbSurface(nsArray);
- if(es == Acad::eOk)
- {
- if(nsArray.length() == 1)
- {
- AcDbDatabase *pDb
- = acdbHostApplicationServices()->workingDatabase();
- AcDbBlockTable *pBlockTable = NULL;
- es = pDb->getBlockTable(pBlockTable, AcDb::kForRead);
- AcDbBlockTableRecord *pMS = NULL;
- es = pBlockTable->getAt(
- ACDB_MODEL_SPACE, pMS, AcDb::kForWrite);
- AcDbNurbSurface *pNS = NULL;
- pNS = AcDbNurbSurface::cast(nsArray.at(0));
- Adesk::UInt16 uIsoDensity = pSurface->uIsolineDensity();
- Adesk::UInt16 vIsoDensity = pSurface->vIsolineDensity();
- AcDbBody* pBody = new AcDbBody();
- es = pBody->setASMBody(pSurface->getLockedASMBody());
- AcBr::ErrorStatus ebs;
- AcBrBrep* pBrep = new AcBrBrep();
- ebs = pBrep->set(*pBody);
- if(AcBr::eOk == ebs)
- {
- AcBrBrepFaceTraverser* pFaceTrav
- = new AcBrBrepFaceTraverser;
- ebs = pFaceTrav->setBrep(*pBrep);
- if(AcBr::eOk == ebs)
- {
- for(pFaceTrav->restart();
- !pFaceTrav->done();pFaceTrav->next())
- {
- AcBrFace face;
- ebs = pFaceTrav->getFace(face);
- if(AcBr::eOk == ebs)
- {
- AcGeSurface *pGeSurface;
- ebs = face.getSurface(pGeSurface);
- Adesk::Boolean isClosedInU
- = pGeSurface->isClosedInU();
- Adesk::Boolean isClosedInV
- = pGeSurface->isClosedInV();
- int ucMax = uIsoDensity+2;
- if(isClosedInU)
- ucMax = uIsoDensity;
- int vcMax = vIsoDensity+2;
- if(isClosedInV)
- vcMax = vIsoDensity;
- AcGeInterval intervalU, intervalV;
- pGeSurface->getEnvelope
- (intervalU, intervalV);
- double boundMinU = 0.0,
- boundMaxU = 0.0,
- boundMinV = 0.0,
- boundMaxV = 0.0;
- intervalU.getBounds
- (boundMinU, boundMaxU);
- intervalV.getBounds
- (boundMinV, boundMaxV);
- double paramIncrU =
- (boundMaxU - boundMinU) /
- (isClosedInU ? uIsoDensity :
- (uIsoDensity+1));
- double paramIncrV =
- (boundMaxV - boundMinV) /
- (isClosedInV ? vIsoDensity :
- (vIsoDensity+1));
- double paramU = boundMinU;
- for(int uc = 0; uc < ucMax; uc++)
- {
- double paramV = boundMinV;
- for(int vc = 0; vc < vcMax; vc++)
- {
- AcArray<AcDbCurve*> uIsoLines;
- es = pNS->getIsolineAtU(
- paramU, uIsoLines);
- if(es == Acad::eOk)
- {
- for(int cnt = 0;
- cnt < uIsoLines.length();
- cnt++)
- {
- AcDbCurve *pCurve
- = uIsoLines[cnt];
- pCurve->setColorIndex(1);
- pMS->appendAcDbEntity
- (pCurve);
- pCurve->close();
- }
- }
- AcArray<AcDbCurve*> vIsoLines;
- es = pNS->getIsolineAtV(
- paramV, vIsoLines);
- if(es == Acad::eOk)
- {
- for(int cnt = 0;
- cnt < vIsoLines.length();
- cnt++)
- {
- AcDbCurve *pCurve
- = vIsoLines[cnt];
- pCurve->setColorIndex(1);
- pMS->appendAcDbEntity
- (pCurve);
- pCurve->close();
- }
- }
- paramV += paramIncrV;
- }
- paramU += paramIncrU;
- }
- }
- else
- {
- acutPrintf(
- ACRX_T("\nИзвините, ошибка BRep."));
- break;
- }
- }
- }
- else
- {
- acutPrintf(ACRX_T("\nИзвините, ошибка BRep."));
- }
- delete pFaceTrav;
- }
- else
- {
- acutPrintf(ACRX_T("\nИзвините, ошибка BRep."));
- }
- delete pBrep;
- es = pMS->close();
- es = pBlockTable->close();
- }
- else
- {
- acutPrintf(ACRX_T("\nзвините, но этот код не может пока обработать
- несколько Nurb-поверхностей."));
- }
- // Очистка
- for(int cnt = 0; cnt < nsArray.length(); cnt++)
- {
- AcDbNurbSurface *pNS = NULL;
- pNS = AcDbNurbSurface::cast(nsArray.at(cnt));
- if(pNS != NULL)
- {
- delete pNS;
- }
- }
- }
- else
- {
- acutPrintf(
- ACRX_T("\nНевозможно преобразовать в Nurb-поверхность."));
- }
- pSurface->close();
Это картинка изолиний полученных из поверхности вращения:
Источник: http://adndevblog.typepad.com/autocad/2014/03/extracting-isolines-from-surface.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=598
Опубликовано 10.03.2014