diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 4011316..37a67d7 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/Generator.cpp b/Generator.cpp index 98862fa..263b1dd 100644 --- a/Generator.cpp +++ b/Generator.cpp @@ -37,8 +37,6 @@ Generator::Generator( void) m_pMchMgr = nullptr ; m_pGeomDB = nullptr ; m_pMachine = nullptr ; - m_sPrevTool.clear() ; - m_sTool.clear() ; m_AxesName.reserve( 8) ; m_AxesVal.reserve( 8) ; } @@ -60,6 +58,7 @@ Generator::Init( MachMgr* pMchMgr) m_pMchMgr = pMchMgr ; m_pGeomDB = m_pMchMgr->GetGeomDB() ; m_pMachine = m_pMchMgr->GetCurrMachine() ; + m_sPrevTool.clear() ; m_sTool.clear() ; return true ; } @@ -196,6 +195,7 @@ Generator::ProcessDisposition( int nOpId, int nOpInd) else break ; } + bool bOk = true ; // Se disposizione con movimenti macchina if ( ! pDisp->IsEmpty()) { @@ -219,7 +219,6 @@ Generator::ProcessDisposition( int nOpId, int nOpInd) return false ; } // Ciclo su tutti i percorsi CL della disposizione - bool bOk = true ; int nClPathInd = 0 ; int nClId = m_pGeomDB->GetFirstNameInGroup( nOpId, MCH_CL) ; int nClPathId = m_pGeomDB->GetFirstGroupInGroup( nClId) ; @@ -234,10 +233,9 @@ Generator::ProcessDisposition( int nOpId, int nOpInd) } // Emetto fine disposizione - if ( ! OnDispositionEnd()) - return false ; + bOk = bOk && OnDispositionEnd() ; - return true ; + return bOk ; } //---------------------------------------------------------------------------- @@ -537,8 +535,9 @@ Generator::OnRawMoveData( int nRawId, int RawMoveInd, int nType, const Point3d& bool Generator::OnToolSelect( void) { + // assegno il nome dell'utensile + bool bOk = m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TOOL, m_sTool) ; // assegno il nome degli assi - bool bOk = true ; int nNumAxes = int( m_AxesName.size()) ; for ( int i = 1 ; i <= MAX_AXES ; ++ i) { if ( i <= nNumAxes) diff --git a/MachConst.h b/MachConst.h index 5477257..08b928d 100644 --- a/MachConst.h +++ b/MachConst.h @@ -43,6 +43,8 @@ const std::string MACH_RAW_SOLID = "RawSolid" ; const std::string MACH_RAW_CENTER = "RawCenter" ; // Nome del contorno esterno del grezzo const std::string MACH_RAW_OUTLINE = "RawOutline" ; +// Nome del kerf del grezzo +const std::string MACH_RAW_KERF = "Kerf" ; //---------------------------------------------------------------------------- // Nome sottodirettorio delle fixtures diff --git a/MachMgrRawParts.cpp b/MachMgrRawParts.cpp index 2b5060c..6fa6463 100644 --- a/MachMgrRawParts.cpp +++ b/MachMgrRawParts.cpp @@ -23,6 +23,7 @@ #include "/EgtDev/Include/EGkCurveAux.h" #include "/EgtDev/Include/EGkOffsetCurve.h" #include "/EgtDev/Include/EgkDistPointCurve.h" +#include "/EgtDev/Include/EGkSfrCreate.h" #include "/EgtDev/Include/EGkStmStandard.h" #include "/EgtDev/Include/EGkStmFromCurves.h" #include "/EgtDev/Include/EmkMachiningGeoConst.h" @@ -767,6 +768,10 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId) // il colore del grezzo Color cCol = AQUA ; m_pGeomDB->GetCalcMaterial( nRawSolId, cCol) ; + // il riferimento del grezzo + Frame3d frRaw ; + if ( ! m_pGeomDB->GetGroupGlobFrame( nRawId, frRaw)) + return GDB_ID_NULL ; // creo la regione del grezzo a partire dal suo contorno // recupero il contorno @@ -781,17 +786,29 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId) return GDB_ID_NULL ; m_pGeomDB->SetLevel( nSfrId, GDB_LV_TEMP) ; + // se esiste il kerf, ne creo la regione + PtrOwner pSfrKerf ; + int nKerfId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_KERF) ; + ICurve* pKerfCrv = GetCurve( m_pGeomDB->GetGeoObj( nKerfId)) ; + if ( pKerfCrv != nullptr) { + SurfFlatRegionByContours SfrCntr ; + SfrCntr.AddCurve( pKerfCrv->Clone()) ; + pSfrKerf.Set( SfrCntr.GetSurf()) ; + if ( IsNull( pSfrKerf)) + return GDB_ID_NULL ; + } + // recupero le regioni delle lavorazioni INTVECTOR vMchRReg ; for ( auto nMchId : vMchId) { // recupero gruppo preview lavorazioni nella lavorazione int nPVGrp = m_pGeomDB->GetFirstNameInGroup( nMchId, MCH_PV) ; if ( nPVGrp == GDB_ID_NULL) - return false ; + return GDB_ID_NULL ; // se vuoto, cerco il rimando al preview nel pezzo if ( m_pGeomDB->GetGroupObjs( nPVGrp) == 0 && ! m_pGeomDB->GetInfo( nPVGrp, MCH_PV_KEY_RELOCATE, nPVGrp)) - return false ; + return GDB_ID_NULL ; // ciclo sui percorsi utensile (CL) int nClId = m_pGeomDB->GetFirstGroupInGroup( nPVGrp) ; while ( nClId != GDB_ID_NULL) { @@ -824,12 +841,47 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId) if ( nId == GDB_ID_NULL) return GDB_ID_NULL ; vNewIds.emplace_back( nId) ; + // imposto lo stato del contorno di questo grezzo come quello del grezzo di partenza + int nStat = GDB_ST_ON ; + if ( m_pGeomDB->GetStatus( nOutCrvId, nStat) && nStat == GDB_ST_OFF) + m_pGeomDB->SetStatus( m_pGeomDB->GetFirstNameInGroup( nId, MACH_RAW_OUTLINE), nStat) ; // assegno la fase al gruppo m_pGeomDB->SetInfo( nId, MACH_RAW_PHASE, m_nCurrPhase) ; - ++ nChunk ; - // cancello la curva - m_pGeomDB->Erase( nFirstLoopId) ; + // se esiste il kerf uso questa curva per creare il kerf del nuovo grezzo + if ( ! IsNull( pSfrKerf)) { + // creo la regione con la curva + SurfFlatRegionByContours SfrCntr ; + SfrCntr.AddCurve( GetCurve( m_pGeomDB->RemoveGeoObjAndErase( nFirstLoopId))) ; + PtrOwner pSfrNewKerf( SfrCntr.GetSurf()) ; + if ( IsNull( pSfrNewKerf)) + return GDB_ID_NULL ; + // la limito con la regione di kerf + if ( ! pSfrNewKerf->Intersect( *pSfrKerf)) + return GDB_ID_NULL ; + // se risultato non vuoto + if ( pSfrNewKerf->IsValid()) { + // riferimento del nuovo grezzo + Frame3d frNewRaw ; + if ( ! m_pGeomDB->GetGroupGlobFrame( nId, frNewRaw)) + return GDB_ID_NULL ; + // la porto dal riferimento del grezzo originale al riferimento di questo grezzo + pSfrNewKerf->LocToLoc( frRaw, frNewRaw) ; + // la porto sulla faccia sopra del grezzo + pSfrNewKerf->Translate( Vector3d( 0, 0, dHeight)) ; + // recupero il contorno e lo inserisco come kerf del nuovo grezzo + PtrOwner pCrv( pSfrNewKerf->GetLoop( 0, 0)) ; + int nNewKerfId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nId, Release( pCrv)) ; + if ( nNewKerfId == GDB_ID_NULL) + return GDB_ID_NULL ; + m_pGeomDB->CopyMaterial( nKerfId, nNewKerfId) ; + m_pGeomDB->SetName( nNewKerfId, MACH_RAW_KERF) ; + } + } + // altrimenti la cancello + else + m_pGeomDB->Erase( nFirstLoopId) ; // passo alla prossima curva + ++ nChunk ; nFirstLoopId = ExeExtractSurfFrChunkLoops( nSfrId, nChunk, nRawId, nullptr) ; } // cancello la regione diff --git a/Machine.cpp b/Machine.cpp index 3a6bb20..8aee18d 100644 --- a/Machine.cpp +++ b/Machine.cpp @@ -172,7 +172,7 @@ Machine::AdjustAuxGeometry( const STRVECTOR& vsAux, int nLay) { // sistemo la geometria ausiliaria for ( const auto& sAux : vsAux) { - // recupero pezzo e layer della geometria ausiliaria della base + // recupero pezzo e layer della geometria ausiliaria string sAuxPart, sAuxLay ; Split( sAux, "/", true, sAuxPart, sAuxLay) ; // cerco il gruppo nella geometria originale @@ -180,7 +180,7 @@ Machine::AdjustAuxGeometry( const STRVECTOR& vsAux, int nLay) int nAuxLay = m_pGeomDB->GetFirstNameInGroup( nAuxPart, sAuxLay) ; if ( nAuxLay == GDB_ID_NULL) return false ; - // lo sposto nel gruppo della base + // lo sposto nel gruppo if ( ! m_pGeomDB->RelocateGlob( nAuxLay, nLay, GDB_LAST_SON)) return false ; } diff --git a/MachineCalc.cpp b/MachineCalc.cpp index dcad448..03e5387 100644 --- a/MachineCalc.cpp +++ b/MachineCalc.cpp @@ -121,15 +121,21 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit) int nHeadId = GetGroup( sHead) ; // recupero i dati della testa Head* pHead = GetHead( nHeadId) ; - if ( pHead == nullptr) + if ( pHead == nullptr) { + string sOut = "Missing head " + sHead ; + LOG_INFO( GetEMkLogger(), sOut.c_str()) return false ; + } // recupero il gruppo dell'uscita string sExit = MCH_EXIT + ToString( nExit) ; int nExitId = m_pGeomDB->GetFirstNameInGroup( nHeadId, sExit) ; // recupero i dati dell'uscita Exit* pExit = GetExit( nExitId) ; - if ( pExit == nullptr) + if ( pExit == nullptr) { + string sOut = "Missing exit " + ToString( nExit) + " on head " + sHead ; + LOG_INFO( GetEMkLogger(), sOut.c_str()) return false ; + } // recupero i dati dell'utensile int nToolId = GDB_ID_NULL ; double dTLen = 0 ; diff --git a/OutputConst.h b/OutputConst.h index 8bf948b..b2abc58 100644 --- a/OutputConst.h +++ b/OutputConst.h @@ -46,6 +46,7 @@ static const std::string GVAR_RAWIND = ".RAWIND" ; // (int) indice mov static const std::string GVAR_RAWTYPE = ".RAWTYPE" ; // (int) tipo di movimento del grezzo static const std::string GVAR_RAWPOS = ".RAWPOS" ; // (Point3d) posizione di movimento del grezzo static const std::string GVAR_RAWFLAG = ".RAWFLAG" ; // (int) flag per movimento del grezzo +static const std::string GVAR_TOOL = ".TOOL" ; // (string) nome utensile static const std::string GVAR_MCHID = ".MCHID" ; // (int) identificativo lavorazione static const std::string GVAR_MCHIND = ".MCHIND" ; // (int) indice lavorazione static const std::string GVAR_PATHID = ".PATHID" ; // (int) identificativo percorso di lavorazione diff --git a/Simulator.cpp b/Simulator.cpp index 0b39780..7b260f9 100644 --- a/Simulator.cpp +++ b/Simulator.cpp @@ -72,6 +72,12 @@ Simulator::Start( void) int nMachGrp = m_pMchMgr->GetCurrMachGroup() ; if ( nMachGrp == GDB_ID_NULL) return false ; + // reset utensile e assi correnti + m_sTool.clear() ; + m_AxesName.clear() ; + // porto la macchina in home + if ( ! GoHome()) + return false ; // imposto fase iniziale m_pMchMgr->SetCurrPhase( 1) ; // verifico la disposizione iniziale della macchinata @@ -102,10 +108,6 @@ Simulator::Start( void) if ( ! UpdateTool( true) || ! UpdateAxes()) return false ; - // porto la macchina in home - if ( ! GoHome()) - return false ; - // richiamo gestione evento inizio lavorazione ++ m_nOpInd ; if ( ! OnMachiningStart( m_nOpId, m_nOpInd)) @@ -131,7 +133,7 @@ bool Simulator::Move( int& nStatus) { // Verifiche - if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) { + if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr || m_pMachine == nullptr) { nStatus = MCH_SIM_ERR ; return false ; } @@ -279,7 +281,7 @@ Simulator::Move( int& nStatus) for ( size_t i = OutAxes.size() ; i < 5 ; ++ i) OutAxes.emplace_back( 0) ; int nStat ; - m_pMchMgr->VerifyOutstroke( OutAxes[0], OutAxes[1], OutAxes[2], OutAxes[3], OutAxes[4], nStat) ; + m_pMachine->VerifyOutstroke( OutAxes[0], OutAxes[1], OutAxes[2], OutAxes[3], OutAxes[4], nStat) ; nStatus = MCH_SIM_OUTSTROKE ; return false ; } case CamData::AS_DIR_ERR : @@ -307,7 +309,7 @@ Simulator::Move( int& nStatus) if ( nMoveType != 2 && nMoveType != 3) { for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) { double dVal = m_AxesVal[i] * ( 1 - m_dCoeff) + AxesEnd[i] * m_dCoeff ; - m_pMchMgr->SetAxisPos( m_AxesName[i], dVal) ; + m_pMachine->SetAxisPos( m_AxesName[i], dVal) ; } } // Eseguo movimento su arco (per ora sempre nel piano XY) @@ -317,12 +319,12 @@ Simulator::Move( int& nStatus) double dAngCen = pCamData->GetAxesAngCen() ; Vector3d vtCurr = Point3d( m_AxesVal[0], m_AxesVal[1], ptCen.z) - ptCen ; vtCurr.Rotate( Z_AX, m_dCoeff * dAngCen) ; - m_pMchMgr->SetAxisPos( m_AxesName[0], ptCen.x + vtCurr.x) ; - m_pMchMgr->SetAxisPos( m_AxesName[1], ptCen.y + vtCurr.y) ; + m_pMachine->SetAxisPos( m_AxesName[0], ptCen.x + vtCurr.x) ; + m_pMachine->SetAxisPos( m_AxesName[1], ptCen.y + vtCurr.y) ; // altri assi for ( size_t i = 2 ; i < m_AxesName.size() ; ++ i) { double dVal = m_AxesVal[i] * ( 1 - m_dCoeff) + AxesEnd[i] * m_dCoeff ; - m_pMchMgr->SetAxisPos( m_AxesName[i], dVal) ; + m_pMachine->SetAxisPos( m_AxesName[i], dVal) ; } } @@ -411,12 +413,26 @@ Simulator::SetStep( double dStep) return true ; } +//---------------------------------------------------------------------------- +bool +Simulator::GoHome( void) +{ + // reset stato macchina + OnResetMachine() ; + // porto la macchina in home + m_pMchMgr->ResetAllAxesPos() ; + // assegno valori home degli assi macchina attivi + return m_pMchMgr->GetAllCalcAxesHomePos( m_AxesVal) ; +} + //---------------------------------------------------------------------------- bool Simulator::Stop( void) { // reset stato macchina OnResetMachine() ; + // porto la macchina in home + m_pMchMgr->ResetAllAxesPos() ; // rimuovo tavola variabili globali m_pMachine->LuaResetGlobVar( GLOB_VAR) ; // reset dello stato @@ -477,23 +493,14 @@ Simulator::UpdateAxes( void) if ( pMachine == nullptr) return false ; // Carico i nomi degli assi macchina attivi - return pMachine->GetAllCurrAxesName( m_AxesName) ; + if ( ! pMachine->GetAllCurrAxesName( m_AxesName)) + return false ; + // Aggiorno la posizione corrente degli assi macchina attivi + for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) + m_pMachine->GetAxisPos( m_AxesName[i], m_AxesVal[i]) ; + return true ; } -//---------------------------------------------------------------------------- -bool -Simulator::GoHome( void) -{ - // reset stato macchina - OnResetMachine() ; - // porto la macchina in home - m_pMchMgr->ResetAllAxesPos() ; - // assegno valori home degli assi macchina attivi - return m_pMchMgr->GetAllCalcAxesHomePos( m_AxesVal) ; -} - - - //---------------------------------------------------------------------------- bool Simulator::OnOperationEnd( void) @@ -613,6 +620,7 @@ Simulator::OnMoveStart( void) // assegno dati bool bOk = m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MOVEID, m_nEntId) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MOVEIND, m_nEntInd) ; + bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MOVE, pCamData->GetMoveType()) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_FLAG, nFlag) ; // verifico esistenza funzione if ( ! m_pMachine->LuaExistsFunction( ON_SIMUL_MOVE_START))