EgtMachKernel 1.6k8 :
- modifiche per tagli di lama inclinati.
This commit is contained in:
+99
-13
@@ -329,6 +329,10 @@ Sawing::Apply( void)
|
||||
else
|
||||
m_pGeomDB->EmptyGroup( nAuxId) ;
|
||||
|
||||
// verifiche per angolo di sbandamento
|
||||
if ( ! VerifySideAngle())
|
||||
return false ;
|
||||
|
||||
// eseguo concatenamento, inserisco i percorsi sotto la geometria ausiliaria
|
||||
if ( ! Chain( nAuxId))
|
||||
return false ;
|
||||
@@ -543,6 +547,51 @@ Sawing::GetCurve( SelData Id)
|
||||
return Release( pCurve) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Sawing::VerifySideAngle( void)
|
||||
{
|
||||
// verifiche per angolo di sbandamento
|
||||
if ( fabs( 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") ;
|
||||
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_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_Params.m_nHeadSide = SAW_HS_LEFT ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// altrimenti angolo interno, lato mandrino deve essere opposto a lato di lavoro
|
||||
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_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_Params.m_nHeadSide = SAW_HS_RIGHT ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Sawing::Chain( int nGrpDestId)
|
||||
@@ -721,7 +770,21 @@ Sawing::PathApply( int nPathId, int nClId)
|
||||
ExeLuaExecLine( sExec) ;
|
||||
double dDepth ;
|
||||
if ( ! ExeLuaEvalNumExpr( m_Params.m_sDepth, &dDepth)) {
|
||||
string sOut = "Depth non calculable by Sawing" ;
|
||||
string sOut = "Depth not computable by Sawing" ;
|
||||
LOG_INFO( GetEMkLogger(), sOut.c_str()) ;
|
||||
return false ;
|
||||
}
|
||||
// correzione per angolo di fianco
|
||||
if ( fabs( m_Params.m_dSideAngle) > EPS_ANG_SMALL) {
|
||||
// generale
|
||||
dDepth /= cos( m_Params.m_dSideAngle * DEGTORAD) ;
|
||||
// se sottosquadra (controllo il lato opposto della lama, quindi ...)
|
||||
if ( m_Params.m_dSideAngle < 0)
|
||||
dDepth += m_TParams.m_dThick * tan( abs( m_Params.m_dSideAngle) * DEGTORAD) ;
|
||||
}
|
||||
// verifico di non superare il massimo materiale
|
||||
if ( dDepth > m_TParams.m_dMaxMat) {
|
||||
string sOut = "Depth bigger than MaxMaterial" ;
|
||||
LOG_INFO( GetEMkLogger(), sOut.c_str()) ;
|
||||
return false ;
|
||||
}
|
||||
@@ -770,13 +833,13 @@ Sawing::EntityApply( const ICurve* pCrvP, const ICurve* pCrvC, const ICurve* pCr
|
||||
// calcolo i versori fresa e correzione
|
||||
Vector3d vtTool, vtCorr ;
|
||||
if ( ! CalculateToolAndCorrVersors( Get( pLine), vtTool, vtCorr)) {
|
||||
string sOut = "Entity non versorable by Sawing" ;
|
||||
string sOut = "Entity not versorable by Sawing" ;
|
||||
LOG_INFO( GetEMkLogger(), sOut.c_str()) ;
|
||||
return false ;
|
||||
}
|
||||
// correzioni per lato lama, lato mandrino
|
||||
if ( ! AdjustForSide( Get( pLine))) {
|
||||
string sOut = "Entity non offsetable by Sawing" ;
|
||||
string sOut = "Entity not offsetable by Sawing" ;
|
||||
LOG_INFO( GetEMkLogger(), sOut.c_str()) ;
|
||||
return false ;
|
||||
}
|
||||
@@ -785,7 +848,7 @@ Sawing::EntityApply( const ICurve* pCrvP, const ICurve* pCrvC, const ICurve* pCr
|
||||
// calcolo elevazione
|
||||
double dElev ;
|
||||
if ( ! GetElevation( pLine->GetStart(), pLine->GetEnd(), vtCorr, dElev)) {
|
||||
string sOut = "Entity non elevation-enabled by Sawing" ;
|
||||
string sOut = "Entity not elevation-enabled by Sawing" ;
|
||||
LOG_INFO( GetEMkLogger(), sOut.c_str()) ;
|
||||
return false ;
|
||||
}
|
||||
@@ -818,6 +881,9 @@ Sawing::EntityApply( const ICurve* pCrvP, const ICurve* pCrvC, const ICurve* pCr
|
||||
AdjustForEdges( Get( pLine), dElev, bIsFirst, bIsLast, bExtAngPC, bExtAngCN) ;
|
||||
// recupero distanza di approccio
|
||||
double dAppr = GetApproachDist() ;
|
||||
// correzione per angolo di fianco
|
||||
if ( fabs( m_Params.m_dSideAngle) > EPS_ANG_SMALL)
|
||||
dAppr /= cos( m_Params.m_dSideAngle * DEGTORAD) ;
|
||||
// imposto dati comuni
|
||||
SetPathId( nPxId) ;
|
||||
SetToolDir( vtTool) ;
|
||||
@@ -848,19 +914,36 @@ Sawing::EntityApply( const ICurve* pCrvP, const ICurve* pCrvC, const ICurve* pCr
|
||||
bool
|
||||
Sawing::CalculateToolAndCorrVersors( const ICurve* pCurve, Vector3d& vtTool, Vector3d& vtCorr)
|
||||
{
|
||||
// recupero la direzione della linea
|
||||
pCurve->GetStartDir( vtTool) ;
|
||||
// annullo la componente in Z e normalizzo
|
||||
vtTool.z = 0 ;
|
||||
if ( ! vtTool.Normalize())
|
||||
// Recupero la direzione della linea e la proietto nel piano XY
|
||||
Vector3d vtTang ;
|
||||
pCurve->GetStartDir( vtTang) ;
|
||||
vtTang.z = 0 ;
|
||||
if ( ! vtTang.Normalize())
|
||||
return false ;
|
||||
|
||||
// Versore fresa : annullo la componente in Z e normalizzo
|
||||
vtTool = vtTang ;
|
||||
// ruoto attorno a Zglob+ a seconda del lato mandrino
|
||||
if ( m_Params.m_nHeadSide == SAW_HS_LEFT)
|
||||
vtTool.Rotate( Z_AX, 0, 1) ;
|
||||
if ( m_Params.m_nHeadSide == SAW_HS_LEFT)
|
||||
vtTool.Rotate( Z_AX, 90) ;
|
||||
else
|
||||
vtTool.Rotate( Z_AX, 0, -1) ;
|
||||
// versore correzione
|
||||
vtTool.Rotate( Z_AX, -90) ;
|
||||
|
||||
// Versore correzione
|
||||
vtCorr = Z_AX ;
|
||||
|
||||
// Se lama sbandata
|
||||
if ( fabs( m_Params.m_dSideAngle) > EPS_ANG_SMALL) {
|
||||
if ( m_Params.m_nWorkSide == SAW_WS_RIGHT) {
|
||||
vtTool.Rotate( vtTang, - m_Params.m_dSideAngle) ;
|
||||
vtCorr.Rotate( vtTang, - m_Params.m_dSideAngle) ;
|
||||
}
|
||||
else {
|
||||
vtTool.Rotate( vtTang, m_Params.m_dSideAngle) ;
|
||||
vtCorr.Rotate( vtTang, m_Params.m_dSideAngle) ;
|
||||
}
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -882,6 +965,9 @@ Sawing::AdjustForSide( ICurve* pCurve)
|
||||
dOffs = 0.5 * m_TParams.m_dThick ;
|
||||
else // testa a destra e lama in centro
|
||||
dOffs = - 0.5 * m_TParams.m_dThick ;
|
||||
// correzione per angolo di fianco
|
||||
if ( fabs( m_Params.m_dSideAngle) > EPS_ANG_SMALL)
|
||||
dOffs /= cos( m_Params.m_dSideAngle * DEGTORAD) ;
|
||||
// eseguo offset curva ( nel piano XY globale)
|
||||
return pCurve->SimpleOffset( dOffs) ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user