From c1b5f41d0d71b672c765f6f7297bfdd8b3143b04 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Mon, 25 May 2026 17:18:54 +0200 Subject: [PATCH 1/5] EgtMachKernel (MillingToolComp) : - prima versione di prova per Tool Compensation per Milling. --- Milling.cpp | 376 +++++++++++++++++++++++++++++++++++++++++++++++----- Milling.h | 6 + 2 files changed, 349 insertions(+), 33 deletions(-) diff --git a/Milling.cpp b/Milling.cpp index c65636d..4a105e2 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -839,9 +839,26 @@ Milling::Apply( bool bRecalc, bool bPostApply) // 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) ; + 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) ; + // compensazione utensile non applicata nel caso di famiglie di lame + if ( m_bToolComp && ( m_TParams.m_nType & TF_SAWBLADE) != 0) + m_bToolComp = false ; + // compensazione utensile non applicata nel caso di attacco a None, ZigZag e Tang+Perp + if ( m_bToolComp) { + int nLeadInType = GetLeadInType() ; + if ( nLeadInType == MILL_LI_NONE || nLeadInType == MILL_LI_ZIGZAG || nLeadInType == MILL_LI_TG_PERP) + m_bToolComp = false ; + } + // compensazione utensile non applicata nel caso di Step Type Spiral + if ( m_bToolComp && m_Params.m_nStepType == MILL_ST_SPIRAL) + m_bToolComp = false ; + // se compensazione utensile, forzo la componente perpendicolare di LeadIn e LeadOut + if ( m_bToolComp) { + m_Params.m_dLiCompLen = GetToolCompPerpLen() ; + m_Params.m_dLoCompLen = GetToolCompPerpLen() ; + } 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") ; @@ -2570,8 +2587,20 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo } else { Point3d ptP3 = pLine->GetEnd() ; - if ( AddLinearMove( ptP3, bSplitArcs) == GDB_ID_NULL) - return false ; + if ( ! m_bToolComp) { + if ( AddLinearMove( ptP3, bSplitArcs) == GDB_ID_NULL) + return false ; + } + else { + int nId = AddLinearMove( ptP3, bSplitArcs) ; + if ( nId == GDB_ID_NULL) + return false ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + if ( pCamData == nullptr) + return false ; + pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, false)) ; + m_pGeomDB->SetMaterial( nId, AQUA) ; + } } } else if ( pCurve->GetType() == CRV_ARC) { @@ -2590,8 +2619,20 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo double dAngCen = pArc->GetAngCenter() ; Vector3d vtN = pArc->GetNormVersor() ; Point3d ptP3 ; pArc->GetEndPoint( ptP3) ; - if ( AddArcMove( ptP3, ptCen, dAngCen, vtN) == GDB_ID_NULL) - return false ; + if ( ! m_bToolComp) { + if ( AddArcMove( ptP3, ptCen, dAngCen, vtN) == GDB_ID_NULL) + return false ; + } + else { + int nId = AddArcMove( ptP3, ptCen, dAngCen, vtN) ; + if ( nId == GDB_ID_NULL) + return false ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + if ( pCamData == nullptr) + return false ; + pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, false)) ; + m_pGeomDB->SetMaterial( nId, AQUA) ; + } } } // se ultima entità, uscita e retrazione @@ -2934,10 +2975,15 @@ Milling::AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool if ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_SAFEIN) == GDB_ID_NULL) return false ; } - // se attacco a zigzag o a spirale, non affondo + // se attacco a zigzag o a spirale o a guida, non affondo else if ( IsLeadInHelixOrZigzagOrGlide()) { ptP1 += vtTool * ( dStElev + GetLeadInOutToler()) ; dStElev = - GetLeadInOutToler() ; + if ( m_bToolComp) { + Point3d ptCurr ; GetCurrPos( ptCurr) ; + if ( ! AreSamePointApprox( ptCurr, ptP1)) + AddLinearMove( ptP1, bSplitArcs, MCH_CL_SAFEIN) ; + } } // altrimenti, affondo in feed opportuna else { @@ -2970,8 +3016,20 @@ Milling::AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool } else { Point3d ptP3 = pLine->GetEnd() ; - if ( AddLinearMove( ptP3, bSplitArcs) == GDB_ID_NULL) - return false ; + if ( ! m_bToolComp) { + if ( AddLinearMove( ptP3, bSplitArcs) == GDB_ID_NULL) + return false ; + } + else { + int nId = AddLinearMove( ptP3, bSplitArcs) ; + if ( nId == GDB_ID_NULL) + return false ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + if ( pCamData == nullptr) + return false ; + pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; + m_pGeomDB->SetMaterial( nId, AQUA) ; + } } } else if ( pCurve->GetType() == CRV_ARC) { @@ -2990,8 +3048,20 @@ Milling::AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool double dAngCen = pArc->GetAngCenter() ; Vector3d vtN = pArc->GetNormVersor() ; Point3d ptP3 ; pArc->GetEndPoint( ptP3) ; - if ( AddArcMove( ptP3, ptCen, dAngCen, vtN) == GDB_ID_NULL) - return false ; + if ( ! m_bToolComp) { + if ( AddArcMove( ptP3, ptCen, dAngCen, vtN) == GDB_ID_NULL) + return false ; + } + else { + int nId = AddArcMove( ptP3, ptCen, dAngCen, vtN) ; + if ( nId == GDB_ID_NULL) + return false ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + if ( pCamData == nullptr) + return false ; + pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; + m_pGeomDB->SetMaterial( nId, AQUA) ; + } } } // se ultima entità, uscita e se ultimo step retrazione @@ -3007,9 +3077,11 @@ Milling::AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool // se non c'è attacco a zigzag o a spirale oppure ultimo step, aggiungo uscita Point3d ptP1 = ptEnd ; Vector3d vtDir1 ; - if ( ! IsLeadInHelixOrZigzag() || k == nStep) { + if ( ! IsLeadInHelixOrZigzag() || k == nStep || m_bToolComp) { if ( k != nStep && GetLeadInType() == MILL_LI_GLIDE) dEndElev = - GetLeadInOutToler() ; + if ( k != nStep) + dEndElev = 0. ; SetFeed( GetEndFeed()) ; if ( ! AddLeadOut( ptEnd, vtEnd, vtTool, dEndElev, bInvert, pCompo, bSplitArcs, ptP1, vtDir1)) { m_pMchMgr->SetLastError( 2311, "Error in Milling : LeadOut not computable") ; @@ -4928,8 +5000,19 @@ Milling::CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const vtDir1 = -vtStart ; return true ; case MILL_LI_HELIX : - ptP1 = ptStart ; - vtDir1 = -vtStart ; + if ( ! m_bToolComp) { + ptP1 = ptStart ; + vtDir1 = -vtStart ; + } + else { + bool bAtLeft = ( bInvert != ( m_Params.m_nWorkSide != MILL_WS_RIGHT)) ; + // vettore dal punto al centro elica + Vector3d vtCen = vtStart ; + vtCen.Rotate( vtTool, 0, ( bAtLeft ? 1 : - 1)) ; + // estensione per componente perpendicolare + ptP1 = ptStart + vtCen * m_Params.m_dLiCompLen ; + vtDir1 = -vtStart ; + } return true ; default : return false ; @@ -4995,10 +5078,37 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& Vector3d vtRot = OrthoCompo( vtTool, vtStart) ; vtPerp.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ; Point3d ptMid = ptStart - vtStart * dTang + vtPerp * dPerp + vtTool * dElev ; - if ( AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) - return false ; + if ( ! m_bToolComp) { + if ( AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) + return false ; + } + else { + int nIdTC = AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) ; + if ( nIdTC == GDB_ID_NULL) + return false ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; + if ( pCamData == nullptr) + return false ; + pCamData->SetCorrType( GetCorrType( TOOL_CORR_IN, bInvert)) ; + m_pGeomDB->SetMaterial( nIdTC, AQUA) ; + } + } + if ( ! m_bToolComp) + return ( AddLinearMove( ptStart, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; + else { + int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; + if ( AddLinearMove( ptStart, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) + return false ; + int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; + for ( int nId = nIdS + 1 ; nId <= nIdE ; ++ nId) { + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + if ( pCamData != nullptr) { + pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; + m_pGeomDB->SetMaterial( nId, AQUA) ; + } + } + return true ; } - return ( AddLinearMove( ptStart, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; case MILL_LI_TG_PERP : { Vector3d vtPerp = vtStart ; @@ -5024,14 +5134,41 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& Vector3d vtRot = OrthoCompo( vtTool, vtStart) ; vtPerp.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ; ptMid = ptStart - vtStart * dTang + vtPerp * dPerp + vtTool * dElev ; - if ( AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) - return false ; + if ( ! m_bToolComp) { + if ( AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) + return false ; + } + else { + int nIdTC = AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) ; + if ( nIdTC == GDB_ID_NULL) + return false ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; + if ( pCamData == nullptr) + return false ; + pCamData->SetCorrType( GetCorrType( TOOL_CORR_IN, bInvert)) ; + m_pGeomDB->SetMaterial( nIdTC, AQUA) ; + } } PtrOwner pCrv( GetArc2PVN( ptStart, ptMid, - vtStart, vtTool)) ; if ( IsNull( pCrv)) return false ; pCrv->Invert() ; - return ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; + if ( ! m_bToolComp) + return ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; + else { + int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; + if ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) + return false ; + int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; + for ( int nId = nIdS + 1 ; nId <= nIdE ; ++ nId) { + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + if ( pCamData != nullptr) { + pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; + m_pGeomDB->SetMaterial( nId, AQUA) ; + } + } + return true ; + } } case MILL_LI_GLIDE : { @@ -5082,11 +5219,38 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& if ( dCompLen > 10 * EPS_SMALL) { Point3d ptMid ; pCrv->GetStartPoint( ptMid) ; - if ( AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) - return false ; + if ( ! m_bToolComp) { + if ( AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) + return false ; + } + else { + int nIdTC = AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) ; + if ( nIdTC == GDB_ID_NULL) + return false ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; + if ( pCamData == nullptr) + return false ; + pCamData->SetCorrType( GetCorrType( TOOL_CORR_IN, bInvert)) ; + m_pGeomDB->SetMaterial( nIdTC, AQUA) ; + } } // emetto (con eventuale spezzatura) - return ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; + if ( ! m_bToolComp) + return ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; + else { + int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; + if ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) + return false ; + int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; + for ( int nId = nIdS + 1 ; nId <= nIdE ; ++ nId) { + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + if ( pCamData != nullptr) { + pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; + m_pGeomDB->SetMaterial( nId, AQUA) ; + } + } + return true ; + } } case MILL_LI_ZIGZAG : { @@ -5160,6 +5324,8 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& // dati dell'elica double dRad = 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam) ; Point3d ptCen = ptP1 + vtCen * dRad ; + if ( m_bToolComp) + ptCen -= vtCen * GetToolCompPerpLen() ; double dDeltaN = ( ptStart - ptP1) * vtTool ; double dAngCen = ceil( - dDeltaN / ( m_Params.m_dLiElev + 10 * EPS_SMALL)) * ( bAtLeft ? ANG_FULL : - ANG_FULL) ; // creo l'elica @@ -5167,7 +5333,33 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& if ( IsNull( pArc) || ! pArc->Set( ptCen, vtTool, dRad, - vtCen, dAngCen, dDeltaN)) return false ; // emetto l'elica (con eventuale spezzatura) - return ( AddCurveMove( pArc, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; + if ( ! m_bToolComp) + return ( AddCurveMove( pArc, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; + else { + Point3d ptCorrE ; pArc->GetStartPoint( ptCorrE) ; + Vector3d vtCorrDir = ptCorrE - ptCen ; vtCorrDir.Normalize() ; + Point3d ptCorrS = ptCorrE - m_Params.m_dLiCompLen * vtCorrDir ; + int nIdTC = AddLinearMove( ptCorrE, bSplitArcs, MCH_CL_LEADIN) ; + if ( nIdTC == GDB_ID_NULL) + return false ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; + if ( pCamData == nullptr) + return false ; + pCamData->SetCorrType( GetCorrType( TOOL_CORR_IN, bInvert)) ; + m_pGeomDB->SetMaterial( nIdTC, AQUA) ; + int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; + if ( AddCurveMove( pArc, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) + return false ; + int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; + for ( int nId = nIdS + 1 ; nId <= nIdE ; ++ nId) { + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + if ( pCamData != nullptr) { + pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; + m_pGeomDB->SetMaterial( nId, AQUA) ; + } + } + return true ; + } } default : return false ; @@ -5355,7 +5547,7 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d case MILL_LI_TANGENT : nType = MILL_LO_TANGENT ; break ; case MILL_LI_GLIDE : nType = MILL_LO_GLIDE ; break ; case MILL_LI_ZIGZAG : nType = MILL_LO_NONE ; break ; - case MILL_LI_HELIX : nType = MILL_LO_NONE ; break ; + case MILL_LI_HELIX : nType = ( ! m_bToolComp ? MILL_LO_NONE : MILL_LO_LINEAR) ; break ; default : nType = MILL_LO_NONE ; break ; } dTang = m_Params.m_dLiTang ; @@ -5396,14 +5588,40 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d if ( ! vtDir1.Normalize()) return false ; // inserisco movimento di uscita - bool bOk = ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; + bool bOk = true ; + if ( ! m_bToolComp) + bOk = ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; + else { + int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; + bOk = ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; + int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; + for ( int nId = nIdS + 1 ; bOk && nId <= nIdE ; ++ nId) { + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + bOk = ( pCamData != nullptr) ; + if ( bOk) { + pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; + m_pGeomDB->SetMaterial( nId, AQUA) ; + } + } + } // 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) ; + if ( ! m_bToolComp) + bOk = bOk && ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; + else { + int nIdTC = AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) ; + bOk = ( nIdTC != GDB_ID_NULL) ; + CamData* pCamData = bOk ? GetCamData( m_pGeomDB->GetUserObj( nIdTC)) : nullptr ; + bOk = bOk && ( pCamData != nullptr) ; + if ( bOk) { + pCamData->SetCorrType( GetCorrType( TOOL_CORR_OUT, bInvert)) ; + m_pGeomDB->SetMaterial( nIdTC, AQUA) ; + } + } } // eventuale movimento in elevazione per flottante if ( m_bTHoldFloating && dFloatElev > 10 * EPS_SMALL) { @@ -5444,14 +5662,40 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d Vector3d vtDirF ; if ( ! pCrv->GetEndDir( vtDirF)) return false ; - bool bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; + bool bOk = true ; + if ( ! m_bToolComp) + bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; + else { + int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; + bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; + int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; + for ( int nId = nIdS + 1 ; bOk && nId <= nIdE ; ++ nId) { + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + bOk = ( pCamData != nullptr) ; + if ( bOk) { + pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; + m_pGeomDB->SetMaterial( nId, AQUA) ; + } + } + } // eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile) if ( dCompLen > 10 * EPS_SMALL) { vtDir1 = OrthoCompo( vtDirF, 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) ; + if ( ! m_bToolComp) + bOk = bOk && ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; + else { + int nIdTC = AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) ; + bOk = ( nIdTC != GDB_ID_NULL) ; + CamData* pCamData = bOk ? GetCamData( m_pGeomDB->GetUserObj( nIdTC)) : nullptr ; + bOk = bOk && ( pCamData != nullptr) ; + if ( bOk) { + pCamData->SetCorrType( GetCorrType( TOOL_CORR_OUT, bInvert)) ; + m_pGeomDB->SetMaterial( nIdTC, AQUA) ; + } + } } // eventuale movimento in elevazione per flottante if ( m_bTHoldFloating && dFloatElev > 10 * EPS_SMALL) { @@ -5505,14 +5749,40 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d pCrv->GetEndPoint( ptP1) ; pCrv->GetEndDir( vtDir1) ; // emetto - bool bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; + bool bOk = true ; + if ( ! m_bToolComp) + bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; + else { + int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; + bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; + int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; + for ( int nId = nIdS + 1 ; bOk && nId <= nIdE ; ++ nId) { + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + bOk = ( pCamData != nullptr) ; + if ( bOk) { + pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; + m_pGeomDB->SetMaterial( nId, AQUA) ; + } + } + } // 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) ; + if ( ! m_bToolComp) + bOk = bOk && ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; + else { + int nIdTC = AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) ; + bOk = ( nIdTC != GDB_ID_NULL) ; + CamData* pCamData = bOk ? GetCamData( m_pGeomDB->GetUserObj( nIdTC)) : nullptr ; + bOk = bOk && ( pCamData != nullptr) ; + if ( bOk) { + pCamData->SetCorrType( GetCorrType( TOOL_CORR_OUT, bInvert)) ; + m_pGeomDB->SetMaterial( nIdTC, AQUA) ; + } + } } return bOk ; } @@ -6694,8 +6964,15 @@ Milling::CalcOffset( ICurveComposite* pCompo, double dSignOffs) const // se curva piatta con estrusione non perpendicolare forzo offset avanzato bool bAdvOffs = ( bIsFlat && abs( vtExtr * plPlane.GetVersN()) < cos( 0.1 * DEGTORAD)) ; // eseguo offset semplice - if ( ! bAdvOffs && pCompo->SimpleOffset( dSignOffs, nFlag)) + if ( ! bAdvOffs) { + pCompo->SimpleOffset( dSignOffs, nFlag) ; + if ( m_bToolComp) { + int nSign = ( dSignOffs > 0.) - ( dSignOffs < 0.) ; + pCompo->SimpleOffset( - nSign * GetToolCompMinRadOffset()) ; + pCompo->SimpleOffset( nSign * GetToolCompMinRadOffset()) ; + } return true ; + } // eseguo offset avanzato if ( bIsFlat) { OffsetCurve OffsCrv ; @@ -6704,6 +6981,11 @@ Milling::CalcOffset( ICurveComposite* pCompo, double dSignOffs) const if ( pOffs != nullptr) { pCompo->Clear() ; pCompo->AddCurve( pOffs) ; + if ( m_bToolComp) { + int nSign = ( dSignOffs > 0.) - ( dSignOffs < 0.) ; + pCompo->SimpleOffset( - nSign * GetToolCompMinRadOffset()) ; + pCompo->SimpleOffset( nSign * GetToolCompMinRadOffset()) ; + } pCompo->ArcsBezierCurvesToArcsPerpExtr( LIN_TOL_MID, ANG_TOL_STD_DEG) ; return true ; } @@ -6811,3 +7093,31 @@ Milling::TrimExtendCurveToClosedStm( ICurveComposite* pCompo, int nCstmId, bool return true ; } + +//---------------------------------------------------------------------------- +int +Milling::GetCorrType( int nToolCompEntity, bool bInvert) const +{ + // verifica tipo di Entità + if ( nToolCompEntity != TOOL_CORR_PATH && nToolCompEntity != TOOL_CORR_IN && nToolCompEntity != TOOL_CORR_OUT) + return 0 ; + // se entità di Uscita, allora valore 140 + if ( nToolCompEntity == TOOL_CORR_OUT) + return 140 ; + // Se lavorazione lato destro + if ( m_Params.m_nWorkSide == MILL_WS_RIGHT) { + if ( ! bInvert) + return ( nToolCompEntity == TOOL_CORR_IN ? 141 : 41) ; + else + return ( nToolCompEntity == TOOL_CORR_IN ? 142 : 42) ; + } + // Se lavorazione lato sinistro + else if ( m_Params.m_nWorkSide == MILL_WS_LEFT) { + if ( ! bInvert) + return ( nToolCompEntity == TOOL_CORR_IN ? 142 : 42) ; + else + return ( nToolCompEntity == TOOL_CORR_IN ? 141 : 41) ; + } + // per gli altri casi + return 0 ; +} diff --git a/Milling.h b/Milling.h index 33dac0c..7afa883 100644 --- a/Milling.h +++ b/Milling.h @@ -81,6 +81,7 @@ class Milling : public Machining double m_dRampLen ; double m_dTopLen ; } ; + enum ToolCorrEntity { TOOL_CORR_PATH = 0, TOOL_CORR_IN = 1, TOOL_CORR_OUT = 2 } ; private : bool VerifyGeometry( SelData Id, int& nSubs, int& nType) ; @@ -138,6 +139,7 @@ class Milling : public Machining Vector3d CalcCorrDir( const ICurveComposite* pCompo, double dU, bool bInvertSide = false, bool bSawSpecial = false) const ; bool CalcOffset( ICurveComposite* pCompo, double dSignOffs) const ; bool TrimExtendCurveToClosedStm( ICurveComposite* pCompo, int nCstmId, bool bInvert) ; + int GetCorrType( int nToolCompEntity, bool bInvert) const ; private : double GetSpeed() const @@ -171,6 +173,10 @@ class Milling : public Machining m_Params.m_dLiTang >= 0.9 * m_TParams.m_dDiam && m_Params.m_dLiElev <= 2) ; } double GetLeadInOutToler( void) const { return ( m_bTHoldFloating ? LIO_ELEV_FLOAT : LIO_ELEV_TOL) ; } + inline double GetToolCompMinRadOffset() const + { return 100. * EPS_SMALL ; } + inline double GetToolCompPerpLen() const + { return 2.0 ; } friend class LeadIOStatus ; private : From b87cbbfb5bcc4f9292e11b210184e5ae211c8dc1 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Tue, 26 May 2026 10:14:36 +0200 Subject: [PATCH 2/5] EgtMachKernel (MillingToolComp) : - aggiunta gestione per Milling ZigZag a singolo step e multi step. --- Milling.cpp | 107 +++++++++++++++++++++++++++++++++++++++++++++++----- Milling.h | 2 +- 2 files changed, 98 insertions(+), 11 deletions(-) diff --git a/Milling.cpp b/Milling.cpp index 4a105e2..612e191 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -2977,8 +2977,10 @@ Milling::AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool } // se attacco a zigzag o a spirale o a guida, non affondo else if ( IsLeadInHelixOrZigzagOrGlide()) { - ptP1 += vtTool * ( dStElev + GetLeadInOutToler()) ; - dStElev = - GetLeadInOutToler() ; + if ( ! m_bToolComp || ( m_bToolComp && ! ( GetLeadInType() == MILL_LI_GLIDE && ! pCompo->IsClosed()))) { + ptP1 += vtTool * ( dStElev + GetLeadInOutToler()) ; + dStElev = - GetLeadInOutToler() ; + } if ( m_bToolComp) { Point3d ptCurr ; GetCurrPos( ptCurr) ; if ( ! AreSamePointApprox( ptCurr, ptP1)) @@ -4872,7 +4874,7 @@ Milling::GetLeadInType( void) const //---------------------------------------------------------------------------- bool Milling::CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtTool, - double dStElev, bool bInvert, const ICurveComposite* pCompo, Point3d& ptP1, Vector3d& vtDir1) const + double dStElev, bool bInvert, const ICurveComposite* pCompo, Point3d& ptP1, Vector3d& vtDir1) { // Assegno tipo e parametri int nType = GetLeadInType() ; @@ -4908,8 +4910,18 @@ Milling::CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const bool bCcwRot = (( ! bInvert && m_Params.m_nWorkSide == MILL_WS_LEFT) || ( bInvert && m_Params.m_nWorkSide != MILL_WS_LEFT)) ; // verifico di poter fare l'ingresso a inseguimento - if ( nType == MILL_LI_GLIDE && ! pCompo->IsClosed() && m_dAddedOverlap < EPS_SMALL) - nType = MILL_LI_NONE ; + if ( nType == MILL_LI_GLIDE && ! pCompo->IsClosed() && m_dAddedOverlap < EPS_SMALL) { + if ( ! m_bToolComp) + nType = MILL_LI_NONE ; + else { + Vector3d vtPerp = vtStart ; + Vector3d vtRot = OrthoCompo( vtTool, vtStart) ; + vtPerp.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ; + ptP1 = ptStart + vtPerp * GetToolCompPerpLen() ; + vtDir1 = ptP1 - ptStart ; + return true ; + } + } // Calcolo punto iniziale switch ( nType) { case MILL_LI_NONE : @@ -5058,8 +5070,22 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& bool bCcwRot = (( ! bInvert && m_Params.m_nWorkSide == MILL_WS_LEFT) || ( bInvert && m_Params.m_nWorkSide != MILL_WS_LEFT)) ; // verifico di poter fare l'ingresso a inseguimento - if ( nType == MILL_LI_GLIDE && ! pCompo->IsClosed() && m_dAddedOverlap < EPS_SMALL) - nType = MILL_LI_NONE ; + if ( nType == MILL_LI_GLIDE && ! pCompo->IsClosed() && m_dAddedOverlap < EPS_SMALL) { + if ( ! m_bToolComp) + nType = MILL_LI_NONE ; + else { + // aggiungo movimento per l'inizio del percorso + int nIdTC = AddLinearMove( ptStart, bSplitArcs, MCH_CL_LEADIN) ; + if ( nIdTC == GDB_ID_NULL) + return false ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; + if ( pCamData == nullptr) + return false ; + pCamData->SetCorrType( GetCorrType( TOOL_CORR_IN, bInvert)) ; + m_pGeomDB->SetMaterial( nIdTC, AQUA) ; + return true ; + } + } // Eseguo a seconda del tipo switch ( nType) { case MILL_LI_NONE : @@ -5547,7 +5573,7 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d case MILL_LI_TANGENT : nType = MILL_LO_TANGENT ; break ; case MILL_LI_GLIDE : nType = MILL_LO_GLIDE ; break ; case MILL_LI_ZIGZAG : nType = MILL_LO_NONE ; break ; - case MILL_LI_HELIX : nType = ( ! m_bToolComp ? MILL_LO_NONE : MILL_LO_LINEAR) ; break ; + case MILL_LI_HELIX : nType = MILL_LO_NONE ; break ; default : nType = MILL_LO_NONE ; break ; } dTang = m_Params.m_dLiTang ; @@ -5561,12 +5587,73 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d dElev = min( m_Params.m_dLiElev, dEndElev + GetLeadInOutToler()) ; dCompLen = m_Params.m_dLiCompLen ; } + // verifico in caso di tool compensation se richiesta uscita con 1/4 di elica + if ( m_bToolComp && GetLeadInType() == MILL_LI_HELIX && GetLeadOutType() == MILL_LO_AS_LI) { + bool bAtLeft = ( bInvert != ( m_Params.m_nWorkSide != MILL_WS_RIGHT)) ; + // vettore dal punto al centro dell'elica + Vector3d vtCen = vtEnd ; + vtCen.Rotate( vtTool, 0, ( bAtLeft ? 1 : -1)) ; + // dati dell'elica + double dRad = 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam) ; + Point3d ptCen = ptEnd + vtCen * dRad ; + double dDeltaN = ( ptEnd - ptP1) * vtTool ; + double dAngCen = ( bAtLeft ? ANG_RIGHT : - ANG_RIGHT) ; + // creo l'elica + PtrOwner pArc( CreateCurveArc()) ; + if ( IsNull( pArc) || ! pArc->Set( ptCen, vtTool, dRad, - vtCen, dAngCen, 0.)) + return false ; + // emetto l'elica (con eventuale spezzatura) + int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; + if ( AddCurveMove( pArc, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) + return false ; + int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; + for ( int nId = nIdS + 1 ; nId <= nIdE ; ++ nId) { + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + if ( pCamData != nullptr) { + pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; + m_pGeomDB->SetMaterial( nId, AQUA) ; + } + } + // emetto il tratto perpendicolare + Point3d ptCorrS ; pArc->GetEndPoint( ptCorrS) ; + Vector3d vtCorrDir = ptCen - ptCorrS ; vtCorrDir.Normalize() ; + Point3d ptCorrE = ptCorrS + m_Params.m_dLiCompLen * vtCorrDir ; + int nIdTC = AddLinearMove( ptCorrE, bSplitArcs, MCH_CL_LEADIN) ; + if ( nIdTC == GDB_ID_NULL) + return false ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; + if ( pCamData == nullptr) + return false ; + pCamData->SetCorrType( GetCorrType( TOOL_CORR_OUT, bInvert)) ; + m_pGeomDB->SetMaterial( nIdTC, AQUA) ; + ptP1 = ptCorrE ; + vtDir1 = vtCorrDir ; + return true ; + } // 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)) ; // verifico di poter fare l'uscita a inseguimento - if ( nType == MILL_LO_GLIDE && ! pCompo->IsClosed() && m_dAddedOverlap < EPS_SMALL) - nType = MILL_LO_NONE ; + if ( nType == MILL_LO_GLIDE && ! pCompo->IsClosed() && m_dAddedOverlap < EPS_SMALL) { + if ( ! m_bToolComp) + nType = MILL_LO_NONE ; + else { + Vector3d vtPerp = vtEnd ; + Vector3d vtRot = OrthoCompo( vtTool, vtEnd) ; + vtPerp.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ; + ptP1 = ptEnd + vtPerp * GetToolCompPerpLen() ; + vtDir1 = ptP1 - ptEnd ; + int nIdTC = AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADIN) ; + if ( nIdTC == GDB_ID_NULL) + return false ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; + if ( pCamData == nullptr) + return false ; + pCamData->SetCorrType( GetCorrType( TOOL_CORR_IN, bInvert)) ; + m_pGeomDB->SetMaterial( nIdTC, AQUA) ; + return true ; + } + } // eseguo a seconda del tipo switch ( nType) { case MILL_LO_NONE : diff --git a/Milling.h b/Milling.h index 7afa883..82627e2 100644 --- a/Milling.h +++ b/Milling.h @@ -116,7 +116,7 @@ class Milling : public Machining bool AddSawBladeSideRetract( const Point3d& ptP, const Vector3d& vtRetr, const Vector3d& vtTool, double dSafeZ, double dSawEndElev, double dEndElev, double dAppr, bool bAddExtract = false) ; bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtTool, - double dStElev, bool bInvert, const ICurveComposite* pCompo, Point3d& ptP1, Vector3d& vtDir1) const ; + double dStElev, bool bInvert, const ICurveComposite* pCompo, Point3d& ptP1, Vector3d& vtDir1) ; bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtTool, double dStElev, bool bInvert, const ICurveComposite* pCompo, bool bSplitArcs) ; bool CalcLeadOutEnd( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d& vtTool, From 1ebce72c1dbbdf78539819b4529b948976f0ecf0 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Tue, 26 May 2026 11:18:06 +0200 Subject: [PATCH 3/5] EgtMachKernel (MillingToolComp) : - piccola correzione. --- Milling.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Milling.cpp b/Milling.cpp index 612e191..a3798aa 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -7051,13 +7051,12 @@ Milling::CalcOffset( ICurveComposite* pCompo, double dSignOffs) const // se curva piatta con estrusione non perpendicolare forzo offset avanzato bool bAdvOffs = ( bIsFlat && abs( vtExtr * plPlane.GetVersN()) < cos( 0.1 * DEGTORAD)) ; // eseguo offset semplice - if ( ! bAdvOffs) { - pCompo->SimpleOffset( dSignOffs, nFlag) ; - if ( m_bToolComp) { - int nSign = ( dSignOffs > 0.) - ( dSignOffs < 0.) ; - pCompo->SimpleOffset( - nSign * GetToolCompMinRadOffset()) ; - pCompo->SimpleOffset( nSign * GetToolCompMinRadOffset()) ; - } + if ( ! m_bToolComp && ! bAdvOffs && pCompo->SimpleOffset( dSignOffs, nFlag)) + return true ; + if ( m_bToolComp) { + int nSign = ( dSignOffs > 0.) - ( dSignOffs < 0.) ; + pCompo->SimpleOffset( - nSign * GetToolCompMinRadOffset()) ; + pCompo->SimpleOffset( nSign * GetToolCompMinRadOffset()) ; return true ; } // eseguo offset avanzato From f089cd1e1c2324a76151c1e8075695eec02ac14d Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Tue, 26 May 2026 16:11:09 +0200 Subject: [PATCH 4/5] =?UTF-8?q?EgtMachKernel=20(MillingToolComp)=20:=20-?= =?UTF-8?q?=20aggiunta=20gestione=20per=20OneWay=20a=20pi=C3=B9=20step=20e?= =?UTF-8?q?=20semplificazione=20del=20codice.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Milling.cpp | 311 +++++++++++++----------------------------------- Operation.h | 4 + OperationCL.cpp | 56 +++++++++ 3 files changed, 144 insertions(+), 227 deletions(-) diff --git a/Milling.cpp b/Milling.cpp index a3798aa..7731182 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -50,6 +50,7 @@ const double OSC_MIN_LEN = 0.1 ; const double LIM_DOWN_APPRZ = -0.5 ; const double DELTA_ELEV_RAD = 4.0 ; const double LIM_SIN_DIFF_DIR = 0.175 ; +const Color TOOL_CORR_COLOR = Color( 0, 255, 255) ; //------------------------------ Errors -------------------------------------- // 2301 = "Error in Milling : UpdateToolData failed" @@ -858,6 +859,10 @@ Milling::Apply( bool bRecalc, bool bPostApply) if ( m_bToolComp) { m_Params.m_dLiCompLen = GetToolCompPerpLen() ; m_Params.m_dLoCompLen = GetToolCompPerpLen() ; + // l'uscita deve essere tra quelle ammesse + int nLeadOutType = GetLeadOutType() ; + if ( nLeadOutType == MILL_LO_NONE || nLeadOutType == MILL_LO_PERP_TG) + m_Params.m_nLeadOutType = MILL_LO_AS_LI ; } if ( m_bToolComp && m_TParams.m_nCorr == 0) { m_bToolComp = false ; @@ -2592,14 +2597,8 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo return false ; } else { - int nId = AddLinearMove( ptP3, bSplitArcs) ; - if ( nId == GDB_ID_NULL) + if ( AddLinearMove( ptP3, bSplitArcs, GetCorrType( TOOL_CORR_PATH, false), nullptr, &TOOL_CORR_COLOR) == GDB_ID_NULL) return false ; - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; - if ( pCamData == nullptr) - return false ; - pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, false)) ; - m_pGeomDB->SetMaterial( nId, AQUA) ; } } } @@ -2624,14 +2623,8 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo return false ; } else { - int nId = AddArcMove( ptP3, ptCen, dAngCen, vtN) ; - if ( nId == GDB_ID_NULL) + if ( AddArcMove( ptP3, ptCen, dAngCen, vtN, GetCorrType( TOOL_CORR_PATH, false), nullptr, &TOOL_CORR_COLOR) == GDB_ID_NULL) return false ; - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; - if ( pCamData == nullptr) - return false ; - pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, false)) ; - m_pGeomDB->SetMaterial( nId, AQUA) ; } } } @@ -3318,7 +3311,6 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool Point3d ptStart ; pCurve->GetStartPoint( ptStart) ; Vector3d vtStart = m_vtStartDir ; - // pCurve->GetStartDir( vtStart) ; // imposto versore correzione e ausiliario sul punto di partenza CalcAndSetCorrAuxDir( pCompo, i, false, true) ; // punto inizio attacco @@ -3326,7 +3318,7 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool Vector3d vtDir1 ; double dCalcStElev = 0 ; // se speciale e step intermedio - if ( bSpecial && k > 1) { + if ( ! m_bToolComp && bSpecial && k > 1) { ptP1 = ptStart + dStep * vtTool ; } // altrimenti @@ -3377,19 +3369,25 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool dStElev = ( j - 1) * dStep ; } // approccio standard al punto iniziale - if ( k == 1 || bMidRetract) { - if ( ! AddApproach( ptP1, vtTool, dSafeZ, dSafeAggrBottZ, dStElev, dExtrAppr, bOutStart, - bAhAboveStartEnd || bUhBelowStartEnd, k == 1, bSplitArcs)) { - m_pMchMgr->SetLastError( 2309, "Error in Milling : Approach not computable") ; - return false ; + if ( ! ( m_bToolComp && bSpecial && k > 1)) { + if ( k == 1 || bMidRetract) { + if ( ! AddApproach( ptP1, vtTool, dSafeZ, dSafeAggrBottZ, dStElev, dExtrAppr, bOutStart, + bAhAboveStartEnd || bUhBelowStartEnd, k == 1, bSplitArcs)) { + m_pMchMgr->SetLastError( 2309, "Error in Milling : Approach not computable") ; + return false ; + } + } + // altrimenti approccio diretto al punto iniziale + else { + if ( ! AddDirectApproach( ptP1, bSplitArcs)) { + m_pMchMgr->SetLastError( 2309, "Error in Milling : Approach not computable") ; + return false ; + } } } - // altrimenti approccio diretto al punto iniziale else { - if ( ! AddDirectApproach( ptP1, bSplitArcs)) { - m_pMchMgr->SetLastError( 2309, "Error in Milling : Approach not computable") ; - return false ; - } + SetFeed( GetStartFeed()) ; + AddLinearMove( ptP1) ; } } // altrimenti, approccio per lame e frese che non lavorano di testa @@ -3476,6 +3474,7 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool } } } + // aggiungo attacco SetFeed( GetStartFeed()) ; if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtTool, dCalcStElev, false, pCompo, bSplitArcs)) { @@ -3499,8 +3498,14 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool } else { Point3d ptP3 = pLine->GetEnd() ; - if ( AddLinearMove( ptP3, bSplitArcs) == GDB_ID_NULL) - return false ; + if ( ! m_bToolComp) { + if ( AddLinearMove( ptP3, bSplitArcs) == GDB_ID_NULL) + return false ; + } + else { + if ( AddLinearMove( ptP3, bSplitArcs, GetCorrType( TOOL_CORR_PATH, false), nullptr, &TOOL_CORR_COLOR) == GDB_ID_NULL) + return false ; + } } } else if ( pCurve->GetType() == CRV_ARC) { @@ -3519,20 +3524,25 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool double dAngCen = pArc->GetAngCenter() ; Vector3d vtN = pArc->GetNormVersor() ; Point3d ptP3 ; pArc->GetEndPoint( ptP3) ; - if ( AddArcMove( ptP3, ptCen, dAngCen, vtN) == GDB_ID_NULL) - return false ; + if ( ! m_bToolComp) { + if ( AddArcMove( ptP3, ptCen, dAngCen, vtN) == GDB_ID_NULL) + return false ; + } + else { + if ( AddArcMove( ptP3, ptCen, dAngCen, vtN, GetCorrType( TOOL_CORR_PATH, false), nullptr, &TOOL_CORR_COLOR) == GDB_ID_NULL) + return false ; + } } } // se ultima entità, uscita e retrazione if ( i == nMaxInd) { // se speciale e step intermedio salto uscita e retrazione - if ( bSpecial && k != nStep) + if ( bSpecial && k != nStep && ! m_bToolComp) continue ; // dati fine entità Point3d ptEnd ; pCurve->GetEndPoint( ptEnd) ; Vector3d vtEnd = m_vtEndDir ; - // pCurve->GetEndDir( vtEnd) ; // elevazione sul punto finale double dEndElev ; if ( ! GetElevation( m_nPhase, ptEnd, vtTool, GetRadiusForStartEndElevation(), vtTool, dEndElev)) @@ -3547,8 +3557,11 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool m_pMchMgr->SetLastError( 2311, "Error in Milling : LeadOut not computable") ; return false ; } + // se tool compensation e speciale, allora salto uscita e retroazione + if ( m_bToolComp && bSpecial && k != nStep) + continue ; // se step finale o intermedi con retrazione - if ( k == nStep || bMidRetract || ! bSafeDirLinkStartEnd) { + if ( ( k == nStep || bMidRetract || ! bSafeDirLinkStartEnd)) { // determino se la fine dell'uscita è fuori dal grezzo Vector3d vtRetr( vtTool.x, vtTool.y, 0) ; if ( ! vtRetr.Normalize()) @@ -5073,18 +5086,8 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& if ( nType == MILL_LI_GLIDE && ! pCompo->IsClosed() && m_dAddedOverlap < EPS_SMALL) { if ( ! m_bToolComp) nType = MILL_LI_NONE ; - else { - // aggiungo movimento per l'inizio del percorso - int nIdTC = AddLinearMove( ptStart, bSplitArcs, MCH_CL_LEADIN) ; - if ( nIdTC == GDB_ID_NULL) - return false ; - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; - if ( pCamData == nullptr) - return false ; - pCamData->SetCorrType( GetCorrType( TOOL_CORR_IN, bInvert)) ; - m_pGeomDB->SetMaterial( nIdTC, AQUA) ; - return true ; - } + else + return ( AddLinearMove( ptStart, bSplitArcs, GetCorrType( TOOL_CORR_IN, bInvert), &MCH_CL_LEADIN, &TOOL_CORR_COLOR) != GDB_ID_NULL) ; } // Eseguo a seconda del tipo switch ( nType) { @@ -5109,32 +5112,14 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& return false ; } else { - int nIdTC = AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) ; - if ( nIdTC == GDB_ID_NULL) + if ( AddLinearMove( ptMid, bSplitArcs, GetCorrType( TOOL_CORR_IN, bInvert), &MCH_CL_LEADIN, &TOOL_CORR_COLOR) == GDB_ID_NULL) return false ; - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; - if ( pCamData == nullptr) - return false ; - pCamData->SetCorrType( GetCorrType( TOOL_CORR_IN, bInvert)) ; - m_pGeomDB->SetMaterial( nIdTC, AQUA) ; } } if ( ! m_bToolComp) return ( AddLinearMove( ptStart, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; - else { - int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; - if ( AddLinearMove( ptStart, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) - return false ; - int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; - for ( int nId = nIdS + 1 ; nId <= nIdE ; ++ nId) { - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; - if ( pCamData != nullptr) { - pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; - m_pGeomDB->SetMaterial( nId, AQUA) ; - } - } - return true ; - } + else + return ( AddLinearMove( ptStart, bSplitArcs, GetCorrType( TOOL_CORR_PATH, bInvert), &MCH_CL_LEADIN, &TOOL_CORR_COLOR) != GDB_ID_NULL) ; case MILL_LI_TG_PERP : { Vector3d vtPerp = vtStart ; @@ -5165,14 +5150,8 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& return false ; } else { - int nIdTC = AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) ; - if ( nIdTC == GDB_ID_NULL) + if ( AddLinearMove( ptMid, bSplitArcs, GetCorrType( TOOL_CORR_IN, bInvert), &MCH_CL_LEADIN, &TOOL_CORR_COLOR) == GDB_ID_NULL) return false ; - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; - if ( pCamData == nullptr) - return false ; - pCamData->SetCorrType( GetCorrType( TOOL_CORR_IN, bInvert)) ; - m_pGeomDB->SetMaterial( nIdTC, AQUA) ; } } PtrOwner pCrv( GetArc2PVN( ptStart, ptMid, - vtStart, vtTool)) ; @@ -5181,20 +5160,8 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& pCrv->Invert() ; if ( ! m_bToolComp) return ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; - else { - int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; - if ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) - return false ; - int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; - for ( int nId = nIdS + 1 ; nId <= nIdE ; ++ nId) { - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; - if ( pCamData != nullptr) { - pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; - m_pGeomDB->SetMaterial( nId, AQUA) ; - } - } - return true ; - } + else + return ( AddCurveMove( pCrv, bSplitArcs, GetCorrType( TOOL_CORR_PATH, bInvert), &MCH_CL_LEADIN, &TOOL_CORR_COLOR) != GDB_ID_NULL) ; } case MILL_LI_GLIDE : { @@ -5250,33 +5217,15 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& return false ; } else { - int nIdTC = AddLinearMove( ptMid, bSplitArcs, MCH_CL_LEADIN) ; - if ( nIdTC == GDB_ID_NULL) + if ( AddLinearMove( ptMid, bSplitArcs, GetCorrType( TOOL_CORR_IN, bInvert), &MCH_CL_LEADIN, &TOOL_CORR_COLOR) == GDB_ID_NULL) return false ; - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; - if ( pCamData == nullptr) - return false ; - pCamData->SetCorrType( GetCorrType( TOOL_CORR_IN, bInvert)) ; - m_pGeomDB->SetMaterial( nIdTC, AQUA) ; } } // emetto (con eventuale spezzatura) if ( ! m_bToolComp) return ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; - else { - int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; - if ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) - return false ; - int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; - for ( int nId = nIdS + 1 ; nId <= nIdE ; ++ nId) { - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; - if ( pCamData != nullptr) { - pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; - m_pGeomDB->SetMaterial( nId, AQUA) ; - } - } - return true ; - } + else + return ( AddCurveMove( pCrv, bSplitArcs, GetCorrType( TOOL_CORR_PATH, bInvert), &MCH_CL_LEADIN, &TOOL_CORR_COLOR) != GDB_ID_NULL) ; } case MILL_LI_ZIGZAG : { @@ -5365,26 +5314,9 @@ Milling::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& Point3d ptCorrE ; pArc->GetStartPoint( ptCorrE) ; Vector3d vtCorrDir = ptCorrE - ptCen ; vtCorrDir.Normalize() ; Point3d ptCorrS = ptCorrE - m_Params.m_dLiCompLen * vtCorrDir ; - int nIdTC = AddLinearMove( ptCorrE, bSplitArcs, MCH_CL_LEADIN) ; - if ( nIdTC == GDB_ID_NULL) + if ( AddLinearMove( ptCorrE, bSplitArcs, GetCorrType( TOOL_CORR_IN, bInvert), &MCH_CL_LEADIN, &TOOL_CORR_COLOR) == GDB_ID_NULL) return false ; - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; - if ( pCamData == nullptr) - return false ; - pCamData->SetCorrType( GetCorrType( TOOL_CORR_IN, bInvert)) ; - m_pGeomDB->SetMaterial( nIdTC, AQUA) ; - int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; - if ( AddCurveMove( pArc, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) - return false ; - int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; - for ( int nId = nIdS + 1 ; nId <= nIdE ; ++ nId) { - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; - if ( pCamData != nullptr) { - pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; - m_pGeomDB->SetMaterial( nId, AQUA) ; - } - } - return true ; + return ( AddCurveMove( pArc, bSplitArcs, GetCorrType( TOOL_CORR_PATH, bInvert), &MCH_CL_LEADIN, &TOOL_CORR_COLOR) != GDB_ID_NULL) ; } } default : @@ -5603,29 +5535,14 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d if ( IsNull( pArc) || ! pArc->Set( ptCen, vtTool, dRad, - vtCen, dAngCen, 0.)) return false ; // emetto l'elica (con eventuale spezzatura) - int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; - if ( AddCurveMove( pArc, bSplitArcs, MCH_CL_LEADIN) == GDB_ID_NULL) + if ( AddCurveMove( pArc, bSplitArcs, GetCorrType( TOOL_CORR_PATH, bInvert), &MCH_CL_LEADIN, &TOOL_CORR_COLOR) == GDB_ID_NULL) return false ; - int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; - for ( int nId = nIdS + 1 ; nId <= nIdE ; ++ nId) { - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; - if ( pCamData != nullptr) { - pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; - m_pGeomDB->SetMaterial( nId, AQUA) ; - } - } // emetto il tratto perpendicolare Point3d ptCorrS ; pArc->GetEndPoint( ptCorrS) ; Vector3d vtCorrDir = ptCen - ptCorrS ; vtCorrDir.Normalize() ; Point3d ptCorrE = ptCorrS + m_Params.m_dLiCompLen * vtCorrDir ; - int nIdTC = AddLinearMove( ptCorrE, bSplitArcs, MCH_CL_LEADIN) ; - if ( nIdTC == GDB_ID_NULL) + if ( AddLinearMove( ptCorrE, bSplitArcs, GetCorrType( TOOL_CORR_OUT, bInvert), &MCH_CL_LEADIN, &TOOL_CORR_COLOR) == GDB_ID_NULL) return false ; - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; - if ( pCamData == nullptr) - return false ; - pCamData->SetCorrType( GetCorrType( TOOL_CORR_OUT, bInvert)) ; - m_pGeomDB->SetMaterial( nIdTC, AQUA) ; ptP1 = ptCorrE ; vtDir1 = vtCorrDir ; return true ; @@ -5643,15 +5560,7 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d vtPerp.Rotate( vtRot, 0, ( bCcwRot ? 1 : - 1)) ; ptP1 = ptEnd + vtPerp * GetToolCompPerpLen() ; vtDir1 = ptP1 - ptEnd ; - int nIdTC = AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADIN) ; - if ( nIdTC == GDB_ID_NULL) - return false ; - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nIdTC)) ; - if ( pCamData == nullptr) - return false ; - pCamData->SetCorrType( GetCorrType( TOOL_CORR_IN, bInvert)) ; - m_pGeomDB->SetMaterial( nIdTC, AQUA) ; - return true ; + return ( AddLinearMove( ptP1, bSplitArcs, GetCorrType( TOOL_CORR_IN, bInvert), &MCH_CL_LEADIN, &TOOL_CORR_COLOR) != GDB_ID_NULL) ; } } // eseguo a seconda del tipo @@ -5679,17 +5588,7 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d if ( ! m_bToolComp) bOk = ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; else { - int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; - bOk = ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; - int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; - for ( int nId = nIdS + 1 ; bOk && nId <= nIdE ; ++ nId) { - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; - bOk = ( pCamData != nullptr) ; - if ( bOk) { - pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; - m_pGeomDB->SetMaterial( nId, AQUA) ; - } - } + bOk = ( AddLinearMove( ptP1, bSplitArcs, GetCorrType( TOOL_CORR_PATH, bInvert), &MCH_CL_LEADOUT, &TOOL_CORR_COLOR) != GDB_ID_NULL) ; } // eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile) if ( dCompLen > 10 * EPS_SMALL) { @@ -5699,16 +5598,8 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d ptP1 += vtDir1 * dCompLen ; if ( ! m_bToolComp) bOk = bOk && ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; - else { - int nIdTC = AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) ; - bOk = ( nIdTC != GDB_ID_NULL) ; - CamData* pCamData = bOk ? GetCamData( m_pGeomDB->GetUserObj( nIdTC)) : nullptr ; - bOk = bOk && ( pCamData != nullptr) ; - if ( bOk) { - pCamData->SetCorrType( GetCorrType( TOOL_CORR_OUT, bInvert)) ; - m_pGeomDB->SetMaterial( nIdTC, AQUA) ; - } - } + else + bOk = bOk && ( AddLinearMove( ptP1, bSplitArcs, GetCorrType( TOOL_CORR_OUT, bInvert), &MCH_CL_LEADOUT, &TOOL_CORR_COLOR) != GDB_ID_NULL) ; } // eventuale movimento in elevazione per flottante if ( m_bTHoldFloating && dFloatElev > 10 * EPS_SMALL) { @@ -5752,19 +5643,8 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d bool bOk = true ; if ( ! m_bToolComp) bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; - else { - int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; - bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; - int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; - for ( int nId = nIdS + 1 ; bOk && nId <= nIdE ; ++ nId) { - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; - bOk = ( pCamData != nullptr) ; - if ( bOk) { - pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; - m_pGeomDB->SetMaterial( nId, AQUA) ; - } - } - } + else + bOk = ( AddCurveMove( pCrv, bSplitArcs, GetCorrType( TOOL_CORR_PATH, bInvert), &MCH_CL_LEADOUT, &TOOL_CORR_COLOR) != GDB_ID_NULL) ; // eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile) if ( dCompLen > 10 * EPS_SMALL) { vtDir1 = OrthoCompo( vtDirF, vtTool) ; @@ -5773,16 +5653,8 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d ptP1 += vtDir1 * dCompLen ; if ( ! m_bToolComp) bOk = bOk && ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; - else { - int nIdTC = AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) ; - bOk = ( nIdTC != GDB_ID_NULL) ; - CamData* pCamData = bOk ? GetCamData( m_pGeomDB->GetUserObj( nIdTC)) : nullptr ; - bOk = bOk && ( pCamData != nullptr) ; - if ( bOk) { - pCamData->SetCorrType( GetCorrType( TOOL_CORR_OUT, bInvert)) ; - m_pGeomDB->SetMaterial( nIdTC, AQUA) ; - } - } + else + bOk = bOk && ( AddLinearMove( ptP1, bSplitArcs, GetCorrType( TOOL_CORR_OUT, bInvert), &MCH_CL_LEADOUT, &TOOL_CORR_COLOR) != GDB_ID_NULL) ; } // eventuale movimento in elevazione per flottante if ( m_bTHoldFloating && dFloatElev > 10 * EPS_SMALL) { @@ -5839,19 +5711,8 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d bool bOk = true ; if ( ! m_bToolComp) bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; - else { - int nIdS = m_pGeomDB->GetLastInGroup( m_nPathId) ; - bOk = ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; - int nIdE = m_pGeomDB->GetLastInGroup( m_nPathId) ; - for ( int nId = nIdS + 1 ; bOk && nId <= nIdE ; ++ nId) { - CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; - bOk = ( pCamData != nullptr) ; - if ( bOk) { - pCamData->SetCorrType( GetCorrType( TOOL_CORR_PATH, bInvert)) ; - m_pGeomDB->SetMaterial( nId, AQUA) ; - } - } - } + else + bOk = ( AddCurveMove( pCrv, bSplitArcs, GetCorrType( TOOL_CORR_PATH, bInvert), &MCH_CL_LEADOUT, &TOOL_CORR_COLOR) != GDB_ID_NULL) ; // eventuale movimento ortogonale (estensione di inserimento compensazione raggio utensile) if ( dCompLen > 10 * EPS_SMALL) { vtDir1 = OrthoCompo( vtDir1, vtTool) ; @@ -5860,16 +5721,8 @@ Milling::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d ptP1 += vtDir1 * dCompLen ; if ( ! m_bToolComp) bOk = bOk && ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; - else { - int nIdTC = AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) ; - bOk = ( nIdTC != GDB_ID_NULL) ; - CamData* pCamData = bOk ? GetCamData( m_pGeomDB->GetUserObj( nIdTC)) : nullptr ; - bOk = bOk && ( pCamData != nullptr) ; - if ( bOk) { - pCamData->SetCorrType( GetCorrType( TOOL_CORR_OUT, bInvert)) ; - m_pGeomDB->SetMaterial( nIdTC, AQUA) ; - } - } + else + bOk = bOk && ( AddLinearMove( ptP1, bSplitArcs, GetCorrType( TOOL_CORR_OUT, bInvert), &MCH_CL_LEADOUT, &TOOL_CORR_COLOR) != GDB_ID_NULL) ; } return bOk ; } @@ -7051,13 +6904,17 @@ Milling::CalcOffset( ICurveComposite* pCompo, double dSignOffs) const // se curva piatta con estrusione non perpendicolare forzo offset avanzato bool bAdvOffs = ( bIsFlat && abs( vtExtr * plPlane.GetVersN()) < cos( 0.1 * DEGTORAD)) ; // eseguo offset semplice - if ( ! m_bToolComp && ! bAdvOffs && pCompo->SimpleOffset( dSignOffs, nFlag)) - return true ; - if ( m_bToolComp) { - int nSign = ( dSignOffs > 0.) - ( dSignOffs < 0.) ; - pCompo->SimpleOffset( - nSign * GetToolCompMinRadOffset()) ; - pCompo->SimpleOffset( nSign * GetToolCompMinRadOffset()) ; - return true ; + if ( ! m_bToolComp) { + if ( ! bAdvOffs && pCompo->SimpleOffset( dSignOffs, nFlag)) + return true ; + } + else { + if ( ! bAdvOffs && pCompo->SimpleOffset( dSignOffs, nFlag)) { + int nSign = ( dSignOffs > 0.) - ( dSignOffs < 0.) ; + pCompo->SimpleOffset( - nSign * GetToolCompMinRadOffset()) ; + pCompo->SimpleOffset( nSign * GetToolCompMinRadOffset()) ; + return true ; + } } // eseguo offset avanzato if ( bIsFlat) { diff --git a/Operation.h b/Operation.h index 74b803e..0b82380 100644 --- a/Operation.h +++ b/Operation.h @@ -325,12 +325,16 @@ class Operation : public IUserObj int AddLinearMove( const Point3d& ptP, const std::string& sName) ; int AddLinearMove( const Point3d& ptP, bool bSplit) ; int AddLinearMove( const Point3d& ptP, bool bSplit, const std::string& sName) ; + int AddLinearMove( const Point3d& ptP, bool bSplit, int nCorrType, const std::string* sName = nullptr, const Color* pColor = nullptr) ; int AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN) ; int AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN, const std::string& sName) ; + int AddArcMove ( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN, int nCorrType, + const std::string* psName = nullptr, const Color* pColor = nullptr) ; int AddCurveMove( const ICurve* pCrv) ; int AddCurveMove( const ICurve* pCrv, const std::string& sName) ; int AddCurveMove( const ICurve* pCrv, bool bSplit) ; int AddCurveMove( const ICurve* pCrv, bool bSplit, const std::string& sName) ; + int AddCurveMove( const ICurve* pCrv, bool bSplit, int nCorrType, const std::string* psName = nullptr, const Color* pColor = nullptr) ; bool ResetMoveData( void) ; protected : diff --git a/OperationCL.cpp b/OperationCL.cpp index 60760f9..ab471d4 100644 --- a/OperationCL.cpp +++ b/OperationCL.cpp @@ -348,6 +348,25 @@ Operation::AddLinearMove( const Point3d& ptP, bool bSplit, const string& sName) return nFirstId ; } +//---------------------------------------------------------------------------- +int +Operation::AddLinearMove( const Point3d& ptP, bool bSplit, int nCorrType, const string* psName, const Color* pColor) +{ + int nFirstId = AddLinearMove( ptP, bSplit) ; + int nId = nFirstId ; + while ( nId != GDB_ID_NULL) { + if ( psName != nullptr) + m_pGeomDB->SetName( nId, *psName) ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + if ( pCamData == nullptr || ! pCamData->SetCorrType( nCorrType)) + return GDB_ID_NULL ; + if ( pColor != nullptr) + m_pGeomDB->SetMaterial( nId, *pColor) ; + nId = m_pGeomDB->GetNext( nId) ; + } + return nFirstId ; +} + //---------------------------------------------------------------------------- int Operation::AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN) @@ -422,6 +441,24 @@ Operation::AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, return nId ; } +//---------------------------------------------------------------------------- +int +Operation::AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN, int nCorrType, + const string* psName, const Color* pColor) +{ + int nId = AddArcMove( ptP, ptCen, dAngCen, vtN) ; + if ( nId != GDB_ID_NULL) { + if ( psName != nullptr) + m_pGeomDB->SetName( nId, *psName) ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + if ( pCamData == nullptr || ! pCamData->SetCorrType( nCorrType)) + return GDB_ID_NULL ; + if ( pColor != nullptr) + m_pGeomDB->SetMaterial( nId, *pColor) ; + } + return nId ; +} + //---------------------------------------------------------------------------- int Operation::AddCurveMove( const ICurve* pCrv) @@ -530,6 +567,25 @@ Operation::AddCurveMove( const ICurve* pCrv, bool bSplit, const string& sName) return nFirstId ; } +//---------------------------------------------------------------------------- +int +Operation::AddCurveMove( const ICurve* pCrv, bool bSplit, int nCorrType, const string* psName, const Color* pColor) +{ + int nFirstId = AddCurveMove( pCrv, bSplit) ; + int nId = nFirstId ; + while ( nId != GDB_ID_NULL) { + if ( psName != nullptr) + m_pGeomDB->SetName( nId, *psName) ; + CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nId)) ; + if ( pCamData == nullptr || ! pCamData->SetCorrType( nCorrType)) + return GDB_ID_NULL ; + if ( pColor != nullptr) + m_pGeomDB->SetMaterial( nId, *pColor) ; + nId = m_pGeomDB->GetNext( nId) ; + } + return nFirstId ; +} + //---------------------------------------------------------------------------- bool Operation::ResetMoveData( void) From dfa0069a0b402c0a45ddcc56b75056e8f0050962 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Tue, 26 May 2026 17:00:31 +0200 Subject: [PATCH 5/5] EgtMachKernel (MillingToolComp) : - prima versione per Tool Compensation in lavorazioni Milling. --- EgtMachKernel.rc | Bin 11774 -> 11774 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 11a1c7e02d9fcf40b888a411fa2b605266b94498..6be67a2fb9a653b68854109e4a110ebb776d0c41 100644 GIT binary patch delta 241 zcmewt{V#gMI%aiGhCGIJh8%`ehGHOAV9;O)W+-7u1ma8}FBB-731Uz7R&U)L$1;bB z(QNZ?Hd|&!v&j!7bvLJRO<)0wTx6PjLa+cPDg+fpQs=?Ad6l#WP#;h`nqrWY@;63e oowE6~YB8f=KG?0EV7KM~-I%!9TYV!lrtsv`ss}fp(l%iN0BRgWK>z>% delta 236 zcmewt{V#gMI%aKGhCGIJh8%`WhGK>c1_cHUhESkLCPN8BDnkm89}HwAf_cT0IklxX ze_&=~W;EUWUhX2(<& nF)y2}rOv|(a;PWRX*mp)Acsx