From e49bd5a2a08670de9a99f15f455b1fdec317bda0 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Tue, 2 Sep 2025 12:51:39 +0200 Subject: [PATCH] EgtGeonKernel : - correzioni a VM5 assi con bezier 3x1. --- VolZmapVolume.cpp | 199 ++++++++++++++++++++++++---------------------- 1 file changed, 106 insertions(+), 93 deletions(-) diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index 137d57c..b4b9253 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -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 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> vRes ; - //vRes.resize( m_nMapNum) ; - - //vector ptLs_j( m_nMapNum) ; - //vector ptLe_j( m_nMapNum) ; - //vector vtLs_j( m_nMapNum) ; - //vector 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> vRes ; + vRes.resize( m_nMapNum) ; + + vector ptLs_j( m_nMapNum) ; + vector ptLe_j( m_nMapNum) ; + vector vtLs_j( m_nMapNum) ; + vector 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 ; }