diff --git a/PocketingNT.cpp b/PocketingNT.cpp index 4154c65..13141e8 100644 --- a/PocketingNT.cpp +++ b/PocketingNT.cpp @@ -2545,7 +2545,7 @@ PocketingNT::CalcPaths( STEPINFOPOVECTOR& vStepInfo) ICRVCOMPOPOVECTOR vCrvPaths ; if ( ! CalcPocketing( vStepInfo[i].pSfrPock, m_TParams.m_dDiam / 2, 0., m_Params.m_dSideStep, m_Params.m_dSideAngle, m_Params.m_nSubType, true, m_Params.m_bInvert, - false, true, ptEndLastPath, vStepInfo[i].pSfrLimit, false, vCrvPaths)) { + false, true, true, ptEndLastPath, vStepInfo[i].pSfrLimit, false, vCrvPaths)) { m_pMchMgr->SetLastError( 3028, "Error in PocketingNT : Error in CalcPocketing") ; return false ; } diff --git a/SurfFinishing.cpp b/SurfFinishing.cpp index 51ee11b..622e23a 100644 --- a/SurfFinishing.cpp +++ b/SurfFinishing.cpp @@ -94,6 +94,7 @@ const double SILH_SAMPLING = 1. ; #if ENABLE_ZCONST_DEBUG || ENABLE_OPTIMAL_DEBUG || ENABLE_OPTIMAL_SOFT_DEBUG #include "EgtDev/Include/EGkGeoPoint3d.h" #include "EgtDev/Include/EGkGeoVector3d.h" + #include "chrono" #endif //---------------------------------------------------------------------------- @@ -1796,7 +1797,7 @@ SurfFinishing::AddZigZag( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf, cons double dPockRadOffs = m_TParams.m_dDiam / 2 - m_Params.m_dSideStep - m_Params.m_dOverlap ; ICRVCOMPOPOVECTOR vpCrvs ; if ( ! CalcPocketing( pSfrPock, dPockRad, dPockRadOffs, m_Params.m_dSideStep, m_Params.m_dSideAngle, - POCKET_ZIGZAG, false, false, true, false, P_INVALID, nullptr, true, vpCrvs)) { + POCKET_ZIGZAG, false, false, true, false, false, P_INVALID, nullptr, true, vpCrvs)) { m_pMchMgr->SetLastError( 3125, "Error in SurfFinishing : CalcPocketing failed") ; return false ; } @@ -1997,7 +1998,7 @@ SurfFinishing::AddOneWay( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf, cons double dPockRadOffs = m_TParams.m_dDiam / 2 - m_Params.m_dSideStep - m_Params.m_dOverlap ; ICRVCOMPOPOVECTOR vpCrvs ; if ( ! CalcPocketing( pSfrPock, dPockRad, dPockRadOffs, m_Params.m_dSideStep, m_Params.m_dSideAngle, - POCKET_ONEWAY, false, false, true, false, P_INVALID, nullptr, true, vpCrvs)) { + POCKET_ONEWAY, false, false, true, false, false, P_INVALID, nullptr, true, vpCrvs)) { m_pMchMgr->SetLastError( 3125, "Error in SurfFinishing : CalcPocketing failed") ; return false ; } @@ -2199,7 +2200,7 @@ SurfFinishing::AddSpiral( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf, cons int nType = ( bInVsOut ? POCKET_SPIRALIN : POCKET_SPIRALOUT) ; ICRVCOMPOPOVECTOR vpCrvs ; if ( ! CalcPocketing( pSfrPock, dPockRad, dPockRadOffs, m_Params.m_dSideStep, m_Params.m_dSideAngle, - nType, false, false, true, false, P_INVALID, nullptr, true, vpCrvs)) { + nType, false, false, true, false, false, P_INVALID, nullptr, true, vpCrvs)) { m_pMchMgr->SetLastError( 3125, "Error in SurfFinishing : CalcPocketing failed") ; return false ; } @@ -2880,9 +2881,11 @@ SurfFinishing::CreateZConstPaths( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSu } } } - // se il link trovato non è valido, errore - if ( ! pCompoLink->IsValid()) - return false ; + // se il link trovato non è valido, ricomincio la ricerca + if ( ! pCompoLink->IsValid()) { + nCurrRow = 0 ; // azzero il contatore delle righe + break ; // interrompo ciclo sulle righe successive di ricerca + } // porto il link sulla curva attuale di silhouette e lo proietto sulla pStm (sono in locale) double dSfrDistNext = vCrvCompo[nNextRow][nNextCol_path]->GetTempParam( 0) ; @@ -3941,7 +3944,7 @@ AdvancedProcessSquare( int nFlag, const INTVECTOR& vInds, const DBLVECTOR& vdU, //---------------------------------------------------------------------------- bool -SurfFinishing::MarchingSquares( const VECTORCOLLISIONSFR& vPntM, bool bSpiral, int nStepX, int nStepY, double dClippingAngle, +SurfFinishing::MarchingSquares( const VECTORCOLLISIONSFR& vPntM, bool bSpiral, double dOffsTol, int nStepX, int nStepY, double dClippingAngle, const Vector3d& vtAxL, const Vector3d& vtMoveL, ICAvToolSurfTm* pCAvTlStm, ICRVCOMPOPOVECTOR& vCrvCompo) const { @@ -4049,6 +4052,12 @@ SurfFinishing::MarchingSquares( const VECTORCOLLISIONSFR& vPntM, bool bSpiral, i vCrvCompo.back()->AddLine( vBiPnt[vnId[i]-1].second) ; if ( ! vCrvCompo.back()->IsClosed()) vCrvCompo.pop_back() ; + else { + // controllo se sufficientemente estesa + double dMaxOffs ; + if ( CalcCurveLimitOffset( *vCrvCompo.back(), dMaxOffs) && dMaxOffs < dOffsTol) + vCrvCompo.pop_back() ; + } } // abbellisco le curve trovate const double SILH_ARC_TOL = 0.1 ; @@ -4091,9 +4100,9 @@ SurfFinishing::GetOptimalSfr( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& Vector3d vtMoveL = vtAxL ; // costanti - const double CLIPPING_ANGLE = 45. ; // Angolo di clipping tra Spiral e ZConst - const double TOL_SAMPLE = 1. ; // Tolleranza di campionamento per collisioni - const double EXTRA_XY = 2.5 * TOL_SAMPLE ; // Espansione del Box in X e Y per griglia di campionamento + const double CLIPPING_ANGLE = m_Params.m_dSideAngle ; // Angolo di clipping tra Spiral e ZConst + const double TOL_SAMPLE = 2. ; // Tolleranza di campionamento per collisioni + const double EXTRA_XY = 2.5 * TOL_SAMPLE ; // Espansione del Box in X e Y per griglia di campionamento // frame pianoXY Frame3d frXY ; @@ -4167,10 +4176,10 @@ SurfFinishing::GetOptimalSfr( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& for ( int nV = 0 ; nV < int( get<2>( *it).size()) ; ++ nV) { if ( ! bOnBorder) { double dAbsCos = abs( get<2>( *it)[nV] * vtAxL) ; - if ( ! vCollision[nInd].bInSpiral) - vCollision[nInd].bInSpiral = ( dAbsCos > dCosClipping + EPS_ANG_ZERO) ; // theta > ClippingAng if ( ! vCollision[nInd].bInZConst) vCollision[nInd].bInZConst = ( dAbsCos < dCosClipping + EPS_ANG_ZERO) ; // theta <= ClippingAng + if ( ! vCollision[nInd].bInSpiral) + vCollision[nInd].bInSpiral = ( dAbsCos > dCosClipping + EPS_ANG_ZERO) ; // theta > ClippingAng } get<2>( vCollision[nInd].CollisionInfo).push_back( get<2>( *it)[nV]) ; } @@ -4198,16 +4207,16 @@ SurfFinishing::GetOptimalSfr( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& int nThreadMax = thread::hardware_concurrency() ; if ( nThreadMax <= 1) { // recupero le curve di contorno per la superficie Spiral - if ( ! MarchingSquares( vCollision, true, nStepX, nStepY, CLIPPING_ANGLE, vtAxL, vtMoveL, pCAvTlStm, vCrvSpiral)) + if ( ! MarchingSquares( vCollision, true, TOL_SAMPLE / 2., nStepX, nStepY, CLIPPING_ANGLE, vtAxL, vtMoveL, pCAvTlStm, vCrvSpiral)) return false ; // recupero le curve di contorno per la superficie ZConst - if ( ! MarchingSquares( vCollision, false, nStepX, nStepY, CLIPPING_ANGLE, vtAxL, vtMoveL, pCAvTlStm, vCrvZConst)) + if ( ! MarchingSquares( vCollision, false, TOL_SAMPLE / 2., nStepX, nStepY, CLIPPING_ANGLE, vtAxL, vtMoveL, pCAvTlStm, vCrvZConst)) return false ; } else { future vRes[2] ; - vRes[0] = async( launch::async, &SurfFinishing::MarchingSquares, this, cref( vCollision), true, nStepX, nStepY, CLIPPING_ANGLE, cref( vtAxL), cref( vtMoveL), ref( pCAvTlStm), ref( vCrvSpiral)) ; - vRes[1] = async( launch::async, &SurfFinishing::MarchingSquares, this, cref( vCollision), false, nStepX, nStepY, CLIPPING_ANGLE, cref( vtAxL), cref( vtMoveL), ref( pCAvTlStm), ref( vCrvZConst)) ; + vRes[0] = async( launch::async, &SurfFinishing::MarchingSquares, this, cref( vCollision), true, TOL_SAMPLE / 2., nStepX, nStepY, CLIPPING_ANGLE, cref( vtAxL), cref( vtMoveL), ref( pCAvTlStm), ref( vCrvSpiral)) ; + vRes[1] = async( launch::async, &SurfFinishing::MarchingSquares, this, cref( vCollision), false, TOL_SAMPLE / 2., nStepX, nStepY, CLIPPING_ANGLE, cref( vtAxL), cref( vtMoveL), ref( pCAvTlStm), ref( vCrvZConst)) ; int nFin = 0 ; bool bOk = true ; while ( nFin < 2) { @@ -4254,7 +4263,7 @@ SurfFinishing::GetOptimalSfr( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& if ( AreOppositeVectorApprox( pSfrSpiral->GetNormVersor(), pSfrLoc->GetNormVersor())) pSfrSpiral->Invert() ; // Offset di correzione per le regioni Spiral - pSfrSpiral->Offset( - TOL_SAMPLE - EPS_SMALL, ICurve::OFF_FILLET) ; + pSfrSpiral->Offset( - TOL_SAMPLE / 10., ICurve::OFF_FILLET) ; #if ENABLE_OPTIMAL_SOFT_DEBUG int _pSS = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrSpiral->Clone()) ; m_pGeomDB->SetMaterial( _pSS, Color( 1., 0., 0., .65)) ; @@ -4338,23 +4347,18 @@ SurfFinishing::AddOptimal( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& vSr } else pSfrSpiral->Clear() ; - // lavoro ogni singolo Chunk singolarmente ( non estendo lati aperti per eveitare merge con gli stessi Chunks) - for ( int nC = 0 ; nC < pSfrSpiral->GetChunkCount() ; ++ nC) { - // recupero il Chunk come regione piana - PtrOwner pSfrToWork( pSfrSpiral->CloneChunk( nC)) ; - if ( IsNull( pSfrToWork) || ! pSfrToWork->IsValid()) - return false ; + if ( ! IsNull( pSfrSpiral) && pSfrSpiral->IsValid()) { // imposto i lati chiusi - for ( int nCC = 0 ; nCC < pSfrToWork->GetChunkCount() ; ++ nCC) { - for ( int nL = 0 ; nL < pSfrToWork->GetLoopCount( nCC) ; ++ nL) { - for ( int nU = 0 ; nU < pSfrToWork->GetLoopCurveCount( nCC, nL) ; ++ nU) - pSfrToWork->SetCurveTempProp( nCC, nL, nU, 0, TEMP_PROP_CLOSE_EDGE) ; + for ( int nCC = 0 ; nCC < pSfrSpiral->GetChunkCount() ; ++ nCC) { + for ( int nL = 0 ; nL < pSfrSpiral->GetLoopCount( nCC) ; ++ nL) { + for ( int nU = 0 ; nU < pSfrSpiral->GetLoopCurveCount( nCC, nL) ; ++ nU) + pSfrSpiral->SetCurveTempProp( nCC, nL, nU, 0, TEMP_PROP_CLOSE_EDGE) ; } } // lavorazione Spiral ICRVCOMPOPOVECTOR vpCrvs ; - if ( ! CalcPocketing( pSfrToWork, m_Params.m_dSideStep, 0., m_Params.m_dSideStep, m_Params.m_dSideAngle, - POCKET_SPIRALIN, false, false, true, false, P_INVALID, nullptr, true, vpCrvs)) { + if ( ! CalcPocketing( pSfrSpiral, m_Params.m_dSideStep, 0., m_Params.m_dSideStep, m_Params.m_dSideAngle, + POCKET_SPIRALIN, false, false, true, false, false, P_INVALID, nullptr, true, vpCrvs)) { m_pMchMgr->SetLastError( 3125, "Error in SurfFinishing : CalcPocketing failed") ; return false ; } @@ -4364,7 +4368,6 @@ SurfFinishing::AddOptimal( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& vSr // definisco un nuovo percorso (in locale) vPaths.resize( vPaths.size() + 1) ; vPaths.back().pCrvPath.Set( Release( vpCrvs[k])) ; - vPaths.back().nType = SURFFIN_SUB_SPIRALIN ; // li correggo per non interferire con le superfici if ( pCAvTlStm != nullptr) { @@ -4411,7 +4414,7 @@ SurfFinishing::AddOptimal( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& vSr } // aggiorno la ProgressBar al 60% - ExeProcessEvents( 5, 0) ; + ExeProcessEvents( 60, 0) ; #if ENABLE_OPTIMAL_SOFT_DEBUG // disegno i percorsi per controllo int ___a = int( vPaths.size()) ; @@ -4424,27 +4427,20 @@ SurfFinishing::AddOptimal( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& vSr // ----------------------- Lavorazione Zconst ------------------------------- if ( ! IsNull( pSfrZConst) && pSfrZConst->IsValid()) { - // lavoro ogni singolo Chunk singolarmente ( non estendo lati aperti per evitare merge con gli stessi Chunks) - for ( int nC = 0 ; nC < pSfrZConst->GetChunkCount() ; ++ nC) { - // recupero il Chunk come regione piana - PtrOwner pSfrToWork( pSfrZConst->CloneChunk( nC)) ; - if ( IsNull( pSfrToWork) || ! pSfrToWork->IsValid()) - return false ; - // mi assicuro di non uscire dalla superficie originale - PtrOwner pSfrOverlap( pSfr->CreateOffsetSurf( m_Params.m_dOverlap, ICurve::OFF_FILLET)) ; - if ( IsNull( pSfrOverlap) || ! pSfrOverlap->IsValid()) - continue ; - if ( ! pSfrOverlap->ToLoc( frSurf) || ! pSfrToWork->Intersect( *pSfrOverlap)) + // mi assicuro di non uscire dalla superficie originale + PtrOwner pSfrOverlap( pSfr->CreateOffsetSurf( m_Params.m_dOverlap, ICurve::OFF_FILLET)) ; + if ( ! IsNull( pSfrOverlap) && pSfrOverlap->IsValid()) { + if ( ! pSfrOverlap->ToLoc( frSurf) || ! pSfrZConst->Intersect( *pSfrOverlap)) return false ; // imposto i lati chiusi - for ( int nCC = 0 ; nCC < pSfrToWork->GetChunkCount() ; ++ nCC) { - for ( int nL = 0 ; nL < pSfrToWork->GetLoopCount( nCC) ; ++ nL) { - for ( int nU = 0 ; nU < pSfrToWork->GetLoopCurveCount( nCC, nL) ; ++ nU) - pSfrToWork->SetCurveTempProp( nC, nL, nU, 0, TEMP_PROP_CLOSE_EDGE) ; + for ( int nC = 0 ; nC < pSfrZConst->GetChunkCount() ; ++ nC) { + for ( int nL = 0 ; nL < pSfrZConst->GetLoopCount( nC) ; ++ nL) { + for ( int nU = 0 ; nU < pSfrZConst->GetLoopCurveCount( nC, nL) ; ++ nU) + pSfrZConst->SetCurveTempProp( nC, nL, nU, 0, TEMP_PROP_CLOSE_EDGE) ; } } // inizializzo la classe di calcolo delle silhouette - CISURFTMPVECTOR vpStm ; vpStm.reserve( vSrfLoc.size()) ; + CISURFTMPVECTOR vpStm ; vpStm.reserve( vSrfLoc.size()) ; // scorro le superfici for ( int i = 0 ; i < int( vSrfLoc.size()) ; ++ i) { // recupero la superficie TriMesh e se valida la memorizzo @@ -4454,12 +4450,12 @@ SurfFinishing::AddOptimal( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& vSr } PtrOwner pCavParSilh( CreateCAvParSilhouettesSurfTm()) ; if ( IsNull( pCavParSilh) || - ! pCavParSilh->SetDataForRegion( vpStm, pSfrToWork, m_TParams.m_dSideAng, m_TParams.m_dDiam, + ! pCavParSilh->SetDataForRegion( vpStm, pSfrZConst, m_TParams.m_dSideAng, m_TParams.m_dDiam, m_TParams.m_dCornRad, m_TParams.m_dMaxMat, GetOffsR(), SILH_SAMPLING, ANG_TOL_STD_DEG)) return false ; // recupero le curve singole definite dal bordo della Silhouette vector vCrvCompo ; - if ( ! CalcZConstSilCrv( pCavParSilh, vSrfLoc, frSurf, pSfrToWork, vtTool, dDepth, vCrvCompo)) { + if ( ! CalcZConstSilCrv( pCavParSilh, vSrfLoc, frSurf, pSfrZConst, vtTool, dDepth, vCrvCompo)) { m_pMchMgr->SetLastError( 3126, "Error in SurfFinishing : Computing ZConst Curves failed") ; return false ; } @@ -4467,7 +4463,7 @@ SurfFinishing::AddOptimal( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& vSr if ( ! vCrvCompo.empty()) { // collego tra loro le curve trovate ICRVCOMPOPOVECTOR vCrv ; - if ( ! CreateZConstPaths( pCAvTlStm, frSurf, vCrvCompo, vtTool, pSfrToWork, dDepth, vCrv)) { + if ( ! CreateZConstPaths( pCAvTlStm, frSurf, vCrvCompo, vtTool, pSfrZConst, dDepth, vCrv)) { m_pMchMgr->SetLastError( 3127, "Error in SurfFinishing : Computing ZConst Paths failed") ; return false ; } diff --git a/SurfFinishing.h b/SurfFinishing.h index c0de7f9..a2ce0cd 100644 --- a/SurfFinishing.h +++ b/SurfFinishing.h @@ -154,7 +154,7 @@ class SurfFinishing : public Machining bool GetSurfaceNormalAtPoint( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf, const Point3d& ptTool, const Vector3d& vtTool, Vector3d& vtNorm) const ; bool GetActiveSurfaces( INTVECTOR& vSurfId) const ; - bool MarchingSquares( const VECTORCOLLISIONSFR& vPntM, bool bSpiral, int nStepX, int nStepY, double dClippingAngle, + bool MarchingSquares( const VECTORCOLLISIONSFR& vPntM, bool bSpiral, double dOffsTol, int nStepX, int nStepY, double dClippingAngle, const Vector3d& vtAxL, const Vector3d& vtMoveL, ICAvToolSurfTm* pCAvTlStm, ICRVCOMPOPOVECTOR& vCrvCompo) const ; bool CalcShapedPoint( const PNTUVVECT& myInfoStart, const PNTUVVECT& myInfoEnd, bool bSpiral, const Vector3d& vtAxL, diff --git a/SurfRoughing.cpp b/SurfRoughing.cpp index f6c41dd..2cf6e56 100644 --- a/SurfRoughing.cpp +++ b/SurfRoughing.cpp @@ -2309,7 +2309,7 @@ SurfRoughing::CalcPaths( const INTINTVECTOR& vPocket, STEPINFOSRVECTOR& vStepInf ICRVCOMPOPOVECTOR vCrvPaths ; if ( ! CalcPocketing( vStepInfo[nInd].pSfrPock, m_TParams.m_dDiam / 2, 0., m_Params.m_dSideStep, m_Params.m_dSideAngle, vStepInfo[nInd].nSubType, true, vStepInfo[nInd].bInverted, - false, true, ptEndLastPath, vStepInfo[nInd].pSfrLimit, false, vCrvPaths)) { + false, true, true, ptEndLastPath, vStepInfo[nInd].pSfrLimit, false, vCrvPaths)) { if ( vStepInfo[nInd].bIsExtraStep) { string sWarn = "Warning in SurfRoughing : CalcPocketing failed with substep (" + ToString( vStepInfo[nInd].dDepth, 1) + ")" ; m_pMchMgr->SetWarning( 3055, sWarn) ;