From d5dd818493f0a6dd06f148d728edfec4a907c268 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Fri, 6 Jul 2018 10:10:07 +0000 Subject: [PATCH] EgtGeomKernel : - migliorie e correzioni a Collision Avoidance - Intervals con std::vector invece di std::list. --- CAvToolSurfTm.cpp | 7 +++ CAvToolSurfTm.h | 1 + CAvToolTriangle.cpp | 118 +++++++++++++++++++++++++++----------------- Intervals.cpp | 64 ++++++++++++------------ Tool.cpp | 77 +++++++++++++++++++++++++++++ Tool.h | 4 +- VolZmap.cpp | 18 +++++-- VolZmap.h | 2 + 8 files changed, 209 insertions(+), 82 deletions(-) diff --git a/CAvToolSurfTm.cpp b/CAvToolSurfTm.cpp index d071e6e..277b6e7 100644 --- a/CAvToolSurfTm.cpp +++ b/CAvToolSurfTm.cpp @@ -63,6 +63,13 @@ CAvToolSurfTm::SetAdvTool( double dH, double dR, double dTipH, double dTipR, dou return m_Tool.SetAdvTool( "", dH, dR, dTipH, dTipR, dCornR, 0) ; } +//---------------------------------------------------------------------------- +bool +CAvToolSurfTm::SetSawTool( double dH, double dR, double dThick, double dStemR, double dCornR) +{ + return m_Tool.SetSawTool( "", dH, dR, dThick, dStemR, dCornR, 0) ; +} + //---------------------------------------------------------------------------- bool CAvToolSurfTm::SetGenTool( const ICurveComposite* pToolOutline) diff --git a/CAvToolSurfTm.h b/CAvToolSurfTm.h index effb69a..2b05aa5 100644 --- a/CAvToolSurfTm.h +++ b/CAvToolSurfTm.h @@ -27,6 +27,7 @@ class CAvToolSurfTm : public ICAvToolSurfTm bool SetMoveDir( const Vector3d& vtrMove) override ; bool SetStdTool( double dH, double dR, double dCornR) override ; bool SetAdvTool( double dH, double dR, double dTipH, double dTipR, double dCornR) override ; + bool SetSawTool( double dH, double dR, double dThick, double dStemR, double dCornR) override ; bool SetGenTool( const ICurveComposite* pToolOutline) override ; double GetToolRadius( void) const override { return m_Tool.GetRadius() ; } diff --git a/CAvToolTriangle.cpp b/CAvToolTriangle.cpp index 7ac2bf6..da70d2f 100644 --- a/CAvToolTriangle.cpp +++ b/CAvToolTriangle.cpp @@ -30,18 +30,15 @@ GetTopTapFromPrevCurve( const ICurve* pPrevCurve) return false ; if ( pPrevCurve->GetType() == CRV_LINE) { const ICurveLine* pPrevLine = GetCurveLine( pPrevCurve) ; - Point3d ptPrevStart = pPrevLine->GetStart() ; - Point3d ptPrevEnd = pPrevLine->GetEnd() ; + const Point3d& ptPrevStart = pPrevLine->GetStart() ; + const Point3d& ptPrevEnd = pPrevLine->GetEnd() ; if ( abs( ptPrevStart.y - ptPrevEnd.y) > EPS_SMALL || ptPrevStart.x > ptPrevEnd.x) return true ; } else if ( pPrevCurve->GetType() == CRV_ARC) { const ICurveArc* pPrevArc = GetCurveArc( pPrevCurve) ; - Point3d ptPrevStart ; pPrevArc->GetStartPoint( ptPrevStart) ; - Point3d ptPrevEnd ; pPrevArc->GetEndPoint( ptPrevEnd) ; - Point3d ptPrevCen = pPrevArc->GetCenter() ; - double dRadius = pPrevArc->GetRadius() ; + const Point3d& ptPrevCen = pPrevArc->GetCenter() ; if ( abs( ptPrevCen.x) > EPS_SMALL) return true ; } @@ -56,17 +53,14 @@ GetBotTapFromNextCurve( const ICurve* pNextCurve) return false ; if ( pNextCurve->GetType() == CRV_LINE) { const ICurveLine* pNextLine = GetCurveLine( pNextCurve) ; - Point3d ptNextStart = pNextLine->GetStart() ; - Point3d ptNextEnd = pNextLine->GetEnd() ; + const Point3d& ptNextStart = pNextLine->GetStart() ; + const Point3d& ptNextEnd = pNextLine->GetEnd() ; if ( abs( ptNextStart.y - ptNextEnd.y) > EPS_SMALL || ptNextStart.x < ptNextEnd.x) return true ; } else if ( pNextCurve->GetType() == CRV_ARC) { const ICurveArc* pNextArc = GetCurveArc( pNextCurve) ; - Point3d ptNextStart ; pNextArc->GetStartPoint( ptNextStart) ; - Point3d ptNextEnd ; pNextArc->GetEndPoint( ptNextEnd) ; - Point3d ptNextCen = pNextArc->GetCenter() ; - double dRadius = pNextArc->GetRadius() ; + const Point3d& ptNextCen = pNextArc->GetCenter() ; if ( abs( ptNextCen.x) > EPS_SMALL) return true ; } @@ -83,8 +77,8 @@ CAvToolTriangle( const Tool& tlTool, const Point3d& ptToolOrig, const Vector3d& const Triangle3d& trTria, const Vector3d& vtMove) { // Se avvicinamento non devo fare nulla - if ( vtMove * trTria.GetN() < - EPS_ZERO) - return 0. ; + if ( vtMove * trTria.GetN() < - EPS_ZERO) + return 0. ; // se utensile cilindrico if ( tlTool.GetType() == Tool::CYLMILL) { // parametri geometrici @@ -180,8 +174,8 @@ CAvToolTriangle( const Tool& tlTool, const Point3d& ptToolOrig, const Vector3d& if ( pCurve->GetType() == CRV_LINE) { // Recupero gli estremi const ICurveLine* pLine = GetCurveLine( pCurve) ; - Point3d ptStart = pLine->GetStart() ; - Point3d ptEnd = pLine->GetEnd() ; + const Point3d& ptStart = pLine->GetStart() ; + const Point3d& ptEnd = pLine->GetEnd() ; // Ne determino l'altezza double dHeight = abs( ptStart.y - ptEnd.y) ; if ( dHeight > EPS_SMALL) { @@ -219,7 +213,7 @@ CAvToolTriangle( const Tool& tlTool, const Point3d& ptToolOrig, const Vector3d& const ICurveArc* pArc = GetCurveArc( pCurve) ; Point3d ptStart ; pArc->GetStartPoint( ptStart) ; Point3d ptEnd ; pArc->GetEndPoint( ptEnd) ; - Point3d ptCen = pArc->GetCenter() ; + const Point3d& ptCen = pArc->GetCenter() ; double dRadius = pArc->GetRadius() ; // Calcolo della distanza di allontanamento del componente corrente // Sfera @@ -285,13 +279,23 @@ CAvToolTriangle( const Tool& tlTool, const Point3d& ptToolOrig, const Vector3d& double CAvSphereTriangle( const Point3d& ptSpheCen, double dSpheRad, const Triangle3d& trTria, const Vector3d& vtMove) { - // Se la sfera sta già tutta dalla parte esterna del triangolo, non va allontanata - Vector3d vtVert0 = ptSpheCen - trTria.GetP( 0) ; - Vector3d vtVert1 = ptSpheCen - trTria.GetP( 1) ; - Vector3d vtVert2 = ptSpheCen - trTria.GetP( 2) ; - if ( vtVert0 * trTria.GetN() > dSpheRad - EPS_SMALL && - vtVert1 * trTria.GetN() > dSpheRad - EPS_SMALL && - vtVert2 * trTria.GetN() > dSpheRad - EPS_SMALL) + // Verifica preliminare che la fetta di spazio delimitata dal piano sotto alla sfera rispetto alla direzione + // di allontanamento non sia già sopra al triangolo (tutti i vertici del triangolo sono sotto). + Point3d ptBase = ptSpheCen - dSpheRad * vtMove ; + double dMaxDistV = PointPlaneSignedDist( trTria.GetP( 0), ptBase, vtMove) ; + dMaxDistV = max( dMaxDistV, PointPlaneSignedDist( trTria.GetP( 1), ptBase, vtMove)) ; + dMaxDistV = max( dMaxDistV, PointPlaneSignedDist( trTria.GetP( 2), ptBase, vtMove)) ; + if ( dMaxDistV < 0.) + return 0. ; + + // Se la sfera sta già tutta dalla parte esterna del triangolo, non va ulteriormente allontanata + // Posizione del centro sfera rispetto ai vertici del triangolo + Vector3d vtVe0Cen = ptSpheCen - trTria.GetP( 0) ; + Vector3d vtVe1Cen = ptSpheCen - trTria.GetP( 1) ; + Vector3d vtVe2Cen = ptSpheCen - trTria.GetP( 2) ; + if ( vtVe0Cen * trTria.GetN() > dSpheRad - EPS_SMALL && + vtVe1Cen * trTria.GetN() > dSpheRad - EPS_SMALL && + vtVe2Cen * trTria.GetN() > dSpheRad - EPS_SMALL) return 0. ; // Valuto Tangenza col piano @@ -411,9 +415,9 @@ CAvCylinderTriangle( const Point3d& ptCylOrig, const Vector3d& vtCylAx, double d // Valuto le distanze con segno dei vertici dal piano del disco : // se sono tutte negative non interferiscono. double dDistV[3] ; - dDistV[0] = PointPlaneSignedDist( trTria.GetP( 0), ptBase, vtCylAx) ; - dDistV[1] = PointPlaneSignedDist( trTria.GetP( 1), ptBase, vtCylAx) ; - dDistV[2] = PointPlaneSignedDist( trTria.GetP( 2), ptBase, vtCylAx) ; + dDistV[0] = PointPlaneSignedDist( trTria.GetP( 0), ptBase, vtMove) ; + dDistV[1] = PointPlaneSignedDist( trTria.GetP( 1), ptBase, vtMove) ; + dDistV[2] = PointPlaneSignedDist( trTria.GetP( 2), ptBase, vtMove) ; double dMaxDistV = max( dDistV[0], max( dDistV[1], dDistV[2])) ; if ( dMaxDistV < 0.) return 0. ; @@ -426,6 +430,10 @@ CAvCylinderTriangle( const Point3d& ptCylOrig, const Vector3d& vtCylAx, double d bInV[2] = ( GetPointLineSqDist( trTria.GetP( 2), ptBase, vtMove) < dSqRad) ; if ( bInV[0] && bInV[1] && bInV[2]) return max( dMaxDistV, 0.) ; + // Distanza di allontanamento dall'interno del triangolo + double dMaxDistI = DiskTriaInteriorLeakDistLongMot( ptBase, dRad, trTria, vtMove) ; + if ( dMaxDistI > EPS_SMALL) + return dMaxDistI ; // Ciclo sui segmenti del triangolo e calcolo la loro distanza di allontanamento, calcolo // anche la distanza di allontanamento dai vertici distanti dall'asse meno del raggio. double dMaxDistVS = 0. ; @@ -447,9 +455,7 @@ CAvCylinderTriangle( const Point3d& ptCylOrig, const Vector3d& vtCylAx, double d if ( dCurDist > dMaxDistVS) dMaxDistVS = dCurDist ; } - // Distanza di allontanamento dall'interno del triangolo - double dMaxDistI = DiskTriaInteriorLeakDistLongMot( ptBase, dRad, trTria, vtMove) ; - return max( dMaxDistVS, dMaxDistI) ; + return dMaxDistVS ; } // Movimento perpendicolare all'asse del cilindro else if ( nMotionType == 3) { @@ -619,6 +625,21 @@ CAvTrConeTriangle( const Point3d& ptMinBase, const Vector3d& vtTrConeAx, double { // Allontanamento con direzione coincidente con l'asse del cono if ( AreSameOrOppositeVectorApprox( vtTrConeAx, vtMove)) { + // Verifica preliminare che la fetta di spazio delimitata dal piano sotto del cono rispetto alla direzione + // di allontanamento non sia già sopra al triangolo (tutti i vertici del triangolo sono sotto). + Point3d ptBase = ptMinBase ; + if ( AreOppositeVectorApprox( vtTrConeAx, vtMove)) + ptBase += dTrConeH * vtTrConeAx ; + double dMaxDistV = PointPlaneSignedDist( trTria.GetP( 0), ptBase, vtMove) ; + dMaxDistV = max( dMaxDistV, PointPlaneSignedDist( trTria.GetP( 1), ptBase, vtMove)) ; + dMaxDistV = max( dMaxDistV, PointPlaneSignedDist( trTria.GetP( 2), ptBase, vtMove)) ; + if ( dMaxDistV < 0.) + return 0. ; + // Distanza di allontanamento dall'interno + double dInnLeakDist = TrConeTriangleInteriorLeakDistLongMot( ptMinBase, vtTrConeAx, dMinBaseR, dMaxBaseR, dTrConeH, + trTria, vtMove) ; + if ( dInnLeakDist > EPS_SMALL) + return dInnLeakDist ; // Distanza di allontanamento dai vertici e lati double dOutLeakDist = 0 ; for ( int nV = 0 ; nV < 3 ; ++ nV) { @@ -633,12 +654,10 @@ CAvTrConeTriangle( const Point3d& ptMinBase, const Vector3d& vtTrConeAx, double double dCurSegDist = TrConeSegmentLeakDistLongMot( ptMinBase, vtTrConeAx, dMinBaseR, dMaxBaseR, dTrConeH, trTria.GetP( nV), vtSeg, dSegLen, vtMove) ; dOutLeakDist = max( dCurSegDist, dOutLeakDist) ; - } - double dInnLeakDist = TrConeTriangleInteriorLeakDistLongMot( ptMinBase, vtTrConeAx, dMinBaseR, dMaxBaseR, dTrConeH, - trTria, vtMove) ; - return max( dOutLeakDist, dInnLeakDist) ; + } + return dOutLeakDist ; } - // allontanamento in direzione ortogonale all'asse del cono + // Allontanamento in direzione ortogonale all'asse del cono else if ( AreOrthoApprox( vtTrConeAx, vtMove)) { double dOutLeakDist = 0. ; // Distanza di allontanamento da vertici e lati @@ -659,9 +678,9 @@ CAvTrConeTriangle( const Point3d& ptMinBase, const Vector3d& vtTrConeAx, double trTria, vtMove) ; return max( dOutLeakDist, dInnLeakDist) ; } - // altri casi + // Movimento generico else - return 0. ; + return -1 ; } //---------------------------------------------------------------------------- @@ -906,6 +925,19 @@ CAvTorusTriangle( const Point3d& ptTorusCen, const Vector3d& vtTorusAx, double d { // Allontanamento con direzione coincidente con l'asse del toro if ( AreSameOrOppositeVectorApprox( vtTorusAx, vtMove)) { + // Verifica preliminare che la fetta di spazio delimitata dal piano sotto del cono rispetto alla direzione + // di allontanamento non sia già sopra al triangolo (tutti i vertici del triangolo sono sotto). + Point3d ptBase = ptTorusCen - dMinRad * vtMove ; + double dMaxDistV = PointPlaneSignedDist( trTria.GetP( 0), ptBase, vtMove) ; + dMaxDistV = max( dMaxDistV, PointPlaneSignedDist( trTria.GetP( 1), ptBase, vtMove)) ; + dMaxDistV = max( dMaxDistV, PointPlaneSignedDist( trTria.GetP( 2), ptBase, vtMove)) ; + if ( dMaxDistV < 0.) + return 0. ; + // Distanza di allontanamento dall'interno + double dInLeakDist = TorusTriangleInteriorLeakDistLongMot( ptTorusCen, dMaxRad, dMinRad, + trTria, vtMove) ; + if ( dInLeakDist > EPS_SMALL) + return dInLeakDist ; // Distanza di allontanamento dai lati double dOutLeakDist = 0. ; for ( int nV = 0 ; nV < 3 ; ++ nV) { @@ -921,11 +953,9 @@ CAvTorusTriangle( const Point3d& ptTorusCen, const Vector3d& vtTorusAx, double d dCurDist > dOutLeakDist) dOutLeakDist = max( dOutLeakDist, dCurDist) ; } - double dInLeakDist = TorusTriangleInteriorLeakDistLongMot( ptTorusCen, dMaxRad, dMinRad, - trTria, vtMove) ; - return max( dInLeakDist, dOutLeakDist) ; + return dOutLeakDist ; } - // Allontanamento in direzione ortogonale all'asse del toro + // Allontanamento in direzione ortogonale all'asse del toro else if ( AreOrthoApprox( vtTorusAx, vtMove)) { // Distanza di allontanamento dai lati double dOutLeakDist = 0. ; @@ -940,9 +970,9 @@ CAvTorusTriangle( const Point3d& ptTorusCen, const Vector3d& vtTorusAx, double d double dInLeakDist = TorusTriangleInteriorLeakDistOrtMot( ptTorusCen, vtTorusAx, dMaxRad, dMinRad, trTria, vtMove) ; return max( dOutLeakDist, dInLeakDist) ; } - // Casi non gestiti + // Movimento generico else - return 0. ; + return -1 ; } //---------------------------------------------------------------------------- @@ -1029,7 +1059,7 @@ TorusTriangleInteriorLeakDistLongMot( const Point3d& ptTorusCen, double dMaxRad, // Nessuna interferenza return 0. ; } - // Altrimenti individuo le due possibili circonferenzecon cui può avvenire il contatto + // Altrimenti individuo le due possibili circonferenze con cui può avvenire il contatto Vector3d vtRadial = trTria.GetN() - trTria.GetN() * vtMove * vtMove ; vtRadial.Normalize() ; Point3d ptDiskPlus = ptTorusCen + dMaxRad * vtRadial ; diff --git a/Intervals.cpp b/Intervals.cpp index 6480ba9..167ae72 100644 --- a/Intervals.cpp +++ b/Intervals.cpp @@ -23,8 +23,8 @@ using namespace std ; void Intervals::Reset( void) { - m_lInts.clear() ; - m_Iter = m_lInts.end() ; + m_vInts.clear() ; + m_Iter = m_vInts.end() ; } //---------------------------------------------------------------------------- @@ -36,7 +36,7 @@ Intervals::Set( double dMin, double dMax) if ( dMin > dMax) swap( dMin, dMax) ; // aggiungo - m_lInts.emplace_back( dMin, dMax) ; + m_vInts.emplace_back( dMin, dMax) ; } //---------------------------------------------------------------------------- @@ -48,17 +48,17 @@ Intervals::Add( double dMin, double dMax) swap( dMin, dMax) ; // aggiungo, tenendo conto di interazioni con eventuali intervalli già presenti - auto iInsert = m_lInts.end() ; - auto iIter = m_lInts.begin() ; - while ( iIter != m_lInts.end()) { + auto iInsert = m_vInts.end() ; + auto iIter = m_vInts.begin() ; + while ( iIter != m_vInts.end()) { // se interseca l'intervallo corrente if ( dMin < iIter->second + m_dToler && dMax > iIter->first - m_dToler) { // se ha già interessato un intervallo precedente - if ( iInsert != m_lInts.end()) { + if ( iInsert != m_vInts.end()) { // aggiorno il massimo dell'intervallo già interessato iInsert->second = max( dMax, iIter->second) ; // cancello il corrente - iIter = m_lInts.erase( iIter) ; + iIter = m_vInts.erase( iIter) ; // il nuovo iteratore è già il successivo } // altrimenti modifico il corrente @@ -75,8 +75,8 @@ Intervals::Add( double dMin, double dMax) // se il nuovo intervallo finisce prima else if ( dMax <= iIter->first - m_dToler) { // se non già inserito, lo faccio ora - if ( iInsert == m_lInts.end()) - iInsert = m_lInts.emplace( iIter, dMin, dMax) ; + if ( iInsert == m_vInts.end()) + iInsert = m_vInts.emplace( iIter, dMin, dMax) ; // termino break ; } @@ -86,8 +86,8 @@ Intervals::Add( double dMin, double dMax) ++ iIter ; } // se non ancora inserito, va aggiunto alla fine - if ( iInsert == m_lInts.end()) - m_lInts.emplace_back( dMin, dMax) ; + if ( iInsert == m_vInts.end()) + m_vInts.emplace_back( dMin, dMax) ; } //---------------------------------------------------------------------------- @@ -99,8 +99,8 @@ Intervals::Subtract( double dMin, double dMax) swap( dMin, dMax) ; // scorro gli intervalli - auto iIter = m_lInts.begin() ; - while ( iIter != m_lInts.end()) { + auto iIter = m_vInts.begin() ; + while ( iIter != m_vInts.end()) { // se interseca l'intervallo corrente if ( dMin < iIter->second && dMax > iIter->first) { // se devo limitarlo inferiormente @@ -118,7 +118,7 @@ Intervals::Subtract( double dMin, double dMax) // se devo dividerlo in due parti else if ( dMin > ( iIter->first + m_dToler) && dMax < ( iIter->second - m_dToler)) { // inserisco il nuovo intervallo che corrisponde alla parte inferiore - iIter = m_lInts.emplace( iIter, iIter->first, dMin) ; + iIter = m_vInts.emplace( iIter, iIter->first, dMin) ; // modifico l'intervallo successivo ++ iIter ; iIter->first = dMax ; @@ -127,7 +127,7 @@ Intervals::Subtract( double dMin, double dMax) } // altrimenti devo eliminarlo else { - iIter = m_lInts.erase( iIter) ; + iIter = m_vInts.erase( iIter) ; // il nuovo iteratore è già il successivo } } @@ -145,7 +145,7 @@ void Intervals::Add( const Intervals& Other) { // aggiungo tutti gli intervalli dell'altro - for ( auto& Interv : Other.m_lInts) + for ( auto& Interv : Other.m_vInts) Add( Interv.first, Interv.second) ; } @@ -154,7 +154,7 @@ void Intervals::Subtract( const Intervals& Other) { // sottraggo tutti gli intervalli dell'altro - for ( auto& Interv : Other.m_lInts) + for ( auto& Interv : Other.m_vInts) Subtract( Interv.first, Interv.second) ; } @@ -163,11 +163,11 @@ void Intervals::Intersect( const Intervals& Other) { // se l'insieme è vuoto non devo fare alcunché - if ( m_lInts.empty()) + if ( m_vInts.empty()) return ; // Insieme di intervalli ausiliario ampio come il corrente Intervals Aux ; - Aux.Set( m_lInts.front().first, m_lInts.back().second) ; + Aux.Set( m_vInts.front().first, m_vInts.back().second) ; // Sottraggo Other da Aux Aux.Subtract( Other) ; // Sottraggo Aux dal corrente @@ -179,11 +179,11 @@ bool Intervals::GetMinMax( double& dMin, double& dMax) const { // verifico ci siano intervalli - if ( m_lInts.empty()) + if ( m_vInts.empty()) return false ; // l'estensione va dall'inizio del primo intervallo alla fine dell'ultimo - dMin = m_lInts.front().first ; - dMax = m_lInts.back().second ; + dMin = m_vInts.front().first ; + dMax = m_vInts.back().second ; return true ; } @@ -192,9 +192,9 @@ bool Intervals::GetFirst( double& dMin, double& dMax) const { // vado all'inizio - m_Iter = m_lInts.begin() ; + m_Iter = m_vInts.begin() ; // verifico sia definito - if ( m_Iter == m_lInts.end()) + if ( m_Iter == m_vInts.end()) return false ; // recupero i dati dMin = m_Iter->first ; @@ -207,11 +207,11 @@ bool Intervals::GetNext( double& dMin, double& dMax) const { // vado al successivo - if ( m_Iter == m_lInts.end()) + if ( m_Iter == m_vInts.end()) return false ; ++ m_Iter ; // verifico sia definito - if ( m_Iter == m_lInts.end()) + if ( m_Iter == m_vInts.end()) return false ; // recupero i dati dMin = m_Iter->first ; @@ -224,12 +224,12 @@ bool Intervals::GetLast( double& dMin, double& dMax) const { // vado alla fine - m_Iter = m_lInts.end() ; - if ( m_Iter == m_lInts.begin()) + m_Iter = m_vInts.end() ; + if ( m_Iter == m_vInts.begin()) return false ; -- m_Iter ; // verifico sia definito - if ( m_Iter == m_lInts.end()) + if ( m_Iter == m_vInts.end()) return false ; // recupero i dati dMin = m_Iter->first ; @@ -242,11 +242,11 @@ bool Intervals::GetPrev( double& dMin, double& dMax) const { // vado al precedente - if ( m_Iter == m_lInts.begin()) + if ( m_Iter == m_vInts.begin()) return false ; -- m_Iter ; // verifico sia definito - if ( m_Iter == m_lInts.end()) + if ( m_Iter == m_vInts.end()) return false ; // recupero i dati dMin = m_Iter->first ; diff --git a/Tool.cpp b/Tool.cpp index 8e9ad8b..38f0325 100644 --- a/Tool.cpp +++ b/Tool.cpp @@ -272,6 +272,83 @@ Tool::SetAdvTool( const string& sToolName, double dH, double dR, return SetGenTool( sToolName, &m_Outline, nToolNum) ; } +//---------------------------------------------------------------------------- +bool +Tool::SetSawTool( const string& sToolName, double dH, double dR, + double dThick, double dStemR, double dCornR, int nToolNum) +{ + // Impostazioni generali + m_sName = sToolName ; + m_nType = UNDEF ; + m_nCurrentNum = nToolNum ; + m_Outline.Clear() ; + + // Verifica dimensioni globali + if ( dH < EPS_SMALL || dR < EPS_SMALL || dThick < EPS_SMALL || dStemR < - EPS_SMALL || dCornR < - EPS_SMALL) + return false ; + + // Con gambo + if ( dH > dThick && dStemR > EPS_SMALL) { + // punti notevoli + Point3d pt0( 0, 0, 0) ; + Point3d pt1( dStemR, 0, 0) ; + Point3d pt2( dStemR, - dH + dThick, 0) ; + Point3d pt3( dR, - dH + dThick, 0) ; + Point3d pt4( dR, - dH, 0) ; + Point3d pt5( 0, - dH, 0) ; + // senza raggio corner + if ( dCornR < EPS_SMALL) { + // creazione profilo + m_Outline.AddPoint( pt0) ; + m_Outline.AddLine( pt1) ; + m_Outline.AddLine( pt2) ; + m_Outline.AddLine( pt3) ; + m_Outline.AddLine( pt4) ; + m_Outline.AddLine( pt5) ; + } + // altrimenti con raggio corner + else { + // creazione profilo + m_Outline.AddPoint( pt0) ; + m_Outline.AddLine( pt1) ; + m_Outline.AddLine( pt2) ; + m_Outline.AddLine( pt3 - X_AX * dCornR) ; + m_Outline.AddArcTg( pt3 - Y_AX * dCornR) ; + m_Outline.AddLine( pt4 + Y_AX * dCornR) ; + m_Outline.AddArcTg( pt4 - X_AX * dCornR) ; + m_Outline.AddLine( pt5) ; + } + } + // altrimenti senza gambo + else { + // punti notevoli + Point3d pt0( 0, - dH + dThick, 0) ; + Point3d pt3( dR, - dH + dThick, 0) ; + Point3d pt4( dR, - dH, 0) ; + Point3d pt5( 0, - dH, 0) ; + // senza raggio corner + if ( dCornR < EPS_SMALL) { + // creazione profilo + m_Outline.AddPoint( pt0) ; + m_Outline.AddLine( pt3) ; + m_Outline.AddLine( pt4) ; + m_Outline.AddLine( pt5) ; + } + // altrimenti con raggio corner + else { + // creazione profilo + m_Outline.AddPoint( pt0) ; + m_Outline.AddLine( pt3 - X_AX * dCornR) ; + m_Outline.AddArcTg( pt3 - Y_AX * dCornR) ; + m_Outline.AddLine( pt4 + Y_AX * dCornR) ; + m_Outline.AddArcTg( pt4 - X_AX * dCornR) ; + m_Outline.AddLine( pt5) ; + } + } + + return SetGenTool( sToolName, &m_Outline, nToolNum) ; +} + //---------------------------------------------------------------------------- bool Tool::SetGenTool( const string& sToolName, const ICurveComposite* pToolOutline, int nToolNum) diff --git a/Tool.h b/Tool.h index be60dc8..459a5c6 100644 --- a/Tool.h +++ b/Tool.h @@ -27,6 +27,8 @@ class Tool bool SetStdTool( const std::string& sToolName, double dH, double dR, double dCornR, int nToolNum) ; bool SetAdvTool( const std::string& sToolName, double dH, double dR, double dTipH, double dTipR, double dCornR, int nToolNum) ; + bool SetSawTool( const std::string& sToolName, double dH, double dR, + double dThick, double dStemR, double dCornR, int nToolNum) ; bool SetGenTool( const std::string& sToolName, const ICurveComposite* pToolOutline, int nToolNum) ; bool SetMortiserTool( const std::string& sToolName, double dH, double dW, double dTh, double dRc, int nToolNum) ; bool SetChiselTool( const std::string& sToolName, double dH, double dW, double dTh, int nToolNum) ; @@ -60,7 +62,7 @@ class Tool public : enum ToolType { UNDEF = 0, // Utensile indefinito - GEN = 1, // Generico da profilo -> usare SetTool + GEN = 1, // Generico da profilo CYLMILL = 2, // Cilindrico BALLMILL = 3, // Sferico BULLNOSEMILL = 4, // Naso di toro diff --git a/VolZmap.cpp b/VolZmap.cpp index c51f74a..b1daaaf 100644 --- a/VolZmap.cpp +++ b/VolZmap.cpp @@ -1319,36 +1319,44 @@ VolZmap::SetTolerances( double dLinTol, double dAngTolDeg) //---------------------------------------------------------------------------- bool -VolZmap::SetStdTool( const std::string& sToolName, double dH, double dR, double dCornR, int nFlag) +VolZmap::SetStdTool( const string& sToolName, double dH, double dR, double dCornR, int nFlag) { return m_Tool.SetStdTool( sToolName, dH, dR, dCornR, nFlag) ; } //---------------------------------------------------------------------------- bool -VolZmap::SetAdvTool( const std::string& sToolName, +VolZmap::SetAdvTool( const string& sToolName, double dH, double dR, double dTipH, double dTipR, double dCornR, int nFlag) { return m_Tool.SetAdvTool( sToolName, dH, dR, dTipH, dTipR, dCornR, nFlag) ; } +//---------------------------------------------------------------------------- +bool +VolZmap::SetSawTool( const string& sToolName, + double dH, double dR, double dThick, double dStemR, double dCornR, int nFlag) +{ + return m_Tool.SetSawTool( sToolName, dH, dR, dThick, dStemR, dCornR, nFlag) ; +} + //---------------------------------------------------------------------------- bool -VolZmap::SetGenTool( const std::string& sToolName, const ICurveComposite* pToolOutline, int nFlag) +VolZmap::SetGenTool( const string& sToolName, const ICurveComposite* pToolOutline, int nFlag) { return m_Tool.SetGenTool( sToolName, pToolOutline, nFlag) ; } //---------------------------------------------------------------------------- bool -VolZmap::SetMortiserTool( const std::string& sToolName, double dH, double dW, double dTh, double dRc, int nFlag) +VolZmap::SetMortiserTool( const string& sToolName, double dH, double dW, double dTh, double dRc, int nFlag) { return m_Tool.SetMortiserTool( sToolName, dH, dW, dTh, dRc, nFlag) ; } //---------------------------------------------------------------------------- bool -VolZmap::SetChiselTool( const std::string& sToolName, double dH, double dW, double dTh, int nFlag) +VolZmap::SetChiselTool( const string& sToolName, double dH, double dW, double dTh, int nFlag) { return m_Tool.SetChiselTool( sToolName, dH, dW, dTh, nFlag) ; } diff --git a/VolZmap.h b/VolZmap.h index d7f3935..78a1d4d 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -86,6 +86,8 @@ class VolZmap : public IVolZmap, public IGeoObjRW bool SetStdTool( const std::string& sToolName, double dH, double dR, double dCornR, int nFlag) override ; bool SetAdvTool( const std::string& sToolName, double dH, double dR, double dTipH, double dTipR, double dCornR, int nFlag) override ; + bool SetSawTool( const std::string& sToolName, + double dH, double dR, double dThick, double dStemR, double dCornR, int nFlag) override ; bool SetGenTool( const std::string& sToolName, const ICurveComposite* pToolOutline, int nFlag) override ; bool SetMortiserTool( const std::string& sToolName, double dH, double dW, double dTh, double dRc, int nFlag) override ; bool SetChiselTool( const std::string& sToolName, double dH, double dW, double dTh, int nFlag) override ;