EgtMachKernel :
- Miglioria Gestione Box di Collisione per Sgrossature.
This commit is contained in:
+67
-68
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user