From 0c7f3d5fd8f36342bcd13bed085c7d0adeb476fc Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Tue, 23 Jun 2026 15:08:40 +0200 Subject: [PATCH] EgtGeomKernel : - miglioria nella creazione dell'offset 3d - aggiunta messaggio di errore nel log per le ruled guided. --- OffsetCurve3d.cpp | 189 ++++++++++++++++++++++++---------------------- SurfBezier.cpp | 8 +- 2 files changed, 104 insertions(+), 93 deletions(-) diff --git a/OffsetCurve3d.cpp b/OffsetCurve3d.cpp index d13a226..12b1946 100644 --- a/OffsetCurve3d.cpp +++ b/OffsetCurve3d.cpp @@ -445,7 +445,7 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v // controllo tutto i punti bool bErasedSomePart = false ; bool bCheckStart = false ; - INTINTVECTOR vInters ; + vector vEditZones ; for ( int j = 0 ; j < ssize( vLines) ; ++j) { Point3d ptStart, ptEnd ; const ICurve* pSubCrv = vOffsetCrvs[vLines[j]].pCrv ; @@ -468,19 +468,21 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v bErasedSomePart = true ; if ( ! bStartInsideCyl) bCheckStart = true ; - // se avevo un'interruzione nella zona da modificare, la colmo - if ( ! vInters.empty() && vInters.back().first != vLines[j-1]) { - // aggiungo tutti i precedenti che mancano - int z = vInters.back().second ; - for ( int h = vInters.back().first + 1 ; h < vLines[j] ; ++h) { - vInters.emplace_back( h, z) ; - vEditInfo.pop_back() ; - ++z ; - } - } - vInters.emplace_back( vLines[j], j) ; + //// se avevo un'interruzione nella zona da modificare, la colmo + //if ( ! vInters.empty() && vInters.back().first != vLines[j-1]) { + // // aggiungo tutti i precedenti che mancano + // int z = vInters.back().second ; + // for ( int h = vInters.back().first + 1 ; h < vLines[j] ; ++h) { + // vInters.emplace_back( h, z) ; + // vEditInfo.pop_back() ; + // ++z ; + // } + //} + if ( vEditZones.empty() || vEditZones.back().back().first != vLines[j-1]) + vEditZones.emplace_back() ; + vEditZones.back().emplace_back( vLines[j], j) ; if ( ! bStartInsideCyl && j < ssize( vLines) - 1) { - vInters.emplace_back( vLines[j+1], j + 1) ; + vEditZones.back().emplace_back( vLines[j+1], j + 1) ; ++j ; } break ; @@ -492,95 +494,100 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v } } if ( bErasedSomePart) { + //// controllo che effettivamente tutti i tratti cancellati siano consecutivi + //for ( int j = 1 ; j < ssize( vInters) ; ++j) { + // if ( vInters[j].first != vInters[j-1].first + 1) + // return false ; + //} // calcolo le intersezioni effettive del primo e ultimo tratto cancellati con i cilindri che li hanno cancellati - // controllo che effettivamente tutti i tratti cancellati siano consecutivi - for ( int j = 1 ; j < ssize( vInters) ; ++j) { - if ( vInters[j].first != vInters[j-1].first + 1) - return false ; - } - for ( int j = 0 ; j < ssize( vInters) ; ++j) { - // cancello i tratti intermedi - if ( j > 0 && j < ssize( vInters) - 1) { - vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::DEL) ; + for ( int z = 0 ; z < ssize( vEditZones) ; ++z) { + INTINTVECTOR& vInters = vEditZones[z] ; + if ( ssize( vInters) == 1) continue ; - } - // per il primo e ultimo controllo le intersezioni con tutti i cilindri - PtrOwner pCL ( vOffsetCrvs[vInters[j].first].pCrv->Clone()) ; - Point3d ptStart ; pCL->GetStartPoint( ptStart) ; - Vector3d vtStart ; pCL->GetStartDir( vtStart) ; - double dLen ; pCL->GetLength( dLen) ; - double dUTrim = ( j == 0 ? INFINITO : 0) ; - Point3d ptTrim = P_INVALID ; - for ( int k = 0 ; k < ssize( vCyl) ; ++k) { - if ( vInters[j].second == k) + for ( int j = 0 ; j < ssize( vInters) ; ++j) { + // cancello i tratti intermedi + if ( j > 0 && j < ssize( vInters) - 1) { + vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::DEL) ; continue ; - Point3d ptInt1 = P_INVALID, ptInt2 = P_INVALID ; - double dU1, dU2 ; - Vector3d vtN1, vtN2 ; - if ( IntersLineCyl( ptStart, vtStart * dLen, vCyl[k].frCyl, vCyl[k].dH, vCyl[k].dRad, false, false, dU1, ptInt1, vtN1, dU2, ptInt2, vtN2, true)) { - bool bUpdate = ( j == 0 ? dU1 < dUTrim : dU1 > dUTrim) ; - bUpdate = bUpdate && ptInt1.IsValid() && dU1 > 0 && dU1 < 1 ; - bUpdate = bUpdate && vtN1 * vtStart < 0 ; - if ( bUpdate) { - dUTrim = dU1 ; - ptTrim = ptInt1 ; - } - bUpdate = ( j == 0 ? dU2 < dUTrim : dU2 > dUTrim) ; - bUpdate = bUpdate && ptInt2.IsValid() && dU2 > 0 && dU2 < 1 ; - bUpdate = bUpdate && vtN2 * vtStart > 0 ; - if ( bUpdate) { - dUTrim = dU2 ; - ptTrim = ptInt2 ; + } + // per il primo e ultimo controllo le intersezioni con tutti i cilindri + PtrOwner pCL ( vOffsetCrvs[vInters[j].first].pCrv->Clone()) ; + Point3d ptStart ; pCL->GetStartPoint( ptStart) ; + Vector3d vtStart ; pCL->GetStartDir( vtStart) ; + double dLen ; pCL->GetLength( dLen) ; + double dUTrim = ( j == 0 ? INFINITO : 0) ; + Point3d ptTrim = P_INVALID ; + for ( int k = 0 ; k < ssize( vCyl) ; ++k) { + if ( vInters[j].second == k) + continue ; + Point3d ptInt1 = P_INVALID, ptInt2 = P_INVALID ; + double dU1, dU2 ; + Vector3d vtN1, vtN2 ; + if ( IntersLineCyl( ptStart, vtStart * dLen, vCyl[k].frCyl, vCyl[k].dH, vCyl[k].dRad, false, false, dU1, ptInt1, vtN1, dU2, ptInt2, vtN2, true)) { + bool bUpdate = ( j == 0 ? dU1 < dUTrim : dU1 > dUTrim) ; + bUpdate = bUpdate && ptInt1.IsValid() && dU1 > 0 && dU1 < 1 ; + bUpdate = bUpdate && vtN1 * vtStart < 0 ; + if ( bUpdate) { + dUTrim = dU1 ; + ptTrim = ptInt1 ; + } + bUpdate = ( j == 0 ? dU2 < dUTrim : dU2 > dUTrim) ; + bUpdate = bUpdate && ptInt2.IsValid() && dU2 > 0 && dU2 < 1 ; + bUpdate = bUpdate && vtN2 * vtStart > 0 ; + if ( bUpdate) { + dUTrim = dU2 ; + ptTrim = ptInt2 ; + } } } - } - if ( j == 0) { - if ( ptTrim.IsValid()) { - bool bOk = pCL->ModifyEnd( ptTrim) ; - double dNewLen ; - if ( bOk) - pCL->GetLength( dNewLen) ; - if ( ( ! bOk || dNewLen < 0.1) && vInters[0].first != 0) { // se fosse il primo allora potrei modificare il successivo - int nPrev = vInters[0].first - 1 ; - vInters[0].first = nPrev ; - int c = 1 ; - while( vEditInfo.end()[-c].nId != nPrev) - ++c ; - vEditInfo.end()[-c].nFlag = EditCrvInfo::EDIT ; - vEditInfo.end()[-c].ptEnd = ptTrim ; - vEditInfo.emplace_back( nPrev + 1, EditCrvInfo::DEL) ; - } - else - vEditInfo.emplace_back( vInters[0].first, EditCrvInfo::EDIT, P_INVALID, ptTrim) ; - } - else - vEditInfo.emplace_back( vInters[0].first, EditCrvInfo::EDIT, P_INVALID, P_INVALID) ; - } - else { - if ( ptTrim.IsValid()) { - bool bOk = pCL->ModifyStart( ptTrim) ; - double dNewLen ; - if ( bOk) - pCL->GetLength( dNewLen) ; - if ( ( ! bOk || dNewLen < 0.1) && vInters[j].first != ssize( vOffsetCrvs) - 1) { // se fosse l'ultima curva allora potrei modificare la precedente - int nNext = vInters[j].first + 1 ; - vInters[j].first = nNext ; - vEditInfo.emplace_back( nNext - 1, EditCrvInfo::DEL) ; - int c = 1 ; - while ( vEditInfo.end()[-c].nId != nNext && c < ssize( vEditInfo)) - ++c ; - if ( vEditInfo.end()[-c].nId == nNext) { + if ( j == 0) { + if ( ptTrim.IsValid()) { + bool bOk = pCL->ModifyEnd( ptTrim) ; + double dNewLen ; + if ( bOk) + pCL->GetLength( dNewLen) ; + if ( ( ! bOk || dNewLen < 0.1) && vInters[0].first != 0) { // se fosse il primo allora potrei modificare il successivo + int nPrev = vInters[0].first - 1 ; + vInters[0].first = nPrev ; + int c = 1 ; + while( vEditInfo.end()[-c].nId != nPrev) + ++c ; vEditInfo.end()[-c].nFlag = EditCrvInfo::EDIT ; - vEditInfo.end()[-c].ptStart = ptTrim ; + vEditInfo.end()[-c].ptEnd = ptTrim ; + vEditInfo.emplace_back( nPrev + 1, EditCrvInfo::DEL) ; } else - vEditInfo.emplace_back( nNext, EditCrvInfo::EDIT, ptTrim, P_INVALID) ; + vEditInfo.emplace_back( vInters[0].first, EditCrvInfo::EDIT, P_INVALID, ptTrim) ; } else - vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::EDIT, ptTrim, P_INVALID) ; + vEditInfo.emplace_back( vInters[0].first, EditCrvInfo::EDIT, P_INVALID, P_INVALID) ; + } + else { + if ( ptTrim.IsValid()) { + bool bOk = pCL->ModifyStart( ptTrim) ; + double dNewLen ; + if ( bOk) + pCL->GetLength( dNewLen) ; + if ( ( ! bOk || dNewLen < 0.1) && vInters[j].first != ssize( vOffsetCrvs) - 1) { // se fosse l'ultima curva allora potrei modificare la precedente + int nNext = vInters[j].first + 1 ; + vInters[j].first = nNext ; + vEditInfo.emplace_back( nNext - 1, EditCrvInfo::DEL) ; + int c = 1 ; + while ( vEditInfo.end()[-c].nId != nNext && c < ssize( vEditInfo)) + ++c ; + if ( vEditInfo.end()[-c].nId == nNext) { + vEditInfo.end()[-c].nFlag = EditCrvInfo::EDIT ; + vEditInfo.end()[-c].ptStart = ptTrim ; + } + else + vEditInfo.emplace_back( nNext, EditCrvInfo::EDIT, ptTrim, P_INVALID) ; + } + else + vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::EDIT, ptTrim, P_INVALID) ; + } + else + vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::EDIT, P_INVALID, P_INVALID) ; } - else - vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::EDIT, P_INVALID, P_INVALID) ; } } } diff --git a/SurfBezier.cpp b/SurfBezier.cpp index e865264..6df7a70 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -6946,14 +6946,18 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c if ( vIso[c].dParam0 < dLastParam0) { if ( dLastParam0 - vIso[c].dParam0 < EPS_ZERO) vIso[c].dParam0 = dLastParam0 + EPS_PARAM ; - else + else { + LOG_DBG_ERR( GetEGkLogger(), "ERROR : Bezier Surface couldn't be created with the isocurves provided") ; return false ; + } } if ( vIso[c].dParam1 < dLastParam1) { if ( dLastParam1 - vIso[c].dParam1 < EPS_ZERO) vIso[c].dParam1 = dLastParam1 + EPS_PARAM ; - else + else { + LOG_DBG_ERR( GetEGkLogger(), "ERROR : Bezier Surface couldn't be created with the isocurves provided") ; return false ; + } } dLastParam0 = vIso[c].dParam0 ; dLastParam1 = vIso[c].dParam1 ;