EgtGeonKernel :

- correzioni a VM5 assi con bezier 3x1.
This commit is contained in:
Daniele Bariletti
2025-09-02 12:51:39 +02:00
parent 81be6ce7b9
commit e49bd5a2a0
+106 -93
View File
@@ -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 ;
}