From 77a61447c62991a8940ca7fafc277f9fcfa01d29 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Sat, 9 Nov 2024 10:34:47 +0100 Subject: [PATCH] EgtMachKernel 2.6k2 : - correzione in Drilling per multiforatura con tre assi rotanti di cui uno bloccato. --- Drilling.cpp | 105 +++++++++++++++++++++++++---------------------- EgtMachKernel.rc | Bin 11782 -> 11782 bytes 2 files changed, 55 insertions(+), 50 deletions(-) diff --git a/Drilling.cpp b/Drilling.cpp index e5c486b..60018da 100644 --- a/Drilling.cpp +++ b/Drilling.cpp @@ -4,7 +4,7 @@ // File : Drilling.cpp Data : 20.12.23 Versione : 2.5l47 // Contenuto : Implementazione gestione forature. // -// Note : Questa lavorazione è sempre espressa nel riferimento globale. +// Note : Questa lavorazione è sempre espressa nel riferimento globale. // // Modifiche : 21.05.15 DS Creazione modulo. // 20.12.23 RE Forature multiple con aggregati. @@ -82,16 +82,16 @@ struct MHDrill { struct HoleInfo { Hole hole ; // foro - bool bDrill = false ; // se alla fine verrà lavorato + bool bDrill = false ; // se alla fine verrà lavorato bool bTempDrill = false ; // per test maschera (se durante un test viene lavorato o no) int nTempTool = -1 ; // per test maschera ( indice utensile che lo lavora durante un test) - bool bSkipToAngle = false ; // nel caso di più assi rotanti, se foro già lavorato con testa orientata - bool bForToolM = false ; // se tool main lavorerà questo foro - int nIndHoleToolM = -1 ; // indice del foro che lo svuoterà inserendo il primo tool in esso + bool bSkipToAngle = false ; // nel caso di più assi rotanti, se foro già lavorato con testa orientata + bool bForToolM = false ; // se tool main lavorerà questo foro + int nIndHoleToolM = -1 ; // indice del foro che lo svuoterà inserendo il primo tool in esso INTVECTOR vToolHole ; // vettore di indici dei fori ai quali inserire l'ultim punta per lavorare il foro corrente INTVECTOR vIndTools ; // vettore dei tool associati ad ogni lavorazione in vToolHole (ordinati) VCT3DVECTOR vVtAux ; // vettore dei vtAux ausiliari del tool principale per lavorare questo foro (ordinati) - int nIndTool = -1 ; // indice del tool che alla fine lavorerà il foro + int nIndTool = -1 ; // indice del tool che alla fine lavorerà il foro Vector3d vtAux ; // vettore ausiliario del tool principale che permette al tool principale di lavorare questo foro Point3d ptBtn ; // punto interno alla base del foro int nIndInSelVector = 0 ; // indice nel vettore m_vId (id fori selezionati) @@ -483,14 +483,14 @@ Drilling::SetParam( int nType, const string& sVal) bool Drilling::SetGeometry( const SELVECTOR& vIds) { - // verifico validità gestore generale e gestore DB geometrico + // verifico validità gestore generale e gestore DB geometrico if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) return false ; // reset della geometria corrente m_vId.clear() ; // se lavorazione standard if ( m_Params.m_nSubType == DRI_SUB_STD) { - // verifico che gli identificativi rappresentino dei fori (il corretto diametro è verificato dopo) + // verifico che gli identificativi rappresentino dei fori (il corretto diametro è verificato dopo) for ( int i = 0 ; i < int( vIds.size()) ; ++ i) { // recupero i dati del foro Hole hole ; @@ -528,12 +528,12 @@ Drilling::Preview( bool bRecalc) { // reset numero forature nella lavorazione m_nDrillings = 0 ; - // verifico validità gestore DB geometrico e Id del gruppo + // verifico validità gestore DB geometrico e Id del gruppo if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) return false ; // recupero gruppo per geometria di Preview int nPvId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_PV) ; - // se non c'è, lo aggiungo + // se non c'è, lo aggiungo if ( nPvId == GDB_ID_NULL) { nPvId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ; if ( nPvId == GDB_ID_NULL) @@ -569,7 +569,7 @@ Drilling::Apply( bool bRecalc, bool bPostApply) int nCurrDrillings = m_nDrillings ; m_nDrillings = 0 ; - // verifico validità gestore DB geometrico e Id del gruppo + // verifico validità gestore DB geometrico e Id del gruppo if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) return false ; @@ -599,7 +599,7 @@ Drilling::Apply( bool bRecalc, bool bPostApply) // recupero gruppo per geometria di lavorazione (Cutter Location) int nClId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_CL) ; - // se non c'è, lo aggiungo + // se non c'è, lo aggiungo if ( nClId == GDB_ID_NULL) { nClId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ; if ( nClId == GDB_ID_NULL) @@ -664,7 +664,7 @@ Drilling::Apply( bool bRecalc, bool bPostApply) bool Drilling::Update( bool bPostApply) { - // verifico validità gestore DB geometrico e Id del gruppo + // verifico validità gestore DB geometrico e Id del gruppo if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) return false ; @@ -674,7 +674,7 @@ Drilling::Update( bool bPostApply) return true ; } - // elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo) + // elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo) RemoveClimbRiseHome() ; // imposto eventuale asse bloccato da lavorazione @@ -760,7 +760,7 @@ Drilling::VerifyMultiParallelFixedDrills( void) return true ; } } - // non è stato trovato niente + // non è stato trovato niente return false ; } @@ -840,7 +840,7 @@ Drilling::MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& tabDri for ( int nT = 0 ; nT < nExitCnt ; ++ nT) { string sToolName ; if ( ! m_pMchMgr->GetLoadedTool( sHead, nT + 1, sToolName) || sToolName.empty()) { - // non c'è utensile + // non c'è utensile vTools.emplace_back( nullptr) ; continue ; } @@ -923,6 +923,11 @@ Drilling::MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& tabDri if ( ! bSomeHoleOk) return true ; + // imposto eventuale asse bloccato da lavorazione + SetBlockedRotAxis( m_Params.m_sBlockedAxis) ; + // applico eventuali blocchi di assi rotanti + m_pMchMgr->ApplyRotAxisBlock() ; + // calcolo la corrispondenza tra utensili e fori if ( ! CalcMask( vHoles, vTools, nMainToolInd, vtTool, vtAux)) return false ; @@ -941,7 +946,7 @@ Drilling::MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& tabDri // numero di fori lavorati int nOkHole = 0 ; - // se c'è un solo foro va sicuramente bene + // se c'è un solo foro va sicuramente bene if ( vHoles.size() == 1 && ! vHoles[0].vVtAux.empty()) { vHoles[0].bForToolM = true ; vHoles[0].nIndTool = nMainToolInd ; @@ -952,7 +957,7 @@ Drilling::MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& tabDri // decido in quali fori inserire il tool principale for ( int nCheck = 1 ; nCheck < ( int)vHoles.size() && nOkHole < ( int)vHoles.size() - nNoDrillHoles ; ++ nCheck) { for ( int i = 0 ; i < ( int)vHoles.size() ; ++i) { - // prendo tutti i fori con vToolHope di lunghezza nCheck non già lavorati + // prendo tutti i fori con vToolHope di lunghezza nCheck non già lavorati if ( vHoles[i].vToolHole.size() == nCheck && ! vHoles[i].bDrill) { vHoles[vHoles[i].vToolHole[0]].bForToolM = true ; vHoles[vHoles[i].vToolHole[0]].nIndTool = nMainToolInd ; @@ -974,7 +979,7 @@ Drilling::MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& tabDri } } - // calcolo la massima differenza di lunghezza tra il primo tool e gli altri ( così l'elevazione finale rimane compatibile) + // calcolo la massima differenza di lunghezza tra il primo tool e gli altri ( così l'elevazione finale rimane compatibile) double dRefLen = vTools[nMainToolInd].pTool->m_dTLen ; double dOffMax = 0 ; for ( int nT = 0 ; nT < ( int)vTools.size() && nNoDrillHoles != (int)vHoles.size() ; ++ nT) { @@ -1084,13 +1089,13 @@ Drilling::CalcMask( VECTORHOLE& vHoles, const VECTORTOOL& vTools, int nIndMT, co // in ogni foro i-esimo inserisco il Tool principale for ( int i = 0 ; i < ( int)vHoles.size() ; ++ i) { - // resetto le veriabili di controllo di svuotatura temporanea per tutti i fori + // resetto le variabili di controllo di svuotatura temporanea per tutti i fori for ( int k = 0 ; k < ( int)vHoles.size() ; ++ k) { vHoles[k].bTempDrill = false ; vHoles[k].nTempTool = -1 ; } - // verifica validità del foro i-esimo per il Tool principale + // verifica validità del foro i-esimo per il Tool principale Hole Hole_i = vHoles[i].hole ; if ( ! MultiHeadVerifyHole( Hole_i, vTools[nIndMT].pTool, dDiamToler, m_vId[vHoles[i].nIndInSelVector])) continue ; @@ -1123,13 +1128,13 @@ Drilling::CalcMask( VECTORHOLE& vHoles, const VECTORTOOL& vTools, int nIndMT, co if ( ! frHMT.IsValid()) return false ; - // numero di svuotature inserendo il Tool principale nel foro i-esimo + // numero di forature inserendo il Tool principale nel foro i-esimo int nDrills = 1 ; // setto le variabili temporanee per il foro i-esimo vHoles[i].bTempDrill = true ; vHoles[i].nTempTool = nIndMT ; - // controllo la compatibilità tra le geometrie dei Tool e dei fori + // controllo la compatibilità tra le geometrie dei Tool e dei fori CheckOtherHolesWithTools( vHoles, vTools, nIndMT, i, Hole_i, frMT, frHMT, dDiamToler, nDrills) ; // controllo quanti fori sono riuscito a svuotare e setto i loro parametri di foratura @@ -1148,7 +1153,7 @@ Drilling::CalcMask( VECTORHOLE& vHoles, const VECTORTOOL& vTools, int nIndMT, co vHoles[d].bTempDrill = false ; } - // se la testa può ruotare + // se la testa può ruotare if ( nStat < 0) { // inizio a scorrere tutti i tools @@ -1166,7 +1171,7 @@ Drilling::CalcMask( VECTORHOLE& vHoles, const VECTORTOOL& vTools, int nIndMT, co ! MultiHeadVerifyHole( Hole_j, vTools[t].pTool, dDiamToler, m_vId[vHoles[j].nIndInSelVector])) continue ; - // resetto le veriabili di controllo di svuotatura temporanea per tutti i fori + // resetto le variabili di controllo di foratura temporanea per tutti i fori for ( int k = 0 ; k < ( int)vHoles.size() ; ++ k) { vHoles[k].bTempDrill = false ; vHoles[k].nTempTool = -1 ; @@ -1197,12 +1202,12 @@ Drilling::CalcMask( VECTORHOLE& vHoles, const VECTORTOOL& vTools, int nIndMT, co vHoles[i].bTempDrill = true ; vHoles[i].nTempTool = nIndMT ; - // controllo quanti fori sono riuscito a svuotare in questo nuovo sistema di riferimento + // controllo quanti fori sono riuscito a lavorare in questo nuovo sistema di riferimento if ( nDrills == nExitCnt - nNullTools) { for ( int d = 0 ; d < ( int)vHoles.size() ; ++ d) { if ( vHoles[d].bTempDrill) { vHoles[d].vToolHole.push_back( i) ; // indice del foro per il tool principale - vHoles[d].vIndTools.push_back( vHoles[d].nTempTool) ; // indice del tool che svuota questo foro + vHoles[d].vIndTools.push_back( vHoles[d].nTempTool) ; // indice del tool che lavora questo foro vHoles[d].vVtAux.push_back( frHMT.VersX()) ; // versore ausiliario del tool principale vHoles[d].bSkipToAngle = true ; } @@ -1252,7 +1257,7 @@ Drilling::CheckOtherHolesWithTools( VECTORHOLE& vHoles, const VECTORTOOL& vTools // cerco se ho un foro j-esimo adatto per quella punta for ( int j = 0 ; j < ( int)vHoles.size() ; ++ j) { Hole Hole_j = vHoles[j].hole ; // copia del foro j-esimo - // controllo che il foro j-esimo non sia l'i-esimo, che non sia stato già precedentemente svuotato da un altro tool t'-esimo ... + // controllo che il foro j-esimo non sia l'i-esimo, che non sia stato già precedentemente lavorato da un altro tool t'-esimo ... // ... che vtDir del foro i-esimo coincida con vtDir del foro j-esimo e che il tool t-esimo sia compatibile con il foro j-esimo if ( nIndHTM == j || vHoles[j].bTempDrill || @@ -1264,9 +1269,9 @@ Drilling::CheckOtherHolesWithTools( VECTORHOLE& vHoles, const VECTORTOOL& vTools Point3d ptHj = Hole_j.ptIni - Hole_j.vtDir * Hole_j.dLen ; ptHj.ToLoc( frHMT) ; - // controllo la compatibilità + // controllo la compatibilità if ( AreSamePointApprox( ptHj, ptETt)) { - // un foro in più lavorato + // un foro in più lavorato ++ nDrills ; // aggiorno le variabili temporanee vHoles[j].bTempDrill = true ; @@ -1287,7 +1292,7 @@ Drilling::MultiHeadVerifyHole( Hole& hole, const ToolData* Tool, double dDiamTol // verifico che il diamtro del tool sia compatibile con quello del foro if ( ! VerifyDiameter( hole.dDiam, Tool->m_dDiam, dDiamToler)) return false ; - // imposto elevazione da lunghezza foro con possibilità di sovrascrittura da info + // imposto elevazione da lunghezza foro con possibilità di sovrascrittura da info double dElev = hole.dLen ; double dMaxElev ; if ( FromString( ExtractInfo( m_Params.m_sUserNotes, "MaxElev="), dMaxElev) && dElev > dMaxElev) { @@ -1313,7 +1318,7 @@ Drilling::AlongCurveProcess( bool bRecalc, int nPvId, int nClId) // recupero gruppo per geometria ausiliaria int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ; bool bChain = false ; - // se non c'è, lo aggiungo + // se non c'è, lo aggiungo if ( nAuxId == GDB_ID_NULL) { nAuxId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ; if ( nAuxId == GDB_ID_NULL) @@ -1356,7 +1361,7 @@ Drilling::Chain( int nGrpDestId) for ( const auto& Id : m_vId) { // prendo curva vpCrvs.emplace_back( GetCurve( Id)) ; - // ne verifico la validità + // ne verifico la validità if ( IsNull( vpCrvs.back())) { string sInfo = "Warning in Drilling : Skipped entity " + ToString( Id) ; m_pMchMgr->SetWarning( 2151, sInfo) ; @@ -1497,7 +1502,7 @@ Drilling::ProcessPath( int nPathId, int nPvId, int nClId) // recupero gruppo per geometria temporanea const string GRP_TEMP = "Temp" ; int nTempId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, GRP_TEMP) ; - // se non c'è, lo aggiungo + // se non c'è, lo aggiungo if ( nTempId == GDB_ID_NULL) { nTempId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ; if ( nTempId == GDB_ID_NULL) @@ -1646,7 +1651,7 @@ Drilling::GenerateHoleCl( int nInd, const SelData& nCircId, const string& sPName // se lavorazione del foro non arriva al suo fondo, lo considero cieco if ( hole.dLen < hole.dThick - 10 * EPS_SMALL) hole.bBlind = true ; - // imposto elevazione da lunghezza foro con possibilità di sovrascrittura da info + // imposto elevazione da lunghezza foro con possibilità di sovrascrittura da info double dElev = hole.dLen ; double dMaxElev ; if ( FromString( ExtractInfo( m_Params.m_sUserNotes, "MaxElev="), dMaxElev) && dElev > dMaxElev) { @@ -1776,7 +1781,7 @@ Drilling::VerifyDiameter( double dHdiam, double dTdiam, double dDiamTol) // imposto minima tolleranza if ( abs( dDiamTol) < 10 * EPS_SMALL) dDiamTol = 10 * EPS_SMALL ; - // se tolleranza in più o in meno + // se tolleranza in più o in meno if ( dDiamTol > 0) return ( abs( dHdiam - dTdiam) < dDiamTol) ; // altrimenti tolleranza solo in meno @@ -1973,7 +1978,7 @@ Drilling::UpdateToolData( bool* pbChanged) bool Drilling::GetGeometry( SELVECTOR& vIds) const { - // restituisco l'elenco delle entità + // restituisco l'elenco delle entità vIds = m_vId ; return true ; } @@ -2047,7 +2052,7 @@ Drilling::GetHoleData( SelData Id, Hole& hole) hole.vtDir.Normalize() ; hole.dThick = abs( dThick) ; hole.dLen = abs( dDepth) ; - // per default è cieco + // per default è cieco hole.bBlind = true ; // se dichiarato passante o no (1/0) int nOpen ; @@ -2070,10 +2075,10 @@ Drilling::GetHoleData( SelData Id, Hole& hole) bool Drilling::VerifyHoleFromBottom( const Hole& hole, SelData Id) { - // se non è foro dal basso in alto, esco + // se non è foro dal basso in alto, esco if ( hole.vtDir.z > MIN_ZDIR_TOP_TOOL) return true ; - // se c'è testa non dall'alto o tavola basculante, esco + // se c'è testa non dall'alto o tavola basculante, esco if ( ! m_bAboveHead || m_bTiltingTab) return true ; // recupero dati di eventuale rinvio da sotto @@ -2121,12 +2126,12 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double GetElevation( m_nPhase, hole.ptIni, hole.vtDir, m_TParams.m_dDiam / 2, hole.vtDir, dElev) ; // determino alcune caratteristiche dell'utensile double dTExtrLen = max( 0.0, m_TParams.m_dTLen - m_TParams.m_dLen) ; - // necessità di spezzatura per robot + // necessità di spezzatura per robot bool bSplitArcs = GetSplitArcs( V_NULL) ; // imposto dati comuni SetPathId( nPathId) ; SetToolDir( hole.vtDir) ; - // 1 -> punto approccio (se con aggregato da sotto è una sequenza di approccio) + // 1 -> punto approccio (se con aggregato da sotto è una sequenza di approccio) SetFlag( 1) ; double dSafeZ = GetSafeZ() ; double dSafeAggrBottZ = GetSafeAggrBottZ() ; @@ -2184,7 +2189,7 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double if ( AddRapidMove( ptP2, bSplitArcs) == GDB_ID_NULL) return false ; } - // 3 -> punto termine velocità ridotta iniziale (se previsto) + // 3 -> punto termine velocità ridotta iniziale (se previsto) if ( bStartSlow) { SetFeed( GetStartFeed()) ; if ( ! bStd && ! bEndSlow) @@ -2195,7 +2200,7 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double if ( AddLinearMove( ptP3, bSplitArcs) == GDB_ID_NULL) return false ; } - // 4 -> punto termine velocità standard (se risulta) + // 4 -> punto termine velocità standard (se risulta) if ( bStd) { SetFeed( GetFeed()) ; if ( ! bEndSlow) @@ -2206,7 +2211,7 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double if ( AddLinearMove( ptP4, bSplitArcs) == GDB_ID_NULL) return false ; } - // 5 -> punto termine velocità finale ridotta (se previsto) + // 5 -> punto termine velocità finale ridotta (se previsto) if ( bEndSlow) { SetFeed( GetTipFeed()) ; SetFlag( 101) ; // fondo del foro @@ -2276,7 +2281,7 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId, double dMHO GetElevation( m_nPhase, hole.ptIni, hole.vtDir, m_TParams.m_dDiam / 2, hole.vtDir, dElev) ; // determino alcune caratteristiche dell'utensile double dTExtrLen = max( 0.0, m_TParams.m_dTLen - m_TParams.m_dLen) ; - // necessità di spezzatura per robot + // necessità di spezzatura per robot bool bSplitArcs = GetSplitArcs( V_NULL) ; // imposto dati comuni SetPathId( nPathId) ; @@ -2350,7 +2355,7 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId, double dMHO dReturnPos = - dStep + APPR_STEP + MIN_MOVE ; double dCurrLen = 0 ; for ( int i = 1 ; i <= nStep ; ++ i) { - // se non è primo step faccio retrazione e riaffondo + // se non è primo step faccio retrazione e riaffondo if ( i != 1) { // retrazione SetFeed( GetEndFeed()) ; @@ -2367,7 +2372,7 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId, double dMHO } // lunghezza di fine step double dEndLen = dCurrLen + dStep ; - // 3 -> punto termine velocità ridotta iniziale (se previsto) + // 3 -> punto termine velocità ridotta iniziale (se previsto) if ( bStartSlow && ( i == 1 || dCurrLen < dStartSlowLen + EPS_SMALL)) { // lunghezza di esecuzione double dLen = min( dStartSlowLen, dEndLen) ; @@ -2392,7 +2397,7 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId, double dMHO if ( bHoleEnd || bStepEnd) continue ; } - // 4 -> punto termine velocità standard (se risulta) + // 4 -> punto termine velocità standard (se risulta) if ( bStd && dCurrLen < dStartSlowLen + dStdLen + EPS_SMALL) { // lunghezza di esecuzione double dLen = min( hole.dLen - dEndSlowLen, dEndLen) ; @@ -2417,7 +2422,7 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId, double dMHO if ( bHoleEnd || bStepEnd) continue ; } - // 5 -> punto termine velocità finale ridotta (se previsto) + // 5 -> punto termine velocità finale ridotta (se previsto) if ( bEndSlow) { // lunghezza di esecuzione double dLen = dEndLen ; diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index ab017a58f12523c2049c403869e094fbbbc66274..608eaa1a24e07132375c341115d72d0220094c84 100644 GIT binary patch delta 97 zcmZpRX^YwLhmFx_^ItYwW=5mQj>5W|vxM9jH?QON0rG*u7nvrX5iEd9O=7{OSQ@Kh Hr8(RHP01iS delta 97 zcmZpRX^YwLhmFy2^ItYwW=6xwj>5W|vxM9jH?QON0rG*u7nvrX5iEd9O=7{OSQ@Kh Hr8(RHOf?`f