EgtMachKernel :
- LeadIn/Out tool non cilindrici, casi ottimizzati a trapezio.
This commit is contained in:
+91
-29
@@ -2974,9 +2974,6 @@ Pocketing::CheckSideAngleForVolume( const ISurfTriMesh* pStmVol_Above, const ISu
|
||||
// NB. Anche la lunghezza del Tool va ad influire... non è detto che un angolo ammissibile presenti
|
||||
// una faccia sufficientemente corta lungo Z da non intersecare il Tool ( per SideAngle < 0)
|
||||
|
||||
// inverto il volume per trovare gli angoli corretti tra le facce
|
||||
//pStmVol->Invert() ;
|
||||
m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmVol->Clone()) ;
|
||||
// vettore dei triangoli da proiettare
|
||||
INTVECTOR vInd_TriaToProj ;
|
||||
// per ogni faccia da controllare
|
||||
@@ -3014,22 +3011,31 @@ Pocketing::CheckSideAngleForVolume( const ISurfTriMesh* pStmVol_Above, const ISu
|
||||
if ( ! pStmVol->GetFacetsContact( vnFaces[f], nFlag, bAdjac, ptP1, ptP2, dAng))
|
||||
return false ;
|
||||
bool bProj = false ; // flag di proiezione della faccia
|
||||
// se la lunghezza del lato lungo Z supera quella del Tool, allora proietto
|
||||
BBox3d BBox ;
|
||||
if ( ! pStmVol->GetFacetBBox( nFlag, GLOB_FRM, BBox))
|
||||
return false ;
|
||||
// se il SideAngle è negativo...
|
||||
if ( m_TParams.m_dSideAng < 0) {
|
||||
// se la lunghezza del lato lungo Z supera quella del Tool, allora proietto
|
||||
BBox3d BBox ;
|
||||
if ( ! pStmVol->GetFacetBBox( nFlag, GLOB_FRM, BBox))
|
||||
return false ;
|
||||
bProj = BBox.GetDimZ() > m_TParams.m_dLen ;
|
||||
if ( ! bProj)
|
||||
// se la lunghezza della faccia è valida, allora controllo la relazione con gli angoli
|
||||
bProj = dAng > ANG_RIGHT - m_TParams.m_dSideAng + 2500 * EPS_ANG_SMALL ;
|
||||
// determino di quanto devo uscire
|
||||
if ( ! bProj && dAng > ANG_RIGHT)
|
||||
if ( abs( m_TParams.m_dSideAng + ANG_RIGHT) > 100 * EPS_SMALL)
|
||||
dExtraLenInOut = max( dExtraLenInOut, BBox.GetDimZ() * tan( - m_TParams.m_dSideAng * DEGTORAD)) ;
|
||||
if ( abs( m_TParams.m_dSideAng + ANG_RIGHT) > 100 * EPS_ANG_SMALL)
|
||||
dExtraLenInOut = max( dExtraLenInOut, BBox.GetDimZ() * tan((dAng - ANG_RIGHT) * DEGTORAD)) ;
|
||||
}
|
||||
// se il SideAngle è positivo...
|
||||
else if ( dAng > 0 && dAng > ANG_RIGHT - m_TParams.m_dSideAng - 2500 * EPS_ANG_SMALL) {
|
||||
bProj = dAng > ANG_RIGHT ;
|
||||
if ( ! bProj) {
|
||||
double dLenOut = BBox.GetDimZ() * tan(( ANG_RIGHT - dAng) * DEGTORAD) ;
|
||||
dExtraLenInOut = max( dExtraLenInOut, BBox.GetDimZ() * tan( m_TParams.m_dSideAng * DEGTORAD) - dLenOut) ;
|
||||
}
|
||||
else
|
||||
dExtraLenInOut = max( dExtraLenInOut, BBox.GetDimZ() * tan( m_TParams.m_dSideAng * DEGTORAD)) ;
|
||||
}
|
||||
else if ( m_TParams.m_dSideAng < 0 && dAng > ANG_RIGHT - m_TParams.m_dSideAng + 2500 * EPS_ANG_SMALL)
|
||||
bProj = true ;
|
||||
|
||||
// se la faccia è da proiettare
|
||||
if ( bProj) {
|
||||
@@ -3049,19 +3055,23 @@ Pocketing::CheckSideAngleForVolume( const ISurfTriMesh* pStmVol_Above, const ISu
|
||||
}
|
||||
}
|
||||
|
||||
// se non ho nessun triangolo da proiettare, allora non faccio nulla
|
||||
if ( vInd_TriaToProj.empty())
|
||||
// se tutti i triangoli non vanno proiettati, allora non faccio nulla
|
||||
if ( int( vInd_TriaToProj.size()) == 0)
|
||||
return true ;
|
||||
|
||||
// Dal volume rimouovo i triangoli ottenuti
|
||||
PtrOwner<ISurfTriMesh> pStmToProj( CloneSurfTriMesh( pStmVol)) ;
|
||||
if ( IsNull( pStmToProj) || ! pStmToProj->IsValid())
|
||||
return false ;
|
||||
for ( int t = 0 ; t < int( vInd_TriaToProj.size()) ; ++ t)
|
||||
if ( ! pStmToProj->RemoveTriangle( vInd_TriaToProj[t]))
|
||||
// creo una TriMesh con i triangoli da proiettare
|
||||
StmFromTriangleSoup StmSoup ;
|
||||
StmSoup.Start() ;
|
||||
for ( int t = 0 ; t < int( vInd_TriaToProj.size()) ; ++ t) {
|
||||
Triangle3dEx Tria ;
|
||||
if ( ! pStmVol->GetTriangle( vInd_TriaToProj[t], Tria) ||
|
||||
! StmSoup.AddTriangle( Tria))
|
||||
return false ;
|
||||
pStmToProj->DoCompacting() ;
|
||||
if ( ! pStmToProj->IsValid())
|
||||
}
|
||||
StmSoup.End() ;
|
||||
|
||||
PtrOwner<ISurfTriMesh> pStmToProj( StmSoup.GetSurf()) ;
|
||||
if ( IsNull( pStmToProj) || ! pStmToProj->IsValid() || ! pStmToProj->DoCompacting())
|
||||
return false ;
|
||||
|
||||
// proietto questa superficie sul piano Z = Z_min
|
||||
@@ -3258,6 +3268,7 @@ Pocketing::ProjectVolume( const ISurfTriMesh* pStmVol, const ISurfTriMesh* pStm_
|
||||
if ( pSfr_ExtendProjection->IsValid())
|
||||
if ( ! pSfr->Add( *pSfr_ExtendProjection))
|
||||
return false ;
|
||||
|
||||
// 2) ricavo la superficie da svuotare come sottrazione tra la ( *pSfr) e la ( *pSfrProjection)
|
||||
if ( pSfr->IsValid() && pSfrProjection->IsValid())
|
||||
if ( ! pSfr->Subtract( *pSfrProjection))
|
||||
@@ -3424,12 +3435,6 @@ Pocketing::ModifySurfByOpenEdges( ISurfFlatRegion* pSfr, const ISurfFlatRegion*
|
||||
m_dDiam_Prec > 0 ? m_dOffsetR_Prec : GetOffsR(),
|
||||
m_dDiam_Prec > 0 ? m_dSideStep_Prec : GetSideStep(),
|
||||
pSfrLimit)) {
|
||||
for ( int u = 0 ; u < pCrvEL->GetCurveCount() ; ++ u) {
|
||||
int nProp0 ; pCrvEL->GetCurveTempProp( u, nProp0, 0) ;
|
||||
int nProp1 ; pCrvEL->GetCurveTempProp( u, nProp1, 1) ;
|
||||
int aaa = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvEL->GetCurve( u)->Clone()) ;
|
||||
m_pGeomDB->SetMaterial( aaa, nProp0 == 0 ? BLUE : RED) ;
|
||||
}
|
||||
m_pMchMgr->SetLastError( 2430, "Error in Pocketing : adjust open edges failed") ;
|
||||
return false ;
|
||||
}
|
||||
@@ -5926,6 +5931,57 @@ Pocketing::AddOneWay( ISURFFRPOVECTOR& vSfr, const std::vector<ICRVCOMPOPOVECTOR
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Pocketing::AdjustTrapezoidSpiralLeadInLeadOutForSideAngle( ICurveComposite* pMCrv, const double dExtraLenInOut,
|
||||
const int nOutsideRaw)
|
||||
{
|
||||
int nTmpProp = pMCrv->GetTempProp( 0) ;
|
||||
double dExtension = 0. ;
|
||||
if ( GetLeadInType() == POCKET_LI_HELIX)
|
||||
dExtension = min( 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam), m_dMaxHelixRad) ;
|
||||
else if ( GetLeadInType() == POCKET_LI_ZIGZAG)
|
||||
dExtension = 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam) ;
|
||||
else if ( GetLeadInType() == POCKET_LI_GLIDE)
|
||||
dExtension = m_Params.m_dLiTang ;
|
||||
dExtension += dExtraLenInOut + m_TParams.m_dDiam * 0.5 ;
|
||||
|
||||
m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pMCrv->Clone()) ;
|
||||
|
||||
if ( m_TParams.m_dSideAng < 0) {
|
||||
// se tutto chiuso
|
||||
if ( nTmpProp == 0) {
|
||||
m_pMchMgr->SetLastError( 2415, "Error in Pocketing : LeadIn not computable") ;
|
||||
return false ;
|
||||
}
|
||||
// se un lato aperto
|
||||
else if ( nTmpProp & 1 || nTmpProp & 4 || nTmpProp == 10) { // almeno 1 base aperta o entrambi i lati obliqui aperti
|
||||
if ( nOutsideRaw == 2)
|
||||
return true ;
|
||||
if ( nOutsideRaw == 0)
|
||||
pMCrv->ExtendStartByLen( dExtension) ;
|
||||
|
||||
pMCrv->ExtendEndByLen( dExtension) ;
|
||||
return true ;
|
||||
}
|
||||
else if ( nTmpProp == 2 || nTmpProp == 8) { // 1 lato obliquo aperto e tutti gli altri chiusi
|
||||
if ( nTmpProp == 2 && nOutsideRaw == 0)
|
||||
pMCrv->Invert() ;
|
||||
|
||||
pMCrv->Close() ;
|
||||
|
||||
if ( nOutsideRaw == 0) {
|
||||
pMCrv->ExtendStartByLen( dExtension) ;
|
||||
pMCrv->ExtendEndByLen( dExtension) ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
@@ -6114,7 +6170,7 @@ Pocketing::AddSpiralIn( ISURFFRPOVECTOR& vSfr, const vector<ICRVCOMPOPOVECTOR>&
|
||||
|
||||
if ( GetLeadInType() == POCKET_LI_HELIX)
|
||||
dLenCheck = min( 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam), m_dMaxHelixRad) ;
|
||||
else if ( GetLeadInType() ==POCKET_LI_ZIGZAG)
|
||||
else if ( GetLeadInType() == POCKET_LI_ZIGZAG)
|
||||
dLenCheck = 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam) ;
|
||||
else if ( GetLeadInType() == POCKET_LI_GLIDE)
|
||||
dLenCheck = m_Params.m_dLiTang ;
|
||||
@@ -6144,6 +6200,11 @@ Pocketing::AddSpiralIn( ISURFFRPOVECTOR& vSfr, const vector<ICRVCOMPOPOVECTOR>&
|
||||
if ( bOptimizedTrap) {
|
||||
AdjustTrapezoidSpiralForLeadInLeadOut( pMCrv, pRCrv, vtTool, dDepth, nOutsideRaw) ;
|
||||
bOutStart = ( nOutsideRaw > 0) ;
|
||||
// controllo geometria del tool
|
||||
if ( m_TParams.m_dSideAng != 0) {
|
||||
if ( ! AdjustTrapezoidSpiralLeadInLeadOutForSideAngle( pMCrv, dExtraLenInOut, nOutsideRaw))
|
||||
return false ;
|
||||
}
|
||||
// aggiorno la curva per eventuali inversioni
|
||||
SDStepCurr.vMCrv.back().Set( pMCrv->Clone()) ;
|
||||
}
|
||||
@@ -10547,6 +10608,7 @@ Pocketing::VerifyLeadInZigZag( ISurfFlatRegion* pSrfChunk, const Point3d& ptPa,
|
||||
for ( int c = 0 ; c < pSrfChunk->GetChunkCount() ; c++) {
|
||||
for ( int l = 0 ; l < pSrfChunk->GetLoopCount( c) ; l++) {
|
||||
vCrv.emplace_back( GetCurveComposite( pSrfChunk->GetLoop( c, l))) ;
|
||||
m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, vCrv.back()->Clone()) ;
|
||||
}
|
||||
}
|
||||
if ( vCrv.size() == 0)
|
||||
@@ -12258,7 +12320,7 @@ Pocketing::CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTr
|
||||
swap( vnProp[1], vnProp[3]) ;
|
||||
}
|
||||
// segno i lati aperti come temp prop della curva
|
||||
int nOpenEdges = vnProp[0] + vnProp[1] * 2 + vnProp[3] * 8 ;
|
||||
int nOpenEdges = vnProp[0] + vnProp[1] * 2 + vnProp[2] * 4 + vnProp[3] * 8 ;
|
||||
pMCrv->SetTempProp( nOpenEdges, 0) ;
|
||||
pMCrv->SetExtrusion( vtExtr) ;
|
||||
|
||||
|
||||
@@ -97,6 +97,8 @@ class Pocketing : public Machining
|
||||
bool GetSpecialElevation( const ISurfFlatRegion* pSfr, const ICurveLine* pLine, const bool bInVsOut,
|
||||
double& dElev) ;
|
||||
|
||||
bool AdjustTrapezoidSpiralLeadInLeadOutForSideAngle( ICurveComposite* pMCrv, const double dExtraLenInOut,
|
||||
const int nOutsideRaw) ;
|
||||
bool GetRaw( ISurfTriMesh* pStmRaw) ;
|
||||
bool SliceVolume( const ISurfTriMesh* pStmVol, const ISurfTriMesh* pStm_Part, const ISurfTriMesh* pSt_Raw,
|
||||
ISURFFRPOVECTOR& vSrfSliced, ISURFFRPOVECTOR& vSfrLimit, std::vector<ICRVCOMPOPOVECTOR>& vCrvOEWithFlags,
|
||||
|
||||
Reference in New Issue
Block a user