EgtMachKernel :

- Miglioria Gestione Box di Collisione per Sgrossature.
This commit is contained in:
Riccardo Elitropi
2026-01-20 11:17:47 +01:00
parent 84d21c48af
commit 2bd9b292fd
+67 -68
View File
@@ -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<ICurveComposite> 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<ISurfTriMesh> 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<ICurveComposite> 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<ISurfTriMesh> 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<ICurveComposite> pCompoLoop( CreateCurveComposite()) ;
if ( IsNull( pCompoLoop) || ! pCompoLoop->FromPolyLine( PL) ||
! SfrByC.AddCurve( Release( pCompoLoop)))
return false ;
}
PtrOwner<ISurfFlatRegion> 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<ISurfFlatRegion> 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
}
}
}