diff --git a/CalcPocketing.cpp b/CalcPocketing.cpp index ef7ab76..64ddd2d 100644 --- a/CalcPocketing.cpp +++ b/CalcPocketing.cpp @@ -2417,7 +2417,7 @@ CalcCircleSpiral( const Point3d& ptCen, const Vector3d& vtN, double dOutRad, dou PtrOwner pArc( CreateCurveArc()) ; if ( IsNull( pArc) || ! pArc->Set( ptCen, vtN, dOutRad)) return false ; - // cambio il punto inizile se necessario + // cambio il punto iniziale se necessario if ( PockParams.ptStart.IsValid()) { double dUStart = 0. ; int nFlag = 0 ; @@ -9828,6 +9828,90 @@ CalcPocketing( const ISurfFlatRegion* pSfr, double dRad, double dRadOffs, double return true ; } +//---------------------------------------------------------------------------- +bool +IsPocketingHole( const ISurfFlatRegion* pSfr, double dToolRad, double dRadialOffs, double dSideStep, int nType, int nLiType, + double dLiTang, double dRatioSfrTool) +{ + // verifico validità della superficie + if ( pSfr == nullptr || ! pSfr->IsValid()) + return false ; + + // la superficie deve avere un solo Chunk e non presentare isole + if ( pSfr->GetChunkCount() != 1 && pSfr->GetLoopCount( 0) != 1) + return false ; + + // porto la superficie nel suo riferimento intrinseco, quindi lavoro nel piano XY + Point3d ptC ; pSfr->GetCentroid( ptC) ; + Frame3d frXY ; + if ( ! frXY.Set( ptC, pSfr->GetNormVersor())) + return false ; + PtrOwner pSfrCL( CloneSurfFlatRegion( pSfr)) ; + if ( IsNull( pSfrCL) || ! pSfrCL->IsValid() || ! pSfrCL->ToLoc( frXY)) + return false ; + + // recupero l'unica curva di bordo che descrive la regione piana + PtrOwner pCrvBorder( ConvertCurveToComposite( pSfrCL->GetLoop( 0, 0))) ; + if ( IsNull( pCrvBorder) || ! pCrvBorder->IsValid()) + return false ; + pCrvBorder->MergeCurves( 10. * EPS_SMALL, 10. * EPS_ANG_SMALL, true, true) ; + pCrvBorder->SetExtrusion( pSfrCL->GetNormVersor()) ; // Z_AX() + + // verifico che le proprietà di lato Aperto/Chiuso siano uniformi + bool bOkSpiral = true ; + const ICurve* pFirstCrv = pCrvBorder->GetCurve( 0) ; + if ( pFirstCrv == nullptr || ! pFirstCrv->IsValid()) + return false ; + int nTmpPropRef = pFirstCrv->GetTempProp( 0) ; + for ( int nU = 1 ; bOkSpiral && nU < pCrvBorder->GetCurveCount() ; ++ nU) { + const ICurve* pCrv = pCrvBorder->GetCurve( nU) ; + if ( pCrv == nullptr || ! pCrv->IsValid()) + return false ; + bOkSpiral = ( pCrv->GetTempProp( 0) == nTmpPropRef) ; + } + if ( ! bOkSpiral) + return false ; + + // definisco i parametri di una lavorazione Standard ( solo quelli utili per una svuotatura di un foro) + PocketParams PockParam ; + PockParam.dRad = dToolRad ; + PockParam.dRadialOffset = dRadialOffs ; + PockParam.dSideStep = dSideStep ; + PockParam.ptStart = P_INVALID ; + PockParam.bCalcFeed = false ; + PockParam.nType = nType ; + PockParam.nLiType = nLiType ; + PockParam.dLiTang = dLiTang ; + + // controllo che il Loop sia una circonferenza + Point3d ptCen ; double dRad ; + if ( ! OptimizedSpiralCircle( pCrvBorder, 50. * EPS_SMALL, dRad, ptCen, bOkSpiral) || ! bOkSpiral) + return false ; + double dOffs = PockParam.dRad + PockParam.dRadialOffset ; + // se curva tutta Open, ingrandisco il raggio della circonferenza trovata + if ( nTmpPropRef == TEMP_PROP_OPEN_EDGE) + dRad += 1.05 * PockParam.dRad + PockParam.dRadialOffset ; + // se curva chiusa, controllo che il raggio sia compatibile con il primo Offset + else + bOkSpiral = ( dRad - dOffs > 10. * EPS_SMALL) ; + if ( ! bOkSpiral) + return false ; + + // verifico di rispettare il Ratio + if ( dRad > dRatioSfrTool * dToolRad + EPS_SMALL) + return false ; + + // verifico se l'entrata è compatibile con la geometria e calcolo un eventuale percorso + double dIntRad = 0 ; + if ( PockParam.nType == POCKET_SPIRALOUT && PockParam.nLiType == LEAD_IN_HELIX) + dIntRad = min( 0.5 * min( PockParam.dLiTang, 2. * PockParam.dRad), dRad - dOffs) ; + PtrOwner pCrvRes( CreateCurveComposite()) ; + if ( IsNull( pCrvRes)) + return false ; + bOkSpiral = CalcCircleSpiral( ptCen, pSfrCL->GetNormVersor(), dRad - dOffs, dIntRad, PockParam, pCrvRes) ; + return ( bOkSpiral && pCrvRes->IsValid() && pCrvRes->GetCurveCount() > 0) ; +} + //---------------------------------------------------------------------------- static bool AdjustZigZagPathTangentLinks( ICurveComposite* pCrvCompo)