EgtGeomKernel :

- miglioria a virtual milling con chisel su Zmap.
This commit is contained in:
Dario Sassi
2018-08-31 08:52:45 +00:00
parent 2d3657a268
commit 7a051e4e29
+28 -55
View File
@@ -3785,65 +3785,38 @@ VolZmap::CompPar_ZMilling( unsigned int nGrid, double dLenX, double dLenY, doubl
const Point3d& ptS, const Point3d& ptE,
const Vector3d& vtToolDir, const Vector3d& vtAux)
{
// uso funzione generica per verifica rapida
return CompPar_Milling( nGrid, dLenX, dLenY, dLenZ, ptS, ptE, vtToolDir, vtAux) ;
// Controllo sull'interferenza utensile-solido
unsigned int nStartI, nStartJ, nEndI, nEndJ ;
bool bInterf = BBoxParaComp( nGrid, dLenX, dLenY, dLenZ, ptS, ptE, vtToolDir, vtAux, nStartI, nStartJ, nEndI, nEndJ) ;
if ( ! bInterf)
return true ;
// Materiale asportato nelle posizioni iniziale e finale
// Costruisco un sistema di riferimento nel piano
Point3d ptSXY( ptS.x, ptS.y, 0) ;
Point3d ptEXY( ptE.x, ptE.y, 0) ;
Vector3d vtV1 = vtToolDir ^ vtAux ;
Vector3d vtV2 = vtAux ;
if ( vtV1 * ( ptE - ptS) < 0)
vtV1 *= - 1 ;
double dLenMove = ( ( ( ptE - ptS) * vtV1) * vtV1).Len() ;
// Quote estreme del volume asportato
// Quote estreme Z
double dMinZ = min( min( ptS.z, ptS.z - vtToolDir.z * dLenZ), min( ptE.z, ptE.z - vtToolDir.z * dLenZ)) ;
double dMaxZ = max( max( ptS.z, ptS.z - vtToolDir.z * dLenZ), max( ptE.z, ptE.z - vtToolDir.z * dLenZ)) ;
// Vettore di movimento
Vector3d vtMove = ptE - ptS ;
// Sistemi di riferimento del solido nella posizione iniziale e finale
Vector3d vtV2 = vtAux ;
Vector3d vtV1 = vtV2 ^ vtToolDir ;
vtV1.Normalize() ;
Point3d ptSXY( ptS.x, ptS.y, 0) ;
Point3d ptEXY( ptE.x, ptE.y, 0) ;
// Studio del volume asportato durante il moto
// Studio delle simmetrie
Point3d ptLs = ( ( ptE - ptS) * vtAux > 0 ? ptS : ptE) ;
Point3d ptLe = ( ( ptE - ptS) * vtAux > 0 ? ptE : ptS) ;
Vector3d vtMove = ptLe - ptLs ;
Vector3d vtW3 = vtAux ;
Vector3d vtAnsatz = ( vtW3 ^ vtToolDir) ;
bool bSymmetry = vtMove * ( vtW3 ^ vtToolDir) > 0 ;
Vector3d vtW2 = ( bSymmetry ? vtAnsatz : - vtAnsatz) ;
Vector3d vtW1 = ( bSymmetry ? vtToolDir : - vtToolDir) ;
Point3d ptDiagMin = ptLs - vtW2 * ( 0.5 * dLenX) + vtW3 * ( 0.5 * dLenY) ;
Point3d ptDiagMax = ptLs + vtW2 * ( 0.5 * dLenX) - vtW3 * ( 0.5 * dLenY) ;
Vector3d vtU1 = ptDiagMax - ptDiagMin ; vtU1.Normalize() ;
Vector3d vtU2 = ( vtU1 * vtMove > 0 ? vtMove - vtMove * vtU1 * vtU1 :
vtMove * vtU1 * vtU1 - vtMove) ;
vtU2.Normalize() ;
Point3d ptOMot = ( vtMove * vtU1 > 0 ? ptDiagMin : ptDiagMin + vtMove) ;
Point3d ptOMotXY( ptOMot.x, ptOMot.y, 0) ;
double dLen1 = vtMove * vtU1 ;
double dLen2 = vtMove * vtU2 ;
double dHx = ( ptDiagMax - ptDiagMin).Len() ;
Frame3d MotionFrame ;
Vector3d vtDiagA = dLenX * vtV1 + dLenY * vtV2 ;
Vector3d vtDiagB = dLenX * vtV1 - dLenY * vtV2 ;
Vector3d vtW1 = ( abs( vtDiagA * vtMove) <= abs( vtDiagB * vtMove) ? vtDiagA : vtDiagB) ;
Point3d ptOrigXY = ptSXY - vtW1 / 2 ;
double dLenW1 = vtW1.Len() ;
vtW1 /= dLenW1 ;
double dDeltaW1 = vtMove * vtW1 ;
Vector3d vtW2 = vtMove - dDeltaW1 * vtW1 ;
double dLenW2 = vtW2.Len() ;
vtW2 /= dLenW2 ;
for ( unsigned int i = nStartI ; i <= nEndI ; ++ i) {
for ( unsigned int j = nStartJ ; j <= nEndJ ; ++ j) {
@@ -3872,12 +3845,12 @@ VolZmap::CompPar_ZMilling( unsigned int nGrid, double dLenX, double dLenY, doubl
SubtractIntervals( nGrid, i, j, dMinZ, dMaxZ, Z_AX, - Z_AX) ;
// Asportazione materiale nel moto
Vector3d vtR = ptC - ptOMotXY ;
double dR1 = vtR * vtU1 ;
double dR2 = vtR * vtU2 ;
if ( dR2 > EPS_SMALL && dR2 < dLen2 - EPS_SMALL &&
dR1 * dLen2 > dLen1 * dR2 + EPS_SMALL &&
dR1 * dLen2 < dHx * dLen2 + dLen1 * dR2 - EPS_SMALL)
Vector3d vtR = ptC - ptOrigXY ;
double dR1 = vtR * vtW1 ;
double dR2 = vtR * vtW2 ;
if ( dR2 > EPS_SMALL && dR2 < dLenW2 - EPS_SMALL &&
dR1 * dLenW2 > /*dLenW1*/dDeltaW1 * dR2 + EPS_SMALL &&
dR1 * dLenW2 < /*dDeltaW1*/dLenW1 * dLenW2 + /*dLenW1*/ dDeltaW1 * dR2 - EPS_SMALL)
SubtractIntervals( nGrid, i, j, dMinZ, dMaxZ, Z_AX, - Z_AX) ;
}
}