From 8e196fbfc6bd47a1469a16dd7ab00aaf0fb7f9bc Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Sat, 14 Sep 2024 12:37:41 +0200 Subject: [PATCH] EgtMachKernel 2.6i2 : - per aggregato da sotto aggiunta gestione approcci/retrazione di tipo 3 (prima parallelo al grezzo poi ruota a perpendicolare stando sotto e viceversa) - ai punti aggiunti per garantire la precisione lineare con assi rotanti in movimento tolto flag 401 e impostato flag2 a -1 - nelle forature aggiustati i fori a step con i foratori multipli rotanti. --- Drilling.cpp | 66 ++++++++++++++++++++++++++++++++++++++++------- Drilling.h | 4 +-- EgtMachKernel.rc | Bin 11774 -> 11774 bytes Milling.cpp | 27 ++++++++++++++++--- Operation.cpp | 2 +- Pocketing.cpp | 31 ++++++++++++++++++---- 6 files changed, 109 insertions(+), 21 deletions(-) diff --git a/Drilling.cpp b/Drilling.cpp index 928d111..720ad98 100644 --- a/Drilling.cpp +++ b/Drilling.cpp @@ -1690,7 +1690,7 @@ Drilling::GenerateHoleCl( int nInd, const SelData& nCircId, const string& sPName } } else { - if ( DoPeckDrilling( hole, nCircId, nPathId)) { + if ( DoPeckDrilling( hole, nCircId, nPathId, dMHOff, vtA)) { // aggiorno numero forature ++ m_nDrillings ; } @@ -2097,7 +2097,7 @@ Drilling::VerifyHoleFromBottom( const Hole& hole, SelData Id) //---------------------------------------------------------------------------- bool -Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double dMHOff, Vector3d vtA) +Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double dMHOff, const Vector3d& vtA) { // aggiusto alcuni parametri del ciclo di foratura double dStartSlowLen = abs( m_Params.m_dStartSlowLen) ; @@ -2132,19 +2132,33 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double Point3d ptP1 = hole.ptIni + hole.vtDir * ( dAppr + dElev + dTExtrLen + dMHOff) ; if ( m_bAggrBottom) { Point3d ptP0 = ptP1 + m_vtAggrBottom * ( m_dDistBottom + m_AggrBottom.dEncH + dSafeZ) ; - Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ; // se rinvio da sotto che richiede speciale rotazione if ( m_AggrBottom.nType == 1) { + // punto ruotato + Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ; Vector3d vtAux = m_vtAggrBottom ; vtAux.Rotate( Z_AX, 0, 1) ; SetAuxDir( vtAux) ; if ( AddRapidStart( ptP00, MCH_CL_AGB_DWN) == GDB_ID_NULL) return false ; + // vado al punto standard SetAuxDir( m_vtAggrBottom) ; SetFlag( 0) ; if ( AddRapidMove( ptP0, bSplitArcs, MCH_CL_AGB_IN) == GDB_ID_NULL) return false ; } + // se altrimenti con rotazione per minimizzare la sporgenza + else if ( m_AggrBottom.nType == 3) { + // punto standard ruotato + Vector3d vtAux = m_vtAggrBottom ; + vtAux.Rotate( Z_AX, 0, 1) ; + SetAuxDir( vtAux) ; + if ( AddRapidStart( ptP0, MCH_CL_AGB_IN) == GDB_ID_NULL) + return false ; + // la rotazione viene eseguita nel movimento successivo al punto sopra l'inizio lavorazione + SetAuxDir( m_vtAggrBottom) ; + SetFlag( 0) ; + } // altrimenti rinvio normale else { SetAuxDir( m_vtAggrBottom) ; @@ -2156,7 +2170,7 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double return false ; } else { - if( ! vtA.IsSmall()) + if ( ! vtA.IsSmall()) SetAuxDir( vtA) ; if ( AddRapidStart( ptP1) == GDB_ID_NULL) return false ; @@ -2205,13 +2219,21 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double return false ; // 7 -> punto fuori (se uso aggregato da sotto) if ( m_bAggrBottom) { + // se con rotazione per minimizzare la sporgenza + if ( m_AggrBottom.nType == 3) { + // imposto rotazione su punto standard + Vector3d vtAux = m_vtAggrBottom ; + vtAux.Rotate( Z_AX, 0, 1) ; + SetAuxDir( vtAux) ; + } SetFlag( 0) ; + // vado al punto Point3d ptP0 = ptP1 + m_vtAggrBottom * ( m_dDistBottom + m_AggrBottom.dEncH + dSafeZ) ; - Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ; if ( AddRapidMove( ptP0, bSplitArcs, MCH_CL_AGB_OUT) == GDB_ID_NULL) return false ; - // se rinvio da sotto che richiede speciale rotazione + // se rinvio da sotto che richiede speciale rotazione if ( m_AggrBottom.nType == 1) { + Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ; Vector3d vtAux = m_vtAggrBottom ; vtAux.Rotate( Z_AX, 0, 1) ; SetAuxDir( vtAux) ; @@ -2228,7 +2250,7 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double //---------------------------------------------------------------------------- bool -Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId) +Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId, double dMHOff, const Vector3d& vtA) { // aggiusto alcuni parametri del ciclo di foratura double dStartSlowLen = abs( m_Params.m_dStartSlowLen) ; @@ -2262,22 +2284,36 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId) double dSafeZ = GetSafeZ() ; double dSafeAggrBottZ = GetSafeAggrBottZ() ; double dAppr = ( m_bAggrBottom ? dSafeAggrBottZ : dSafeZ) ; - Point3d ptP1 = hole.ptIni + hole.vtDir * ( dAppr + dElev + dTExtrLen) ; + Point3d ptP1 = hole.ptIni + hole.vtDir * ( dAppr + dElev + dTExtrLen + dMHOff) ; if ( m_bAggrBottom) { Point3d ptP0 = ptP1 + m_vtAggrBottom * ( m_dDistBottom + m_AggrBottom.dEncH + dSafeZ) ; - Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ; // se rinvio da sotto che richiede speciale rotazione if ( m_AggrBottom.nType == 1) { + // punto ruotato + Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ; Vector3d vtAux = m_vtAggrBottom ; vtAux.Rotate( Z_AX, 0, 1) ; SetAuxDir( vtAux) ; if ( AddRapidStart( ptP00, MCH_CL_AGB_DWN) == GDB_ID_NULL) return false ; + // vado al punto standard SetFlag( 0) ; SetAuxDir( m_vtAggrBottom) ; if ( AddRapidMove( ptP0, bSplitArcs, MCH_CL_AGB_IN) == GDB_ID_NULL) return false ; } + // se altrimenti con rotazione per minimizzare la sporgenza + else if ( m_AggrBottom.nType == 3) { + // punto standard ruotato + Vector3d vtAux = m_vtAggrBottom ; + vtAux.Rotate( Z_AX, 0, 1) ; + SetAuxDir( vtAux) ; + if ( AddRapidStart( ptP0, MCH_CL_AGB_IN) == GDB_ID_NULL) + return false ; + // la rotazione viene eseguita nel movimento successivo al punto sopra l'inizio lavorazione + SetAuxDir( m_vtAggrBottom) ; + SetFlag( 0) ; + } // altrimenti rinvio normale else { SetAuxDir( m_vtAggrBottom) ; @@ -2289,6 +2325,8 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId) return false ; } else { + if ( ! vtA.IsSmall()) + SetAuxDir( vtA) ; if ( AddRapidStart( ptP1) == GDB_ID_NULL) return false ; } @@ -2409,13 +2447,21 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId) // 7 -> punto fuori (se uso aggregato da sotto) if ( m_bAggrBottom) { + // se con rotazione per minimizzare la sporgenza + if ( m_AggrBottom.nType == 3) { + // imposto rotazione su punto standard + Vector3d vtAux = m_vtAggrBottom ; + vtAux.Rotate( Z_AX, 0, 1) ; + SetAuxDir( vtAux) ; + } + // vado al punto SetFlag( 0) ; Point3d ptP0 = ptP1 + m_vtAggrBottom * ( m_dDistBottom + m_AggrBottom.dEncH + dSafeZ) ; - Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ; if ( AddRapidMove( ptP0, bSplitArcs, MCH_CL_AGB_OUT) == GDB_ID_NULL) return false ; // se rinvio da sotto che richiede speciale rotazione if ( m_AggrBottom.nType == 1) { + Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ; Vector3d vtAux = m_vtAggrBottom ; vtAux.Rotate( Z_AX, 0, 1) ; SetAuxDir( vtAux) ; diff --git a/Drilling.h b/Drilling.h index e0421c6..baf1200 100644 --- a/Drilling.h +++ b/Drilling.h @@ -84,8 +84,8 @@ class Drilling : public Machining bool GenerateHoleRegionPv( int nFirstId, int nCount, int nPvId) ; bool VerifyDiameter( double dHdiam, double dTdiam, double ddiamTol) ; bool VerifyHoleFromBottom( const Hole& hole, SelData Id) ; - bool DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double nMHOff, Vector3d vtA) ; - bool DoPeckDrilling( const Hole& hole, SelData Id, int nPathId) ; + bool DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double nMHOff, const Vector3d& vtA) ; + bool DoPeckDrilling( const Hole& hole, SelData Id, int nPathId, double dMHOff, const Vector3d& vtA) ; bool MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& vDrills, double& dMHOff, bool bOrd = true) ; bool CalcMask( VECTORHOLE& vHoles, const VECTORTOOL& vTools, int nIndMT, const Vector3d& vtTool, const Vector3d& vtAux) ; bool CheckOtherHolesWithTools( VECTORHOLE& vHoles, const VECTORTOOL& vTools, int nIndTM, int nIndHTM, Hole holeICP, diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index a583864a206ff5f65856d7ae00cbc3991336992b..cfd6b7664fef2ef2d4a049cf4d8e8e2dd1759b0c 100644 GIT binary patch delta 97 zcmewt{V#gMFE&P_&A-`fnHh~HKa|wnoW?bQ1uSxrY4Qod0+^@}R1`^_2jk{d(jGv4 NK<#LXK~l;gTmU8!BZvS1 delta 97 zcmewt{V#gMFE&QQ&A-`fnHdcyKa|wnoW?bQ1uSxrY4Qod0+^@}R1`^_2jk{d(jGv4 NK<#LXK~l;gTmU3rBY*$^ diff --git a/Milling.cpp b/Milling.cpp index e1d2ba9..dc2bd0b 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -4284,19 +4284,33 @@ Milling::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dAggZ = ( bBottomStart ? 0. : max( dElev + max( dSafeAggrBottZ, dAppr), 0.)) ; // pre-approccio Point3d ptP0 = ptP - Z_AX * dAggZ + m_vtAggrBottom * ( dDistBottom + m_AggrBottom.dEncH + dSafeZ) ; - Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAggZ - dElev) ; - // se rinvio da sotto che richiede speciale rotazione + // se richiede speciale rotazione if ( m_AggrBottom.nType == 1) { + // punto ruotato + Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAggZ - dElev) ; Vector3d vtAux = m_vtAggrBottom ; vtAux.Rotate( Z_AX, 0, 1) ; SetAuxDir( vtAux) ; if ( AddRapidStartOrMove( ptP00, bFirst, bSplitArcs, MCH_CL_AGB_DWN) == GDB_ID_NULL) return false ; + // vado al punto standard SetAuxDir( m_vtAggrBottom) ; SetFlag( 0) ; if ( AddRapidMove( ptP0, bSplitArcs, MCH_CL_AGB_IN) == GDB_ID_NULL) return false ; } + // se altrimenti con rotazione per minimizzare la sporgenza + else if ( m_AggrBottom.nType == 3) { + // punto standard ruotato + Vector3d vtAux = m_vtAggrBottom ; + vtAux.Rotate( Z_AX, 0, 1) ; + SetAuxDir( vtAux) ; + if ( AddRapidStartOrMove( ptP0, bFirst, bSplitArcs, MCH_CL_AGB_IN) == GDB_ID_NULL) + return false ; + // la rotazione viene eseguita nel movimento successivo al punto sopra l'inizio lavorazione + SetAuxDir( m_vtAggrBottom) ; + SetFlag( 0) ; + } // altrimenti rinvio normale else { SetAuxDir( m_vtAggrBottom) ; @@ -4547,15 +4561,22 @@ Milling::AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, } // se con aggregato da sotto if ( m_bAggrBottom) { + // se con rotazione per minimizzare la sporgenza + if ( m_AggrBottom.nType == 3) { + // imposto rotazione su punto standard + Vector3d vtAux = m_vtAggrBottom ; + vtAux.Rotate( Z_AX, 0, 1) ; + SetAuxDir( vtAux) ; + } // aggiuntivo in Z double dAggZ = ( bBottomOutStart ? 0. : max( dElev + max( dSafeAggrBottZ, dAppr), 0.)) ; // post-retract Point3d ptP0 = ptP - Z_AX * dAggZ + m_vtAggrBottom * ( dDistBottom + m_AggrBottom.dEncH + dSafeZ) ; - Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAggZ - dElev) ; if ( AddRapidMove( ptP0, bSplitArcs, MCH_CL_AGB_OUT) == GDB_ID_NULL) return false ; // se rinvio da sotto che richiede speciale rotazione if ( m_AggrBottom.nType == 1) { + Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAggZ - dElev) ; Vector3d vtAux = m_vtAggrBottom ; vtAux.Rotate( Z_AX, 0, 1) ; SetAuxDir( vtAux) ; diff --git a/Operation.cpp b/Operation.cpp index b505dc3..401c3f6 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -2376,7 +2376,7 @@ Operation::VerifyLineMidPoint( const Point3d& ptPrec, const Vector3d& vtDirPrec, pMidCamData->SetEndPoint( ptMid) ; pMidCamData->SetToolDir( vtDirMid) ; pMidCamData->SetAuxDir( vtAuxMid) ; - pMidCamData->SetFlag( 401) ; + pMidCamData->SetFlag2( -1) ; // calcolo gli assi rotanti per il punto medio DBLVECTOR vAxRotHome( int( vAxVal.size() - 3)) ; DBLVECTOR vAxRotPrec( int( vAxVal.size() - 3)) ; diff --git a/Pocketing.cpp b/Pocketing.cpp index 0c22ab8..37239fd 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -5061,20 +5061,34 @@ Pocketing::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafe double dAggZ = ( bBottomOutStart ? 0. : max( dElev + max( dSafeAggrBottZ, dAppr), 0.)) ; // pre-approccio Point3d ptP0 = ptP - Z_AX * dAggZ + m_vtAggrBottom * ( dDistBottom + m_AggrBottom.dEncH + dSafeZ) ; - Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAggZ - dElev) ; - // se rinvio da sotto che richiede speciale rotazione + // se richiede speciale rotazione if ( m_AggrBottom.nType == 1) { + // punto ruotato + Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAggZ - dElev) ; Vector3d vtAux = m_vtAggrBottom ; vtAux.Rotate( Z_AX, 0, 1) ; SetAuxDir( vtAux) ; if ( AddRapidStart( ptP00, MCH_CL_AGB_DWN) == GDB_ID_NULL) return false ; + // vado al punto standard SetAuxDir( m_vtAggrBottom) ; SetFlag( 0) ; if ( AddRapidMove( ptP0, bSplitArcs, MCH_CL_AGB_IN) == GDB_ID_NULL) return false ; } - // altrimenti rinvio normale + // se altrimenti con rotazione per minimizzare la sporgenza + else if ( m_AggrBottom.nType == 3) { + // punto standard ruotato + Vector3d vtAux = m_vtAggrBottom ; + vtAux.Rotate( Z_AX, 0, 1) ; + SetAuxDir( vtAux) ; + if ( AddRapidStart( ptP0, MCH_CL_AGB_IN) == GDB_ID_NULL) + return false ; + // la rotazione viene eseguita nel movimento successivo al punto sopra l'inizio lavorazione + SetAuxDir( m_vtAggrBottom) ; + SetFlag( 0) ; + } + // altrimenti rinvio normale else { SetAuxDir( m_vtAggrBottom) ; if ( AddRapidStart( ptP0, MCH_CL_AGB_IN) == GDB_ID_NULL) @@ -5207,15 +5221,22 @@ Pocketing::AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ } // se con aggregato da sotto o equivalente (rinvio a 90 gradi su testa 5 assi) if ( m_bAggrBottom) { + // se con rotazione per minimizzare la sporgenza + if ( m_AggrBottom.nType == 3) { + // imposto rotazione su punto standard + Vector3d vtAux = m_vtAggrBottom ; + vtAux.Rotate( Z_AX, 0, 1) ; + SetAuxDir( vtAux) ; + } // aggiuntivo in Z double dAggZ = ( bBottomOutStart ? 0. : max( dElev + max( dSafeAggrBottZ, dAppr), 0.)) ; // post-retract Point3d ptP0 = ptP - Z_AX * dAggZ + m_vtAggrBottom * ( dDistBottom + m_AggrBottom.dEncH + dSafeZ) ; - Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAggZ - dElev) ; if ( AddRapidMove( ptP0, bSplitArcs, MCH_CL_AGB_OUT) == GDB_ID_NULL) return false ; - // se rinvio da sotto che richiede speciale rotazione + // se richiede speciale rotazione if ( m_AggrBottom.nType == 1) { + Point3d ptP00 = ptP0 + Z_AX * ( m_AggrBottom.dEncV + m_TParams.m_dLen + dAggZ - dElev) ; Vector3d vtAux = m_vtAggrBottom ; vtAux.Rotate( Z_AX, 0, 1) ; SetAuxDir( vtAux) ;