EgtMachKernel 1.6j3 :
- aggiunta gestione DB utensili - migliorata simulazione - aggiunta impostazione macchina corrente anche senza macchinata.
This commit is contained in:
+159
@@ -15,6 +15,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "MachMgr.h"
|
||||
#include "Machining.h"
|
||||
#include "MachiningConst.h"
|
||||
#include "CamData.h"
|
||||
#include "/EgtDev/Include/EGkGeoPoint3d.h"
|
||||
#include "/EgtDev/Include/EGkCurveLine.h"
|
||||
@@ -328,3 +329,161 @@ Machining::ResetMoveData( void)
|
||||
m_nFlag = 0 ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machining::GetFinalAxesValues( DBLVECTOR& vAxVal)
|
||||
{
|
||||
// recupero gruppo per geometria di lavorazione (Cutter Location)
|
||||
int nClId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_CL) ;
|
||||
if ( nClId == GDB_ID_NULL)
|
||||
return false ;
|
||||
// recupero l'ultimo percorso CL
|
||||
int nClPathId = m_pGeomDB->GetLastGroupInGroup( nClId) ;
|
||||
// recupero l'ultima entità di questo percorso
|
||||
int nEntId = m_pGeomDB->GetLastInGroup( nClPathId) ;
|
||||
// recupero i dati Cam dell'entità
|
||||
CamData* pCamData = dynamic_cast<CamData*>( m_pGeomDB->GetUserObj( nEntId)) ;
|
||||
if ( pCamData == nullptr)
|
||||
return false ;
|
||||
// assegno i valori degli assi
|
||||
vAxVal = pCamData->GetAxisVal() ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machining::CalculateAxesValues( void)
|
||||
{
|
||||
// recupero la lavorazione precedente
|
||||
int nPrevOpId = m_pMchMgr->GetPrevOperation( GetOwner()) ;
|
||||
Machining* pPrevMch = dynamic_cast<Machining*>( m_pGeomDB->GetUserObj( nPrevOpId)) ;
|
||||
// recupero l'utensile precedente
|
||||
string sPrevTool ;
|
||||
if ( pPrevMch != nullptr)
|
||||
pPrevMch->GetParam( MPA_TOOL, sPrevTool) ;
|
||||
|
||||
// imposto l'utensile per i calcoli macchina
|
||||
if ( ! m_pMchMgr->SetCalcTool( GetToolData().m_sName, GetToolData().m_sHead, GetToolData().m_nExit))
|
||||
return false ;
|
||||
|
||||
// recupero il numero di assi lineari e rotanti attivi
|
||||
int nLinAxes = m_pMchMgr->GetCurrLinAxes() ;
|
||||
int nRotAxes = m_pMchMgr->GetCurrRotAxes() ;
|
||||
|
||||
// assegno gli angoli iniziali
|
||||
double dAngAprec = 0 ;
|
||||
double dAngBprec = 0 ;
|
||||
// se utensile non cambiato, uso gli angoli finali della lavorazione precedente
|
||||
if ( ! sPrevTool.empty() && GetToolData().m_sName == sPrevTool) {
|
||||
DBLVECTOR vAxVal ;
|
||||
pPrevMch->GetFinalAxesValues( vAxVal) ;
|
||||
if ( nRotAxes >= 1)
|
||||
dAngAprec = vAxVal[nLinAxes - 1 + 1] ;
|
||||
if ( nRotAxes >= 2)
|
||||
dAngBprec = vAxVal[nLinAxes - 1 + 2] ;
|
||||
}
|
||||
// altrimenti uso gli angoli home
|
||||
else {
|
||||
DBLVECTOR vAxVal ;
|
||||
m_pMchMgr->GetAllCalcAxesHomePos( vAxVal) ;
|
||||
if ( nRotAxes >= 1)
|
||||
dAngAprec = vAxVal[nLinAxes - 1 + 1] ;
|
||||
if ( nRotAxes >= 2)
|
||||
dAngBprec = vAxVal[nLinAxes - 1 + 2] ;
|
||||
}
|
||||
|
||||
// recupero peso primo asse rotante di testa
|
||||
double dRot1W = m_pMchMgr->GetCalcRot1W() ;
|
||||
|
||||
// recupero gruppo della geometria di lavorazione (Cutter Location)
|
||||
int nClId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_CL) ;
|
||||
if ( nClId == GDB_ID_NULL)
|
||||
return false ;
|
||||
|
||||
// calcolo il valore degli assi macchina di tutti i movimenti
|
||||
bool bOk = true ;
|
||||
int nClPathId = m_pGeomDB->GetFirstGroupInGroup( nClId) ;
|
||||
while ( nClPathId != GDB_ID_NULL) {
|
||||
if ( ! CalculateClPathAxesValues( nClPathId, nLinAxes, nRotAxes, dRot1W, dAngAprec, dAngBprec))
|
||||
bOk = false ;
|
||||
nClPathId = m_pGeomDB->GetNextGroup( nClPathId) ;
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machining::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, double dRot1W,
|
||||
double& dAngAprec, double& dAngBprec)
|
||||
{
|
||||
// recupero il numero degli assi lineari e rotanti
|
||||
// predispongo variabile per valori assi
|
||||
DBLVECTOR vAxVal ;
|
||||
vAxVal.reserve( 8) ;
|
||||
// ciclo su tutte le entità del percorso CL
|
||||
bool bOk = true ;
|
||||
for ( int nEntId = m_pGeomDB->GetFirstInGroup( nClPathId) ;
|
||||
nEntId != GDB_ID_NULL ;
|
||||
nEntId = m_pGeomDB->GetNext( nEntId)) {
|
||||
// recupero i dati Cam dell'entità
|
||||
CamData* pCamData = dynamic_cast<CamData*>( m_pGeomDB->GetUserObj( nEntId)) ;
|
||||
if ( pCamData == nullptr)
|
||||
continue ;
|
||||
// calcolo degli assi rotanti della macchina
|
||||
int nRStat ;
|
||||
double dAngA1, dAngB1, dAngA2, dAngB2 ;
|
||||
bool bROk = m_pMchMgr->GetCalcAngles( pCamData->GetToolDir(), pCamData->GetCorrDir(), nRStat, dAngA1, dAngB1, dAngA2, dAngB2) ;
|
||||
if ( ! bROk || nRStat == 0) {
|
||||
bOk = false ;
|
||||
pCamData->SetAxes( CamData::AS_ERR, vAxVal) ;
|
||||
continue ;
|
||||
}
|
||||
if ( nRStat == 2) {
|
||||
double dDeltaA1 = dRot1W * fabs( dAngA1 - dAngAprec) ;
|
||||
double dDeltaB1 = fabs( dAngB1 - dAngBprec) ;
|
||||
double dDeltaA2 = dRot1W * fabs( dAngA2 - dAngAprec) ;
|
||||
double dDeltaB2 = fabs( dAngB2 - dAngBprec) ;
|
||||
if ( dDeltaA2 + dDeltaB2 < dDeltaA1 + dDeltaB1 - 1.) {
|
||||
dAngA1 = dAngA2 ;
|
||||
dAngB1 = dAngB2 ;
|
||||
}
|
||||
}
|
||||
// ricavo posizione con eventuali modifiche dipendenti dalla lavorazione
|
||||
Point3d ptP = pCamData->GetBasePoint() ;
|
||||
AdjustPositionForAxesCalc( pCamData, ptP) ;
|
||||
// calcolo gli assi lineari della macchina
|
||||
int nLStat ;
|
||||
double dX, dY, dZ ;
|
||||
bool bLOk = m_pMchMgr->GetCalcPositions( ptP, dAngA1, dAngB1, nLStat, dX, dY, dZ) ;
|
||||
if ( ! bLOk || nLStat != 0) {
|
||||
bOk = false ;
|
||||
pCamData->SetAxes( CamData::AS_ERR, vAxVal) ;
|
||||
continue ;
|
||||
}
|
||||
// assegno valori assi
|
||||
vAxVal.clear() ;
|
||||
vAxVal.emplace_back( dX) ;
|
||||
vAxVal.emplace_back( dY) ;
|
||||
vAxVal.emplace_back( dZ) ;
|
||||
vAxVal.emplace_back( dAngA1) ;
|
||||
vAxVal.emplace_back( dAngB1) ;
|
||||
// verifico i limiti di corsa degli assi
|
||||
int nStat ;
|
||||
bool bOsOk = m_pMchMgr->VerifyOutOfStroke( dX, dY, dZ, dAngA1, dAngB1, nStat) ;
|
||||
if ( ! bOsOk || nStat != 0) {
|
||||
bOk = false ;
|
||||
pCamData->SetAxes( CamData::AS_OUTSTROKE, vAxVal) ;
|
||||
continue ;
|
||||
}
|
||||
// salvo i valori degli assi
|
||||
pCamData->SetAxes( CamData::AS_OK, vAxVal) ;
|
||||
// memorizzo i valori degli angoli come nuovi precedenti
|
||||
dAngAprec = dAngA1 ;
|
||||
dAngBprec = dAngB1 ;
|
||||
}
|
||||
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user