EgtMachKernel 1.6v2 :
- gestiti attacchi con elevazione - corretti calcoli con archi di elica (deltaN <> 0).
This commit is contained in:
+22
-6
@@ -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 ;
|
||||
|
||||
Reference in New Issue
Block a user