From 9880fa01739fa9e305026329c7c9c9a1c3102bbb Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Fri, 15 Mar 2024 13:17:41 +0100 Subject: [PATCH] EgtGeomKernel : - migliorie varie. --- RotationMinimizeFrame.cpp | 9 +++++- StmFromCurves.cpp | 58 ++++++++++++++++++++++----------------- 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/RotationMinimizeFrame.cpp b/RotationMinimizeFrame.cpp index 13603db..9691c96 100644 --- a/RotationMinimizeFrame.cpp +++ b/RotationMinimizeFrame.cpp @@ -173,7 +173,7 @@ RotationMinimizeFrame::GetFramesByStep( FRAME3DVECTOR& vRMFrames, double dStep, // ciclo sugli step in cui la curva è suddivisa for ( int i = 0 ; i < nStep ; ++ i) { // ricavo la lunghezza della curva relativo allo step (i+1)-esimo - dLenNext = min( dLen - EPS_SMALL, ( i + 1) * dMyStep) ; + dLenNext = min( dLen - 10 * EPS_SMALL, ( i + 1) * dMyStep) ; // ricavo il frame alla lunghezza calcolata Frame3d frNext ; if ( ! GetFrameAtLength( vRMFrames[i], dLenNext, frNext)) @@ -221,6 +221,11 @@ RotationMinimizeFrame::GetFramesByTollerance( FRAME3DVECTOR& vRMFrames, double d if ( ! m_pCrv->ApproxWithLines( dTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) return false ; + // ricavo la lunghezza della curva + double dCrvLen = 0 ; + if ( ! m_pCrv->GetLength( dCrvLen)) + return false ; + // devo calcolare il RMF su ogni punto ricavato dall'approssimazione Point3d ptCurr ; bool bPoint = PL.GetFirstPoint( ptCurr) ; @@ -236,6 +241,8 @@ RotationMinimizeFrame::GetFramesByTollerance( FRAME3DVECTOR& vRMFrames, double d double dLen = 0. ; if ( ! m_pCrv->GetLengthAtPoint( ptCurr, dLen)) return false ; + // per sicurezza controllo che sia minore della lunghezza complessiva + dLen = min( dCrvLen - 10 * EPS_SMALL , dLen) ; // ricavo il Frame associato a tale lunghezza Frame3d frNext ; if ( ! GetFrameAtLength( vRMFrames.back(), dLen, frNext)) diff --git a/StmFromCurves.cpp b/StmFromCurves.cpp index 7e60df8..a2a4d7a 100644 --- a/StmFromCurves.cpp +++ b/StmFromCurves.cpp @@ -652,7 +652,7 @@ GetSurfTriMeshRectSwept( double dDimH, double dDimV, double dBevelH, double dBev //------------------------------------------------------------------------------- ISurfTriMesh* -GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, double dLinTol) +GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, double dLinTol, Vector3d* vtStatic) { // verifica parametri if ( pSect == nullptr || pGuide == nullptr) @@ -687,7 +687,6 @@ GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, d ( 2) mediante l'algoritmo del Rotation Minimize Frame */ - // recupero la sezione come curva composite mediante tolleranza definita PtrOwner pSecLocApprox( CreateCurveComposite()) ; if ( IsNull( pSecLocApprox) || ! pSecLocApprox->FromPolyLine( PL) || @@ -698,20 +697,29 @@ GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, d frStart.Set( ptStart, vtStart) ; if ( ! frStart.IsValid()) return nullptr ; - // porto la PolyLine della sezione in questo riferimento - if ( ! PL.ToLoc( frStart)) - return nullptr ; - // tengo in memorial il frame nel punto iniziale e finale della guida in caso di caps + + // tengo in memoria il frame nel punto iniziale e finale della guida in caso di caps Frame3d frCaps_start ; Frame3d frCaps_end ; - if ( true) { // (1) versore statico - Vector3d VETTORE( 0, 0, 1) ; - // creo il piano di proiezine in Z = 0 con normale definita dal vettore + if ( vtStatic != nullptr) { // (1) versore statico + // creo il piano di proiezione con normale definita dal vettore Plane3d plProj ; - plProj.Set( ORIG, VETTORE) ; + plProj.Set( ORIG, *vtStatic) ; if ( ! plProj.IsValid()) return nullptr ; + // porto la sezione nel frame definito dalla guida proeittando la Z nel piano definito da vtStatic + Point3d ptS_proj( vtStart.x, vtStart.y, vtStart.z) ; + ptS_proj = ProjectPointOnPlane( ptS_proj, plProj) ; + Vector3d vtStartH( ptS_proj.x, ptS_proj.y, ptS_proj.z) ; + if ( ! vtStartH.Normalize()) + return nullptr ; + Frame3d frInitial ; + frInitial.Set( ptStart, vtStartH) ; + if ( ! frInitial.IsValid()) + return nullptr ; + pSecLocApprox->ToLoc( frInitial) ; + PL.ToLoc( frInitial) ; // approssimo la guida mediante la tolleranza richiesta PolyLine PL_G ; if ( ! pGuide->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL_G)) @@ -754,7 +762,7 @@ GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, d if ( ! vtTanSucc.Normalize()) return nullptr ; // se tangente alla guida in ptSucc perpendicolare al piano... // creazione del frame corrente - frCurr.Set( ptCurr, vtTanCurr, VETTORE ^ vtTanCurr) ; + frCurr.Set( ptCurr, vtTanCurr, *vtStatic ^ vtTanCurr) ; if ( ! frCurr.IsValid()) return nullptr ; if ( bFirstIter) { // memorizzo il primo frame di caso di caps @@ -762,7 +770,7 @@ GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, d bFirstIter = false ; } // creazione del frame successivo - frSucc.Set( ptSucc, vtTanSucc, VETTORE ^ vtTanSucc) ; + frSucc.Set( ptSucc, vtTanSucc, *vtStatic ^ vtTanSucc) ; if ( ! frSucc.IsValid()) return nullptr ; frCaps_end = frSucc ; // aggiorno il frame finale @@ -788,7 +796,7 @@ GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, d pSTM->DoSewing( *pSr) ; // aggiornamento dei parametri ptCurr = ptSucc ; // il punto corrente diventa il successivo - bNextPoint = PL.GetNextPoint( ptSucc) ; // il successivo lo recupero dalla PolyLine + bNextPoint = PL_G.GetNextPoint( ptSucc) ; // il successivo lo recupero dalla PolyLine vtTanCurr = vtTanSucc ; // il versore tangete corrente diventa il successivo } // la superficie definita dal RMF è invertita, il verosre Z è diretto come la tangente della curva @@ -796,6 +804,9 @@ GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, d } else { // (2) Rotation Minimize Frame + // porto la PolyLine e la curva della sezione nel riferimento nel punto iniziale della guida + pSecLocApprox->ToLoc( frStart) ; + PL.ToLoc( frStart) ; // calcolo il vettore di Frames campionati lungo la guida mediante la tolleranza definita RotationMinimizeFrame RMF( pGuide, frStart) ; FRAME3DVECTOR vRMF ; @@ -824,7 +835,7 @@ GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, d // attacco la rigata alla superficie da restituire pSTM->DoSewing( *pSr) ; } - // la superficie definita dal RMF è invertita, il verosre Z è diretto come la tangente della curva + // la superficie definita dal RMF è invertita, il versore Z è diretto come la tangente della curva pSTM->Invert() ; // assegno frame iniziale e finale per caps frCaps_start = vRMF[0] ; @@ -833,22 +844,11 @@ GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, d // se richiesti caps e sezione chiusa e guida aperta if ( bCapEnds && bSectClosed && ! bGuideClosed) { - // inverto - pSTM->Invert() ; - // verifico che le due estremità siano chiuse e piatte - POLYLINEVECTOR vPL ; - if ( ! pSTM->GetLoops( vPL) || vPL.size() != 2) - return nullptr ; - Plane3d plEnds ; double dArea ; - if ( ! vPL[0].IsClosedAndFlat( plEnds, dArea, 100 * EPS_SMALL) || - ! vPL[1].IsClosedAndFlat( plEnds, dArea, 100 * EPS_SMALL)) - return nullptr ; // aggiungo il cap sull'inizio ( portandolo nel frame del punto iniziale della guida ) PtrOwner pSci( CreateBasicSurfTriMesh()) ; if ( IsNull( pSci) || ! pSci->CreateByFlatContour( PL)) return nullptr ; pSci->ToGlob( frCaps_start) ; - pSci->Invert() ; // il versore Z è tangente alla curva nella sua direzione di percorrenza // unisco pSTM->DoSewing( *pSci) ; // aggiungo il cap sulla fine ( portandolo nel frame del punto finale della guida ) @@ -856,6 +856,7 @@ GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, d if ( IsNull( pSce) || ! pSce->CreateByFlatContour( PL)) return nullptr ; pSce->ToGlob( frCaps_end) ; + pSce->Invert() ; // il versore z è definito dalle tangenti alla curva // unisco pSTM->DoSewing( *pSce) ; } @@ -946,6 +947,13 @@ GetSurfTriMeshSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, d return Release( pSTM) ; } +//------------------------------------------------------------------------------- +ISurfTriMesh* +GetSurfTriMeshSwept( const ISurfFlatRegion* pSfrSect, const ICurve* pGuide, bool bCapEnds, double dLinTol, Vector3d* vtStatic) +{ + return nullptr ; +} + //------------------------------------------------------------------------------- ISurfTriMesh* GetSurfTriMeshTransSwept( const ICurve* pSect, const ICurve* pGuide, bool bCapEnds, double dLinTol)