diff --git a/CalcPocketing.cpp b/CalcPocketing.cpp index 2ea388a..539a225 100644 --- a/CalcPocketing.cpp +++ b/CalcPocketing.cpp @@ -3159,8 +3159,8 @@ CalcTrapezoidSpiralXCoord( const ICurveComposite* pCrvPocket, int nBase, int nSe int nProp = - 1 ; if ( ! pCrvPocket->GetCurveTempProp( nCrvId, nProp)) return false ; - // se open - if ( nProp == 1) { + // se Open + if ( nProp == TEMP_PROP_OPEN_EDGE) { Point3d pt1, pt2 ; pCrvPocket->GetCurve( nCrvId)->GetStartPoint( pt1) ; pCrvPocket->GetCurve( nCrvId)->GetEndPoint( pt2) ; @@ -3169,10 +3169,10 @@ CalcTrapezoidSpiralXCoord( const ICurveComposite* pCrvPocket, int nBase, int nSe else dXCoord = max( pt1.x, pt2.x) ; } - // se closed + // se Closed else { // creo la curva destra/sinistra - int nLast = bStart ? pCrvPocket->GetCurveCount() : nSecondBase ; + int nLast = ( bStart ? pCrvPocket->GetCurveCount() : nSecondBase) ; PtrOwner pCrvSide( ConvertCurveToComposite( pCrvPocket->CopyParamRange( nCrvId, nLast))) ; if ( IsNull( pCrvSide)) return false ; @@ -3200,7 +3200,7 @@ CalcTrapezoidSpiralXCoord( const ICurveComposite* pCrvPocket, int nBase, int nSe PtrOwner pLineMid( CreateCurveLine()) ; if ( IsNull( pLineMid)) return false ; - pLineMid->Set( Point3d( - 3000, dYCoord, 0), Point3d( 3000, dYCoord, 0)) ; + pLineMid->Set( Point3d( - 3000., dYCoord, 0.), Point3d( 3000., dYCoord, 0.)) ; IntersCurveCurve intCC( *pLineMid, *pCrvOffs) ; IntCrvCrvInfo ccClass ; if ( intCC.GetIntersCount() != 0) { @@ -3211,8 +3211,7 @@ CalcTrapezoidSpiralXCoord( const ICurveComposite* pCrvPocket, int nBase, int nSe return false ; } else { - // se non ho intersezioni... - // prendo il box della curva + // se non ho intersezioni, prendo il box della curva BBox3d Box3d ; pCrvSide->GetLocalBBox( Box3d) ; // creo la linea limitie verticale @@ -3220,10 +3219,10 @@ CalcTrapezoidSpiralXCoord( const ICurveComposite* pCrvPocket, int nBase, int nSe if ( IsNull( pCrvVertLine)) return false ; if ( bStart) - pCrvVertLine->SetPDL( Box3d.GetMax() + 5 * TOL_TRAPEZOID * Y_AX, - 90 , 2 * dPocketSize) ; + pCrvVertLine->SetPDL( Box3d.GetMax() + 5 * TOL_TRAPEZOID * Y_AX, - ANG_RIGHT , 2 * dPocketSize) ; else - pCrvVertLine->SetPDL( Box3d.GetMin() - 5 * TOL_TRAPEZOID * Y_AX, 90, 2 * dPocketSize) ; - // intersechiamo + pCrvVertLine->SetPDL( Box3d.GetMin() - 5 * TOL_TRAPEZOID * Y_AX, ANG_RIGHT, 2 * dPocketSize) ; + // intersezione IntersCurveCurve intCC2( *pCrvVertLine, *pCrvSide) ; if ( intCC2.GetOverlaps()) { if ( bStart) @@ -3232,7 +3231,7 @@ CalcTrapezoidSpiralXCoord( const ICurveComposite* pCrvPocket, int nBase, int nSe dXCoord = Box3d.GetMin().x - dRad ; } else { - dXCoord = bStart ? -INFINITO : INFINITO ; + dXCoord = ( bStart ? -INFINITO : INFINITO) ; for ( int i = 0 ; i < intCC2.GetIntersCount() ; ++ i) { IntCrvCrvInfo ccClass2 ; if ( intCC2.GetIntCrvCrvInfo( i, ccClass2)) { @@ -3259,24 +3258,25 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p const PocketParams& PockParams, bool bStart) { // parametri - double dDiam = PockParams.dRad_prec > 0 ? 2 * PockParams.dRad_prec : 2 * PockParams.dRad ; - double dOffsR = PockParams.dRad_prec > 0 ? PockParams.dRadialOffset_prec : PockParams.dRadialOffset ; + double dDiam = ( PockParams.dRad_prec > 0 ? 2. * PockParams.dRad_prec : 2. * PockParams.dRad) ; + double dOffsR = ( PockParams.dRad_prec > 0 ? PockParams.dRadialOffset_prec : PockParams.dRadialOffset) ; double dRad = 0.5 * dDiam + dOffsR ; - - PtrOwner pCompo( CreateCurveComposite()) ; if ( ! bStart) pMCrv->Invert() ; + // recupero la coordinata Y del tratto lineare e la dimensione della tasca a trapezio Point3d ptTmp ; pMCrv->GetStartPoint( ptTmp) ; - double dYCoord = ptTmp.y ; // quota verticale del percorso di svuotatura + double dYCoord = ptTmp.y ; pCrvPocket->GetCurve( 2)->GetStartPoint( ptTmp) ; double dPocketSize = ptTmp.y ; + // offset del lato chiuso del raggio utensile, verso l'interno della tasca a trapezio int nCrvId = ( bStart ? 3 : 1) ; PtrOwner pLine( GetCurveLine( pCrvPocket->GetCurve( nCrvId)->Clone())) ; pLine->SimpleOffset( - dRad) ; + // inverto gli estremi se necessario Point3d ptP1, ptP2 ; pLine->GetStartPoint( ptP1) ; pLine->GetEndPoint( ptP2) ; @@ -3284,8 +3284,11 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p swap( ptP1, ptP2) ; int nProp2 ; + PtrOwner pCompo( CreateCurveComposite()) ; + if ( IsNull( pCompo)) + return false ; // lato opposto a quello di riferimento aperto - if ( pCrvPocket->GetCurveTempProp( 2, nProp2) && nProp2 != 0) { + if ( pCrvPocket->GetCurveTempProp( 2, nProp2) && nProp2 != TEMP_PROP_CLOSE_EDGE) { // caso 1 : pLine ha un estremo sopra e uno sotto il percorso di svuotatura pMCrv if ( ptP2.y < dYCoord && dYCoord < ptP1.y) { @@ -3316,22 +3319,19 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p if ( ! pMCrv->TrimStartAtParam( dPar)) pMCrv->Clear() ; - if ( ptP1.y > dPocketSize) { + if ( ptP1.y > dPocketSize + 100. * EPS_SMALL) { // se ptP1 è esterno alla svuotatura scambio i punti in modo da usare ptP2 per il biarco ( così da non farlo fuoriuscire troppo) swap( ptP1, ptP2) ; pCompo->Invert() ; } // creo biarco fra ptP1 e ptCrv - Vector3d vtDir ; - pCompo->GetStartDir( vtDir) ; - double dAng ; - vtDir.GetAngleXY( X_AX, dAng) ; - PtrOwner pBiArc( GetBiArc( ptP1, - dAng, ptCrv, bStart ? 0 : 180, 0.8)) ; - + Vector3d vtDir ; pCompo->GetStartDir( vtDir) ; + double dAng ; vtDir.GetAngleXY( X_AX, dAng) ; bool bUseBiArc = false ; + PtrOwner pBiArc( GetBiArc( ptP1, - dAng, ptCrv, bStart ? 0 : ANG_STRAIGHT, 0.8)) ; if ( ! IsNull( pBiArc)) { - // verifico che con il biarco non si oltrepassi il lato obliquo chiuso della svuotatura + // verifico che con il biarco non si oltrepassi il lato obliquo chiuso della svuotatura IntersCurveCurve intCC2( *pBiArc, *pCompo) ; if ( intCC2.GetIntersCount() == 1) bUseBiArc = true ; @@ -3356,9 +3356,9 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p // trovo l'intersezione fra il prolungamento della linea e pMCrv if ( bStart) - pLine->ExtendStartByLen( 1000) ; + pLine->ExtendStartByLen( 1000.) ; else - pLine->ExtendEndByLen( 1000) ; + pLine->ExtendEndByLen( 1000.) ; IntersCurveCurve intCC ( *pLine, *pMCrv) ; if ( intCC.GetIntersCount() == 0) return false ; @@ -3376,7 +3376,7 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p } } - // se il lato opposto a quello di riferimento � chiuso bisogna distinguere i casi + // se il lato opposto a quello di riferimento è chiuso bisogna distinguere i casi else { bool bStartPnt = false ; if ( ptP2.y < dYCoord) { @@ -3387,7 +3387,7 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p pLine->GetStartDir( vtDir) ; if ( bStart) vtDir.Invert() ; - Point3d ptP2N = ptP2 - dDiam / 2 * abs( vtDir.x / vtDir.y) * vtDir ; + Point3d ptP2N = ptP2 - dDiam / 2. * abs( vtDir.x / vtDir.y) * vtDir ; if ( ptP2N.y < dYCoord) bStartPnt = pCompo->AddPoint( ptP2N) ; } @@ -3399,12 +3399,13 @@ AdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* p } // setto temp prop per ricordare che è curva aggiuntiva per pulire angoli - for ( int i = 0 ; i < pCompo->GetCurveCount() ; i++) - pCompo->SetCurveTempProp( i, 1) ; + for ( int i = 0 ; i < pCompo->GetCurveCount() ; ++ i) + pCompo->SetCurveTempProp( i, TEMP_PROP_OPEN_EDGE) ; pMCrv->AddCurve( Release( pCompo), false) ; - if ( ! bStart) - pMCrv->Invert() ; // ripristino la direzione originaria + // se richiesto ripristino la direzione originaria + if ( ! bStart) + pMCrv->Invert() ; return true ; } @@ -3418,7 +3419,6 @@ CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTrap, double // parametri double dDiam = 2 * PockParams.dRad ; double dOffsR = PockParams.dRadialOffset ; - bOptimizedTrap = false ; Vector3d vtExtr ; pCrvPocket->GetExtrusion( vtExtr) ; @@ -3443,7 +3443,7 @@ CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTrap, double pCrvPocket->GetCurve( nSecondBase)->GetLength( dLen2) ; bool bRealTrap = ( pCrvPocket->GetCurveCount() == 4) ; for ( int i = 0 ; i < 4 && bRealTrap ; ++ i) - bRealTrap = pCrvPocket->GetCurve( i)->GetType() == CRV_LINE ; + bRealTrap = ( pCrvPocket->GetCurve( i)->GetType() == CRV_LINE) ; if ( bRealTrap) { pCrvPocket->GetCurve( nBase + 1)->GetLength( dLen1) ; pCrvPocket->GetCurve( nSecondBase + 1)->GetLength( dLen3) ; @@ -3469,13 +3469,17 @@ CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTrap, double else { // trovo la quota Y per centro del Tool double dYCoord ; - if ( pCrvPocket->GetCurve( nBase)->GetTempProp( 0) == TEMP_PROP_CLOSE_EDGE) // se base principale chiusa + // se base principale chiusa + if ( pCrvPocket->GetCurve( nBase)->GetTempProp( 0) == TEMP_PROP_CLOSE_EDGE) dYCoord = 0.5 * dDiam + dOffsR ; - else if ( pCrvPocket->GetCurve( nSecondBase)->GetTempProp( 0) == TEMP_PROP_CLOSE_EDGE) // se base principale aperta e secondaria chiusa + // se base principale aperta e secondaria chiusa + else if ( pCrvPocket->GetCurve( nSecondBase)->GetTempProp( 0) == TEMP_PROP_CLOSE_EDGE) dYCoord = dPocketSize - 0.5 * dDiam - dOffsR ; - else // se entrambi i lati paralleli sono aperti mi posiziono a metà della svuotatura + // se entrambi i lati paralleli sono aperti mi posiziono a metà della svuotatura + else dYCoord = 0.5 * dPocketSize ; + // determino le quote coordinate in X inziale e finale double dXCoordStart = -INFINITO ; double dXCoordEnd = INFINITO ; if ( ! CalcTrapezoidSpiralXCoord( pCrvPocket, nBase, nSecondBase, true, dYCoord, dXCoordStart, @@ -3486,10 +3490,14 @@ CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTrap, double return false ; if ( dXCoordStart > dXCoordEnd + 500 * EPS_SMALL) return false ; + + // determino gli estremi del segmento di svuotatura Point3d ptStart( dXCoordStart, dYCoord) ; Point3d ptEnd( dXCoordEnd, dYCoord) ; - if ( bRealTrap && AreSamePointEpsilon( ptStart, ptEnd, 500 * EPS_SMALL) && ( vnProp[0] != 0 || vnProp[2] != 0)) { + // verifico se il punto iniziale e finale coincidono + if ( bRealTrap && AreSamePointEpsilon( ptStart, ptEnd, 500 * EPS_SMALL) && + ( vnProp[0] != TEMP_PROP_CLOSE_EDGE || vnProp[2] != TEMP_PROP_CLOSE_EDGE)) { Vector3d vtDir1, vtDir3 ; pCrvPocket->GetCurve( 1)->GetStartDir( vtDir1) ; pCrvPocket->GetCurve( 3)->GetStartDir( vtDir3) ; @@ -3532,6 +3540,7 @@ CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTrap, double pMCrv->SetCurveTempProp( 0, TEMP_PROP_OPEN_EDGE) ; } } + // se estremi del segmento differenti, allora il percorso è definito else { if ( ! pMCrv->AddPoint( ptStart)) return true ; @@ -3883,7 +3892,7 @@ GetPtStartOnOpenEdgeByOrigCurve( const ICurveComposite* pCrvOrig, const PocketPa double dLen = 0. ; pCrvOpen->GetLength( dLen) ; // se lunghezza accettabile o maggiore della massima trovata - if ( dLen > dLenRef) { + if ( dLen > dLenRef - 10. * EPS_SMALL) { Point3d ptSTmp ; Vector3d vtMidOutTmp ; // ricavo il punto medio e il vettore tangente ad esso associato