EgtMachKernel 1.6v2 :

- gestiti attacchi con elevazione
- corretti calcoli con archi di elica (deltaN <> 0).
This commit is contained in:
Dario Sassi
2016-10-07 10:37:49 +00:00
parent 3b4f83be19
commit c11878617c
6 changed files with 127 additions and 70 deletions
+22 -6
View File
@@ -724,13 +724,15 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
}
// salvo i valori degli assi
pCamData->SetAxes( CamData::AS_OK, vAxVal) ;
// se arco (per ora solo nel piano XY) devo calcolarne il centro in assi macchina
// se arco devo calcolarne il centro in assi macchina
if ( pCamData->IsArc()) {
// ricavo punto medio
// devo lavorare con arco schiacciato nel suo piano
Point3d ptCen = pCamData->GetCenter() ;
double dAngCen = pCamData->GetAngCen() ;
Vector3d vtN = pCamData->GetNormDir() ;
Point3d ptMid = ptP ;
double dDeltaN = pCamData->GetDeltaN() ;
// ricavo punto medio nel piano dell'arco
Point3d ptMid = ptP - dDeltaN * vtN ;
ptMid.Rotate( ptCen, vtN, - dAngCen / 2) ;
// determino i valori degli assi al punto medio
DBLVECTOR vAngMid( vAng1.size()) ;
@@ -744,10 +746,24 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
pCamData->SetAxes( CamData::AS_ERR, vAxVal) ;
continue ;
}
// ricavo punto finale nel piano dell'arco
Point3d ptEnd = ptP - dDeltaN * vtN ;
// determino i valori degli assi al punto finale
DBLVECTOR vAngEnd( vAng1.size()) ;
for ( size_t i = 0 ; i < vAng1.size() ; ++ i)
vAngEnd[i] = vAng1[i] ;
int nLendStat ;
double dXend, dYend, dZend ;
bool bLendOk = m_pMchMgr->GetCalcPositions( ptEnd, vAngEnd, nLendStat, dXend, dYend, dZend) ;
if ( ! bLendOk || nLendStat != 0) {
bOk = false ;
pCamData->SetAxes( CamData::AS_ERR, vAxVal) ;
continue ;
}
// punti espressi in assi macchina
Point3d ptP1M( dXprec, dYprec, dZprec) ;
Point3d ptP2M( dXmid, dYmid, dZmid) ;
Point3d ptP3M( dX, dY, dZ) ;
Point3d ptP3M( dXend, dYend, dZend) ;
// se coincidono
if ( AreSamePointApprox( ptP1M, ptP2M) && AreSamePointApprox( ptP1M, ptP3M)) {
// lo considero un arco di raggio nullo
@@ -785,8 +801,8 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
Vector3d vtCurr = Point3d( dXprec, dYprec, dZprec) - ptCen ;
for ( int i = 1 ; i < NUM_VERIF_STEP ; ++ i) {
vtCurr.Rotate( vtN, dAngCenStep) ;
Point3d ptCurr = ptCen + vtCurr ;
double dCoeff = i / NUM_VERIF_STEP ;
double dCoeff = double( i) / NUM_VERIF_STEP ;
Point3d ptCurr = ptCen + vtCurr + vtN * dDeltaN * dCoeff ;
DBLVECTOR vAng( vAng1.size()) ;
for ( size_t i = 0 ; i < vAng1.size() ; ++ i)
vAng[i] = vAxRotPrec[i] * ( 1 - dCoeff) + vAng1[i] * dCoeff ;