EgtMachKernel 3.1e5 :

- modifiche a svuotature per correzioni raggio fresa in macchina
- preparazione di fresature per correzioni raggio fresa in macchina.
This commit is contained in:
Dario Sassi
2026-05-25 07:37:58 +02:00
parent f2b8f25fbd
commit a91525108c
11 changed files with 180 additions and 81 deletions
+87 -33
View File
@@ -92,6 +92,7 @@ const double LIM_SIN_DIFF_DIR = 0.175 ;
// 2362 = "Warning in Milling : tabs incompatible with saw blade"
// 2363 = "Warning in Milling : tabs impossible"
// 2364 = "Warning in Milling : tabs number less than minimum"
// 2365 = "Warning in Milling : No compensation in tool, so no compensation in machine"
//----------------------------------------------------------------------------
USEROBJ_REGISTER( GetOperationClass( OPER_MILLING), Milling) ;
@@ -259,6 +260,7 @@ Milling::Milling( void)
m_bAggrBottom = false ;
m_dCurrOscillLen = 0 ;
m_dCurrTabsLen = 0 ;
m_bToolComp = false ;
m_bStartOutRaw = false ;
m_bEndOutRaw = false ;
}
@@ -835,6 +837,16 @@ Milling::Apply( bool bRecalc, bool bPostApply)
CalcSurfAuxView( nAuxId, nAuxViewId) ;
}
// recupero flag correzione raggio fresa
int nToolComp = TOOL_COMP_PROGRAM ;
bool m_bToolComp = ( GetValInNotes( m_Params.m_sUserNotes, UN_TOOL_COMPENSATION, nToolComp) &&
( nToolComp == TOOL_COMP_RADIUS || nToolComp == TOOL_COMP_LEN_AND_RAD) &&
m_Params.m_nWorkSide != MILL_WS_CENTER) ;
if ( m_bToolComp && m_TParams.m_nCorr == 0) {
m_bToolComp = false ;
m_pMchMgr->SetWarning( 2365, "Warning in Milling : No compensation in tool, so no compensation in machine") ;
}
// lavoro ogni singola catena
bool bOk = true ;
int nPathId = m_pGeomDB->GetFirstGroupInGroup( nAuxId) ;
@@ -1795,7 +1807,7 @@ Milling::ProcessPath( int nPathId, int nPvId, int nClId)
double dOffs = 0.5 * m_TParams.m_dDiam + GetOffsR() ;
if ( m_Params.m_nWorkSide != MILL_WS_CENTER && abs( dOffs) > EPS_SMALL) {
// valore offset
double dSignOffs = ( m_Params.m_nWorkSide == MILL_WS_RIGHT) ? dOffs : - dOffs ;
double dSignOffs = (( m_Params.m_nWorkSide == MILL_WS_RIGHT) ? dOffs : - dOffs) ;
// esecuzione offset
if ( ! CalcOffset( pCompo, dSignOffs)) {
m_pMchMgr->SetLastError( 2302, "Error in Milling : Offset not computable") ;
@@ -4797,6 +4809,7 @@ Milling::CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const
double dElev = m_Params.m_dLiElev ;
if ( m_TParams.m_nType != TT_MILL_POLISHING)
dElev = min( m_Params.m_dLiElev, dStElev + GetLeadInOutToler()) ;
double dCompLen = m_Params.m_dLiCompLen ;
// se step invertito
if ( bInvert) {
// va aggiustato se non zigzag o spirale
@@ -4815,6 +4828,7 @@ Milling::CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const
dElev = m_Params.m_dLoElev ;
if ( m_TParams.m_nType != TT_MILL_POLISHING)
dElev = min( m_Params.m_dLoElev, dStElev + GetLeadInOutToler()) ;
dCompLen = m_Params.m_dLoCompLen ;
}
}
}
@@ -4838,15 +4852,15 @@ Milling::CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const
vtDir1 = ptP1 - ptStart ;
if ( ! vtDir1.Normalize())
return false ;
bool bOk = true ;
// eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile)
if ( m_Params.m_dLiCompLen > 10 * EPS_SMALL) {
if ( dCompLen > 10 * EPS_SMALL) {
vtDir1 = OrthoCompo( vtDir1, vtTool) ;
bOk = bOk && vtDir1.Normalize() ;
vtDir1.Rotate( vtRot, 0, ( bCcwRot ? -1 : 1)) ;
ptP1 += vtDir1 * m_Params.m_dLiCompLen ;
if ( ! vtDir1.Normalize())
return false ;
vtDir1.Rotate( vtTool, 0, ( bCcwRot ? -1 : 1)) ;
ptP1 += vtDir1 * dCompLen ;
}
return bOk ;
return true ;
}
case MILL_LI_TG_PERP : {
Vector3d vtPerp = vtStart ;
@@ -4864,17 +4878,18 @@ Milling::CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const
vtDir1 = ptP1 - ptStart ;
if ( ! vtDir1.Normalize())
return false ;
bool bOk = true ;
// eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile)
if ( m_Params.m_dLiCompLen > 10 * EPS_SMALL) {
if ( dCompLen > 10 * EPS_SMALL) {
PtrOwner<ICurve> pCrv( GetArc2PVN( ptStart, ptP1, - vtStart, vtTool)) ;
bOk = bOk && ! IsNull( pCrv) && pCrv->GetEndDir( vtDir1) ;
if ( IsNull( pCrv) || ! pCrv->GetEndDir( vtDir1))
return false ;
vtDir1 = OrthoCompo( vtDir1, vtTool) ;
bOk = bOk && vtDir1.Normalize() ;
vtDir1.Rotate( vtRot, 0, ( bCcwRot ? -1 : 1)) ;
ptP1 += vtDir1 * m_Params.m_dLiCompLen ;
if ( ! vtDir1.Normalize())
return false ;
vtDir1.Rotate( vtTool, 0, ( bCcwRot ? -1 : 1)) ;
ptP1 += vtDir1 * dCompLen ;
}
return bOk ;
return true ;
}
case MILL_LI_GLIDE :
{
@@ -4896,7 +4911,17 @@ Milling::CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const
}
ptP1 += vtTool * ( vtTool * ( ptStart - ptP1)) + vtTool * dElev ;
vtDir1 = ptP1 - ptStart ;
return vtDir1.Normalize() ;
if ( ! vtDir1.Normalize())
return false ;
// eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile)
if ( dCompLen > 10 * EPS_SMALL) {
vtDir1 = OrthoCompo( vtDir1, vtTool) ;
if ( ! vtDir1.Normalize())
return false ;
vtDir1.Rotate( vtTool, 0, ( bCcwRot ? -1 : 1)) ;
ptP1 += vtDir1 * dCompLen ;
}
return true ;
}
case MILL_LI_ZIGZAG :
ptP1 = ptStart ;
@@ -4923,6 +4948,7 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d&
double dElev = m_Params.m_dLiElev ;
if ( m_TParams.m_nType != TT_MILL_POLISHING)
dElev = min( m_Params.m_dLiElev, dStElev + GetLeadInOutToler()) ;
double dCompLen = m_Params.m_dLiCompLen ;
// se step invertito
if ( bInvert) {
// va aggiustato se non zigzag o spirale
@@ -4941,6 +4967,7 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d&
dElev = m_Params.m_dLoElev ;
if ( m_TParams.m_nType != TT_MILL_POLISHING)
dElev = min( m_Params.m_dLoElev, dStElev + GetLeadInOutToler()) ;
dCompLen = m_Params.m_dLoCompLen ;
}
}
}
@@ -4963,7 +4990,7 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d&
dElev = 0 ;
}
// eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile)
if ( m_Params.m_dLiCompLen > 10 * EPS_SMALL) {
if ( dCompLen > 10 * EPS_SMALL) {
Vector3d vtPerp = vtStart ;
Vector3d vtRot = OrthoCompo( vtTool, vtStart) ;
vtPerp.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ;
@@ -4992,7 +5019,7 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d&
dElev = 0 ;
}
// eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile)
if ( m_Params.m_dLiCompLen > 10 * EPS_SMALL) {
if ( dCompLen > 10 * EPS_SMALL) {
Vector3d vtPerp = vtStart ;
Vector3d vtRot = OrthoCompo( vtTool, vtStart) ;
vtPerp.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ;
@@ -5051,6 +5078,13 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d&
double dNini = ( ptP1 - ORIG) * vtTool ;
double dNfin = ( ptStart - ORIG) * vtTool ;
AdjustCurveSlope( pCrv, dNini, dNfin) ;
// eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile)
if ( dCompLen > 10 * EPS_SMALL) {
Point3d ptMid ;
pCrv->GetStartPoint( ptMid) ;
if ( AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL)
return false ;
}
// emetto (con eventuale spezzatura)
return ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ;
}
@@ -5165,6 +5199,7 @@ Milling::CalcLeadOutEnd( const Point3d& ptEnd, const Vector3d& vtEnd, const Vect
double dElev = m_Params.m_dLoElev ;
if ( m_TParams.m_nType != TT_MILL_POLISHING)
dElev = min( m_Params.m_dLoElev, dEndElev + GetLeadInOutToler()) ;
double dCompLen = m_Params.m_dLoCompLen ;
// se uscita come ingresso o step invertito
if ( nType == MILL_LO_AS_LI || bInvert) {
int nLiType = GetLeadInType() ;
@@ -5186,10 +5221,11 @@ Milling::CalcLeadOutEnd( const Point3d& ptEnd, const Vector3d& vtEnd, const Vect
dElev = m_Params.m_dLiElev ;
if ( m_TParams.m_nType != TT_MILL_POLISHING)
dElev = min( m_Params.m_dLiElev, dEndElev + GetLeadInOutToler()) ;
dCompLen = m_Params.m_dLiCompLen ;
}
// senso di rotazione da dir tg a dir esterna
bool bCcwRot = (( ! bInvert && m_Params.m_nWorkSide == MILL_WS_LEFT) ||
( bInvert && m_Params.m_nWorkSide != MILL_WS_LEFT)) ;
( bInvert && m_Params.m_nWorkSide != MILL_WS_LEFT)) ;
// verifico di poter fare l'uscita a inseguimento
if ( nType == MILL_LO_GLIDE && ! pCompo->IsClosed() && m_dAddedOverlap < EPS_SMALL)
nType = MILL_LO_NONE ;
@@ -5204,11 +5240,11 @@ Milling::CalcLeadOutEnd( const Point3d& ptEnd, const Vector3d& vtEnd, const Vect
Vector3d vtRot = OrthoCompo( vtTool, vtEnd) ;
vtPerp.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ;
ptP1 = ptEnd + vtEnd * dTang + vtPerp * dPerp + vtTool * dElev ;
if ( m_Params.m_dLoCompLen > 10 * EPS_SMALL) {
if ( dCompLen > 10 * EPS_SMALL) {
Vector3d vtPerp2 = vtEnd * dTang + vtPerp * dPerp ;
if ( vtPerp2.Normalize()) {
vtPerp2.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ;
ptP1 += vtPerp2 * m_Params.m_dLoCompLen ;
ptP1 += vtPerp2 * dCompLen ;
}
}
return true ;
@@ -5229,11 +5265,11 @@ Milling::CalcLeadOutEnd( const Point3d& ptEnd, const Vector3d& vtEnd, const Vect
Vector3d vtRot = OrthoCompo( vtTool, vtEnd) ;
vtPerp.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ;
ptP1 = ptEnd + vtEnd * dTang + vtPerp * dPerp + vtTool * dElev ;
if ( m_Params.m_dLoCompLen > 10 * EPS_SMALL) {
if ( dCompLen > 10 * EPS_SMALL) {
Vector3d vtPerp2 = vtEnd * dTang + vtPerp * dPerp ;
if ( vtPerp2.Normalize()) {
vtPerp2.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ;
ptP1 += vtPerp2 * m_Params.m_dLoCompLen ;
ptP1 += vtPerp2 * dCompLen ;
}
}
return true ;
@@ -5281,6 +5317,15 @@ Milling::CalcLeadOutEnd( const Point3d& ptEnd, const Vector3d& vtEnd, const Vect
AdjustCurveSlope( pCrv, dNini, dNini + dElev) ;
// assegno punto finale dell'uscita
pCrv->GetEndPoint( ptP1) ;
// eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile)
if ( dCompLen > 10 * EPS_SMALL) {
Vector3d vtDir1 ;
pCrv->GetEndDir( vtDir1) ;
vtDir1 = OrthoCompo( vtDir1, vtTool) ;
vtDir1.Normalize() ;
vtDir1.Rotate( vtTool, 0, ( bCcwRot ? 1 : - 1)) ;
ptP1 += vtDir1 * dCompLen ;
}
return true ;
}
default :
@@ -5300,6 +5345,7 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d
double dElev = m_Params.m_dLoElev ;
if ( m_TParams.m_nType != TT_MILL_POLISHING)
dElev = min( m_Params.m_dLoElev, dEndElev + GetLeadInOutToler()) ;
double dCompLen = m_Params.m_dLoCompLen ;
// se uscita come ingresso o step invertito
if ( nType == MILL_LO_AS_LI || bInvert) {
int nLiType = GetLeadInType() ;
@@ -5321,6 +5367,7 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d
dElev = m_Params.m_dLiElev ;
if ( m_TParams.m_nType != TT_MILL_POLISHING)
dElev = min( m_Params.m_dLiElev, dEndElev + GetLeadInOutToler()) ;
dCompLen = m_Params.m_dLiCompLen ;
}
// senso di rotazione da dir tg a dir esterna
bool bCcwRot = (( ! bInvert && m_Params.m_nWorkSide == MILL_WS_LEFT) ||
@@ -5351,11 +5398,11 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d
// inserisco movimento di uscita
bool bOk = ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
// eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile)
if ( m_Params.m_dLoCompLen > 10 * EPS_SMALL) {
if ( dCompLen > 10 * EPS_SMALL) {
vtDir1 = OrthoCompo( vtDir1, vtTool) ;
bOk = bOk && vtDir1.Normalize() ;
vtDir1.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ;
ptP1 += vtDir1 * m_Params.m_dLoCompLen ;
vtDir1.Rotate( vtTool, 0, ( bCcwRot ? 1 : - 1)) ;
ptP1 += vtDir1 * dCompLen ;
bOk = bOk && ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
}
// eventuale movimento in elevazione per flottante
@@ -5397,14 +5444,13 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d
Vector3d vtDirF ;
if ( ! pCrv->GetEndDir( vtDirF))
return false ;
bool bOk = true ;
bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
bool bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
// eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile)
if ( m_Params.m_dLoCompLen > 10 * EPS_SMALL) {
if ( dCompLen > 10 * EPS_SMALL) {
vtDir1 = OrthoCompo( vtDirF, vtTool) ;
bOk = bOk && vtDir1.Normalize() ;
vtDir1.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ;
ptP1 += vtDir1 * m_Params.m_dLoCompLen ;
vtDir1.Rotate( vtTool, 0, ( bCcwRot ? 1 : - 1)) ;
ptP1 += vtDir1 * dCompLen ;
bOk = bOk && ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
}
// eventuale movimento in elevazione per flottante
@@ -5455,12 +5501,20 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d
// assegno la corretta pendenza
double dNini = ( ptEnd - ORIG) * vtTool ;
AdjustCurveSlope( pCrv, dNini, dNini + dElev) ;
// emetto
AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) ;
// assegno punto e direzione finale dell'uscita
pCrv->GetEndPoint( ptP1) ;
pCrv->GetEndDir( vtDir1) ;
return true ;
// emetto
bool bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
// eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile)
if ( dCompLen > 10 * EPS_SMALL) {
vtDir1 = OrthoCompo( vtDir1, vtTool) ;
bOk = bOk && vtDir1.Normalize() ;
vtDir1.Rotate( vtTool, 0, ( bCcwRot ? 1 : - 1)) ;
ptP1 += vtDir1 * dCompLen ;
bOk = bOk && ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
}
return bOk ;
}
default :
return false ;