diff --git a/SurfRoughing.cpp b/SurfRoughing.cpp index ff7666b..9a4d783 100644 --- a/SurfRoughing.cpp +++ b/SurfRoughing.cpp @@ -30,6 +30,7 @@ #include "/EgtDev/Include/EGkSurfTriMesh.h" #include "/EgtDev/Include/EGkSurfBezier.h" #include "/EgtDev/Include/EGkSfrCreate.h" +#include "/EgtDev/Include/EGkStmStandard.h" #include "/EgtDev/Include/EGkCalcPocketing.h" #include "/EgtDev/Include/EGkSurfLocal.h" #include "/EgtDev/Include/EGkCAvSilhouetteSurfTm.h" @@ -2332,75 +2333,73 @@ SurfRoughing::GetToolCollisionRegion( const ISurfFlatRegion* pSfrSgro, double& d // definisco la distanza di sicurezza double const SAFE_TOL = 5. * EPS_SMALL ; - // --- tavola - BBox3d b3Area ; // z = 0 - if ( m_pMchMgr->GetTableArea( 1, b3Area) && ! b3Area.IsEmpty()) { - // caso sgrossatura in Z - if ( AreSameVectorApprox( pSfrSgro->GetNormVersor(), Z_AX)) { - // controllo se limitare la Depth della tavola - double dTabDist = abs( ( ptCen - b3Area.GetMax()) * pSfrSgro->GetNormVersor()) ; - if ( dDepth > dTabDist - DIST_TABLE) { - dDepth = dTabDist - DIST_TABLE ; - string sWarn = "Warning in SurfRoughing : Depth reduced at " + ToString( dDepth, 3) ; - m_pMchMgr->SetWarning( 3057, sWarn) ; - } - } - // se orientamento diverso dalla tavola - else { - // recupero la TriMesh di espansione per evitare collisioni - double dTmpTabThick = 0.1 * ( min( b3Area.GetDimX(), b3Area.GetDimY())) ; - b3Area.Expand( SAFE_TOL, SAFE_TOL, 0.) ; - PtrOwner pCompoTab( CreateCurveComposite()) ; - if ( IsNull( pCompoTab)) - return false ; - pCompoTab->AddPoint( b3Area.GetMin()) ; - pCompoTab->AddLine( b3Area.GetMin() + X_AX * b3Area.GetDimX()) ; - pCompoTab->AddLine( b3Area.GetMax() - Z_AX * b3Area.GetDimZ()) ; - pCompoTab->AddLine( b3Area.GetMin() + Y_AX * b3Area.GetDimY()) ; - pCompoTab->Close() ; - pCompoTab->Translate( - Z_AX * ( dTmpTabThick + SAFE_TOL)) ; - #if ENABLE_DEBUG_SFR_COLLISION - ICurveComposite* _pCompoBox = CloneCurveComposite( pCompoTab) ; - _pCompoBox->SetExtrusion( Z_AX) ; - _pCompoBox->SetThickness( dTmpTabThick + 2. * SAFE_TOL) ; - int _nTbId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, _pCompoBox) ; - m_pGeomDB->SetMaterial( _nTbId, RED) ; - #endif - CICURVEPVECTOR vpCrvs ; - vpCrvs.emplace_back( pCompoTab) ; - PtrOwner pStmCollTab( GetSurfTriMeshByRegionExtrusion( vpCrvs, Z_AX * ( dTmpTabThick + 2. * SAFE_TOL))) ; - if ( IsNull( pStmCollTab) || ! pStmCollTab->IsValid() || pStmCollTab->GetTriangleCount() == 0) - return false ; - // recupero la sua proiezione nel piano di sgrossatura come regione piana - Plane3d plProj ; - if ( ! plProj.Set( frLoc.Orig() - dDepth * frLoc.VersZ(), frLoc.VersZ())) - return false ; - POLYLINEVECTOR vPL ; - if ( ! pStmCollTab->GetSilhouette( plProj, EPS_SMALL, vPL)) // proiezione di 6 triangoli, veloce - return false ; - // se completamente dietro al piano, non influenza la sgrossatura attuale - if ( ! vPL.empty()) { - SurfFlatRegionByContours SfrByC ; - for ( const PolyLine& PL : vPL) { - PtrOwner pCompoLoop( CreateCurveComposite()) ; - if ( IsNull( pCompoLoop) || ! pCompoLoop->FromPolyLine( PL) || - ! SfrByC.AddCurve( Release( pCompoLoop))) - return false ; + // Recupero la macchina corrente e gli oggetti di Collisione + Machine* pMch = m_pMchMgr->GetCurrMachine() ; + if ( pMch != nullptr) { + INTVECTOR vTabCollId ; + if ( pMch->GetCurrTableCollGroups( vTabCollId)) { + for ( const int& nCollId : vTabCollId) { + // recupero il Box dell'Oggetto + BBox3d BBoxTab ; + if ( ! m_pGeomDB->GetGlobalBBox( nCollId, BBoxTab) || BBoxTab.IsEmpty()) + continue ; + // se sgrossatura orientata come la Tavola, quindi Z_AX + if ( AreSameVectorApprox( pSfrSgro->GetNormVersor(), Z_AX)) { + // controllo se limitare la Depth della tavola + double dTabDist = abs( ( ptCen - BBoxTab.GetMax()) * pSfrSgro->GetNormVersor()) ; + if ( dDepth > dTabDist - DIST_TABLE) { + dDepth = dTabDist - DIST_TABLE ; + string sWarn = "Warning in SurfRoughing : Depth reduced at " + ToString( dDepth, 3) ; + m_pMchMgr->SetWarning( 3057, sWarn) ; + } + } + // altrimenti + else { + // espando leggermente il Box per tolleranze + BBoxTab.Expand( SAFE_TOL) ; + // creo una TriMesh rappresentativa del Box + double dDimX = BBoxTab.GetDimX() ; + double dDimY = BBoxTab.GetDimY() ; + double dDimZ = BBoxTab.GetDimZ() ; + PtrOwner pStmBox( GetSurfTriMeshBox( dDimX, dDimY, dDimZ, true)) ; + if ( IsNull( pStmBox) || ! pStmBox->IsValid()) + continue ; + Point3d ptBoxC ; BBoxTab.GetCenter( ptBoxC) ; + Point3d ptStmC = Point3d( dDimX / 2., dDimY / 2., dDimZ / 2.) ; + pStmBox->Translate( ptStmC - ptBoxC) ; + // recupero la sua proiezione nel piano di sgrossatura come regione piana + // NB. Usando il piano, non considero la parte di superifie nel semipiano negativo + Plane3d plProj ; + if ( ! plProj.Set( frLoc.Orig() - dDepth * frLoc.VersZ(), frLoc.VersZ())) + return false ; + POLYLINEVECTOR vPL ; + if ( ! pStmBox->GetSilhouette( plProj, EPS_SMALL, vPL)) + return false ; + // se esiste una proiezione nel semipiano positivo, ne recupero la regione piana + if ( ! vPL.empty()) { + SurfFlatRegionByContours SfrByC ; + for ( const PolyLine& PL : vPL) { + PtrOwner pCompoLoop( CreateCurveComposite()) ; + if ( IsNull( pCompoLoop) || ! pCompoLoop->FromPolyLine( PL) || + ! SfrByC.AddCurve( Release( pCompoLoop))) + return false ; + } + PtrOwner pSfrTabColl( SfrByC.GetSurf()) ; + if ( IsNull( pSfrTabColl) || ! pSfrTabColl->IsValid()) + return false ; + // aggiorno la regione di collissione per l'utensile + if ( ! pSfrColl->CopyFrom( pSfrTabColl)) + return false ; + if ( AreOppositeVectorApprox( pSfrColl->GetNormVersor(), frLoc.VersZ())) + pSfrColl->Invert() ; + #if ENABLE_DEBUG_SFR_COLLISION + ISurfFlatRegion* _pSfrTab = CreateSurfFlatRegion() ; + _pSfrTab->CopyFrom( pSfrColl) ; + int _nSrfTbId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, _pSfrTab) ; + m_pGeomDB->SetMaterial( _nSrfTbId, Color( 255, 0, 0, 50)) ; + #endif + } } - PtrOwner pSfrTabColl( SfrByC.GetSurf()) ; - if ( IsNull( pSfrTabColl) || ! pSfrTabColl->IsValid()) - return false ; - // aggiorno la regione di collissione per l'utensile - if ( ! pSfrColl->CopyFrom( pSfrTabColl)) - return false ; - if ( AreOppositeVectorApprox( pSfrColl->GetNormVersor(), frLoc.VersZ())) - pSfrColl->Invert() ; - #if ENABLE_DEBUG_SFR_COLLISION - ISurfFlatRegion* _pSfrTab = CreateSurfFlatRegion() ; - _pSfrTab->CopyFrom( pSfrColl) ; - int _nSrfTbId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, _pSfrTab) ; - m_pGeomDB->SetMaterial( _nSrfTbId, Color( 255, 0, 0, 50)) ; - #endif } } }