//---------------------------------------------------------------------------- // EgalTech 2014-2014 //---------------------------------------------------------------------------- // File : API_GdbCreateSurf.cpp Data : 02.11.14 Versione : 1.5j7 // Contenuto : Funzioni di creazione superfici del DB geometrico per API. // // // // Modifiche : 02.11.14 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "API.h" #include "API_Macro.h" #include "/EgtDev/Include/EInAPI.h" #include "/EgtDev/Include/EgkCurve.h" #include "/EgtDev/Include/EgkSurfTriMesh.h" #include "/EgtDev/Include/EgtPointerOwner.h" using namespace std ; //------------------------------------------------------------------------------- int __stdcall EgtCreateSurfTriMeshByContour( int nParentId, int nCrvId, double dLinTol) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero il riferimento del gruppo destinazione Frame3d frDest ; if ( ! pGeomDB->GetGroupGlobFrame( nParentId, frDest)) return GDB_ID_NULL ; // calcolo la polilinea che approssima la curva PolyLine PL ; if ( ! GetPolyLineFromCurve( nCrvId, frDest, dLinTol, PL)) return GDB_ID_NULL ; // creo la superficie trimesh PtrOwner pSTM( CreateSurfTriMesh()) ; if ( IsNull( pSTM)) return GDB_ID_NULL ; // setto la superficie if ( ! pSTM->CreateByFlatContour( PL)) return GDB_ID_NULL ; // inserisco la superficie nel DB return pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pSTM)) ; } //------------------------------------------------------------------------------- int __stdcall EgtCreateSurfTriMeshByExtrusion( int nParentId, int nCrvId, const double vtExtr[3], double dLinTol) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero il riferimento del gruppo destinazione Frame3d frDest ; if ( ! pGeomDB->GetGroupGlobFrame( nParentId, frDest)) return GDB_ID_NULL ; // calcolo la polilinea che approssima la curva PolyLine PL ; if ( ! GetPolyLineFromCurve( nCrvId, frDest, dLinTol, PL)) return GDB_ID_NULL ; // creo la superficie trimesh PtrOwner pSTM( CreateSurfTriMesh()) ; if ( IsNull( pSTM)) return GDB_ID_NULL ; // setto la superficie if ( ! pSTM->CreateByExtrusion( PL, vtExtr)) return GDB_ID_NULL ; // inserisco la superficie nel DB return pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pSTM)) ; } //------------------------------------------------------------------------------- int __stdcall EgtCreateSurfTriMeshByScrewing( int nParentId, int nCrvId, const double ptAx[3], const double vtAx[3], double dAngRotDeg, double dMove, double dLinTol) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero il riferimento del gruppo destinazione Frame3d frDest ; if ( ! pGeomDB->GetGroupGlobFrame( nParentId, frDest)) return GDB_ID_NULL ; // calcolo la polilinea che approssima la curva PolyLine PL ; if ( ! GetPolyLineFromCurve( nCrvId, frDest, dLinTol, PL)) return GDB_ID_NULL ; // calcolo lo step di rotazione double dMaxRad = 0 ; PL.GetMaxDistanceFromLine( dMaxRad, ptAx, vtAx, 1, false) ; if ( dMaxRad < EPS_SMALL) return false ; double dStepRotDeg = sqrt( 8 * dLinTol / dMaxRad) * RADTODEG ; // creo la superficie trimesh PtrOwner pSTM( CreateSurfTriMesh()) ; if ( IsNull( pSTM)) return GDB_ID_NULL ; // setto la superficie if ( ! pSTM->CreateByScrewing( PL, ptAx, vtAx, dAngRotDeg, dStepRotDeg, dMove)) return GDB_ID_NULL ; // inserisco la superficie nel DB return pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pSTM)) ; } //------------------------------------------------------------------------------- int __stdcall EgtCreateSurfTriMeshRuled( int nParentId, int nCrvId1, int nCrvId2, double dLinTol) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero il riferimento del gruppo destinazione Frame3d frDest ; if ( ! pGeomDB->GetGroupGlobFrame( nParentId, frDest)) return GDB_ID_NULL ; // calcolo la polilinea che approssima la prima curva PolyLine PL1 ; if ( ! GetPolyLineFromCurve( nCrvId1, frDest, dLinTol, PL1)) return GDB_ID_NULL ; // calcolo la polilinea che approssima la seconda curva PolyLine PL2 ; if ( ! GetPolyLineFromCurve( nCrvId2, frDest, dLinTol, PL2)) return GDB_ID_NULL ; // creo la superficie trimesh PtrOwner pSTM( CreateSurfTriMesh()) ; if ( IsNull( pSTM)) return GDB_ID_NULL ; // costruisco la rigata tra le due curve if ( ! pSTM->CreateByTwoCurves( PL1, PL2)) return GDB_ID_NULL ; // inserisco la superficie trimesh nel DB return pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pSTM)) ; }