From 6fce5b366d4aeb5512043bb3bd627440968ea1a6 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 8 Mar 2017 19:47:08 +0000 Subject: [PATCH] EgtMachKernel 1.8c3 : - prima versione funzionante di lavorazione generica con script lua - corretta funzione per Lua EmtAddArcMove - aggiunta VerifyAngleOutstroke - corretta assegnazione valore precedente ad asse indeterminato - corretta assegnazione angoli tenendo conto dei precedenti durante lavorazione. --- Chiseling.cpp | 4 +- EgtMachKernel.rc | Bin 11774 -> 11774 bytes GenMachining.cpp | 133 +++++++++++++++++++++++++++---------------- GenMachiningData.cpp | 14 +++++ GenMachiningData.h | 5 +- MachConst.h | 8 ++- MachMgr.h | 1 + MachMgrMachines.cpp | 8 +++ MachMgrSetup.cpp | 1 - Machine.h | 1 + MachineCalc.cpp | 16 ++++++ MachineLuaCL.cpp | 4 +- Milling.cpp | 4 +- Operation.cpp | 22 +++++-- Pocketing.cpp | 4 +- Sawing.cpp | 4 +- 16 files changed, 163 insertions(+), 66 deletions(-) diff --git a/Chiseling.cpp b/Chiseling.cpp index 0f28b89..07f8f72 100644 --- a/Chiseling.cpp +++ b/Chiseling.cpp @@ -476,8 +476,10 @@ Chiseling::Apply( bool bRecalc) } // se lavorazione vuota, esco - if ( m_nChisels == 0) + if ( m_nChisels == 0) { + LOG_INFO( GetEMkLogger(), "Warning in Chiseling : Plunges not found") return true ; + } // calcolo gli assi macchina string sHint = ExtractHint( m_Params.m_sUserNotes) ; diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index c2af0b472f718172fae267ea801ac1b9143f05ce..6ef0470e8d8b5b2fd06063d0b7aedd319060b734 100644 GIT binary patch delta 97 zcmewt{V#gMFE&Qw&A-`fnHh~IKa|wnoW?bQ1uSxrY4Qod0+^@}R1`^_2jk{d(jGv4 NK<#LXK~l;gTmUD-Bai?9 delta 97 zcmewt{V#gMFE&P_&A-`fnHh~HKa|wnoW?bQ1uSxrY4Qod0+^@}R1`^_2jk{d(jGv4 NK<#LXK~l;gTmU8!BZvS1 diff --git a/GenMachining.cpp b/GenMachining.cpp index 41472fa..2e7f379 100644 --- a/GenMachining.cpp +++ b/GenMachining.cpp @@ -27,9 +27,15 @@ #include "/EgtDev/Include/EGkUserObjFactory.h" #include "/EgtDev/Include/EGnStringKeyVal.h" #include "/EgtDev/Include/EgtPointerOwner.h" +#include "/EgtDev/Include/EgtIniFile.h" using namespace std ; +//------------------------------ Errors -------------------------------------- +// 2801 = "Error in GenMachining : UpdateToolData failed" +// 2802 = "Error in GenMachining : missing Script (xxx)" +// 2803 = "Error in GenMachining : Error in xxx (nnn)" + //---------------------------------------------------------------------------- USEROBJ_REGISTER( "EMkGenMachining", GenMachining) ; @@ -209,6 +215,9 @@ GenMachining::SetParam( int nType, int nVal) return false ; m_Params.m_nSolCh = nVal ; return true ; + case MPA_SUBTYPE : + m_Params.m_nSubType = nVal ; + return true ; } return false ; } @@ -399,33 +408,9 @@ GenMachining::Apply( bool bRecalc) if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) return false ; - // recupero gruppo per geometria ausiliaria - int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ; - bool bChain = false ; - // 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) - return false ; - m_pGeomDB->SetName( nAuxId, MCH_AUX) ; - m_pGeomDB->SetStatus( nAuxId, GDB_ST_OFF) ; - bChain = true ; - } - // altrimenti, se chiesto ricalcolo, lo svuoto - else if ( bRecalc) { - m_pGeomDB->EmptyGroup( nAuxId) ; - bChain = true ; - } - // aggiorno dati geometrici dell'utensile if ( ! UpdateToolData()) { - LOG_INFO( GetEMkLogger(), "Error in GenMachining : UpdateToolData failed") ; - return false ; - } - - // se necessario, eseguo concatenamento ed inserisco i percorsi sotto la geometria ausiliaria - if ( bChain && ! Chain( nAuxId)) { - LOG_INFO( GetEMkLogger(), "Error in GenMachining : Chaining failed") ; + m_pMchMgr->SetLastError( 2801, "Error in GenMachining : UpdateToolData failed") ; return false ; } @@ -442,12 +427,76 @@ GenMachining::Apply( bool bRecalc) else m_pGeomDB->EmptyGroup( nClId) ; - // lavoro ogni singola catena - int nPathId = m_pGeomDB->GetFirstGroupInGroup( nAuxId) ; - while ( nPathId != GDB_ID_NULL) { - if ( ! ProcessPath( nPathId, GDB_ID_NULL, nClId)) - return false ; - nPathId = m_pGeomDB->GetNextGroup( nPathId) ; + // costanti + static const string EMC_VAR = "EMC" ; // tabella variabili locali per calcolo + static const string EVAR_MACHID = ".MACHID" ; // IN (int) identificativo della lavorazione + static const string EVAR_GEOM = ".GEOM" ; // IN (table) tabella delle entità da lavorare + static const string EVAR_DEPTH = ".DEPTH" ; // IN (string) affondamento (espressione numerica) + static const string EVAR_INVERT = ".INVERT" ; // IN (bool) flag di inversione direzione lavorazione + static const string EVAR_STARTPOS = ".STARTPOS" ; // IN (num) quota di inizio lavorazione (sempre >= 0) + static const string EVAR_OFFSR = ".OFFSR" ; // IN (num) offset radiale + static const string EVAR_OFFSL = ".OFFSL" ; // IN (num) offset longitudinale + static const string EVAR_TOOL = ".TOOL" ; // IN (string) nome dell'utensile + static const string EVAR_FEED = ".FEED" ; // IN (num) feed dell'utensile + static const string EVAR_STARTFEED = ".STARTFEED" ;// IN (num) feed di inizio dell'utensile + static const string EVAR_ENDFEED = ".ENDFEED" ; // IN (num) feed di fine dell'utensile + static const string EVAR_TIPFEED = ".TIPFEED" ; // IN (num) feed di punta dell'utensile + static const string EVAR_SYSNOTES = ".SYSNOTES" ; // IN (string) note interne + static const string EVAR_USERNOTES = ".USERNOTES" ;// IN (string) note dell'utente + static const string EVAR_ERROR = ".ERR" ; // OUT (int) codice di errore ( 0 = ok) + static const string EVAR_MILLS = ".MILLS" ; // OUT (int) numero di percorsi di lavoro + static const string ON_APPLY = "OnApply_" ; + + // recupero la macchina corrente + Machine* pMch = m_pMchMgr->GetCurrMachine() ; + if ( pMch == nullptr) + return false ; + + // nome della funzione lua da Ini della macchina + string sMachIni = pMch->GetMachineDir() + "\\" + pMch->GetMachineName() + ".ini" ; + string sKey = GENMACHINING_SCRIPT_KEY + ToString( m_Params.m_nSubType) ; + string sName = GetPrivateProfileStringUtf8( GENMACHINING_SEC.c_str(), sKey.c_str(), "", sMachIni.c_str()) ; + string sApply = ON_APPLY + sName ; + + // verifico esistenza funzione + if ( ! pMch->LuaExistsFunction( sApply)) { + string sErr = "Error in GenMachining : missing Script " + sApply ; + m_pMchMgr->SetLastError( 2802, sErr) ; + return false ; + } + + // imposto stato + bool bOk = true ; + int nErr = 99 ; + // imposto valori parametri + bOk = bOk && pMch->LuaCreateGlobTable( EMC_VAR) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_MACHID, m_nOwnerId) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_GEOM, m_vId) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_DEPTH, m_Params.m_sDepth) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_INVERT, m_Params.m_bInvert) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_STARTPOS, m_Params.m_dStartPos) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OFFSR, GetOffsR()) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OFFSL, GetOffsL()) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TOOL, m_TParams.m_sName) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_FEED, GetFeed()) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_STARTFEED, GetStartFeed()) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_ENDFEED, GetEndFeed()) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TIPFEED, GetTipFeed()) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_SYSNOTES, m_Params.m_sSysNotes) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_USERNOTES, m_Params.m_sUserNotes) ; + // eseguo + bOk = bOk && pMch->LuaCallFunction( sApply, false) ; + // recupero valori parametri obbligatori + bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_ERROR, nErr) ; + bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_MILLS, m_nMills) ; + // reset + bOk = bOk && pMch->LuaResetGlobVar( EMC_VAR) ; + // segnalo errori + if ( ! bOk || nErr != 0) { + m_nMills = 0 ; + string sErr = "Error in GenMachining : Error in " + sApply + " (" + ToString( nErr) + ")" ; + m_pMchMgr->SetLastError( 2803, sErr) ; + return false ; } // se lavorazione vuota, esco @@ -494,6 +543,9 @@ GenMachining::GetParam( int nType, int& nVal) const case MPA_SCC : nVal = m_Params.m_nSolCh ; return true ; + case MPA_SUBTYPE : + nVal = m_Params.m_nSubType ; + return true ; } nVal = 0 ; return false ; @@ -1041,25 +1093,6 @@ GenMachining::ProcessPath( int nPathId, int nPvId, int nClId) else return false ; - // per frese normali, verifico di non superare il massimo materiale - if ( ( m_TParams.m_nType & TF_SAWBLADE) == 0) { - const double MAXMAT_TOL = EPS_SMALL ; - if ( dElev > m_TParams.m_dMaxMat + MAXMAT_TOL) { - if ( dDepth + max( dThick, 0.0) > m_TParams.m_dMaxMat) { - dDepth = m_TParams.m_dMaxMat - max( dThick, 0.0) ; - string sInfo = "Warning in GenMachining : machining depth (" + ToString( dElev, 1) + - ") bigger than MaxMaterial (" + ToString( m_TParams.m_dMaxMat, 1) + ")" ; - LOG_INFO( GetEMkLogger(), sInfo.c_str()) ; - } - else { - string sInfo = "Error in GenMachining : machining depth (" + ToString( dElev, 1) + - ") bigger than MaxMaterial (" + ToString( m_TParams.m_dMaxMat, 1) + ")" ; - LOG_INFO( GetEMkLogger(), sInfo.c_str()) ; - return false ; - } - } - } - // se richiesta anteprima if ( nPvId != GDB_ID_NULL) { // creo gruppo per geometria di lavorazione del percorso diff --git a/GenMachiningData.cpp b/GenMachiningData.cpp index 8408756..221c8f6 100644 --- a/GenMachiningData.cpp +++ b/GenMachiningData.cpp @@ -40,6 +40,7 @@ enum nGenMachiningKey { KEY_PS, KEY_S, KEY_SCC, + KEY_SUBTYPE, KEY_TNAME, KEY_TUUID, KEY_UUID, @@ -60,6 +61,7 @@ static const std::array sGenMachiningKey = { "PS", "S", "SCC", + "SUB", "TN", "TU", "UUID"} ; @@ -110,6 +112,7 @@ GenMachiningData::CopyFrom( const MachiningData* pMdata) m_bInvert = pGdata->m_bInvert ; m_sDepth = pGdata->m_sDepth ; m_dStartPos = pGdata->m_dStartPos ; + m_nSubType = pGdata->m_nSubType ; m_sSysNotes = pGdata->m_sSysNotes ; m_sUserNotes = pGdata->m_sUserNotes ; return true ; @@ -142,6 +145,7 @@ GenMachiningData::SameAs(const MachiningData* pMdata) const m_bInvert == pGdata->m_bInvert && m_sDepth == pGdata->m_sDepth && abs( m_dStartPos - pGdata->m_dStartPos) < EPS_MACH_LEN_PAR && + m_nSubType == pGdata->m_nSubType && m_sSysNotes == pGdata->m_sSysNotes && m_sUserNotes == pGdata->m_sUserNotes) ; } @@ -227,6 +231,9 @@ GenMachiningData::FromString( const string& sString, int& nKey) case KEY_SCC : bOk = ::FromString( sVal, m_nSolCh) ; break ; + case KEY_SUBTYPE : + bOk = ::FromString( sVal, m_nSubType) ; + break ; case KEY_TNAME : m_sToolName = sVal ; break ; @@ -262,6 +269,7 @@ GenMachiningData::ToString( int nKey) const case KEY_PS : return ( sGenMachiningKey[KEY_PS] + "=" + ::ToString( m_dStartPos)) ; case KEY_S : return ( sGenMachiningKey[KEY_S] + "=" + ::ToString( m_dSpeed)) ; case KEY_SCC : return ( sGenMachiningKey[KEY_SCC] + "=" + ::ToString( m_nSolCh)) ; + case KEY_SUBTYPE : return ( sGenMachiningKey[KEY_SUBTYPE] + "=" + ::ToString( m_nSubType)) ; case KEY_TNAME : return ( sGenMachiningKey[KEY_TNAME] + "=" + m_sToolName) ; case KEY_TUUID : return ( sGenMachiningKey[KEY_TUUID] + "=" + ::ToString( m_ToolUuid)) ; case KEY_UUID : return ( sGenMachiningKey[KEY_UUID] + "=" + ::ToString( m_Uuid)) ; @@ -330,6 +338,9 @@ GenMachiningData::SetParam( int nType, int nVal) return false ; m_nSolCh = nVal ; return true ; + case MPA_SUBTYPE : + m_nSubType = nVal ; + return true ; } return false ; } @@ -431,6 +442,9 @@ GenMachiningData::GetParam( int nType, int& nVal) const case MPA_SCC : nVal = m_nSolCh ; return true ; + case MPA_SUBTYPE : + nVal = m_nSubType ; + return true ; } nVal = 0 ; return false ; diff --git a/GenMachiningData.h b/GenMachiningData.h index 8bb54f7..3299b01 100644 --- a/GenMachiningData.h +++ b/GenMachiningData.h @@ -28,15 +28,16 @@ struct GenMachiningData : public MachiningData double m_dTipFeed ; // velocità di lavorazione di sfondamento ( se 0 da utensile) double m_dOffsR ; // offset radiale ( se UNKNOWN_PAR da utensile) double m_dOffsL ; // offset longitudinale ( se UNKNOWN_PAR da utensile) - bool m_bInvert ; // flag di inversione direzione lavorazione per fori aperti + bool m_bInvert ; // flag di inversione direzione lavorazione std::string m_sDepth ; // affondamento (espressione numerica) double m_dStartPos ; // quota di inizio lavorazione (sempre >= 0) + int m_nSubType ; // da [GenMachining] di Ini di macchina std::string m_sSysNotes ; // note interne std::string m_sUserNotes ; // note dell'utente GenMachiningData( void) : m_ToolUuid(), m_nSolCh( 0), m_dSpeed( 0), m_dFeed( 0), m_dStartFeed( 0), m_dEndFeed( 0), m_dTipFeed( 0), - m_dOffsR( 0), m_dOffsL( 0), m_bInvert( false), m_dStartPos( 0) {} + m_dOffsR( 0), m_dOffsL( 0), m_bInvert( false), m_dStartPos( 0), m_nSubType( 0) {} GenMachiningData* Clone( void) const override ; bool CopyFrom( const MachiningData* pMdata) override ; bool SameAs(const MachiningData* pMdata) const override ; diff --git a/MachConst.h b/MachConst.h index 329fc71..4ecc5cc 100644 --- a/MachConst.h +++ b/MachConst.h @@ -72,10 +72,16 @@ const std::string MACHININGS_DIR = "Machinings" ; // Nome file delle lavorazioni const std::string MACHININGS_FILE = "Machinings.data" ; +//---------------------------------------------------------------------------- +// Sezione lavorazioni generiche nel file INI di macchina +const std::string GENMACHINING_SEC = "GenMachining" ; +// Chiave (radice) per nome lavorazione generica i-esima +const std::string GENMACHINING_SCRIPT_KEY = "GenScript" ; + //---------------------------------------------------------------------------- // Sezione di attrezzaggio nel file INI di macchina const std::string SETUP_SEC = "Setup" ; -// Chaive per attrezzaggio di default +// Chiave per attrezzaggio di default const std::string SETUP_DEF_KEY = "Default" ; //---------------------------------------------------------------------------- diff --git a/MachMgr.h b/MachMgr.h index d3e498a..a2b7d76 100644 --- a/MachMgr.h +++ b/MachMgr.h @@ -356,6 +356,7 @@ class MachMgr : public IMachMgr bool IsKinematicRotAxisBlocked( int nInd) const ; double GetCalcRot1W( void) const ; bool SetCalcSolCh( int nScc) ; + bool VerifyAngleOutstroke( int nInd, double dAng) const ; // operations bool GetOperationNewName( std::string& sName) const ; const ToolData* GetMachiningToolData( void) const ; diff --git a/MachMgrMachines.cpp b/MachMgrMachines.cpp index 84716d9..2a1f42f 100644 --- a/MachMgrMachines.cpp +++ b/MachMgrMachines.cpp @@ -539,6 +539,14 @@ MachMgr::LimitAngleToStroke( int nInd, double& dAng) const return ( ( pMch != nullptr) ? pMch->LimitAngleToStroke( nInd, dAng) : false) ; } +//---------------------------------------------------------------------------- +bool +MachMgr::VerifyAngleOutstroke( int nInd, double dAng) const +{ + Machine* pMch = GetCurrMachine() ; + return ( ( pMch != nullptr) ? pMch->VerifyAngleOutstroke( nInd, dAng) : false) ; +} + //---------------------------------------------------------------------------- bool MachMgr::VerifyOutstroke( double dX, double dY, double dZ, double dAngA, double dAngB, int& nStat) diff --git a/MachMgrSetup.cpp b/MachMgrSetup.cpp index d2c6cc2..68645eb 100644 --- a/MachMgrSetup.cpp +++ b/MachMgrSetup.cpp @@ -35,7 +35,6 @@ MachMgr::GetDefaultSetupName( string& sName) const if ( pMch == nullptr) return false ; // recupero da file Ini della macchina - //string sMachIni = m_sMachinesDir + "\\" + GetCurrMGeoName() + "\\" + GetCurrMGeoName() + ".ini" ; string sMachIni = pMch->GetMachineDir() + "\\" + pMch->GetMachineName() + ".ini" ; string sDefault = GetPrivateProfileStringUtf8( SETUP_SEC.c_str(), SETUP_DEF_KEY.c_str(), "", sMachIni.c_str()) ; // se non trovato, errore diff --git a/Machine.h b/Machine.h index 652f718..5337454 100644 --- a/Machine.h +++ b/Machine.h @@ -110,6 +110,7 @@ class Machine bool GetToolDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) const ; bool GetNearestAngleInStroke( int nInd, double dAngRef, double& dAng) const ; bool LimitAngleToStroke( int nInd, double& dAng) const ; + bool VerifyAngleOutstroke( int nInd, double dAng) const ; bool VerifyOutstroke( double dX, double dY, double dZ, const DBLVECTOR& vAng, int& nStat) const ; const std::string& GetOutstrokeInfo( void) const { return m_sOutstrokeInfo ; } diff --git a/MachineCalc.cpp b/MachineCalc.cpp index a4e1f0f..01888fc 100644 --- a/MachineCalc.cpp +++ b/MachineCalc.cpp @@ -1148,6 +1148,22 @@ Machine::LimitAngleToStroke( int nInd, double& dAng) const return true ; } +//---------------------------------------------------------------------------- +bool +Machine::VerifyAngleOutstroke( int nInd, double dAng) const +{ + // se angolo fittizio (non esiste l'asse rotante corrispondente), va bene + if ( nInd < 0 || nInd >= int( m_vCalcRotAx.size())) + return true ; + // se angolo fuori corsa, errore + if ( dAng < m_vCalcRotAx[nInd].stroke.Min) + return false ; + else if ( dAng > m_vCalcRotAx[nInd].stroke.Max) + return false ; + // va bene + return true ; +} + //---------------------------------------------------------------------------- bool Machine::VerifyOutstroke( double dX, double dY, double dZ, const DBLVECTOR& vAng, int& nStat) const diff --git a/MachineLuaCL.cpp b/MachineLuaCL.cpp index 34f27cc..11e3431 100644 --- a/MachineLuaCL.cpp +++ b/MachineLuaCL.cpp @@ -229,9 +229,9 @@ Machine::LuaEmtAddArcMove( lua_State* L) bool bOk = ! IsNull( pArc) ; // assegno i dati dell'arco double dDeltaZ = ( ptFin - ptIni) * vtN ; - bOk = bOk && ( ! pArc->SetCPAN( ptCen, ptIni, dAngCen, dDeltaZ, vtN)) ; + bOk = bOk && pArc->SetCPAN( ptCen, ptIni, dAngCen, dDeltaZ, vtN) ; Point3d ptCalcFin ; - bOk = bOk && ( ! pArc->GetEndPoint( ptCalcFin) || ! AreSamePointApprox( ptCalcFin, ptFin)) ; + bOk = bOk && ( pArc->GetEndPoint( ptCalcFin) && AreSamePointApprox( ptCalcFin, ptFin)) ; int nMove = ( dAngCen > 0 ? 3 : 2) ; // inserisco l'oggetto nel DB geometrico int nId = ( bOk ? m_pMchLua->m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pArc)) : GDB_ID_NULL) ; diff --git a/Milling.cpp b/Milling.cpp index 092c48e..fc4eb13 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -529,8 +529,10 @@ Milling::Apply( bool bRecalc) } // se lavorazione vuota, esco - if ( m_nMills == 0) + if ( m_nMills == 0) { + LOG_INFO( GetEMkLogger(), "Warning in Milling : No machinable path") return true ; + } // calcolo gli assi macchina string sHint = ExtractHint( m_Params.m_sUserNotes) ; diff --git a/Operation.cpp b/Operation.cpp index 00776f8..d55ea58 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -783,7 +783,7 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, // ignoro gli assi bloccati if ( m_pMchMgr->IsKinematicRotAxisBlocked( i)) continue ; - // assegno il precedente + // assegno il precedente ed esco vAng1[i] = vAxRotPrec[i] ; m_pMchMgr->LimitAngleToStroke( i, vAng1[i]) ; break ; @@ -801,13 +801,16 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, // ignoro gli assi bloccati if ( m_pMchMgr->IsKinematicRotAxisBlocked( i)) continue ; - // assegno il precedente + // assegno il precedente ed esco vAng1[i] = vAxRotPrec[i] ; + break ; } } } } if ( abs( nRStat) == 2) { + bool bAng1 = true ; + bool bAng2 = true ; // se primo movimento if ( bFirst) { // porto gli angoli ai valori più vicini ai precedenti con offset di uno o più giri @@ -821,10 +824,11 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, // ignoro gli assi bloccati if ( m_pMchMgr->IsKinematicRotAxisBlocked( i)) continue ; - // assegno il precedente + // assegno il precedente ed esco vAng1[i] = vAxRotPrec[i] ; m_pMchMgr->LimitAngleToStroke( i, vAng1[i]) ; vAng2[i] = vAng1[i] ; + break ; } } } @@ -839,12 +843,20 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, // ignoro gli assi bloccati if ( m_pMchMgr->IsKinematicRotAxisBlocked( i)) continue ; - // assegno il precedente + // assegno il precedente ed esco vAng1[i] = vAxRotPrec[i] ; vAng2[i] = vAng1[i] ; + break ; } } } + // verifico che le soluzioni siano nelle corse + for ( int i = 0 ; i < int( vAng1.size()) ; ++ i) { + if ( ! m_pMchMgr->VerifyAngleOutstroke( i, vAng1[i])) + bAng1 = false ; + if ( ! m_pMchMgr->VerifyAngleOutstroke( i, vAng2[i])) + bAng2 = false ; + } } // scelgo la soluzione più vicina alla precedente double dDelta1 = 0 ; @@ -858,7 +870,7 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, dDelta1 += fabs( vAng1[i] - vAxRotPrec[i]) * ( bFirst ? dRot1W : 1) ; dDelta2 += fabs( vAng2[i] - vAxRotPrec[i]) * ( bFirst ? dRot1W : 1) ; } - if ( dDelta2 < dDelta1 - EPS_ANG_SMALL) + if ( bAng2 && ( dDelta2 < dDelta1 - EPS_ANG_SMALL || ! bAng1)) vAng1 = vAng2 ; } // ricavo posizione con eventuali modifiche dipendenti dalla lavorazione diff --git a/Pocketing.cpp b/Pocketing.cpp index d8c84ea..e931a65 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -510,8 +510,10 @@ Pocketing::Apply( bool bRecalc) return false ; // se lavorazione vuota, esco - if ( m_nPockets == 0) + if ( m_nPockets == 0) { + LOG_INFO( GetEMkLogger(), "Warning in Pocketing : No machinable pocket") return true ; + } // calcolo gli assi macchina string sHint = ExtractHint( m_Params.m_sUserNotes) ; diff --git a/Sawing.cpp b/Sawing.cpp index bf5d6df..3368307 100644 --- a/Sawing.cpp +++ b/Sawing.cpp @@ -394,7 +394,7 @@ Sawing::SetGeometry( const SELVECTOR& vIds) // test sull'entità int nSubs ; if ( ! VerifyGeometry( Id, nSubs)) { - string sOut = "Entity " + ToString( Id) + " skipped by Sawing" ; + string sOut = "Warning in Sawing : Skipped entity " + ToString( Id) ; LOG_INFO( GetEMkLogger(), sOut.c_str()) ; continue ; } @@ -887,7 +887,7 @@ Sawing::Chain( int nGrpDestId) vpCrvs.emplace_back( GetCurve( Id)) ; // ne verifico la validità if ( IsNull( vpCrvs.back())) { - string sOut = "Entity " + ToString( Id) + " skipped by Sawing" ; + string sOut = "Warning in Sawing : Skipped entity " + ToString( Id) ; LOG_INFO( GetEMkLogger(), sOut.c_str()) ; vpCrvs.back().Reset() ; }