//---------------------------------------------------------------------------- // 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 ; //------------------------------------------------------------------------------- static bool GetPolyLineFromCurve( IGeomDB* pGeomDB, int nId, const Frame3d& frDest, double dLinTol, PolyLine& PL) ; //------------------------------------------------------------------------------- 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( pGeomDB, 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( pGeomDB, 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( pGeomDB, 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( pGeomDB, nCrvId1, frDest, dLinTol, PL1)) return GDB_ID_NULL ; // calcolo la polilinea che approssima la seconda curva PolyLine PL2 ; if ( ! GetPolyLineFromCurve( pGeomDB, 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)) ; } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- static bool GetPolyLineFromCurve( IGeomDB* pGeomDB, int nId, const Frame3d& frDest, double dLinTol, PolyLine& PL) { const double ANG_TOL_STD_DEG = 15 ; // recupero la curva const ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCrv == nullptr) return false ; // recupero il riferimento della curva Frame3d frCrv ; if ( ! pGeomDB->GetGlobFrame( nId, frCrv)) return false ; // calcolo la polilinea che approssima la curva // se i riferimenti sono uguali if ( AreSameFrame( frCrv, frDest)) { // ricavo l'approssimazione if ( ! pCrv->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, PL)) return false ; } // altrimenti devo prima trasformare la curva else { // creo una copia della curva (da buttare alla fine) PtrOwner pModCrv( pCrv->Clone()) ; if ( IsNull( pModCrv)) return false ; // eseguo la trasformazione pModCrv->LocToLoc( frCrv, frDest) ; // ricavo l'approssimazione if ( ! pModCrv->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, PL)) return false ; } return true ; }