diff --git a/CalcPocketing.cpp b/CalcPocketing.cpp index 6c75003..6689b35 100644 --- a/CalcPocketing.cpp +++ b/CalcPocketing.cpp @@ -1845,12 +1845,10 @@ GetSinglePocketingCurves( ISurfFlatRegion* pSfr, const PocketParams& PockParams, int nChunks = pSfr->GetChunkCount() ; int nCurrChunk = 0 ; for ( int i = 0 ; i < nChunks ; ++ i) { - // recupero il Chunk corrente PtrOwner pSfrChunk( pSfr->CloneChunk( nCurrChunk)) ; if ( IsNull( pSfrChunk) || ! pSfrChunk->IsValid()) return false ; - // se il Chunk corrente si svuota con curva singola, allora lo rimuovo dalla superficie bool bRemoved = false ; GetPocketCurvesByClosedEdges( pSfrChunk, PockParams, vCrvSingleCurves, bRemoved) ; @@ -1873,7 +1871,27 @@ GetSinglePocketingCurves( ISurfFlatRegion* pSfr, const PocketParams& PockParams, /* Idea : Feed proporzionale al minimo Offset per annullare la regione -> Massimo parametro sui bisettori di VORONOI + se le curve risultano aperte, cambio il loro punto iniziale a seconda dell'estensione fatta */ + if ( vCrvSingleCurves[i]->IsValid() && vCrvSingleCurves[i]->GetCurveCount() != 0 && + ! vCrvSingleCurves[i]->IsClosed()) { + int nTempProp_firstCrv = vCrvSingleCurves[i]->GetFirstCurve()->GetTempProp( 0) ; + int nTempProp_lastCrv = vCrvSingleCurves[i]->GetLastCurve()->GetTempProp( 0) ; + // se estremi entrambi estesi + if ( nTempProp_firstCrv == TEMP_PROP_OUT_START && nTempProp_lastCrv == TEMP_PROP_OUT_START) { + if ( PockParams.ptStart.IsValid()) { + Point3d ptStart ; vCrvSingleCurves[i]->GetStartPoint( ptStart) ; + double dSqDist_first = SqDist( PockParams.ptStart, ptStart) ; + Point3d ptEnd ; vCrvSingleCurves[i]->GetEndPoint( ptEnd) ; + double dSqDist_last = SqDist( PockParams.ptStart, ptEnd) ; + if ( dSqDist_last < dSqDist_first) + vCrvSingleCurves[i]->Invert() ; + } + } + // se invece l'estensione รจ alla fine + else if ( nTempProp_lastCrv == TEMP_PROP_OUT_START) + vCrvSingleCurves[i]->Invert() ; + } // recupero il MaxOffset per la curva double dMaxOffs = vCrvSingleCurves[i]->GetTempParam( 0) ; // calcolo la Feed proporzionale a tale Offset @@ -6704,6 +6722,17 @@ AddOneWay( ISurfFlatRegion* pSrfPock, const ISurfFlatRegion* pSfrOrig, PocketPar pCrvSegCompo->AddCurve( Release( pCrvSeg)) ; // calcolo la Feed AssignFeedZigZagOneWay( pCrvSegCompo, false, vCrvNull, vLineUnder, vCrvCompoNull, PockParams) ; + // estendo presso lati aperti se richiesto + if ( ! PockParams.bAllClosed) { + Vector3d vtRef ; pCrvSegCompo->GetStartDir( vtRef) ; + vtRef.Invert() ; + bool bIsExtended = false ; + if ( ! ExtendPath( pCrvSegCompo, pSfrOrig, PockParams, vtRef, false,bIsExtended)) + return false ; + pCrvSegCompo->GetEndDir( vtRef) ; + if ( ! ExtendPath( pCrvSegCompo, pSfrOrig, PockParams, vtRef, true, bIsExtended)) + return false ; + } vCrvCompoRes.emplace_back( Release( pCrvSegCompo)) ; } } @@ -8125,11 +8154,10 @@ AddConformal( ISurfFlatRegion* pSfrPock, const ISurfFlatRegion* pSfrOrig, aperti mediante Offset di tipo Chamfer; in questo modo semplifico la classificazione */ PtrOwner pSfrClass( pSfrPock->CreateOffsetSurf( - ( 3. * PockParams.dRad / 4.) - PockParams.dRadialOffset, ICurve::OFF_FILLET)) ; - if ( IsNull( pSfrClass) || ! pSfrClass->IsValid()) - return false ; - - // recupero la dimensione del vettore delle curve da resituire ( nel caso dovessi lavorare in SPIRAL_IN) - int nDim = int( vCrvCompoRes.size()) ; + if ( IsNull( pSfrClass)) + return false ; + if ( ! pSfrClass->IsValid()) + return true ; // non posso svuotare nulla // scorro i chunk della superficie da lavorare for ( int nC = 0 ; nC < pSfrPock->GetChunkCount() ; ++ nC) { @@ -8169,9 +8197,8 @@ AddConformal( ISurfFlatRegion* pSfrPock, const ISurfFlatRegion* pSfrOrig, return false ; // se non ottengo Curve di Offset, lavoro in SpiralIn ( il Chunk ha dei lati aperti) if ( vvCrvOffs.empty()) { - vCrvCompoRes.resize( nDim) ; // pulisco il vettore di curve - // NB. Facendo un offset interno di 3R/4 potrebbero essersi splittati dei Chunks - return ( AddSpiralIn( pSfrPock, pSfrOrig, PockParams, vCrvCompoRes)) ; + if ( ! AddSpiralIn( pSfrChunk, pSfrOrig, PockParams, vCrvCompoRes)) + return false ; } else { // definisco vettore degli Offset e dei Link