diff --git a/Pocketing.cpp b/Pocketing.cpp index c42f477..0ce3efc 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -1,4 +1,4 @@ -//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- // EgalTech 2017-2022 //---------------------------------------------------------------------------- // File : Pocketing.cpp Data : 17.12.23 Versione : 2.5l3 @@ -2586,39 +2586,6 @@ Pocketing::GetNewSfrByAnotherPocketing( ISurfFlatRegion* pSfrPock, const ISurfFl if ( IsNull( pSfrToolPath)) { m_pMchMgr->SetLastError( 2412, "Error in Pocketing : Offset not computable") ; return false ; - Polygon3d pgFacet ; - if ( ! pgFacet.FromPolyLine( PL)) - return false ; - // aggiungo l'affondamento - pgFacet.Translate( -dDepth * vtTool) ; - - // inizializzo elevazioni per ogni grezzo - INTDBLVECTOR vRawElev ; - // ciclo sui grezzi della fase - int nRawId = m_pMchMgr->GetFirstRawPart() ; - while ( nRawId != GDB_ID_NULL) { - // verifico che il grezzo compaia nella fase - if ( m_pMchMgr->VerifyRawPartPhase( nRawId, m_nPhase)) { - // recupero la trimesh del grezzo - int nStmId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; - const ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nStmId)) ; - if ( pStm != nullptr) { - // recupero il riferimento della trimesh - Frame3d frStm ; - m_pGeomDB->GetGlobFrame( nStmId, frStm) ; - // porto il poligono in questo riferimento - Polygon3d pgFacetL = pgFacet ; - pgFacetL.ToLoc( frStm) ; - // calcolo l'elevazione - double dCurrElev ; - if ( ! PolygonElevationInClosedSurfTm( pgFacetL, *pStm, true, dCurrElev)) - return false ; - if ( dCurrElev > EPS_SMALL) - vRawElev.emplace_back( nStmId, dCurrElev) ; - } - } - // passo al grezzo successivo - nRawId = m_pMchMgr->GetNextRawPart( nRawId) ; } if ( ! pSfrToolPath->IsValid()) return true ; @@ -3301,132 +3268,86 @@ Pocketing::ModifySurfByOpenEdges( ISurfFlatRegion* pSfr, const ISurfFlatRegion* //---------------------------------------------------------------------------- bool -Pocketing::CalcRegionElevation( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dRad, +Pocketing::CalcRegionElevation( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dRad, double dLen, double& dElev) const { + // inizializzo l'elevazione + dElev = 0 ; - // DA ADATTARE ! + // approssimo la curva con una polilinea che uso per creare il poligono equivalente + PolyLine PL ; + if ( ! pCompo->ApproxWithLines( LIN_TOL_RAW, ANG_TOL_MAX_DEG, ICurve::APL_SPECIAL, PL)) + return false ; + Polygon3d pgFacet ; + if ( ! pgFacet.FromPolyLine( PL)) + return false ; + // aggiungo l'affondamento + pgFacet.Translate( -dDepth * vtTool) ; - //// inizializzo l'elevazione - // dElev = 0 ; - //// affondamento come vettore - // Vector3d vtDepth = vtTool * dDepth ; - - //// Offsetto la curva della quantità stabvilità per la ricerca di proiezioni - // OffsetCurve OffsCrv ; - // if ( ! OffsCrv.Make( pCompo, m_dMaxLenRawProj, ICurve::OFF_FILLET)) { - // m_pMchMgr->SetLastError( 2412, "Error in Pocketing : Offset not computable") ; - // return false ; - // } - // PtrOwner pCompoExtended( ConvertCurveToComposite( OffsCrv.GetLongerCurve())) ; - // if ( IsNull( pCompoExtended) || ! pCompoExtended->IsValid()) - // return false ; - - //// Campiono il contorno - // int nMaxInd = pCompoExtended->GetCurveCount() - 1 ; - // for ( int i = 0 ; i <= nMaxInd ; ++ i) { - // // curva corrente - // const ICurve* pCrvC = pCompoExtended->GetCurve( i) ; - // Point3d ptStart ; pCrvC->GetStartPoint( ptStart) ; - // Point3d ptMid ; pCrvC->GetMidPoint( ptMid) ; - // Point3d ptEnd ; pCrvC->GetEndPoint( ptEnd) ; - // // elevazione della curva - // double dCurrElev ; - // if ( GetElevation( m_nPhase, ptStart - vtDepth, ptMid - vtDepth, ptEnd - vtDepth, vtTool, dCurrElev)) { - // if ( dCurrElev > dElev) - // dElev = dCurrElev ; - // } - // else { - // m_pMchMgr->SetLastError( 2408, "Error in Pocketing : Entity GetElevation") ; - // return false ; - // } - // } - - //// Campiono l'interno con una griglia (uso linee parallele a X) - //// determino il riferimento di base - // Frame3d frPocket ; - // Point3d ptCen ; pCompoExtended->GetCentroid( ptCen) ; - // frPocket.Set( ptCen, vtTool) ; - //// copio il contorno e lo porto nel riferimento - // PtrOwner pCompoL( pCompoExtended->Clone()) ; - // if ( IsNull( pCompoL) || ! pCompoL->ToLoc( frPocket)) { - // m_pMchMgr->SetLastError( 2408, "Error in Pocketing : Entity GetElevation") ; - // return false ; - // } - //// ingombro del contorno in locale - // BBox3d b3Pocket ; - // pCompoL->GetLocalBBox( b3Pocket) ; - // Point3d ptMin ; double dDimX, dDimY, dDimZ ; - // b3Pocket.GetMinDim( ptMin, dDimX, dDimY, dDimZ) ; - - //// passi in Y - // const double STEP = m_TParams.m_dDiam ; - // int nYStep = max( int( ceil( ( dDimY - 20 * EPS_SMALL) / STEP)), 2) ; - // double dYStep = ( nYStep > 0 ? ( dDimY - 20 * EPS_SMALL) / nYStep : 0) ; - //// calcolo le linee di svuotatura - // for ( int i = 1 ; i < nYStep ; ++ i) { - // // definisco la linea - // PtrOwner pLine( CreateCurveLine()) ; - // const double EXP_LEN = 1.0 ; - // Point3d ptStart( ptMin.x - EXP_LEN, ptMin.y + 10 * EPS_SMALL + i * dYStep, ptMin.z + dDimZ) ; - // if ( IsNull( pLine) || ! pLine->SetPVL( ptStart, X_AX, dDimX + 2 * EXP_LEN)) { - // m_pMchMgr->SetLastError( 2408, "Error in Pocketing : Entity GetElevation") ; - // return false ; - // } - - // // calcolo la classificazione della curva rispetto al contorno - // IntersCurveCurve intCC( *pLine, *pCompoL) ; - // CRVCVECTOR ccClass ; - // if ( intCC.GetCurveClassification( 0, EPS_SMALL, ccClass)) { - // // determino gli intervalli di curva interni - // Intervals inOk ; - // for ( auto& ccOne : ccClass) { - // if ( ccOne.nClass == CRVC_IN) { - // // ricavo punto iniziale e finale - // Point3d ptStart ; - // pLine->GetPointD1D2( ccOne.dParS, ICurve::FROM_PLUS, ptStart) ; - // Point3d ptEnd ; - // pLine->GetPointD1D2( ccOne.dParE, ICurve::FROM_MINUS, ptEnd) ; - // // calcolo la distanza tra questi due punti - // double dDist = Dist( ptStart, ptEnd) ; - // // il tratto interno lo campiono rispetto ad X - // for ( int j = 0 ; j <= int( dDist / STEP) + 1 ; ++ j) { - // Point3d ptCurr ; - // pLine->GetPointD1D2( ccOne.dParS + j * ( ccOne.dParE - ccOne.dParS) / ( dDist / STEP + 1), ICurve::FROM_PLUS, ptCurr) ; - // ptCurr.ToGlob( frPocket) ; - // double dCurrElev ; - // if ( GetElevation( m_nPhase, ptCurr - vtDepth, vtTool, dCurrElev)) { - // if ( dCurrElev > dElev) - // dElev = dCurrElev ; - // } - // else { - // m_pMchMgr->SetLastError( 2408, "Error in Pocketing : Entity GetElevation") ; - // return false ; - // } - // } - // } - // } - // } - // // altrimenti uso tutta la curva - // else { - // Point3d ptStart ; - // pLine->GetStartPoint( ptStart) ; - // ptStart.ToGlob( frPocket) ; - // Point3d ptEnd ; - // pLine->GetEndPoint( ptEnd) ; - // ptEnd.ToGlob( frPocket) ; - // // elevazione della curva - // double dCurrElev ; - // if ( GetElevation( m_nPhase, ptStart - vtDepth, ptEnd - vtDepth, vtTool, dCurrElev)) { - // if ( dCurrElev > dElev) - // dElev = dCurrElev ; - // } - // else { - // m_pMchMgr->SetLastError( 2408, "Error in Pocketing : Entity GetElevation") ; - // return false ; - // } - // } - // } + // inizializzo elevazioni per ogni grezzo + INTDBLVECTOR vRawElev ; + // ciclo sui grezzi della fase + int nRawId = m_pMchMgr->GetFirstRawPart() ; + while ( nRawId != GDB_ID_NULL) { + // verifico che il grezzo compaia nella fase + if ( m_pMchMgr->VerifyRawPartPhase( nRawId, m_nPhase)) { + // recupero la trimesh del grezzo + int nStmId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; + const ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nStmId)) ; + if ( pStm != nullptr) { + // recupero il riferimento della trimesh + Frame3d frStm ; + m_pGeomDB->GetGlobFrame( nStmId, frStm) ; + // porto il poligono in questo riferimento + Polygon3d pgFacetL = pgFacet ; + pgFacetL.ToLoc( frStm) ; + // calcolo l'elevazione + double dCurrElev ; + if ( ! PolygonElevationInClosedSurfTm( pgFacetL, *pStm, true, dCurrElev)) + return false ; + if ( dCurrElev > EPS_SMALL) + vRawElev.emplace_back( nStmId, dCurrElev) ; + } + } + // passo al grezzo successivo + nRawId = m_pMchMgr->GetNextRawPart( nRawId) ; + } + // se trovate elevazioni + if ( ! vRawElev.empty()) { + // ordino il vettore secondo l'elevazione crescente + sort( vRawElev.begin(), vRawElev.end(), []( const INTDBL& a, const INTDBL& b) + { return a.second < b.second ; }) ; + // box dell'insieme delle posizioni utensile all'inizioe + const double MAX_DIST_RAW = 200.0 ; + BBox3d b3Tool ; + pgFacet.GetLocalBBox( b3Tool) ; + b3Tool.Add( b3Tool.GetMin() + dLen * vtTool) ; + b3Tool.Add( b3Tool.GetMax() + dLen * vtTool) ; + if ( vtTool.IsX()) + b3Tool.Expand( 0, dRad, dRad) ; + else if ( vtTool.IsY()) + b3Tool.Expand( dRad, 0, dRad) ; + else if ( vtTool.IsZ()) + b3Tool.Expand( dRad, dRad, 0) ; + else { + double dExpandX = dRad * sqrt( 1 - vtTool.x * vtTool.x) ; + double dExpandY = dRad * sqrt( 1 - vtTool.y * vtTool.y) ; + double dExpandZ = dRad * sqrt( 1 - vtTool.z * vtTool.z) ; + b3Tool.Expand( dExpandX, dExpandY, dExpandZ) ; + } + b3Tool.Expand( MAX_DIST_RAW) ; + // verifico la reale interferenza dell'utensile con i diversi grezzi + for ( int i = 0 ; i < int( vRawElev.size()) ; ++ i) { + // box del grezzo + BBox3d b3Raw ; + m_pGeomDB->GetGlobalBBox( vRawElev[i].first, b3Raw) ; + // confronto con il box dell'utensile nella posizione precedente + BBox3d b3CurrTool = b3Tool ; + b3CurrTool.Translate( dElev * vtTool) ; + if ( b3Raw.Overlaps( b3CurrTool)) + dElev = vRawElev[i].second ; + } + } return true ; }