EgtGeomKernel :
- aggiunta di una funzione per la VirtualMilling a 5 assi usando le bilineari.
This commit is contained in:
+378
-44
@@ -21,6 +21,8 @@
|
||||
#include "/EgtDev/Include/EGkStringUtils3d.h"
|
||||
#include "/EgtDev/Include/EgtNumUtils.h"
|
||||
#include "/EgtDev/Include/EgtPerfCounter.h"
|
||||
#include "/EgtDev/Include/EGkSurfBezier.h"
|
||||
#include "/EgtDev/Include/ENkPolynomialRoots.h"
|
||||
#include <future>
|
||||
|
||||
using namespace std ;
|
||||
@@ -905,6 +907,247 @@ GetAlongAcrossRotation( const Vector3d& vtDir1, const Vector3d& vtDir2, const Ve
|
||||
return true ;
|
||||
}
|
||||
|
||||
bool
|
||||
UpdateMaxMin(Point3d ptBez, Vector3d vtN, double& dMin, double& dMax, Point3d& ptMin, Point3d& ptMax, Vector3d& vtMin, Vector3d& vtMax) {
|
||||
if ( ptBez.z > dMax) {
|
||||
dMax = ptBez.z ;
|
||||
ptMax = ptBez ;
|
||||
vtMax = -vtN ; // inverto il segno della normale, perché devo passare la normale della supercie tagliata, non di quella di taglio
|
||||
}
|
||||
if ( ptBez.z < dMin) {
|
||||
dMin = ptBez.z ;
|
||||
ptMin = ptBez ;
|
||||
vtMin = -vtN ; // inverto il segno della normale, perché devo passare la normale della supercie tagliata, non di quella di taglio
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
VolZmap::InitializeAuxPoints( Point3d ptTop1s[3], Point3d ptTop1e[3], Point3d ptTop2s[3], Point3d ptTop2e[3],
|
||||
Point3d ptBottom1s[3], Point3d ptBottom1e[3], Point3d ptBottom2s[3], Point3d ptBottom2e[3])
|
||||
{
|
||||
// per ogni array il punto epr la prima griglia è già settato, devo aggiungere i punti per le altre due, permutando le coordinate
|
||||
if ( m_nMapNum > 1) {
|
||||
ptTop1s[1].x = ptTop1s[0].y ; ptTop1s[1].y = ptTop1s[0].z ; ptTop1s[1].z = ptTop1s[0].x ;
|
||||
ptTop1s[2].x = ptTop1s[0].z ; ptTop1s[2].y = ptTop1s[0].x ; ptTop1s[2].z = ptTop1s[0].y ;
|
||||
ptTop1e[1].x = ptTop1e[0].y ; ptTop1e[1].y = ptTop1e[0].z ; ptTop1e[1].z = ptTop1e[0].x ;
|
||||
ptTop1e[2].x = ptTop1e[0].z ; ptTop1e[2].y = ptTop1e[0].x ; ptTop1e[2].z = ptTop1e[0].y ;
|
||||
ptTop2s[1].x = ptTop2s[0].y ; ptTop2s[1].y = ptTop2s[0].z ; ptTop2s[1].z = ptTop2s[0].x ;
|
||||
ptTop2s[2].x = ptTop2s[0].z ; ptTop2s[2].y = ptTop2s[0].x ; ptTop2s[2].z = ptTop2s[0].y ;
|
||||
ptTop2e[1].x = ptTop2e[0].y ; ptTop2e[1].y = ptTop2e[0].z ; ptTop2e[1].z = ptTop2e[0].x ;
|
||||
ptTop2e[2].x = ptTop2e[0].z ; ptTop2e[2].y = ptTop2e[0].x ; ptTop2e[2].z = ptTop2e[0].y ;
|
||||
ptBottom1s[1].x = ptBottom1s[0].y ; ptBottom1s[1].y = ptBottom1s[0].z ; ptBottom1s[1].z = ptBottom1s[0].x ;
|
||||
ptBottom1s[2].x = ptBottom1s[0].z ; ptBottom1s[2].y = ptBottom1s[0].x ; ptBottom1s[2].z = ptBottom1s[0].y ;
|
||||
ptBottom1e[1].x = ptBottom1e[0].y ; ptBottom1e[1].y = ptBottom1e[0].z ; ptBottom1e[1].z = ptBottom1e[0].x ;
|
||||
ptBottom1e[2].x = ptBottom1e[0].z ; ptBottom1e[2].y = ptBottom1e[0].x ; ptBottom1e[2].z = ptBottom1e[0].y ;
|
||||
ptBottom2s[1].x = ptBottom2s[0].y ; ptBottom2s[1].y = ptBottom2s[0].z ; ptBottom2s[1].z = ptBottom2s[0].x ;
|
||||
ptBottom2s[2].x = ptBottom2s[0].z ; ptBottom2s[2].y = ptBottom2s[0].x ; ptBottom2s[2].z = ptBottom2s[0].y ;
|
||||
ptBottom2e[1].x = ptBottom2e[0].y ; ptBottom2e[1].y = ptBottom2e[0].z ; ptBottom2e[1].z = ptBottom2e[0].x ;
|
||||
ptBottom2e[2].x = ptBottom2e[0].z ; ptBottom2e[2].y = ptBottom2e[0].x ; ptBottom2e[2].z = ptBottom2e[0].y ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
VolZmap::SelectGeneralMotion( const Point3d& ptPs, const Point3d& ptPe, const Vector3d& vtDs, const Vector3d& vtDe, const int nPhase)
|
||||
{
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// qui al momento gestisco solo il caso del cilindro, ma dovrò gestire anche gli altri casi
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// tolgo il volume dei cilindri all'inzio e alla fine del tratto e poi uso delle bilineari per approssimare il volume spazzato
|
||||
Point3d ptLs[N_MAPS] ;
|
||||
Point3d ptLe[N_MAPS] ;
|
||||
Vector3d vtLs[N_MAPS] ;
|
||||
Vector3d vtLe[N_MAPS] ;
|
||||
InitializePointsAndVectors( ptPs, ptPe, vtDs, vtDe, ptLs, ptLe, vtLs, vtLe) ;
|
||||
// recupero le info del tool
|
||||
Tool& CurrTool = m_vTool[m_nCurrTool] ;
|
||||
double dHeight = CurrTool.GetHeigth() ;
|
||||
double dRadius = CurrTool.GetRadius() ;
|
||||
|
||||
Point3d ptTop1s[N_MAPS] ;
|
||||
Point3d ptTop1e[N_MAPS] ;
|
||||
Point3d ptTop2s[N_MAPS] ;
|
||||
Point3d ptTop2e[N_MAPS] ;
|
||||
Point3d ptBottom1s[N_MAPS] ;
|
||||
Point3d ptBottom1e[N_MAPS] ;
|
||||
Point3d ptBottom2s[N_MAPS] ;
|
||||
Point3d ptBottom2e[N_MAPS] ;
|
||||
|
||||
// determino la posizone della punta del tool nella posizone inizale e in quella finale
|
||||
Point3d ptP1T = ptPs - dHeight * vtDs ;
|
||||
Point3d ptP2T = ptPe - dHeight * vtDe ;
|
||||
// determino la direzione di movimento del top del tool e della punta del tool
|
||||
Vector3d vtDirTop = ptPe - ptPs ;
|
||||
Vector3d vtDirTip = ptP2T - ptP1T ;
|
||||
|
||||
// determino i punti laterali del top e del bottom(tip), nella posizione di partenza
|
||||
Vector3d vtAuxTopS = vtDs ^ vtDirTop ;
|
||||
vtAuxTopS.Normalize() ;
|
||||
vtAuxTopS *= dRadius ;
|
||||
ptTop1s[0] = ptPs + vtAuxTopS ;
|
||||
ptTop2s[0] = ptPs - vtAuxTopS ;
|
||||
|
||||
Vector3d vtAuxBottomS = vtDs ^ vtDirTip ;
|
||||
vtAuxBottomS.Normalize() ;
|
||||
vtAuxBottomS *= dRadius ;
|
||||
ptBottom1s[0] = ptP1T + vtAuxBottomS ;
|
||||
ptBottom2s[0] = ptP1T - vtAuxBottomS ;
|
||||
|
||||
// determino i punti laterali del top e del bottom(tip), nella posizione di arrivo
|
||||
Vector3d vtAuxTopE = vtDe ^ vtDirTop ;
|
||||
vtAuxTopE.Normalize() ;
|
||||
vtAuxTopE *= dRadius ;
|
||||
ptTop1e[0] = ptPe + vtAuxTopE ;
|
||||
ptTop2e[0] = ptPe - vtAuxTopE ;
|
||||
|
||||
Vector3d vtAuxBottomE = vtDe ^ vtDirTip ;
|
||||
vtAuxBottomE.Normalize() ;
|
||||
vtAuxBottomE *= dRadius ;
|
||||
ptBottom1e[0] = ptP2T + vtAuxBottomE ;
|
||||
ptBottom2e[0] = ptP2T - vtAuxBottomE ;
|
||||
|
||||
InitializeAuxPoints( ptTop1s, ptTop1e, ptTop2s, ptTop2e, ptBottom1s, ptBottom1e, ptBottom2s, ptBottom2e) ;
|
||||
|
||||
vector<IGeoObj*> vGeo ;
|
||||
for ( int z = 0 ; z < m_nMapNum ; ++z) {
|
||||
|
||||
//CompCyl_AcrossMilling() // questa potrebbe essere la funzione che raccoglie tutto quello che ci sarà in questo for
|
||||
|
||||
// tolgo il volume del cilindro iniziale e finale del moto
|
||||
if ( nPhase == VolZmap::MillingPhase::COUNT_START_CYL) {
|
||||
// in base all'orientamento del tool scelgo la funzione adatta
|
||||
if ( vtLs[z].SqLenXY() < EPS_SMALL * EPS_SMALL)
|
||||
CompCyl_ZDrilling( z, ptLs[z], ptLs[z], vtLs[z], dHeight, dRadius, CurrTool.GetToolNum()) ;
|
||||
else
|
||||
CompCyl_Drilling( z, ptLs[z], ptLs[z], vtLs[z], dHeight, dRadius, false, false, CurrTool.GetToolNum()) ;
|
||||
}
|
||||
if ( nPhase == VolZmap::MillingPhase::COUNT_END_CYL) {
|
||||
if ( vtLs[z].SqLenXY() < EPS_SMALL * EPS_SMALL)
|
||||
CompCyl_ZDrilling( z, ptLe[z], ptLe[z], vtLe[z], dHeight, dRadius, CurrTool.GetToolNum()) ;
|
||||
else
|
||||
CompCyl_Drilling( z, ptLe[z], ptLe[z], vtLe[z], dHeight, dRadius, false, false, CurrTool.GetToolNum()) ;
|
||||
}
|
||||
|
||||
// tolgo il volume spazzato dal tool durante il movimento
|
||||
// Verifica sull'interferenza con lo Zmap
|
||||
int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
if ( ! TestCompoBBox( z, ptLs[z], ptLe[z], vtLs[z], vtLe[z], dRadius, dRadius, dHeight, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
|
||||
int nDegU = 1 ; int nDegV = 1 ;
|
||||
int nSpanU = 1 ; int nSpanV = 1 ;
|
||||
bool bRat = false ;
|
||||
vector<PNTVECTOR> vvPtCtrl ;
|
||||
PNTVECTOR vPtCtrl0 = { ptBottom1s[z], ptTop1s[z], ptBottom1e[z], ptTop1e[z]} ;
|
||||
vvPtCtrl.push_back( move( vPtCtrl0)) ;
|
||||
PNTVECTOR vPtCtrl1 = { ptBottom2s[z], ptBottom1s[z], ptBottom2e[z], ptBottom1e[z]} ;
|
||||
vvPtCtrl.push_back( move( vPtCtrl1)) ;
|
||||
PNTVECTOR vPtCtrl2 = { ptTop2s[z], ptBottom2s[z], ptTop2e[z], ptBottom2e[z]} ;
|
||||
vvPtCtrl.push_back( move( vPtCtrl2)) ;
|
||||
PNTVECTOR vPtCtrl3 = { ptTop1s[z], ptTop2s[z], ptTop1e[z], ptTop2e[z]} ;
|
||||
vvPtCtrl.push_back( move( vPtCtrl3)) ;
|
||||
PNTVECTOR vPtCtrl4 = { ptBottom1s[z], ptBottom2s[z], ptTop1s[z], ptTop2s[z]} ;
|
||||
vvPtCtrl.push_back( move( vPtCtrl4)) ;
|
||||
PNTVECTOR vPtCtrl5 = { ptBottom2e[z], ptBottom1e[z], ptTop2e[z], ptTop1e[z]} ;
|
||||
vvPtCtrl.push_back( move( vPtCtrl5)) ;
|
||||
|
||||
// per ognuna delle 6 superfici bilineari
|
||||
ISURFBEZPOVECTOR vSurfBez ;
|
||||
//VCT3DVECTOR a ;
|
||||
//VCT3DVECTOR b ;
|
||||
//VCT3DVECTOR c ;
|
||||
PNTVECTOR d ;
|
||||
Vector3d q = Z_AX ;
|
||||
DBLVECTOR A1, B1, C1, A2, B2, C2 ;
|
||||
for( int s = 0 ; s < 6 ; ++s) {
|
||||
// inzializzo la superficie
|
||||
vSurfBez.emplace_back( CreateSurfBezier()) ;
|
||||
vSurfBez.back()->Init(nDegU, nDegV, nSpanU, nSpanV, bRat) ;
|
||||
vSurfBez.back()->SetControlPoint( 0, vvPtCtrl[s][0]) ;
|
||||
vSurfBez.back()->SetControlPoint( 1, vvPtCtrl[s][1]) ;
|
||||
vSurfBez.back()->SetControlPoint( 2, vvPtCtrl[s][2]) ;
|
||||
vSurfBez.back()->SetControlPoint( 3, vvPtCtrl[s][3]) ;
|
||||
|
||||
// salvo i parametri per il calcolo delle intersezioni
|
||||
//a.push_back( vvPtCtrl[s][3] - vvPtCtrl[s][1] + ( vvPtCtrl[s][0] - vvPtCtrl[s][2])) ;
|
||||
//b.push_back( vvPtCtrl[s][1] - vvPtCtrl[s][0]) ;
|
||||
//c.push_back( vvPtCtrl[s][2] - vvPtCtrl[s][0]) ;
|
||||
Vector3d a = vvPtCtrl[s][3] - vvPtCtrl[s][1] + ( vvPtCtrl[s][0] - vvPtCtrl[s][2]) ;
|
||||
Vector3d b = vvPtCtrl[s][1] - vvPtCtrl[s][0] ;
|
||||
Vector3d c = vvPtCtrl[s][2] - vvPtCtrl[s][0] ;
|
||||
d.push_back( vvPtCtrl[s][0]) ;
|
||||
|
||||
A1.push_back( a.x * q.z - a.z * q.x) ;
|
||||
B1.push_back( b.x * q.z - b.z * q.x) ;
|
||||
C1.push_back( c.x * q.z - c.z * q.x) ;
|
||||
A2.push_back( a.y * q.z - a.z * q.y) ;
|
||||
B2.push_back( b.y * q.z - b.z * q.y) ;
|
||||
C2.push_back( c.y * q.z - c.z * q.y) ;
|
||||
}
|
||||
|
||||
|
||||
// scorro tutti gli spilloni interessati
|
||||
for ( int i = nStartI ; i <= nEndI ; ++ i) {
|
||||
for ( int j = nStartJ ; j <= nEndJ ; ++ j) {
|
||||
double dX = ( i + 0.5) * m_dStep ;
|
||||
double dY = ( j + 0.5) * m_dStep ;
|
||||
Point3d r( dX, dY, 0) ;
|
||||
Point3d ptMin, ptMax ;
|
||||
double dMin = INFINITO, dMax = -10 ;
|
||||
Vector3d vtMin, vtMax ;
|
||||
for( int s = 0 ; s < 6 ; ++s) {
|
||||
// di queste variabili probabilmente posso portare fuori dai for nested tutte quelle che non dipendono da r ed esplicitare già qx = 0, qy= 0 , qz = 1
|
||||
//double A1 = a[s].x * q.z - a[s].z * q.x ;
|
||||
//double B1 = b[s].x * q.z - b[s].z * q.x ;
|
||||
//double C1 = c[s].x * q.z - c[s].z * q.x ;
|
||||
double D1 = ( d[s].x - r.x) * q.z - ( d[s].z - r.z) * q.x ;
|
||||
//double A2 = a[s].y * q.z - a[s].z * q.y ;
|
||||
//double B2 = b[s].y * q.z - b[s].z * q.y ;
|
||||
//double C2 = c[s].y * q.z - c[s].z * q.y ;
|
||||
double D2 = ( d[s].y - r.y) * q.z - ( d[s].z - r.z) * q.y ;
|
||||
|
||||
DBLVECTOR vdCoeff, vdRoots ;
|
||||
vdCoeff = { (B2[s] * D1 - B1[s] * D2), ( A2[s] * D1 - A1[s] * D2 + B2[s] * C1[s] - B1[s] * C2[s]), ( A2[s] * C1[s] - A1[s] * C2[s])} ;
|
||||
int nRoots = PolynomialRoots( 2, vdCoeff, vdRoots) ;
|
||||
if ( nRoots != 0) {
|
||||
double dU1 = 0, dV1 = 0 ;
|
||||
double dU2 = 0, dV2 = 0 ;
|
||||
if ( vdRoots[0] > 0 - EPS_ZERO && vdRoots[0] < 1 + EPS_ZERO) {
|
||||
dV1 = vdRoots[0] ;
|
||||
dU1 = (dV1 * (C1[s] - C2[s]) + ( D1 - D2)) / ( dV1 * ( A2[s] - A1[s]) + ( B2[s] - B1[s])) ;
|
||||
if ( dU1 > - EPS_ZERO && dU1 < 1 + EPS_ZERO) {
|
||||
Point3d ptBez1 ;
|
||||
Vector3d vtN1 ;
|
||||
vSurfBez[s]->GetPointNrmD1D2(dU1, dV1, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptBez1, vtN1) ;
|
||||
UpdateMaxMin( ptBez1, vtN1, dMin, dMax, ptMin, ptMax, vtMin, vtMax) ;
|
||||
}
|
||||
}
|
||||
if ( nRoots > 1 && vdRoots[1] > 0 - EPS_ZERO && vdRoots[1] < 1 + EPS_ZERO) {
|
||||
dV2 = vdRoots[1] ;
|
||||
dU2 = (dV2 * (C1[s] - C2[s]) + ( D1 - D2)) / ( dV2 * ( A2[s] - A1[s]) + ( B2[s] - B1[s])) ;
|
||||
if ( dU2 > - EPS_ZERO && dU2 < 1 + EPS_ZERO) {
|
||||
Point3d ptBez2 ;
|
||||
Vector3d vtN2 ;
|
||||
vSurfBez[s]->GetPointNrmD1D2(dU2, dV2, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptBez2, vtN2) ;
|
||||
UpdateMaxMin( ptBez2, vtN2, dMin, dMax, ptMin, ptMax, vtMin, vtMax) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( dMax > 0 && dMin < dMax)
|
||||
SubtractIntervals( z, i, j, dMin, dMax, vtMin, vtMax, CurrTool.GetToolNum()) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, const Vector3d& vtAs,
|
||||
@@ -914,27 +1157,58 @@ 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 = 0.04 ;
|
||||
const double ANG_ACROSS_STEP = 4 ;
|
||||
const double ANG_ALONG_STEP = 1.0 ;
|
||||
int nStepCnt = int( max( { abs( dAlongAngDeg) / ANG_ALONG_STEP, abs( dAcrossAngDeg) / ANG_ACROSS_STEP, 1.})) ;
|
||||
bool bOk = true ;
|
||||
Point3d ptSt = ptPs ;
|
||||
|
||||
// valori allo step i-esimo
|
||||
Point3d ptSt = ptPs ; ///////////////////// commentato per debug
|
||||
|
||||
|
||||
Point3d ptSti = ptPs ;
|
||||
Vector3d vtDSi = vtDs ;
|
||||
double dCorr = 0.05 * 1. / nStepCnt ; // creo una sovrapposizone tra uno step e il successivo
|
||||
for ( int i = 0 ; i <= nStepCnt && bOk ; ++ i) {
|
||||
double dPosCoeff, dDirCoeff ;
|
||||
if ( i < nStepCnt) {
|
||||
dPosCoeff = ( i + 0.5) / nStepCnt ;
|
||||
dDirCoeff = double( i) / nStepCnt ;
|
||||
}
|
||||
else {
|
||||
dPosCoeff = 1 ;
|
||||
dDirCoeff = 1 ;
|
||||
}
|
||||
Point3d ptEn = Media( ptPs, ptPe, dPosCoeff) ;
|
||||
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 ;
|
||||
//////////////////////////////////////////////// commentato per debug
|
||||
// double dPosCoeff, dDirCoeff ;
|
||||
// if ( i < nStepCnt) {
|
||||
// dPosCoeff = ( i + 0.5) / nStepCnt ;
|
||||
// dDirCoeff = double( i) / nStepCnt ;
|
||||
// }
|
||||
// else {
|
||||
// dPosCoeff = 1 ;
|
||||
// dDirCoeff = 1 ;
|
||||
// }
|
||||
// Point3d ptEn = Media( ptPs, ptPe, dPosCoeff) ;
|
||||
// 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 ;
|
||||
|
||||
|
||||
//// replico il tutto ma tenendo degli step più ampi e usando i veri vettori di start e end del tratto
|
||||
double dPosCoeffE, dDirCoeffE, dPosCoeffS, dDirCoeffS ;
|
||||
dPosCoeffS = double( i) / (nStepCnt + 1) ;
|
||||
dDirCoeffS = double( i) / (nStepCnt + 1) ;
|
||||
dPosCoeffE = double( i + 1) / (nStepCnt + 1) ;
|
||||
dDirCoeffE = double( i + 1) / (nStepCnt + 1) ;
|
||||
if ( i != 0)
|
||||
ptSti = Media( ptPs, ptPe, dPosCoeffS - dCorr) ;
|
||||
Point3d ptEni = Media( ptPs, ptPe, i != nStepCnt ? dPosCoeffE : (dPosCoeffE + dCorr)) ;
|
||||
if ( i != 0)
|
||||
vtDSi = Media( vtDs, vtDe, dDirCoeffS - dCorr) ; vtDSi.Normalize() ;
|
||||
Vector3d vtDEi = Media( vtDs, vtDe, i != nStepCnt ? dDirCoeffE : (dPosCoeffE + dCorr)) ; vtDEi.Normalize() ;
|
||||
|
||||
int nPhase = VolZmap::MillingPhase::ONLY_LATERAL_SURF ;
|
||||
if ( i == 0)
|
||||
nPhase = VolZmap::MillingPhase::COUNT_START_CYL ;
|
||||
if ( i == nStepCnt)
|
||||
nPhase = VolZmap::MillingPhase::COUNT_END_CYL ;
|
||||
bOk = bOk && SelectGeneralMotion( ptSti, ptEni, vtDSi, vtDEi,nPhase) ;
|
||||
}
|
||||
return bOk ;
|
||||
}
|
||||
@@ -948,14 +1222,15 @@ VolZmap::MillingTranslationStep( const Point3d& ptPs, const Point3d& ptPe, const
|
||||
Vector3d vtLs[N_MAPS] ;
|
||||
Vector3d vtALs[N_MAPS] ;
|
||||
InitializePointsAndVectors( ptPs, ptPe, vtD, vtA, ptLs, ptLe, vtLs, vtALs) ;
|
||||
// Ciclo sulle mappe (scommentare solo per DEBUG)
|
||||
//{
|
||||
// bool bOk = true ;
|
||||
// for ( int i = 0 ; i < m_nMapNum ; ++ i) {
|
||||
// bOk = SelectMotion( i, ptLs[i], ptLe[i], vtLs[i], vtALs[i]) && bOk ;
|
||||
// }
|
||||
// return true ;
|
||||
//}
|
||||
//// Ciclo sulle mappe (scommentare solo per DEBUG)
|
||||
// {
|
||||
// bool bOk = true ;
|
||||
// for ( int i = 0 ; i < m_nMapNum ; ++ i) {
|
||||
// bOk = SelectMotion( i, ptLs[i], ptLe[i], vtLs[i], vtALs[i]) && bOk ;
|
||||
// }
|
||||
// return true ;
|
||||
// }
|
||||
|
||||
// Ciclo sulle mappe
|
||||
vector< future<bool>> vRes ;
|
||||
vRes.resize( m_nMapNum) ;
|
||||
@@ -2092,7 +2367,7 @@ VolZmap::GenTool_ZDrilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c
|
||||
return false ;
|
||||
Tool& CurrTool = m_vTool[m_nCurrTool] ;
|
||||
|
||||
// Descrizione geometrica del moto
|
||||
// Descrizione geometrica del moto
|
||||
Point3d ptI = ptS ;
|
||||
Point3d ptF = ptE ;
|
||||
Vector3d vtMove = ptE - ptS ;
|
||||
@@ -3653,7 +3928,7 @@ VolZmap::CompCyl_ZDrilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c
|
||||
{
|
||||
// Verifica sull'interferenza con lo Zmap
|
||||
int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, dRad, dRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, V_NULL, dRad, dRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
|
||||
// Proiezione dei punti sul piano
|
||||
@@ -3698,7 +3973,7 @@ VolZmap::CompConus_ZDrilling( int nGrid, const Point3d& ptS, const Point3d& ptE,
|
||||
{
|
||||
// Verifica sull'interferenza con lo Zmap
|
||||
int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, dMaxRad, dMinRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, V_NULL, dMaxRad, dMinRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
|
||||
Point3d ptO( ptS.x, ptS.y, 0) ;
|
||||
@@ -3858,7 +4133,7 @@ VolZmap::CompCyl_ZMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, co
|
||||
{
|
||||
// Verifica sull'interferenza con lo Zmap
|
||||
int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, dRad, dRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, V_NULL, dRad, dRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
|
||||
// Parametri geometrici
|
||||
@@ -3871,8 +4146,8 @@ VolZmap::CompCyl_ZMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, co
|
||||
Point3d ptFT = ptF - vtToolDir * dHei ;
|
||||
Point3d ptIxy( ptI.x, ptI.y, 0) ;
|
||||
|
||||
Point3d ptIUp( ptI.x, ptI.y, max( ptI.z, ptIT.z)) ;
|
||||
Point3d ptIDw( ptI.x, ptI.y, min( ptI.z, ptIT.z)) ;
|
||||
//Point3d ptIUp( ptI.x, ptI.y, max( ptI.z, ptIT.z)) ;
|
||||
//Point3d ptIDw( ptI.x, ptI.y, min( ptI.z, ptIT.z)) ;
|
||||
|
||||
// Quote iniziali e finali massime e
|
||||
// minime del gambo dell'utensile e DeltaZ
|
||||
@@ -3919,7 +4194,7 @@ VolZmap::CompCyl_ZMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, co
|
||||
double dX1 = vtC * vtV1 ;
|
||||
double dX2 = vtC * vtV2 ;
|
||||
|
||||
Point3d ptInt ;
|
||||
//Point3d ptInt ;
|
||||
|
||||
// Se il punto appartiene alla proiezione del volume spazzato valuto massimo e minimo
|
||||
if ( ( dX1 > 0 && dX1 < dLenXY && abs( dX2) < dSafeRad) ||
|
||||
@@ -3978,7 +4253,7 @@ VolZmap::CompConus_ZMilling( int nGrid, const Point3d& ptS, const Point3d& ptE,
|
||||
const Vector3d& vtArcNormMaxR, const Vector3d& vtArcNormMinR, int nToolNum)
|
||||
{
|
||||
int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, dMaxRad, dMinRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, V_NULL, dMaxRad, dMinRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
|
||||
Point3d ptI = ( vtToolDir * ( ptE - ptS) > 0 ? ptS : ptE) ;
|
||||
@@ -4390,7 +4665,7 @@ VolZmap::CompCyl_Drilling( int nGrid, const Point3d& ptS, const Point3d& ptE, co
|
||||
{
|
||||
// Verifico che il cilindro con il suo movimento intersechi la griglia
|
||||
int nStartI, nEndI, nStartJ, nEndJ ;
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, dRad, dRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, V_NULL, dRad, dRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
|
||||
// Studio delle simmetrie
|
||||
@@ -4423,7 +4698,7 @@ VolZmap::CompConus_Drilling( int nGrid, const Point3d& ptS, const Point3d& ptE,
|
||||
const Vector3d& vtArcNormMaxR, const Vector3d& vtArcNormMinR, int nToolNum)
|
||||
{
|
||||
int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, dMaxRad, dMinRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, V_NULL, dMaxRad, dMinRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
|
||||
// Apertura del cono
|
||||
@@ -4544,7 +4819,7 @@ VolZmap::CompCyl_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE,
|
||||
{
|
||||
// Verifica sull'interferenza utensile Zmap
|
||||
int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, dRad, dRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, V_NULL, dRad, dRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
|
||||
// Studio delle simmetrie
|
||||
@@ -4678,7 +4953,7 @@ VolZmap::CompConus_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, c
|
||||
{
|
||||
// Verifico interferenza
|
||||
int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, dMaxRad, dMinRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtToolDir, V_NULL, dMaxRad, dMinRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
|
||||
// Geometria del cono
|
||||
@@ -5155,7 +5430,7 @@ VolZmap::CompBall_Milling( int nGrid, const Point3d& ptLs, const Point3d& ptLe,
|
||||
{
|
||||
// Verifico interferisca
|
||||
int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
if ( ! TestCompoBBox( nGrid, ptLs, ptLe, V_NULL, dRad, 0, 0, nStartI, nStartJ, nEndI, nEndJ))
|
||||
if ( ! TestCompoBBox( nGrid, ptLs, ptLe, V_NULL, V_NULL, dRad, 0, 0, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
// Vettore modivemnto
|
||||
Vector3d vtV = ptLe - ptLs ;
|
||||
@@ -5330,7 +5605,7 @@ VolZmap::AddingCylinder( int nGrid, const Point3d& ptS, const Point3d& ptE, cons
|
||||
|
||||
// Verifica sull'interferenza utensile Zmap
|
||||
int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtAx, dRad, dRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtAx, V_NULL, dRad, dRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
|
||||
Vector3d vtV1 = ptE - ptS ;
|
||||
@@ -5384,7 +5659,7 @@ VolZmap::AddingTruncatedCone( int nGrid, const Point3d& ptS, const Point3d& ptE,
|
||||
|
||||
// Verifico interferenza
|
||||
int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtAx, dMaxRad, dMinRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, vtAx, V_NULL, dMaxRad, dMinRad, dHei, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
|
||||
// Geometria del cono
|
||||
@@ -5706,7 +5981,7 @@ VolZmap::AddingSphere( int nGrid, const Point3d& ptS, const Point3d& ptE, double
|
||||
|
||||
// Verifico interferisca
|
||||
int nStartI, nStartJ, nEndI, nEndJ ;
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, V_NULL, dRad, 0, 0, nStartI, nStartJ, nEndI, nEndJ))
|
||||
if ( ! TestCompoBBox( nGrid, ptS, ptE, V_NULL, V_NULL, dRad, 0, 0, nStartI, nStartJ, nEndI, nEndJ))
|
||||
return true ;
|
||||
// Vettore movimento
|
||||
Vector3d vtV = ptE - ptS ;
|
||||
@@ -5796,6 +6071,59 @@ GetCylMoveBBox( const Point3d& ptP1, const Point3d& ptP2, const Vector3d& vtV, d
|
||||
return b3Box ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
inline BBox3d
|
||||
GetCylMoveRotBBox( const Point3d& ptP1, const Point3d& ptP2, const Vector3d& vtV1, const Vector3d& vtV2, double dRad, double dH)
|
||||
{
|
||||
// Determinazione dei punti più laterali del tool, rispetto alla direzione di movimento
|
||||
// per la testa e per la punta del tool
|
||||
Point3d ptP1T = ptP1 - dH * vtV1 ;
|
||||
Point3d ptP2T = ptP2 - dH * vtV2 ;
|
||||
|
||||
Vector3d vtDirTop = ptP2 - ptP1 ;
|
||||
Vector3d vtDirTip = ptP2T - ptP1T ;
|
||||
|
||||
// determino i punti laterali del top e del bottom(tip), nella posizione di partenza
|
||||
Vector3d vtAuxTopS = vtV1 ^ vtDirTop ;
|
||||
vtAuxTopS.Normalize() ;
|
||||
vtAuxTopS *= dRad ;
|
||||
Point3d ptPTop1 = ptP1 + vtAuxTopS ;
|
||||
Point3d ptPTop2 = ptP1 - vtAuxTopS ;
|
||||
|
||||
Vector3d vtAuxBottomS = vtV1 ^ vtDirTip ;
|
||||
vtAuxBottomS.Normalize() ;
|
||||
vtAuxBottomS *= dRad ;
|
||||
Point3d ptPBottom1 = ptP1T + vtAuxBottomS ;
|
||||
Point3d ptPBottom2 = ptP1T - vtAuxBottomS ;
|
||||
|
||||
// determino i punti laterali del top e del bottom(tip), nella posizione di arrivo
|
||||
Vector3d vtAuxTopE = vtV2 ^ vtDirTop ;
|
||||
vtAuxTopE.Normalize() ;
|
||||
vtAuxTopE *= dRad ;
|
||||
Point3d ptPTop3 = ptP2 + vtAuxTopE ;
|
||||
Point3d ptPTop4 = ptP2 - vtAuxTopE ;
|
||||
|
||||
Vector3d vtAuxBottomE = vtV2 ^ vtDirTip ;
|
||||
vtAuxBottomE.Normalize() ;
|
||||
vtAuxBottomE *= dRad ;
|
||||
Point3d ptPBottom3 = ptP2T + vtAuxBottomE ;
|
||||
Point3d ptPBottom4 = ptP2T - vtAuxBottomE ;
|
||||
|
||||
// Calcolo del box del volume spazzato dal tool
|
||||
BBox3d b3Box ;
|
||||
b3Box.Add( ptPTop1) ;
|
||||
b3Box.Add( ptPTop2) ;
|
||||
b3Box.Add( ptPBottom1) ;
|
||||
b3Box.Add( ptPBottom2) ;
|
||||
b3Box.Add( ptPTop3) ;
|
||||
b3Box.Add( ptPTop4) ;
|
||||
b3Box.Add( ptPBottom3) ;
|
||||
b3Box.Add( ptPBottom4) ;
|
||||
|
||||
// Restituisco il box calcolato
|
||||
return b3Box ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
inline BBox3d
|
||||
GetSphereMoveBBox( const Point3d& ptP1, const Point3d& ptP2, double dRad)
|
||||
@@ -5820,13 +6148,13 @@ VolZmap::TestToolBBox( int nGrid, const Point3d& ptP1, const Point3d& ptP2, cons
|
||||
return false ;
|
||||
Tool& CurrTool = m_vTool[m_nCurrTool] ;
|
||||
|
||||
return TestCompoBBox( nGrid, ptP1, ptP2, vtV, CurrTool.GetRadius(), CurrTool.GetTipRadius(), CurrTool.GetHeigth(),
|
||||
return TestCompoBBox( nGrid, ptP1, ptP2, vtV, V_NULL, CurrTool.GetRadius(), CurrTool.GetTipRadius(), CurrTool.GetHeigth(),
|
||||
nStI, nStJ, nEnI, nEnJ) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
inline bool
|
||||
VolZmap::TestCompoBBox( int nGrid, const Point3d& ptP1, const Point3d& ptP2, const Vector3d& vtV,
|
||||
VolZmap::TestCompoBBox( int nGrid, const Point3d& ptP1, const Point3d& ptP2, const Vector3d& vtV, const Vector3d& vtV2,
|
||||
double dRad, double dTipRad, double dHei,
|
||||
int& nStI, int& nStJ, int& nEnI, int& nEnJ)
|
||||
{
|
||||
@@ -5841,7 +6169,13 @@ VolZmap::TestCompoBBox( int nGrid, const Point3d& ptP1, const Point3d& ptP2, con
|
||||
|
||||
// BBox dell'utensile nel suo movimento
|
||||
double dMaxRad = max( dRad, dTipRad) ;
|
||||
BBox3d b3Box = ( vtV.IsSmall() ? GetSphereMoveBBox( ptP1, ptP2, dRad) : GetCylMoveBBox( ptP1, ptP2, vtV, dMaxRad, dHei)) ;
|
||||
BBox3d b3Box ;
|
||||
if ( vtV.IsSmall())
|
||||
b3Box = GetSphereMoveBBox( ptP1, ptP2, dRad) ;
|
||||
else if( AreSameVectorExact(vtV2, V_NULL))
|
||||
b3Box = GetCylMoveBBox( ptP1, ptP2, vtV, dMaxRad, dHei) ;
|
||||
else
|
||||
b3Box = GetCylMoveRotBBox( ptP1, ptP2, vtV, vtV2, dRad, dHei) ;
|
||||
|
||||
// Verifica dell'interferenza dell'utensile con lo Zmap
|
||||
if ( ! b3Zmap.FindIntersection( b3Box, b3Box))
|
||||
|
||||
Reference in New Issue
Block a user