EgtGeomKernel :

- migliorie nella intersezione tra triangoli
- correzione a IntersSurfTmSurfTm che non interpretava correttamente i nuovi risultati di IntersTriaTria
- correzioni a Zmap per Mortising con movimento nel piano ma non perpendicolare all'asse dell'utensile.
This commit is contained in:
Dario Sassi
2019-11-12 07:44:51 +00:00
parent f031160066
commit 068681c474
4 changed files with 91 additions and 56 deletions
+40 -29
View File
@@ -611,7 +611,7 @@ VolZmap::MillingStep( const Point3d& ptPs, const Vector3d& vtDs, const Vector3d&
Mrt_ZMilling( i, ptLs[i], ptLe[i], vtLs[i], vtALs[i]) ;
break ;
case Tool::CHISEL :
Chs_ZMilling( i, ptLs[i], ptLe[i], vtLs[i], vtALs[i]) ;
Chs_Milling( i, ptLs[i], ptLe[i], vtLs[i], vtALs[i]) ;
break ;
}
}
@@ -628,6 +628,10 @@ VolZmap::MillingStep( const Point3d& ptPs, const Vector3d& vtDs, const Vector3d&
break ;
case Tool::CONEMILL :
Conus_ZMilling( i, ptLs[i], ptLe[i], vtLs[i]) ;
break ;
case Tool::MORTISER :
Mrt_Milling( i, ptLs[i], ptLe[i], vtLs[i], vtALs[i]) ;
break ;
}
}
}
@@ -697,6 +701,9 @@ VolZmap::MillingStep( const Point3d& ptPs, const Vector3d& vtDs, const Vector3d&
case Tool::CONEMILL :
Conus_XYMilling( i, ptLs[i], ptLe[i], vtLs[i]) ;
break ;
case Tool::MORTISER :
Mrt_Milling( i, ptLs[i], ptLe[i], vtLs[i], vtALs[i]) ;
break ;
}
}
}
@@ -745,9 +752,7 @@ VolZmap::MillingStep( const Point3d& ptPs, const Vector3d& vtDs, const Vector3d&
Conus_Milling( i, ptLs[i], ptLe[i], vtLs[i]) ;
break ;
case Tool::MORTISER :
// ammesso solo movimento perpendicolare all'asse utensile
if ( dSqLLong < EPS_SMALL * EPS_SMALL)
Mrt_Milling( i, ptLs[i], ptLe[i], vtLs[i], vtALs[i]) ;
Mrt_Milling( i, ptLs[i], ptLe[i], vtLs[i], vtALs[i]) ;
break ;
case Tool::CHISEL :
// ammesso solo movimento perpendicolare all'asse utensile
@@ -1601,12 +1606,10 @@ VolZmap::Mrt_ZMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, const
{
// Proiezione della traiettoria sul piano di movimento
Vector3d vtPlV = vtToolDir ^ vtAux ;
if ( vtPlV * ( ptE - ptS) < 0)
vtPlV *= - 1 ;
Point3d ptPlS = ptS ;
Point3d ptPlE = ptS + ( ptE - ptS) * vtPlV * vtPlV ;
Point3d ptPlE = ptS + ( ( ptE - ptS) - ( ptE - ptS) * vtAux * vtAux) ;
// Scompongo la mortasatrice in solidi semplici
@@ -1615,7 +1618,7 @@ VolZmap::Mrt_ZMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, const
double dLenY = m_Tool.GetMrtChsThickness() ;
double dLenZ = m_Tool.GetHeigth() - m_Tool.GetCornRadius() ;
CompPar_ZMilling( nGrid, dLenX, dLenY, dLenZ, ptPlS, ptPlE, vtToolDir, vtAux) ;
CompPar_Milling( nGrid, dLenX, dLenY, dLenZ, ptPlS, ptPlE, vtToolDir, vtAux) ;
// Se la punta è di tipo bull-nose
if ( abs( m_Tool.GetMrtChsWidth() - 2 * m_Tool.GetCornRadius()) > EPS_SMALL) {
@@ -1626,12 +1629,15 @@ VolZmap::Mrt_ZMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, const
dLenX = abs( m_Tool.GetMrtChsWidth() - 2 * m_Tool.GetCornRadius()) ;
dLenZ = m_Tool.GetCornRadius() ;
// Cilindro ( il moto dei due cilindri si sovrappone, quindi è inutile
CompPar_Milling( nGrid, dLenX, dLenY, dLenZ, ptTipS, ptTipE, vtToolDir, vtAux) ;
// Cilindri ( il moto dei due cilindri non sempre si sovrappone, quindi è fondamentale
// eseguire due volte il conto
Point3d ptSminus = ptTipS - ( 0.5 * dLenX) * vtPlV + 0.5 * dLenY * vtAux ;
Point3d ptEplus = ptTipE + ( 0.5 * dLenX) * vtPlV + 0.5 * dLenY * vtAux ;
CompCyl_Milling( nGrid, ptSminus, ptEplus, vtAux, dLenY, m_Tool.GetCornRadius(), false, false) ;
Point3d ptSCyl = ptTipS - ( 0.5 * dLenX) * vtPlV + 0.5 * dLenY * vtAux ;
Point3d ptECyl = ptTipE - ( 0.5 * dLenX) * vtPlV + 0.5 * dLenY * vtAux ;
CompCyl_Milling( nGrid, ptSCyl, ptECyl, vtAux, dLenY, m_Tool.GetCornRadius(), false, false) ;
ptSCyl = ptTipS + ( 0.5 * dLenX) * vtPlV + 0.5 * dLenY * vtAux ;
ptECyl = ptTipE + ( 0.5 * dLenX) * vtPlV + 0.5 * dLenY * vtAux ;
CompCyl_Milling( nGrid, ptSCyl, ptECyl, vtAux, dLenY, m_Tool.GetCornRadius(), false, false) ;
}
// se la punta è di tipo sfera
@@ -2792,9 +2798,11 @@ bool
VolZmap::Mrt_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtToolDir, const Vector3d& vtAux)
{
// Proiezione della traiettoria sul piano dei movimenti possibili
Point3d ptSp = ptS ;
Vector3d vtMoveDir = vtToolDir ^ vtAux ;
Point3d ptEp = ptS + ( ptE - ptS) * vtMoveDir * vtMoveDir ;
Vector3d vtVOnP = vtToolDir ^ vtAux ;
if ( vtVOnP * ( ptE - ptS) < 0)
vtVOnP *= -1 ;
Point3d ptPlS = ptS ;
Point3d ptPlE = ptS + ( ( ptE - ptS) - (ptE - ptS) * vtAux * vtAux) ;
// Scompongo la mortasatrice in solidi semplici
@@ -2803,35 +2811,38 @@ VolZmap::Mrt_Milling( int nGrid, const Point3d& ptS, const Point3d& ptE, const V
double dLenY = m_Tool.GetMrtChsThickness() ;
double dLenZ = m_Tool.GetHeigth() - m_Tool.GetCornRadius() ;
CompPar_Milling( nGrid, dLenX, dLenY, dLenZ, ptS, ptEp, vtToolDir, vtAux) ;
Point3d ptBasePS = ptPlS - 0.5 * dLenZ * vtToolDir + 0.5 * dLenY * vtAux ;
Point3d ptBasePE = ptPlE - 0.5 * dLenZ * vtToolDir + 0.5 * dLenY * vtAux ;
CompPar_Milling( nGrid, dLenX, dLenZ, dLenY, ptBasePS, ptBasePE, vtAux, vtToolDir) ;
// Se la punta è di tipo bull-nose
if ( abs( m_Tool.GetMrtChsWidth() - 2 * m_Tool.GetCornRadius()) > EPS_SMALL) {
// Parallelepipedo di punta
Point3d ptTipS = ptS - dLenZ * vtToolDir ;
Point3d ptTipE = ptEp - dLenZ * vtToolDir ;
Point3d ptTipPS = ptBasePS - 0.5 * dLenZ * vtToolDir ;
Point3d ptTipPE = ptBasePE - 0.5 * dLenZ * vtToolDir ;
dLenX = abs( m_Tool.GetMrtChsWidth() - 2 * m_Tool.GetCornRadius()) ;
dLenZ = m_Tool.GetCornRadius() ;
Vector3d vtVOnP = vtToolDir ^ vtAux ;
if ( vtVOnP * ( ptTipE - ptTipS) < 0)
vtVOnP *= - 1 ;
ptTipPS -= 0.5 * dLenZ * vtToolDir ;
ptTipPE -= 0.5 * dLenZ * vtToolDir ;
CompPar_Milling( nGrid, dLenX, dLenZ, dLenY, ptTipPS, ptTipPE, vtAux, vtToolDir) ;
// Cilindri
Point3d ptSminus = ptTipS - ( 0.5 * dLenX) * vtVOnP + 0.5 * dLenY * vtAux ;
Point3d ptEminus = ptTipE - ( 0.5 * dLenX) * vtVOnP + 0.5 * dLenY * vtAux ;
Point3d ptSplus = ptTipS + ( 0.5 * dLenX) * vtVOnP + 0.5 * dLenY * vtAux ;
Point3d ptEplus = ptTipE + ( 0.5 * dLenX) * vtVOnP + 0.5 * dLenY * vtAux ;
CompCyl_Milling( nGrid, ptSminus, ptEplus, vtAux, dLenY, m_Tool.GetCornRadius(), false, false) ;
Point3d ptSminus = ptTipPS + 0.5 * dLenZ * vtToolDir - ( 0.5 * dLenX) * vtVOnP ;
Point3d ptEminus = ptTipPE + 0.5 * dLenZ * vtToolDir - ( 0.5 * dLenX) * vtVOnP ;
CompCyl_Milling( nGrid, ptSminus, ptEminus, vtAux, dLenY, m_Tool.GetCornRadius(), false, false) ;
Point3d ptSplus = ptTipPS + 0.5 * dLenZ * vtToolDir + ( 0.5 * dLenX) * vtVOnP ;
Point3d ptEplus = ptTipPE + 0.5 * dLenZ * vtToolDir + ( 0.5 * dLenX) * vtVOnP ;
CompCyl_Milling( nGrid, ptSplus, ptEplus, vtAux, dLenY, m_Tool.GetCornRadius(), false, false) ;
}
// se la punta è di tipo sfera
else {
// Cilindro
Point3d ptCylS = ptS - dLenZ * vtToolDir + 0.5 * dLenY * vtAux ;
Point3d ptCylE = ptEp - dLenZ * vtToolDir + 0.5 * dLenY * vtAux ;
Point3d ptCylS = ptBasePS - 0.5 * dLenZ * vtToolDir ;
Point3d ptCylE = ptBasePE - 0.5 * dLenZ * vtToolDir ;
CompCyl_Milling( nGrid, ptCylS, ptCylE, vtAux, dLenY, m_Tool.GetCornRadius(), false, false) ;
}