EgtGeomKernel :
- miglioria a virtual milling con chisel su Zmap.
This commit is contained in:
+28
-55
@@ -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) ;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user