EgtGeonKernel :
- correzioni a VM5 assi con bezier 3x1.
This commit is contained in:
+106
-93
@@ -1311,7 +1311,7 @@ VolZmap::GenTool_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR&
|
||||
return true ;
|
||||
}
|
||||
|
||||
#if true
|
||||
#if false
|
||||
//debug
|
||||
#define TEST
|
||||
static vector<IGeoObj*> vGeo ;
|
||||
@@ -1515,9 +1515,10 @@ IntersLineBezierSurfSet( const Point3d& ptLineStart, const Vector3d& vtLineDir,
|
||||
Vector3d vAlpha = a3 * pow(dU, 3) + a2 * pow( dU, 2) + a1 * dU + a0 ;
|
||||
Vector3d vBeta = b3 * pow(dU, 3) + b2 * pow( dU, 2) + b1 * dU + b0 ;
|
||||
double dDen = ( vAlpha.x * q.z - vAlpha.z * q.x) ;
|
||||
if ( dDen > EPS_ZERO)
|
||||
if ( abs( dDen) > EPS_ZERO)
|
||||
dV = ( ( vBeta.z - r.z) * q.x - ( vBeta.x - r.x ) * q.z) / dDen ;
|
||||
else {
|
||||
// se la prima equazione risulta un x/0 allora uso la seconda equazione per trovare il secondo parametro
|
||||
double dDen2 = ( vAlpha.y * q.z - vAlpha.z * q.y) ;
|
||||
dV = ( ( vBeta.z - r.z) * q.y - ( vBeta.y - r.y ) * q.z) / dDen2 ;
|
||||
}
|
||||
@@ -2263,8 +2264,11 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt
|
||||
if ( bUseOnlyExtremes == bFirstAmbiguousCaseType)
|
||||
bAllSameType = true ;
|
||||
|
||||
if( bUseOnlyExtremes != bFirstAmbiguousCaseType && bAllSameType)
|
||||
if ( bUseOnlyExtremes != bFirstAmbiguousCaseType && bAllSameType ) {
|
||||
string sOut = " Taglio multiplo ambiguo che avrebbe bisogno di più calcoli!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ; // debug
|
||||
LOG_INFO( GetEGkLogger(), sOut.c_str())
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
|
||||
if( ! bAllSameType)
|
||||
@@ -2463,6 +2467,10 @@ bool
|
||||
VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, const Vector3d& vtAs,
|
||||
const Point3d& ptPe, const Vector3d& vtDe, const Vector3d& vtAe)
|
||||
{
|
||||
#if false
|
||||
#define OLD_LINEAR
|
||||
#endif
|
||||
|
||||
// Deve essere definito l'utensile corrente
|
||||
if ( m_nCurrTool < 0 || m_nCurrTool >= int( m_vTool.size()))
|
||||
return false ;
|
||||
@@ -2470,7 +2478,12 @@ VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, co
|
||||
double dAlongAngDeg, dAcrossAngDeg ;
|
||||
GetAlongAcrossRotation( vtDs, vtDe, ptPe - ptPs, dAlongAngDeg, dAcrossAngDeg) ;
|
||||
// Divido il movimento in tratti con direzione utensile costante
|
||||
const double ANG_ACROSS_STEP = 1.0 ;
|
||||
#ifdef OLD_LINEAR
|
||||
const double ANG_ACROSS_STEP = 0.04 ;
|
||||
#else
|
||||
const double ANG_ACROSS_STEP = 1 ;
|
||||
#endif
|
||||
|
||||
const double ANG_ALONG_STEP = 1.0 ;
|
||||
int nStepCnt = int( max( { abs( dAlongAngDeg) / ANG_ALONG_STEP, abs( dAcrossAngDeg) / ANG_ACROSS_STEP, 1.})) ;
|
||||
|
||||
@@ -2535,51 +2548,53 @@ VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, co
|
||||
LOG_INFO( GetEGkLogger(), sOut.c_str())
|
||||
//debug
|
||||
|
||||
// Divido il movimento in tratti con direzione utensile costante
|
||||
bool bOk = true ;
|
||||
|
||||
//////// debug - vecchia modalità
|
||||
//bool bOk = true ;
|
||||
// // Calcolo coefficiente di riduzione movimenti con direzione costante per evitare extra tagli
|
||||
////!!! In attesa dell'algoritmo esatto !!!
|
||||
//double dToolLen = m_vTool[m_nCurrTool].GetHeigth() ;
|
||||
//double dToolCrad = m_vTool[m_nCurrTool].GetCornRadius() ;
|
||||
//Vector3d vtBase = ptPe - ptPs ;
|
||||
//double dBaseLen = vtBase.Len() ;
|
||||
//Vector3d vtTip = ptPe - dToolLen * vtDe - ( ptPs - dToolLen * vtDs) ;
|
||||
//double dTipLen = vtTip.Len() ;
|
||||
//double dK = ( vtBase * vtTip > EPS_SMALL ? dTipLen / dBaseLen : 0) ;
|
||||
//if ( dTipLen / nStepCnt < 0.1 * dToolCrad)
|
||||
//dK = 0 ;
|
||||
//for ( int i = 0 ; i <= nStepCnt && bOk ; ++ i) {
|
||||
// double dStCoeff, dEnCoeff, dDirCoeff ;
|
||||
// if ( i == 0) {
|
||||
// dStCoeff = 0 ;
|
||||
// dEnCoeff = dK / nStepCnt ;
|
||||
// dDirCoeff = 0 ;
|
||||
// }
|
||||
// else if ( i < nStepCnt) {
|
||||
// dStCoeff = ( i - dK) / nStepCnt ;
|
||||
// dEnCoeff = ( i + dK) / nStepCnt ;
|
||||
// dDirCoeff = double( i) / nStepCnt ;
|
||||
// }
|
||||
// else {
|
||||
// dStCoeff = ( nStepCnt - dK) / nStepCnt ;
|
||||
// dEnCoeff = 1 ;
|
||||
// dDirCoeff = 1 ;
|
||||
// }
|
||||
// Point3d ptSt = Media( ptPs, ptPe, dStCoeff) ;
|
||||
// Point3d ptEn = Media( ptPs, ptPe, dEnCoeff) ;
|
||||
// Vector3d vtD = Media( vtDs, vtDe, dDirCoeff) ; vtD.Normalize() ;
|
||||
// Vector3d vtA = Media( vtAs, vtAe, dDirCoeff) ; vtA.Normalize() ;
|
||||
// bOk = bOk && MillingTranslationStep( ptSt, ptEn, vtD, vtA) ;
|
||||
// // aggiorno prossimo inizio
|
||||
// ptSt = ptEn ;
|
||||
//}
|
||||
//Divido il movimento in tratti con direzione utensile costante
|
||||
|
||||
//return bOk ;
|
||||
//////// debug - vecchia modalità
|
||||
////// debug - vecchia modalità
|
||||
#ifdef OLD_LINEAR
|
||||
// Calcolo coefficiente di riduzione movimenti con direzione costante per evitare extra tagli
|
||||
//!!! In attesa dell'algoritmo esatto !!!
|
||||
double dToolLen = m_vTool[m_nCurrTool].GetHeigth() ;
|
||||
double dToolCrad = m_vTool[m_nCurrTool].GetCornRadius() ;
|
||||
Vector3d vtBase = ptPe - ptPs ;
|
||||
double dBaseLen = vtBase.Len() ;
|
||||
Vector3d vtTip = ptPe - dToolLen * vtDe - ( ptPs - dToolLen * vtDs) ;
|
||||
double dTipLen = vtTip.Len() ;
|
||||
double dK = ( vtBase * vtTip > EPS_SMALL ? dTipLen / dBaseLen : 0) ;
|
||||
if ( dTipLen / nStepCnt < 0.1 * dToolCrad)
|
||||
dK = 0 ;
|
||||
for ( int i = 0 ; i <= nStepCnt && bOk ; ++ i) {
|
||||
double dStCoeff, dEnCoeff, dDirCoeff ;
|
||||
if ( i == 0) {
|
||||
dStCoeff = 0 ;
|
||||
dEnCoeff = dK / nStepCnt ;
|
||||
dDirCoeff = 0 ;
|
||||
}
|
||||
else if ( i < nStepCnt) {
|
||||
dStCoeff = ( i - dK) / nStepCnt ;
|
||||
dEnCoeff = ( i + dK) / nStepCnt ;
|
||||
dDirCoeff = double( i) / nStepCnt ;
|
||||
}
|
||||
else {
|
||||
dStCoeff = ( nStepCnt - dK) / nStepCnt ;
|
||||
dEnCoeff = 1 ;
|
||||
dDirCoeff = 1 ;
|
||||
}
|
||||
Point3d ptSt = Media( ptPs, ptPe, dStCoeff) ;
|
||||
Point3d ptEn = Media( ptPs, ptPe, dEnCoeff) ;
|
||||
Vector3d vtD = Media( vtDs, vtDe, dDirCoeff) ; vtD.Normalize() ;
|
||||
Vector3d vtA = Media( vtAs, vtAe, dDirCoeff) ; vtA.Normalize() ;
|
||||
bOk = bOk && MillingTranslationStep( ptSt, ptEn, vtD, vtA) ;
|
||||
// aggiorno prossimo inizio
|
||||
ptSt = ptEn ;
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
#endif
|
||||
////// debug - vecchia modalità
|
||||
|
||||
|
||||
|
||||
Point3d ptSti = ptPs ;
|
||||
Vector3d vtDSi = vtDs ;
|
||||
@@ -2610,57 +2625,55 @@ VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, co
|
||||
InitializePointsAndVectors( ptSti, ptEni, vtDSi, vtDEi, ptLs[i], ptLe[i], vtLs[i], vtLe[i]) ;
|
||||
}
|
||||
|
||||
///// decommentare solo per debug
|
||||
bool bOk = true ;
|
||||
for( int j = 0 ; j < N_MAPS; ++j) {
|
||||
PNTVECTOR ptLs_j( nStepCnt) ;
|
||||
PNTVECTOR ptLe_j( nStepCnt) ;
|
||||
VCT3DVECTOR vtLs_j( nStepCnt) ;
|
||||
VCT3DVECTOR vtLe_j( nStepCnt) ;
|
||||
for ( int z = 0 ; z < nStepCnt ; ++z) {
|
||||
ptLs_j[z] = ptLs[z][j] ;
|
||||
ptLe_j[z] = ptLe[z][j] ;
|
||||
vtLs_j[z] = vtLs[z][j] ;
|
||||
vtLe_j[z] = vtLe[z][j] ;
|
||||
}
|
||||
SelectGeneralMotion( j, ptLs_j, ptLe_j, vtLs_j,vtLe_j, n5AxisType) ;
|
||||
}
|
||||
///// decommentare solo per debug
|
||||
|
||||
//// Ciclo sulle mappe
|
||||
//vector< future<bool>> vRes ;
|
||||
//vRes.resize( m_nMapNum) ;
|
||||
|
||||
//vector<PNTVECTOR> ptLs_j( m_nMapNum) ;
|
||||
//vector<PNTVECTOR> ptLe_j( m_nMapNum) ;
|
||||
//vector<VCT3DVECTOR> vtLs_j( m_nMapNum) ;
|
||||
//vector<VCT3DVECTOR> vtLe_j( m_nMapNum) ;
|
||||
//for( int p = 0 ; p < m_nMapNum ; ++p) {
|
||||
// ptLs_j[p].resize(nStepCnt) ;
|
||||
// ptLe_j[p].resize(nStepCnt) ;
|
||||
// vtLs_j[p].resize(nStepCnt) ;
|
||||
// vtLe_j[p].resize(nStepCnt) ;
|
||||
/////// decommentare solo per debug // versione a singolo thread
|
||||
//for( int j = 0 ; j < N_MAPS; ++j) {
|
||||
// PNTVECTOR ptLs_j( nStepCnt) ;
|
||||
// PNTVECTOR ptLe_j( nStepCnt) ;
|
||||
// VCT3DVECTOR vtLs_j( nStepCnt) ;
|
||||
// VCT3DVECTOR vtLe_j( nStepCnt) ;
|
||||
// for ( int z = 0 ; z < nStepCnt ; ++z) {
|
||||
// ptLs_j[p][z] = ptLs[z][p] ;
|
||||
// ptLe_j[p][z] = ptLe[z][p] ;
|
||||
// vtLs_j[p][z] = vtLs[z][p] ;
|
||||
// vtLe_j[p][z] = vtLe[z][p] ;
|
||||
// ptLs_j[z] = ptLs[z][j] ;
|
||||
// ptLe_j[z] = ptLe[z][j] ;
|
||||
// vtLs_j[z] = vtLs[z][j] ;
|
||||
// vtLe_j[z] = vtLe[z][j] ;
|
||||
// }
|
||||
// SelectGeneralMotion( j, ptLs_j, ptLe_j, vtLs_j,vtLe_j, n5AxisType) ;
|
||||
//}
|
||||
/////// decommentare solo per debug
|
||||
|
||||
//for ( int j = 0 ; j < m_nMapNum ; ++ j) {
|
||||
// vRes[j] = async( launch::async, &VolZmap::SelectGeneralMotion, this, j, cref( ptLs_j[j]), cref( ptLe_j[j]), cref( vtLs_j[j]), cref( vtLe_j[j]), n5AxisType) ;
|
||||
//}
|
||||
//bool bOk = true ;
|
||||
//int nTerminated = 0 ;
|
||||
//while ( nTerminated < m_nMapNum) {
|
||||
// for ( int j = 0 ; j < m_nMapNum ; ++ j) {
|
||||
// if ( vRes[j].valid() && vRes[j].wait_for( chrono::nanoseconds{ 1}) == future_status::ready) {
|
||||
// bOk = vRes[j].get() && bOk ;
|
||||
// ++ nTerminated ;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
// Ciclo sulle mappe
|
||||
vector< future<bool>> vRes ;
|
||||
vRes.resize( m_nMapNum) ;
|
||||
|
||||
vector<PNTVECTOR> ptLs_j( m_nMapNum) ;
|
||||
vector<PNTVECTOR> ptLe_j( m_nMapNum) ;
|
||||
vector<VCT3DVECTOR> vtLs_j( m_nMapNum) ;
|
||||
vector<VCT3DVECTOR> vtLe_j( m_nMapNum) ;
|
||||
for( int p = 0 ; p < m_nMapNum ; ++p) {
|
||||
ptLs_j[p].resize(nStepCnt) ;
|
||||
ptLe_j[p].resize(nStepCnt) ;
|
||||
vtLs_j[p].resize(nStepCnt) ;
|
||||
vtLe_j[p].resize(nStepCnt) ;
|
||||
for ( int z = 0 ; z < nStepCnt ; ++z) {
|
||||
ptLs_j[p][z] = ptLs[z][p] ;
|
||||
ptLe_j[p][z] = ptLe[z][p] ;
|
||||
vtLs_j[p][z] = vtLs[z][p] ;
|
||||
vtLe_j[p][z] = vtLe[z][p] ;
|
||||
}
|
||||
}
|
||||
|
||||
for ( int j = 0 ; j < m_nMapNum ; ++ j) {
|
||||
vRes[j] = async( launch::async, &VolZmap::SelectGeneralMotion, this, j, cref( ptLs_j[j]), cref( ptLe_j[j]), cref( vtLs_j[j]), cref( vtLe_j[j]), n5AxisType) ;
|
||||
}
|
||||
int nTerminated = 0 ;
|
||||
while ( nTerminated < m_nMapNum) {
|
||||
for ( int j = 0 ; j < m_nMapNum ; ++ j) {
|
||||
if ( vRes[j].valid() && vRes[j].wait_for( chrono::nanoseconds{ 1}) == future_status::ready) {
|
||||
bOk = vRes[j].get() && bOk ;
|
||||
++ nTerminated ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user