diff --git a/Trimming.cpp b/Trimming.cpp index 0d9df4c..48d7b46 100644 --- a/Trimming.cpp +++ b/Trimming.cpp @@ -3920,8 +3920,50 @@ GetTrimmingSyncInterpolation( const ICurve* pCrvEdge1, const ICurve* pCrvEdge2, return false ; // Recupero i due tratti di curva - PtrOwner pCompoGuide1( ConvertCurveToBasicComposite( pCrvEdge1->CopyParamRange( dUA, dUC))) ; - PtrOwner pCompoGuide2( ConvertCurveToBasicComposite( pCrvEdge2->CopyParamRange( dUB, dUD))) ; + PtrOwner pCompoGuide1( nullptr) ; + PtrOwner pCompoGuide2( nullptr) ; + // se entrambe chiuse + if ( pCrvEdge1->IsClosed() && pCrvEdge2->IsClosed()) { + // Recupero la porzione di curva di Edge1 di lunghezza minima tra il parametro A e C + PtrOwner pCompoAC( ConvertCurveToBasicComposite( pCrvEdge1->CopyParamRange( dUA, dUC))) ; + PtrOwner pCompoCA( ConvertCurveToBasicComposite( pCrvEdge1->CopyParamRange( dUC, dUA))) ; + if ( IsNull( pCompoAC) || IsNull( pCompoCA) || ! pCompoAC->IsValid() || ! pCompoCA->IsValid()) + return false ; + double dLenAC ; pCompoAC->GetLength( dLenAC) ; + double dLenCA ; pCompoCA->GetLength( dLenCA) ; + if ( dLenAC < dLenCA) + pCompoGuide1.Set( Release( pCompoAC)) ; + else + pCompoGuide1.Set( Release( pCompoCA)) ; + // Recupero la porzione di curva di Edge2 di lunghezza minima tra il parametro B e D + PtrOwner pCompoBD( ConvertCurveToBasicComposite( pCrvEdge2->CopyParamRange( dUB, dUD))) ; + PtrOwner pCompoDB( ConvertCurveToBasicComposite( pCrvEdge2->CopyParamRange( dUD, dUB))) ; + if ( IsNull( pCompoBD) || IsNull( pCompoBD) || ! pCompoBD->IsValid() || ! pCompoDB->IsValid()) + return false ; + double dLenBD ; pCompoBD->GetLength( dLenBD) ; + double dLenDB ; pCompoDB->GetLength( dLenDB) ; + if ( dLenBD < dLenDB) + pCompoGuide2.Set( Release( pCompoBD)) ; + else + pCompoGuide2.Set( Release( pCompoDB)) ; + } + // se entrambe aperte + else if ( ! pCrvEdge1->IsClosed() && ! pCrvEdge2->IsClosed()) { + pCompoGuide1.Set( ConvertCurveToBasicComposite( pCrvEdge1->Clone())) ; + if ( IsNull( pCompoGuide1) || ! pCompoGuide1->IsValid()) + return false ; + if ( dUA < dUC) + pCompoGuide1->TrimStartEndAtParam( dUA, dUC) ; + else + pCompoGuide1->TrimStartEndAtParam( dUC, dUA) ; + pCompoGuide2.Set( ConvertCurveToBasicComposite( pCrvEdge2->Clone())) ; + if ( IsNull( pCompoGuide2) || ! pCompoGuide2->IsValid()) + return false ; + if ( dUB < dUD) + pCompoGuide2->TrimStartEndAtParam( dUB, dUD) ; + else + pCompoGuide2->TrimStartEndAtParam( dUD, dUB) ; + } if ( IsNull( pCompoGuide1) || IsNull( pCompoGuide2) || ! pCompoGuide1->IsValid() || ! pCompoGuide2->IsValid()) return false ; @@ -3935,10 +3977,11 @@ GetTrimmingSyncInterpolation( const ICurve* pCrvEdge1, const ICurve* pCrvEdge2, swap( pCompoGuide1, pCompoGuide2) ; swap( dLen1, dLen2) ; } - if ( pCompoGuide2->IsPointOn( ptS1)) - swap( ptS1, ptE1) ; - if ( pCompoGuide2->IsPointOn( ptS2)) - swap( ptS2, ptE2) ; + // Aggiorno gli estremi delle curve + pCompoGuide1->GetStartPoint( ptS1) ; + pCompoGuide2->GetStartPoint( ptE1) ; + pCompoGuide1->GetEndPoint( ptS2) ; + pCompoGuide2->GetEndPoint( ptE2) ; #if DEBUG_SYNC_INTERPOLATION VT.clear() ; VC.clear() ;