diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index 1f36956..c2cf8bb 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -24,6 +24,7 @@ #include "/EgtDev/Include/EgtPerfCounter.h" #include "/EgtDev/Include/EGkSurfBezier.h" #include "/EgtDev/Include/ENkPolynomialRoots.h" +#include "/EgtDev/Include/EGkIntersLineBox.h" #include "/EgtDev/Include/EGkGeoObjSave.h" // debug #include "SurfBezier.h" #include @@ -1387,8 +1388,15 @@ struct SurfBezForInters { Vector3d a3, a2, a1, a0, b3, b2, b1, b0 ; }; +static int nIntersCalc = 0 ; + +typedef std::pair DBLDBL ; + static bool -IntersLineBezierSurfSet( const Point3d& ptLineStart, const Vector3d& vtLineDir, const vector& vSurfBez, PNTVEC3DVECTOR& vInters, INTVECTOR& vSurfInters) { +IntersLineBezierSurfSet( const Point3d& ptLineStart, const Vector3d& vtLineDir, double dMin, double dMax, + const vector& vSurfBez, PNTVEC3DVECTOR& vInters, INTVECTOR& vSurfInters, + int nGrid, const Vector3d& vtN, vector& vInterv) +{ Point3d r = ptLineStart ; Vector3d q = vtLineDir ; @@ -1410,8 +1418,34 @@ IntersLineBezierSurfSet( const Point3d& ptLineStart, const Vector3d& vtLineDir, BBox3d bbox = srf.bbSurf ; if( bNeedToRot) bbox.ToLoc( frRot) ; + INTDBLVECTOR vIntBoxBox ; + bool bCalcInters = false ; + if( dMax > EPS_ZERO) { + /*IntersLineBox( r + q * dMin, r + q * dMax, bbox, vIntBoxBox, true) ; + bCalcInters = int( vIntBoxBox.size()) != 0 ;*/ + Point3d ptMin = bbox.GetMin(), ptMax = bbox.GetMax() ; + for ( int k = 0 ; k < int(vInterv.size()) && ! bCalcInters; ++k) { + bCalcInters = (vInterv[k].first > ptMin.z && vInterv[k].first < ptMax.z) || (vInterv[k].second > ptMin.z && vInterv[k].second < ptMax.z) ; + } + bCalcInters = bCalcInters && bbox.SqDistFromPointXY( r) < EPS_ZERO ; + } + else + bCalcInters = bbox.SqDistFromPointXY( r) < EPS_ZERO ; + + if( dMax > EPS_ZERO) { + bool bBetter = int( vIntBoxBox.size()) == 0 && bbox.SqDistFromPointXY( r) < EPS_ZERO ; + if( bBetter) + int a = 0 ; + } // verifico che lo spillone faccia interferenza con il box della superficie - if ( bbox.SqDistFromPointXY( r) < EPS_ZERO) { + if ( bCalcInters && dMax > - EPS_ZERO) { + ++nIntersCalc ; + string sOut = " actual inters calc " + ToString(nIntersCalc) + " Griglia" + ToString(nGrid); // debug + if( nGrid != 1) + sOut += " toolZ: " + ToString( vtN.z, 3) ; + LOG_INFO( GetEGkLogger(), sOut.c_str()) + + // se la linea รจ parallela all'asse X o Y allora ruoto tutto di 45 gradi rispetto a Z Vector3d a3, a2, a1, a0, b3, b2, b1, b0 ; if ( ! bNeedToRot) { @@ -2205,7 +2239,21 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt //debug INTVECTOR vSurfInters ; //debug - IntersLineBezierSurfSet( r, q, vSurfBez, vInters, vSurfInters) ; + int nPos = j * m_nNx[nGrid] + i ; + vector& vDexel = m_Values[nGrid][nPos] ; + vector vInterv, vEmpty ; + for ( int k = 0 ; k < int(vDexel.size()) ; ++k ) { + vInterv.emplace_back( vDexel[k].dMin, vDexel[k].dMax) ; + } + + double dMin = 0 , dMax = 0 ; + if ( vDexel.size() != 0) { + dMin = vDexel.front().dMin ; + dMax = vDexel.back().dMax ; + } + else + dMax = - 1 ; + IntersLineBezierSurfSet( r, q, dMin, dMax, vSurfBez, vInters, vSurfInters, nGrid, vtLs[0], vInterv) ; if ( vInters.size() > 2) { SortGroupInters( vInters, vStartEnds, Z_AX) ; if ( bForward && vStartEnds.size() > 1) { @@ -2227,7 +2275,7 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt INTVECTOR vSurfX ; INTINTVECTOR vStartEndsX ; bool bXInclude = false ; - IntersLineBezierSurfSet( ptLineStart, vtLineStart, vSurfBez, vIntersX, vSurfX) ; + IntersLineBezierSurfSet( ptLineStart, vtLineStart, 0, 0, vSurfBez, vIntersX, vSurfX, -1, V_NULL, vEmpty) ; if( vIntersX.size() > 1) { SortGroupInters( vIntersX, vStartEndsX, X_AX) ; if( vStartEndsX.size() != 0) @@ -2240,7 +2288,7 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt INTVECTOR vSurfY ; INTINTVECTOR vStartEndsY ; bool bYInclude = false ; - IntersLineBezierSurfSet( ptLineStart, vtLineStart, vSurfBez, vIntersY, vSurfY) ; + IntersLineBezierSurfSet( ptLineStart, vtLineStart, 0, 0, vSurfBez, vIntersY, vSurfY, -1, V_NULL, vEmpty) ; if ( vIntersY.size() > 1) { SortGroupInters( vIntersY, vStartEndsY, Y_AX) ; if( vStartEndsY.size() != 0) @@ -2478,6 +2526,7 @@ 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 + // #ifdef OLD_LINEAR const double ANG_ACROSS_STEP = 0.04 ; #else @@ -2625,21 +2674,23 @@ 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 // 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[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 +#ifdef _DEBUG + ///// 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[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 +#else // Ciclo sulle mappe vector< future> vRes ; @@ -2674,6 +2725,7 @@ VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, co } } } +#endif return bOk ; }