EgtMachKernel :

- in svuotature gestione SpiralIn e SpiralOut ottimizzate per cerchi
- in svuotatura aggiunti attacchi zigzag e elica e uscita Glide
- in contornatura miglioramenti vari.
This commit is contained in:
Dario Sassi
2017-02-20 18:28:57 +00:00
parent 11df3f63f6
commit 2d0ea787fa
17 changed files with 825 additions and 401 deletions
+51 -40
View File
@@ -32,6 +32,22 @@
using namespace std ;
//------------------------------ Errors --------------------------------------
// 2201 = "Error in Sawing : UpdateToolData failed"
// 2202 = "Error in Sawing : Center work not allowed with side angle"
// 2203 = "Error in Sawing : External side angle HeadSide must equal WorkSide"
// 2204 = "Error in Sawing : Internal side angle HeadSide must opposite WorkSide"
// 2205 = "Error in Sawing : Depth not computable"
// 2206 = "Error in Sawing : machining depth (xx) bigger than MaxMaterial (yy)"
// 2207 = "Error in Sawing : SideAngle not allowed on Arc"
// 2208 = "Error in Sawing : Entity CalculateToolAndCorrVersors"
// 2209 = "Error in Sawing : Entity AdjustForSide"
// 2210 = "Error in Sawing : Entity GetElevation"
// 2211 = "Error in Sawing : Entity AdjustForEdges"
// 2212 = "Error in Sawing : Entity CalculateToolAndCorrVersors 2nd"
// 2213 = "Error in Sawing : Center work not allowed with internal arc"
// 2214 = "Error in Sawing : Chaining failed"
//----------------------------------------------------------------------------
USEROBJ_REGISTER( "EMkSawing", Sawing) ;
@@ -424,13 +440,15 @@ Sawing::Preview( bool bRecalc)
// aggiorno dati geometrici dell'utensile
if ( ! UpdateToolData()) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : UpdateToolData failed") ;
m_pMchMgr->SetLastError( 2201, "Error in Sawing : UpdateToolData failed") ;
return false ;
}
// se necessario, eseguo concatenamento ed inserisco i percorsi sotto la geometria ausiliaria
if ( bChain && ! Chain( nAuxId))
if ( bChain && ! Chain( nAuxId)) {
m_pMchMgr->SetLastError( 2214, "Error in Sawing : Chaining failed") ;
return false ;
}
// verifiche per angolo di sbandamento
if ( ! VerifySideAngle())
@@ -491,13 +509,15 @@ Sawing::Apply( bool bRecalc)
// aggiorno dati geometrici dell'utensile
if ( ! UpdateToolData()) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : UpdateToolData failed") ;
m_pMchMgr->SetLastError( 2201, "Error in Sawing : UpdateToolData failed") ;
return false ;
}
// se necessario, eseguo concatenamento ed inserisco i percorsi sotto la geometria ausiliaria
if ( bChain && ! Chain( nAuxId))
if ( bChain && ! Chain( nAuxId)) {
m_pMchMgr->SetLastError( 2214, "Error in Sawing : Chaining failed") ;
return false ;
}
// verifiche per angolo di sbandamento
if ( ! VerifySideAngle())
@@ -815,20 +835,20 @@ Sawing::VerifySideAngle( void)
if ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL) {
// non ammesso lato di lavoro in centro
if ( m_Params.m_nWorkSide == SAW_WS_CENTER) {
LOG_INFO( GetEMkLogger(), "Center work not allowed with side angle") ;
m_pMchMgr->SetLastError( 2202, "Error in Sawing : Center work not allowed with side angle") ;
return false ;
}
// se angolo esterno lato mandrino deve uguagliare lato di lavoro
if ( m_Params.m_dSideAngle > 0) {
if ( m_Params.m_nWorkSide == SAW_WS_RIGHT) {
if ( m_Params.m_nHeadSide == SAW_HS_LEFT) {
LOG_INFO( GetEMkLogger(), "External side angle HeadSide must equal WorkSide") ;
m_pMchMgr->SetLastError( 2203, "Error in Sawing : External side angle HeadSide must equal WorkSide") ;
m_Params.m_nHeadSide = SAW_HS_RIGHT ;
}
}
if ( m_Params.m_nWorkSide == SAW_WS_LEFT) {
if ( m_Params.m_nHeadSide == SAW_HS_RIGHT) {
LOG_INFO( GetEMkLogger(), "External side angle HeadSide must equal WorkSide") ;
m_pMchMgr->SetLastError( 2203, "Error in Sawing : External side angle HeadSide must equal WorkSide") ;
m_Params.m_nHeadSide = SAW_HS_LEFT ;
}
}
@@ -837,13 +857,13 @@ Sawing::VerifySideAngle( void)
else {
if ( m_Params.m_nWorkSide == SAW_WS_RIGHT) {
if ( m_Params.m_nHeadSide == SAW_HS_RIGHT) {
LOG_INFO( GetEMkLogger(), "Internal side angle HeadSide must opposite WorkSide") ;
m_pMchMgr->SetLastError( 2204, "Error in Sawing : Internal side angle HeadSide must opposite WorkSide") ;
m_Params.m_nHeadSide = SAW_HS_LEFT ;
}
}
if ( m_Params.m_nWorkSide == SAW_WS_LEFT) {
if ( m_Params.m_nHeadSide == SAW_HS_LEFT) {
LOG_INFO( GetEMkLogger(), "Internal side angle HeadSide must opposite WorkSide") ;
m_pMchMgr->SetLastError( 2204, "Error in Sawing : Internal side angle HeadSide must opposite WorkSide") ;
m_Params.m_nHeadSide = SAW_HS_RIGHT ;
}
}
@@ -1070,7 +1090,7 @@ Sawing::ProcessPath( int nPathId, int nPvId, int nClId)
double dDepth ;
string sMyDepth = m_Params.m_sDepth ;
if ( ! ExeLuaEvalNumExpr( ToUpper( sMyDepth), &dDepth)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Depth not computable") ;
m_pMchMgr->SetLastError( 2205, "Error in Sawing : Depth not computable") ;
return false ;
}
// se spessore positivo, lo sottraggo dal risultato
@@ -1090,8 +1110,9 @@ Sawing::ProcessPath( int nPathId, int nPvId, int nClId)
}
// verifico di non superare il massimo materiale
if ( dDepth > m_TParams.m_dMaxMat) {
string sOut = "Error in Sawing : Depth bigger than MaxMaterial" ;
LOG_INFO( GetEMkLogger(), sOut.c_str()) ;
string sOut = "Error in Sawing : machining depth (" + ToString( dDepth, 1) +
") bigger than MaxMaterial (" + ToString( m_TParams.m_dMaxMat, 1) + ")" ;
m_pMchMgr->SetLastError( 2206, sOut.c_str()) ;
return false ;
}
@@ -1100,21 +1121,11 @@ Sawing::ProcessPath( int nPathId, int nPvId, int nClId)
m_pGeomDB->GetName( nPathId, sPathName) ;
// verifiche sull'ampiezza dell'angolo al centro degli eventuali archi
const double MAX_ANG_CEN = 180 + EPS_ANG_SMALL ;
int nMaxInd = pCompo->GetCurveCount() - 1 ;
for ( int i = 0 ; i <= nMaxInd ; ++ i) {
// se arco con angolo al centro oltre il limite, lo divido a metà
const ICurveArc* pArc = GetCurveArc( pCompo->GetCurve( i)) ;
if ( pArc != nullptr && abs( pArc->GetAngCenter()) > MAX_ANG_CEN) {
pCompo->AddJoint( i + 0.5) ;
++ i ;
++ nMaxInd ;
}
}
VerifyArcs( pCompo) ;
// ciclo sulle curve elementari
bool bClosed = pCompo->IsClosed() ;
nMaxInd = pCompo->GetCurveCount() - 1 ;
int nMaxInd = pCompo->GetCurveCount() - 1 ;
for ( int i = 0 ; i <= nMaxInd ; ++ i) {
// curva precedente
int j = (( i == 0 && bClosed) ? nMaxInd : i - 1) ;
@@ -1154,7 +1165,7 @@ Sawing::ProcessEntity( const ICurve* pCrvP, const ICurve* pCrvC, const ICurve* p
return false ;
// verifico che non ci sia angolo di fianco
if ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : SideAngle not allowed on Arc") ;
m_pMchMgr->SetLastError( 2207, "Error in Sawing : SideAngle not allowed on Arc") ;
return false ;
}
// se arco lavorato dall'esterno
@@ -1190,12 +1201,12 @@ Sawing::ProcessLine( const ICurve* pCrvP, const ICurveLine* pLineC, const ICurve
// calcolo i versori fresa e correzione
Vector3d vtTool, vtCorr ;
if ( ! CalculateToolAndCorrVersors( vtDirC, m_Params.m_nHeadSide, m_Params.m_nWorkSide, m_Params.m_dSideAngle, vtTool, vtCorr)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity CalculateToolAndCorrVersors") ;
m_pMchMgr->SetLastError( 2208, "Error in Sawing : Entity CalculateToolAndCorrVersors") ;
return false ;
}
// correzioni per lato lama, lato mandrino
if ( ! AdjustForSide( pLine)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity AdjustForSide") ;
m_pMchMgr->SetLastError( 2209, "Error in Sawing : Entity AdjustForSide") ;
return false ;
}
// aggiungo affondamento
@@ -1207,7 +1218,7 @@ Sawing::ProcessLine( const ICurve* pCrvP, const ICurveLine* pLineC, const ICurve
Vector3d vtThick = vtToolH * ( m_TParams.m_dThick / vtToolH.SqLen() + 10 * EPS_SMALL) ;
if ( ! GetElevation( m_nPhase, pLine->GetStart() - vtSafe, pLine->GetEnd() - vtSafe, vtCorr, dElev) ||
! GetElevation( m_nPhase, pLine->GetStart() + vtThick, pLine->GetEnd() + vtThick, vtCorr, dElev2) ) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity GetElevation") ;
m_pMchMgr->SetLastError( 2210, "Error in Sawing : Entity GetElevation") ;
return false ;
}
dElev = max( dElev, dElev2) ;
@@ -1239,7 +1250,7 @@ Sawing::ProcessLine( const ICurve* pCrvP, const ICurveLine* pLineC, const ICurve
// aggiusto per tipo estremi
bool bToSkip = false ;
if ( ! AdjustLineForEdges( pLine, dElev, vtCorr, vtThick, bIsFirst, bIsLast, bExtAngPC, bExtAngCN, bToSkip)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity AdjustForEdges") ;
m_pMchMgr->SetLastError( 2211, "Error in Sawing : Entity AdjustForEdges") ;
return false ;
}
if ( bToSkip) {
@@ -1567,12 +1578,12 @@ Sawing::ProcessExtArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
! CalculateToolAndCorrVersors( vtEndDirC, m_Params.m_nHeadSide, m_Params.m_nWorkSide, m_Params.m_dSideAngle, vtEndTool, vtEndCorr) ||
! AreSameVectorApprox( vtStaCorr, vtMidCorr) ||
! AreSameVectorApprox( vtStaCorr, vtEndCorr)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity CalculateToolAndCorrVersors") ;
m_pMchMgr->SetLastError( 2208, "Error in Sawing : Entity CalculateToolAndCorrVersors") ;
return false ;
}
// correzioni per lato lama, lato mandrino
if ( ! AdjustForSide( pArc)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity AdjustForSide") ;
m_pMchMgr->SetLastError( 2209, "Error in Sawing : Entity AdjustForSide") ;
return false ;
}
// aggiungo affondamento
@@ -1588,7 +1599,7 @@ Sawing::ProcessExtArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
Vector3d vtEndThick = vtEndTool * m_TParams.m_dThick ;
if ( ! GetElevation( m_nPhase, ptStart, ptMid, ptEnd, vtStaCorr, dElev) ||
! GetElevation( m_nPhase, ptStart + vtStaThick, ptMid + vtMidThick, ptEnd + vtEndThick, vtStaCorr, dElev2) ) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity GetElevation") ;
m_pMchMgr->SetLastError( 2210, "Error in Sawing : Entity GetElevation") ;
return false ;
}
dElev = max( dElev, dElev2) ;
@@ -1617,7 +1628,7 @@ Sawing::ProcessExtArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
// aggiusto per tipo estremi
bool bToSkip = false ;
if ( ! AdjustArcForEdges( pArc, dElev, 1.0, bIsFirst, bIsLast, bExtAngPC, bExtAngCN, bToSkip)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity AdjustForEdges") ;
m_pMchMgr->SetLastError( 2211, "Error in Sawing : Entity AdjustForEdges") ;
return false ;
}
if ( bToSkip) {
@@ -1631,7 +1642,7 @@ Sawing::ProcessExtArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
if ( ! CalculateToolAndCorrVersors( vtStaDirC, m_Params.m_nHeadSide, m_Params.m_nWorkSide, m_Params.m_dSideAngle, vtStaTool, vtStaCorr) ||
! CalculateToolAndCorrVersors( vtMidDirC, m_Params.m_nHeadSide, m_Params.m_nWorkSide, m_Params.m_dSideAngle, vtMidTool, vtMidCorr) ||
! CalculateToolAndCorrVersors( vtEndDirC, m_Params.m_nHeadSide, m_Params.m_nWorkSide, m_Params.m_dSideAngle, vtEndTool, vtEndCorr)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity CalculateToolAndCorrVersors 2nd") ;
m_pMchMgr->SetLastError( 2212, "Error in Sawing : Entity CalculateToolAndCorrVersors 2nd") ;
return false ;
}
@@ -2182,7 +2193,7 @@ Sawing::ProcessIntArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
// Verifiche su lato di lavoro e lato testa (si lavora con angolo di sbandamento negativo)
int nHeadSide = m_Params.m_nHeadSide ;
if ( m_Params.m_nWorkSide == SAW_WS_CENTER) {
LOG_INFO( GetEMkLogger(), "Center work not allowed with internal arc") ;
m_pMchMgr->SetLastError( 2213, "Error in Sawing : Center work not allowed with internal arc") ;
return false ;
}
else if ( m_Params.m_nWorkSide == SAW_WS_LEFT) {
@@ -2205,12 +2216,12 @@ Sawing::ProcessIntArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
if ( ! CalculateToolAndCorrVersors( vtStaDirC, nHeadSide, m_Params.m_nWorkSide, dSideAng, vtStaTool, vtStaCorr) ||
! CalculateToolAndCorrVersors( vtMidDirC, nHeadSide, m_Params.m_nWorkSide, dSideAng, vtMidTool, vtMidCorr) ||
! CalculateToolAndCorrVersors( vtEndDirC, nHeadSide, m_Params.m_nWorkSide, dSideAng, vtEndTool, vtEndCorr)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity CalculateToolAndCorrVersors") ;
m_pMchMgr->SetLastError( 2208, "Error in Sawing : Entity CalculateToolAndCorrVersors") ;
return false ;
}
// correzioni per lato lama, lato mandrino
if ( ! AdjustIntArcForSide( pArc, dSideAng)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity AdjustForSide") ;
m_pMchMgr->SetLastError( 2209, "Error in Sawing : Entity AdjustForSide") ;
return false ;
}
// aggiungo affondamento
@@ -2226,7 +2237,7 @@ Sawing::ProcessIntArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
Vector3d vtEndThick = vtEndTool * m_TParams.m_dThick ;
if ( ! GetElevation( m_nPhase, ptStart, ptMid, ptEnd, Z_AX, dElev) ||
! GetElevation( m_nPhase, ptStart + vtStaThick, ptMid + vtMidThick, ptEnd + vtEndThick, Z_AX, dElev2) ) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity GetElevation") ;
m_pMchMgr->SetLastError( 2210, "Error in Sawing : Entity GetElevation") ;
return false ;
}
dElev = max( dElev, dElev2) ;
@@ -2259,7 +2270,7 @@ Sawing::ProcessIntArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
double dLenCoeff = ( dRad + 0.8 * dDelta) / dRad ; // coefficiente per riportare lunghezza
bool bToSkip = false ;
if ( ! AdjustArcForEdges( pArc, dSlantElev, dLenCoeff, bIsFirst, bIsLast, bExtAngPC, bExtAngCN, bToSkip)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity AdjustForEdges") ;
m_pMchMgr->SetLastError( 2211, "Error in Sawing : Entity AdjustForEdges") ;
return false ;
}
if ( bToSkip) {
@@ -2273,7 +2284,7 @@ Sawing::ProcessIntArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
if ( ! CalculateToolAndCorrVersors( vtStaDirC, nHeadSide, m_Params.m_nWorkSide, dSideAng, vtStaTool, vtStaCorr) ||
! CalculateToolAndCorrVersors( vtMidDirC, nHeadSide, m_Params.m_nWorkSide, dSideAng, vtMidTool, vtMidCorr) ||
! CalculateToolAndCorrVersors( vtEndDirC, nHeadSide, m_Params.m_nWorkSide, dSideAng, vtEndTool, vtEndCorr)) {
LOG_INFO( GetEMkLogger(), "Error in Sawing : Entity CalculateToolAndCorrVersors 2nd") ;
m_pMchMgr->SetLastError( 2212, "Error in Sawing : Entity CalculateToolAndCorrVersors 2nd") ;
return false ;
}