//---------------------------------------------------------------------------- // 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 "AuxTools.h" #include "/EgtDev/Include/EInAPI.h" #include "/EgtDev/Include/EInConst.h" #include "/EgtDev/Include/EgkCurve.h" #include "/EgtDev/Include/EgkSurfTriMesh.h" #include "/EgtDev/Include/EgkStringUtils3d.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) bool bOk = true ; // recupero il riferimento del gruppo destinazione Frame3d frDest ; if ( ! pGeomDB->GetGroupGlobFrame( nParentId, frDest)) bOk = false ; // calcolo la polilinea che approssima la curva PolyLine PL ; if ( ! GetPolyLineFromCurve( nCrvId, frDest, dLinTol, PL)) bOk = false ; // creo e setto la superficie trimesh PtrOwner pSTM( CreateSurfTriMesh()) ; if ( IsNull( pSTM) || ! pSTM->CreateByFlatContour( PL)) bOk = false ; // inserisco la superficie nel DB int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pSTM)) : GDB_ID_NULL) ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtSurfTmByContour(" + ToString( nParentId) + "," + ToString( nCrvId) + "," + ToString( dLinTol) + ")" + " -- Id=" + ToString( nNewId) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco l'identificativo della nuova entità return nNewId ; } //------------------------------------------------------------------------------- int __stdcall EgtCreateSurfTriMeshByExtrusion( int nParentId, int nCrvId, const double vtExtr[3], double dLinTol, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) bool bOk = true ; // porto in locale il vettore estrusione Vector3d vtExtrL( vtExtr) ; Frame3d frLoc ; bOk = bOk && pGeomDB->GetGroupGlobFrame( nParentId, frLoc) ; if ( nRefType == RTY_GLOB) { vtExtrL.ToLoc( frLoc) ; } else if ( nRefType == RTY_GRID) { vtExtrL.LocToLoc( pGeomDB->GetGridFrame(), frLoc) ; } // calcolo la polilinea che approssima la curva PolyLine PL ; bOk = bOk && GetPolyLineFromCurve( nCrvId, frLoc, dLinTol, PL) ; // creo e setto la superficie trimesh PtrOwner pSTM( CreateSurfTriMesh()) ; bOk = bOk && ! IsNull( pSTM) ; bOk = bOk && pSTM->CreateByExtrusion( PL, vtExtrL) ; // inserisco la superficie nel DB int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pSTM)) : GDB_ID_NULL) ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtSurfTmByExtrusion(" + ToString( nParentId) + "," + ToString( nCrvId) + ",{" + ToString( Vector3d( vtExtr)) + "}," + ToString( dLinTol) + "," + RefTypeToString( nRefType) + ")" + " -- Id=" + ToString( nNewId) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco l'identificativo della nuova entità return nNewId ; } //------------------------------------------------------------------------------- int __stdcall EgtCreateSurfTriMeshByScrewing( int nParentId, int nCrvId, const double ptAx[3], const double vtAx[3], double dAngRotDeg, double dMove, double dLinTol, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) bool bOk = true ; // porto in locale punto e vettore asse Point3d ptAxL( ptAx) ; Vector3d vtAxL( vtAx) ; Frame3d frLoc ; bOk = bOk && pGeomDB->GetGroupGlobFrame( nParentId, frLoc) ; if ( nRefType == RTY_GLOB) { ptAxL.ToLoc( frLoc) ; vtAxL.ToLoc( frLoc) ; } else if ( nRefType == RTY_GRID) { ptAxL.LocToLoc( pGeomDB->GetGridFrame(), frLoc) ; vtAxL.LocToLoc( pGeomDB->GetGridFrame(), frLoc) ; } // limite minimo su tolleranza dLinTol = max( dLinTol, EPS_SMALL) ; // calcolo la polilinea che approssima la curva PolyLine PL ; bOk = bOk && GetPolyLineFromCurve( nCrvId, frLoc, dLinTol, PL) ; // calcolo lo step di rotazione double dMaxRad = 0 ; bOk = bOk && PL.GetMaxDistanceFromLine( dMaxRad, ptAxL, vtAxL, 1, false) ; if ( dMaxRad < EPS_SMALL) { bOk = false ; dMaxRad = EPS_SMALL ; } double dStepRotDeg = sqrt( 8 * dLinTol / dMaxRad) * RADTODEG ; // se superficie rototraslata, necessari limiti sulla lunghezza dei segmenti if ( fabs( dAngRotDeg) > EPS_ANG_SMALL && fabs( dMove) > EPS_SMALL){ double dLenMax = 2 * fabs( dMove) * dStepRotDeg / dAngRotDeg ; bOk = bOk && PL.AdjustForMaxSegmentLen( dLenMax) ; } // creo e setto la superficie trimesh PtrOwner pSTM( CreateSurfTriMesh()) ; bOk = bOk && ! IsNull( pSTM) ; bOk = bOk && pSTM->CreateByScrewing( PL, ptAxL, vtAxL, dAngRotDeg, dStepRotDeg, dMove) ; // inserisco la superficie nel DB int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pSTM)) : GDB_ID_NULL) ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtSurfTmByScrewing(" + ToString( nParentId) + "," + ToString( nCrvId) + ",{" + ToString( Point3d( ptAx)) + "},{" + ToString( Vector3d( vtAx)) + "}," + ToString( dAngRotDeg) + "," + ToString( dMove) + "," + ToString( dLinTol) + "," + RefTypeToString( nRefType) + ")" + " -- Id=" + ToString( nNewId) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco l'identificativo della nuova entità return nNewId ; } //------------------------------------------------------------------------------- int __stdcall EgtCreateSurfTriMeshRuled( int nParentId, int nCrvId1, int nCrvId2, double dLinTol) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) bool bOk = true ; // recupero il riferimento del gruppo destinazione Frame3d frDest ; if ( ! pGeomDB->GetGroupGlobFrame( nParentId, frDest)) bOk = false ; // calcolo la polilinea che approssima la prima curva PolyLine PL1 ; if ( ! GetPolyLineFromCurve( nCrvId1, frDest, dLinTol, PL1)) bOk = false ; // calcolo la polilinea che approssima la seconda curva PolyLine PL2 ; if ( ! GetPolyLineFromCurve( nCrvId2, frDest, dLinTol, PL2)) bOk = false ; // creo la superficie trimesh e costruisco la rigata tra le due curve PtrOwner pSTM( CreateSurfTriMesh()) ; if ( IsNull( pSTM) || ! pSTM->CreateByTwoCurves( PL1, PL2)) bOk = false ; // inserisco la superficie trimesh nel DB int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pSTM)) : GDB_ID_NULL) ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtSurfTmRuled(" + ToString( nParentId) + "," + ToString( nCrvId1) + "," + ToString( nCrvId2) + "," + ToString( dLinTol) + ")" + " -- Id=" + ToString( nNewId) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco l'identificativo della nuova entità return nNewId ; }