From 2361225321e58afedae53de7f8abc375693a4334 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Tue, 28 May 2024 16:29:10 +0200 Subject: [PATCH] EgtGeomKernel : - aggiunte le chiamate per la creazione di una rigata come superficie di Bezier - aggiunta la funzione per la creazione del cono come Bezier ( ancora da implementare). --- SbzFromCurves.cpp | 123 ++++++++++++++++++++++++++-------------------- SbzStandard.cpp | 33 +++++++++++++ 2 files changed, 104 insertions(+), 52 deletions(-) diff --git a/SbzFromCurves.cpp b/SbzFromCurves.cpp index 9e0bab1..ab77a4a 100644 --- a/SbzFromCurves.cpp +++ b/SbzFromCurves.cpp @@ -1082,55 +1082,74 @@ GetSurfBezierByScrewing( const ICurve* pCurve, const Point3d& ptAx, const Vector // // restituisco la superficie // return Release( pSTM) ; //} -// -////------------------------------------------------------------------------------- -//ISurfBezier* -//GetSurfBezierRuled( const Point3d& ptP, const ICurve* pCurve, double dLinTol) // DA SISTEMARE - ancora copia della versione stm, cambia solo il nome della funzione////////////////////// -//{ -// // verifica parametri -// if ( &ptP == nullptr || pCurve == nullptr) -// return nullptr ; -// // calcolo la polilinea che approssima la curva -// PolyLine PL ; -// if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) -// return nullptr ; -// // creo e setto la superficie trimesh -// PtrOwner pSTM( CreateBasicSurfTriMesh()) ; -// if ( IsNull( pSTM) || ! pSTM->CreateByPointCurve( ptP, PL)) -// return nullptr ; -// // salvo tolleranza lineare usata -// pSTM->SetLinearTolerance( dLinTol) ; -// // restituisco la superficie -// return Release( pSTM) ; -//} -// -////------------------------------------------------------------------------------- -//ISurfBezier* -//GetSurfBezierRuled( const ICurve* pCurve1, const ICurve* pCurve2, int nType, double dLinTol) // DA SISTEMARE - ancora copia della versione stm, cambia solo il nome della funzione////////////////////// -//{ -// // verifica parametri -// if ( pCurve1 == nullptr || pCurve2 == nullptr) -// return nullptr ; -// -// // qui anziché fare le polyline converto le curve in bezier! -// // SE NON HO LO STESSO NUMERO DI CURVE COME LO GESTISCO?? -// -// // calcolo la polilinea che approssima la prima curva -// PolyLine PL1 ; -// if ( ! pCurve1->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL1)) -// return nullptr ; -// // calcolo la polilinea che approssima la seconda curva -// PolyLine PL2 ; -// if ( ! pCurve2->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL2)) -// return nullptr ; -// -// -// // creo e setto la superficie trimesh -// PtrOwner pSbz( CreateBasicSurfBezier()) ; -// if ( IsNull( pSbz) || ! pSbz->CreateByTwoCurves( PL1, PL2, nType)) -// return nullptr ; -// //// salvo tolleranza lineare usata -// //pSbz->SetLinearTolerance( dLinTol) ; -// // restituisco la superficie -// return Release( pSbz) ; -//} \ No newline at end of file + +//------------------------------------------------------------------------------- +ISurfBezier* +GetSurfBezierRuled( const Point3d& ptP, const ICurve* pCurve, double dLinTol) +{ + // verifica parametri + if ( &ptP == nullptr || pCurve == nullptr) + return nullptr ; + //// calcolo la polilinea che approssima la curva + //PolyLine PL ; + //if ( ! pCurve->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) + // return nullptr ; + // creo e setto la superficie trimesh + PtrOwner pSbz( CreateBasicSurfBezier()) ; + if ( IsNull( pSbz) || ! pSbz->CreateByPointCurve( ptP, pCurve)) + return nullptr ; + //// salvo tolleranza lineare usata + //pSbz->SetLinearTolerance( dLinTol) ; + // restituisco la superficie + return Release( pSbz) ; +} + +//------------------------------------------------------------------------------- +ISurfBezier* +GetSurfBezierRuled( const ICurve* pCurve1, const ICurve* pCurve2, int nType, double dLinTol) +{ + // verifica parametri + if ( pCurve1 == nullptr || pCurve2 == nullptr) + return nullptr ; + + // qui anziché fare le polyline converto le curve in bezier! + // SE NON HO LO STESSO NUMERO DI CURVE COME LO GESTISCO?? + + //// calcolo la polilinea che approssima la prima curva + //PolyLine PL1 ; + //if ( ! pCurve1->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL1)) + // return nullptr ; + //// calcolo la polilinea che approssima la seconda curva + //PolyLine PL2 ; + //if ( ! pCurve2->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL2)) + // return nullptr ; + + + // dLinTol servirà quando ci sarà la funzione ApproxWithCurveBezier + // se la curva è già una bezier singola la tengo, sennò la converto // e la compo di bezier??? + PtrOwner pCC1( CreateCurveComposite()) ; + if ( pCurve1->GetType() != CRV_BEZIER) + pCC1->AddCurve( CurveToBezierCurve( pCurve1)) ; + else + pCC1->AddCurve( pCurve1->Clone()) ; + if ( IsNull( pCC1) || ! pCC1->IsValid()) + return false ; + + // se la curva è già una bezier singola la tengo, sennò la converto + PtrOwner pCC2( CreateCurveComposite()) ; + if ( pCurve2->GetType() != CRV_BEZIER) + pCC2->AddCurve( CurveToBezierCurve( pCurve2)) ; + else + pCC2->AddCurve( pCurve2->Clone()) ; + if ( IsNull( pCC2) || ! pCC2->IsValid()) + return false ; + + // creo e setto la superficie trimesh + PtrOwner pSbz( CreateBasicSurfBezier()) ; + if ( IsNull( pSbz) || ! pSbz->CreateByTwoCurves( pCC1, pCC2, nType)) + return nullptr ; + //// salvo tolleranza lineare usata + //pSbz->SetLinearTolerance( dLinTol) ; + // restituisco la superficie + return Release( pSbz) ; +} \ No newline at end of file diff --git a/SbzStandard.cpp b/SbzStandard.cpp index f01903a..ea4f4b1 100644 --- a/SbzStandard.cpp +++ b/SbzStandard.cpp @@ -17,6 +17,7 @@ #include "SurfTriMesh.h" #include "SurfBezier.h" #include "/EgtDev/Include/EGkSbzStandard.h" +#include "/EgtDev/Include/EGkSbzFromCurves.h" using namespace std ; @@ -78,3 +79,35 @@ GetSurfBezierSphere( const Point3d& ptCenter, double dR) return Release( pSrfBez) ; } + +////------------------------------------------------------------------------------- +//ISurfBezier* +//GetSurfBezierCone( const Point3d& ptCenter, double dRadius, const Vector3d& dHeight) +//{ +// // le dimensioni devono essere significative +// if ( dRadius < EPS_SMALL || abs( dHeight) < EPS_SMALL) +// return nullptr ; +// // creo la circonferenza di base +// CurveArc cArc ; +// cArc.Set( ORIG, Z_AX, dRadius) ; +// if ( dHeight < 0) +// cArc.Invert() ; +// // punto di vertice +// Point3d ptTip( 0, 0, dHeight) ; +// // creo la superficie laterale del cono +// PtrOwner pSbz( GetSurfBezierRuled( ptTip, &cArc)) ; +// if ( IsNull( pSbz)) +// return nullptr ; +// +// //// creo la superficie di base e la inverto +// //PtrOwner pSTM1( GetSurfTriMeshByFlatContour( &cArc, dLinTol)) ; +// //if ( IsNull( pSTM1)) +// // return nullptr ; +// //pSTM1->Invert() ; +// //// la unisco alla superficie del fianco +// //if ( ! pSTM->DoSewing( *pSTM1)) +// // return nullptr ; +// +// // restituisco la superficie +// return Release( pSbz) ; +//}