diff --git a/OffsetCurve3d.cpp b/OffsetCurve3d.cpp index e5212c5..d13a226 100644 --- a/OffsetCurve3d.cpp +++ b/OffsetCurve3d.cpp @@ -258,6 +258,7 @@ OffsetCurve3d::Make( const PolyLine& PL, const VCT3DVECTOR& vOffDir, double dOff vOffsetCrvs[vEditInfo[i].nId].pCrv->ModifyStart( vEditInfo[i].ptStart) ; if ( vEditInfo[i].ptEnd.IsValid()) vOffsetCrvs[vEditInfo[i].nId].pCrv->ModifyEnd( vEditInfo[i].ptEnd) ; + vOffsetCrvs[vEditInfo[i].nId].nParent = -2 ; } } @@ -279,7 +280,9 @@ OffsetCurve3d::Make( const PolyLine& PL, const VCT3DVECTOR& vOffDir, double dOff #if SAVEOFFSET for ( int i = 0 ; i < ssize( vOffsetCrvs) ; ++i) { vGeo.push_back( vOffsetCrvs[i].pCrv->Clone()) ; - if ( vOffsetCrvs[i].nFlag == OffsetCurve3d::AngType::ANG_SMOOTH_CONC) + if ( vOffsetCrvs[i].nParent == -2) + vCol.push_back( LIME) ; + else if ( vOffsetCrvs[i].nFlag == OffsetCurve3d::AngType::ANG_SMOOTH_CONC) vCol.push_back( GREEN) ; else if ( vOffsetCrvs[i].nFlag == OffsetCurve3d::AngType::ANG_STR) vCol.push_back( PURPLE) ; @@ -408,6 +411,7 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v Point3d ptStart, ptEnd ; pSubCrv->GetStartPoint( ptStart) ; pSubCrv->GetEndPoint( ptEnd) ; + ////////// cilindri con asse sul parent Vector3d vtHeight = ptEnd - ptStart ; double dHeight = vtHeight.Len() ; vtHeight.Normalize() ; @@ -418,13 +422,30 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v vGeo.push_back( pSurfTm) ; vCol.push_back( LGRAY) ; #endif + +// //// cilindri con la direz offset +// Point3d ptOffEnd ; vOffsetCrvs[vLines[j]].pCrv->GetEndPoint( ptOffEnd) ; +// Vector3d vtOff = ptOffEnd - ptEnd ; vtOff.Normalize() ; +// Vector3d vtHeight = ptEnd - ptStart ; +// double dHeight = vtHeight.Len() ; +// Vector3d vtNewAxis = OrthoCompo( vtHeight, vtOff) ; +// vtHeight.Normalize() ; +// vtNewAxis.Normalize() ; +// Point3d ptStartCyl = ptEnd -vtNewAxis * dHeight ; +// vCyl.emplace_back( ptStartCyl, vtNewAxis, dHeight, dRad, dLinTol) ; +//#if SAVECYL +// CurveArc ca ; ca.Set( vCyl.back().frCyl.Orig(), vCyl.back().frCyl.VersZ(), dRad) ; +// ISurfTriMesh* pSurfTm = GetSurfTriMeshByExtrusion( &ca, vCyl.back().frCyl.VersZ() * dHeight, false, 2 * EPS_SMALL) ; +// vGeo.push_back( pSurfTm) ; +// vCol.push_back( LGRAY) ; +//#endif } // controllo l'end di ogni linea per verificare se sta nel cilindro definito da uno degli altri tratti // controllo tutto i punti bool bErasedSomePart = false ; bool bCheckStart = false ; - INTVECTOR vInters ; + INTINTVECTOR vInters ; for ( int j = 0 ; j < ssize( vLines) ; ++j) { Point3d ptStart, ptEnd ; const ICurve* pSubCrv = vOffsetCrvs[vLines[j]].pCrv ; @@ -448,16 +469,18 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v if ( ! bStartInsideCyl) bCheckStart = true ; // se avevo un'interruzione nella zona da modificare, la colmo - if ( ! vInters.empty() && vInters.back() != vLines[j-1]) { + if ( ! vInters.empty() && vInters.back().first != vLines[j-1]) { // aggiungo tutti i precedenti che mancano - for ( int h = vInters.back() + 1 ; h < vLines[j] ; ++h) { - vInters.push_back( h) ; + 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.push_back( vLines[j]) ; + vInters.emplace_back( vLines[j], j) ; if ( ! bStartInsideCyl && j < ssize( vLines) - 1) { - vInters.push_back( vLines[j+1]) ; + vInters.emplace_back( vLines[j+1], j + 1) ; ++j ; } break ; @@ -472,24 +495,24 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v // 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] != vInters[j-1] + 1) + 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], EditCrvInfo::DEL) ; + vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::DEL) ; continue ; } // per il primo e ultimo controllo le intersezioni con tutti i cilindri - PtrOwner pCL ( vOffsetCrvs[vInters[j]].pCrv->Clone()) ; + 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] == k) + if ( vInters[j].second == k) continue ; Point3d ptInt1 = P_INVALID, ptInt2 = P_INVALID ; double dU1, dU2 ; @@ -513,11 +536,13 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v } if ( j == 0) { if ( ptTrim.IsValid()) { - pCL->ModifyEnd( ptTrim) ; - double dNewLen ; pCL->GetLength( dNewLen) ; - if ( dNewLen < 0.1 && vInters[0] != 0) { // se fosse il primo allora potrei modificare il successivo - int nPrev = vInters[0] - 1 ; - vInters[0] = nPrev ; + 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 ; @@ -526,18 +551,20 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v vEditInfo.emplace_back( nPrev + 1, EditCrvInfo::DEL) ; } else - vEditInfo.emplace_back( vInters[0], EditCrvInfo::EDIT, P_INVALID, ptTrim) ; + vEditInfo.emplace_back( vInters[0].first, EditCrvInfo::EDIT, P_INVALID, ptTrim) ; } else - vEditInfo.emplace_back( vInters[0], EditCrvInfo::EDIT, P_INVALID, P_INVALID) ; + vEditInfo.emplace_back( vInters[0].first, EditCrvInfo::EDIT, P_INVALID, P_INVALID) ; } else { if ( ptTrim.IsValid()) { - pCL->ModifyStart( ptTrim) ; - double dNewLen ; pCL->GetLength( dNewLen) ; - if ( dNewLen < 0.1 && vInters[j] != ssize( vOffsetCrvs) - 1) { // se fosse l'ultima curva allora potrei modificare la precedente - int nNext = vInters[j] + 1 ; - vInters[j] = nNext ; + 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)) @@ -550,10 +577,10 @@ CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& v vEditInfo.emplace_back( nNext, EditCrvInfo::EDIT, ptTrim, P_INVALID) ; } else - vEditInfo.emplace_back( vInters[j], EditCrvInfo::EDIT, ptTrim, P_INVALID) ; + vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::EDIT, ptTrim, P_INVALID) ; } else - vEditInfo.emplace_back( vInters[j], EditCrvInfo::EDIT, P_INVALID, P_INVALID) ; + vEditInfo.emplace_back( vInters[j].first, EditCrvInfo::EDIT, P_INVALID, P_INVALID) ; } } }