Merge commit '2ed88f66e9daa224e881c6be61bb5a7616b0e349' into feature/Svuotature
This commit is contained in:
+9
-12
@@ -626,12 +626,18 @@ Chiseling::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2910, "Error in Chiseling : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2911, "Error in Chiseling : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 2912, sErr) ;
|
||||
else
|
||||
@@ -639,15 +645,6 @@ Chiseling::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2910, "Error in Chiseling : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2911, "Error in Chiseling : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+9
-12
@@ -748,12 +748,18 @@ Drilling::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2111, "Error in Drilling : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2112, "Error in Drilling : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 2113, sErr) ;
|
||||
else
|
||||
@@ -761,15 +767,6 @@ Drilling::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2111, "Error in Drilling : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2112, "Error in Drilling : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+9
-12
@@ -743,12 +743,18 @@ FiveAxisMilling::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 3306, "Error in FiveAxisMilling : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 3307, "Error in FiveAxisMilling : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 3308, sErr) ;
|
||||
else
|
||||
@@ -756,15 +762,6 @@ FiveAxisMilling::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 3306, "Error in FiveAxisMilling : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 3307, "Error in FiveAxisMilling : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+9
-12
@@ -719,12 +719,18 @@ GenMachining::Update( bool bPostApply)
|
||||
bool bVpl ;
|
||||
if ( ! FromString( ExtractInfo( m_Params.m_sUserNotes, "Vpl:"), bVpl))
|
||||
bVpl = true ;
|
||||
bool bLinkOk = AdjustStartEndMovements( bVpl) ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements( bVpl)) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2806, "Error in GenMachining : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2807, "Error in GenMachining : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 2808, sErr) ;
|
||||
else
|
||||
@@ -732,15 +738,6 @@ GenMachining::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2806, "Error in GenMachining : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2807, "Error in GenMachining : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
@@ -184,7 +184,7 @@ class Machine
|
||||
bool VerifyAngleOutstroke( int nInd, double dAng) const ;
|
||||
bool VerifyOutstroke( double dX, double dY, double dZ, const DBLVECTOR& vAng, bool bClear, int& nStat) const ;
|
||||
bool ExistProtectedAreas( void) const ;
|
||||
bool VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR& vAng, int nLinkType, int& nStat) ;
|
||||
bool VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR& vAng, int& nStat) ;
|
||||
bool VerifyOutstroke( const std::string& sAxName, double dVal) const ;
|
||||
std::string GetOutstrokeInfo( bool bMM = true) const ;
|
||||
void ResetOutstrokeInfo( void) const
|
||||
|
||||
+33
-38
@@ -48,7 +48,6 @@ static const string EVAR_R1 = ".R1" ; // (num) valore del pri
|
||||
static const string EVAR_R2 = ".R2" ; // (num) valore del secondo asse rotante
|
||||
static const string EVAR_R3 = ".R3" ; // (num) valore del terzo asse rotante
|
||||
static const string EVAR_R4 = ".R4" ; // (num) valore del quarto asse rotante
|
||||
static const string EVAR_LINKTYPE = ".LINKTYPE" ; // (int) tipo collegamento (0=No, 1=Inizio, 2=Fine, 3=Link))
|
||||
static const string EVAR_ERROR = ".ERR" ; // OUT (int) codice di errore ( 0 = ok)
|
||||
static const string EVAR_STAT = ".STAT" ; // OUT (int) codice di stato ( 0 = ok)
|
||||
static const string EVAR_AUXINFO = ".AUXINFO" ; // OUT (string) stringa con info ausiliarie
|
||||
@@ -76,7 +75,7 @@ Machine::SetCurrTable( const string& sTable)
|
||||
m_pGeomDB->SetStatus( m_nCalcTabId, GDB_ST_ON) ;
|
||||
// lancio eventuale funzione lua di personalizzazione
|
||||
if ( LuaExistsFunction( ON_SET_TABLE)) {
|
||||
// salvo eventuale variabile EMC_VAR già presente
|
||||
// salvo eventuale variabile EMC_VAR già presente
|
||||
bool bOldEMC = LuaChangeNameGlobVar( EMC_VAR, EMC_VAR_BACKUP) ;
|
||||
// definisco variabili
|
||||
bool bOk = LuaCreateGlobTable( EMC_VAR) ;
|
||||
@@ -86,7 +85,7 @@ Machine::SetCurrTable( const string& sTable)
|
||||
bOk = bOk && LuaCallFunction( ON_SET_TABLE) ;
|
||||
// reset variabili
|
||||
bOk = bOk && LuaResetGlobVar( EMC_VAR) ;
|
||||
// ripristino eventuale variabile EMC_VAR già presente
|
||||
// ripristino eventuale variabile EMC_VAR già presente
|
||||
if ( bOldEMC)
|
||||
LuaChangeNameGlobVar( EMC_VAR_BACKUP, EMC_VAR) ;
|
||||
// restituisco risultato
|
||||
@@ -283,7 +282,7 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit)
|
||||
if ( ! sTool.empty()) {
|
||||
// carico anche gli utensili su eventuali altre uscite della testa
|
||||
LoadTools( sHead, nExit) ;
|
||||
// carico l'utensile (si sostituisce ad altro già presente sulla stessa uscita)
|
||||
// carico l'utensile (si sostituisce ad altro già presente sulla stessa uscita)
|
||||
if ( ! LoadTool( sHead, nExit, sTool)) {
|
||||
string sOut = "Missing tool " + sTool ;
|
||||
LOG_ERROR( GetEMkLogger(), sOut.c_str())
|
||||
@@ -333,7 +332,7 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit)
|
||||
m_dCalcTOvRad = dTOvDiam / 2 ;
|
||||
// lancio eventuale funzione lua di personalizzazione
|
||||
if ( LuaExistsFunction( ON_SET_HEAD)) {
|
||||
// salvo eventuale variabile EMC_VAR già presente
|
||||
// salvo eventuale variabile EMC_VAR già presente
|
||||
bool bOldEMC = LuaChangeNameGlobVar( EMC_VAR, EMC_VAR_BACKUP) ;
|
||||
// definisco variabili
|
||||
bool bOk = LuaCreateGlobTable( EMC_VAR) ;
|
||||
@@ -351,7 +350,7 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit)
|
||||
bOk = bOk && LuaCallFunction( ON_SET_HEAD) ;
|
||||
// reset variabili
|
||||
bOk = bOk && LuaResetGlobVar( EMC_VAR) ;
|
||||
// ripristino eventuale variabile EMC_VAR già presente
|
||||
// ripristino eventuale variabile EMC_VAR già presente
|
||||
if ( bOldEMC)
|
||||
LuaChangeNameGlobVar( EMC_VAR_BACKUP, EMC_VAR) ;
|
||||
// in caso di errore esco
|
||||
@@ -541,7 +540,7 @@ Machine::CalculateKinematicChain( void)
|
||||
nHParId = m_pGeomDB->GetParentId( nHParId) ;
|
||||
}
|
||||
|
||||
// se non ci sono assi, né lineari né rotanti, sicuramente errore
|
||||
// se non ci sono assi, né lineari né rotanti, sicuramente errore
|
||||
if ( m_nTabLinAxes == 0 && m_nHeadLinAxes == 0 &&
|
||||
m_nTabRotAxes == 0 && m_nHeadRotAxes == 0) {
|
||||
LOG_ERROR( GetEMkLogger(), "Errors in Axes : none have been found")
|
||||
@@ -666,7 +665,7 @@ Machine::CalculateKinematicChain( void)
|
||||
}
|
||||
}
|
||||
}
|
||||
// se 3 va bene ( uno dovrà poi avere valore assegnato)
|
||||
// se 3 va bene ( uno dovrà poi avere valore assegnato)
|
||||
else if ( m_vCalcRotAx.size() == 3) {
|
||||
int n2ndHeadRotAx = - 1 ;
|
||||
// se tutti e tre di testa, devo invertire il primo con il terzo
|
||||
@@ -688,7 +687,7 @@ Machine::CalculateKinematicChain( void)
|
||||
}
|
||||
}
|
||||
}
|
||||
// se più di 3
|
||||
// se più di 3
|
||||
else {
|
||||
// altrimenti non ancora gestito, quindi errore
|
||||
LOG_ERROR( GetEMkLogger(), "Rotary Axes not manageable")
|
||||
@@ -705,7 +704,7 @@ Machine::CalculateKinematicChain( void)
|
||||
// non sono ammessi due assi di questo tipo
|
||||
if ( m_nHeadSpecRotAxis != -1)
|
||||
return false ;
|
||||
// la tavola non deve avere più di un asse lineare
|
||||
// la tavola non deve avere più di un asse lineare
|
||||
if ( m_nTabLinAxes > 1)
|
||||
return false ;
|
||||
// se ha un asse lineare deve essere allineato con il rotante speciale
|
||||
@@ -754,7 +753,7 @@ Machine::AddKinematicAxis( bool bOnHead, int nId)
|
||||
kAx.vtDir = pAx->GetDir() ;
|
||||
kAx.stroke = pAx->GetStroke() ;
|
||||
kAx.dHomeVal = pAx->GetHomeVal() ;
|
||||
// ne determino l'indice di posizione nella sua catena cinematica (assegno valore negato perchè provvisorio)
|
||||
// ne determino l'indice di posizione nella sua catena cinematica (assegno valore negato perchè provvisorio)
|
||||
if ( kAx.bHead) {
|
||||
( kAx.bLinear ? ++ m_nHeadLinAxes : ++ m_nHeadRotAxes) ;
|
||||
kAx.nInd = - ( m_nHeadLinAxes + m_nHeadRotAxes) ;
|
||||
@@ -977,7 +976,7 @@ Machine::GetAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
|
||||
// aggiorno direzioni utensile e ausiliaria richieste
|
||||
vtDirTm.Rotate( m_vCalcRotAx[i].vtDir, m_vCalcRotAx[i].dFixVal) ;
|
||||
vtDirAm.Rotate( m_vCalcRotAx[i].vtDir, m_vCalcRotAx[i].dFixVal) ;
|
||||
// aggiorno eventuali assi già inseriti (sicuramente di tavola)
|
||||
// aggiorno eventuali assi già inseriti (sicuramente di tavola)
|
||||
for ( size_t j = 0 ; int( j) < nNumRotAx ; ++ j) {
|
||||
RotAx[j].ptPos.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, m_vCalcRotAx[i].dFixVal) ;
|
||||
RotAx[j].vtDir.Rotate( m_vCalcRotAx[i].vtDir, m_vCalcRotAx[i].dFixVal) ;
|
||||
@@ -1066,7 +1065,7 @@ Machine::GetMyAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
|
||||
// componente versore fresa desiderato su direzione primo asse rotante
|
||||
double dCompTSuAxR1 = vtDirTn * vtAx1 ;
|
||||
|
||||
// se c'è secondo asse rotante, si calcola angolo per avere il componente appena calcolato
|
||||
// se c'è secondo asse rotante, si calcola angolo per avere il componente appena calcolato
|
||||
bool bDet = true ;
|
||||
Vector3d vtDirH1, vtDirH2 ;
|
||||
Vector3d vtDirI1, vtDirI2 ;
|
||||
@@ -1221,7 +1220,7 @@ Machine::GetPositions( const Point3d& ptP, const DBLVECTOR& vAng,
|
||||
int& nStat, double& dX, double& dY, double& dZ) const
|
||||
{
|
||||
// la posizione deve essere espressa rispetto allo ZERO MACCHINA
|
||||
// il punto è dato rispetto alla posizione home della tavola
|
||||
// il punto è dato rispetto alla posizione home della tavola
|
||||
|
||||
// verifico che siano stati assegnati gli angoli necessari, altrimenti errore
|
||||
if ( vAng.size() < m_vCalcRotAx.size())
|
||||
@@ -1263,7 +1262,7 @@ Machine::GetPositions( const Point3d& ptP, const DBLVECTOR& vAng,
|
||||
// assegno l'offset testa
|
||||
Vector3d vtDtHe = ORIG - m_ptCalcPos ;
|
||||
|
||||
// calcolo il recupero degli assi : è l'opposto dello spostamento della posizione
|
||||
// calcolo il recupero degli assi : è l'opposto dello spostamento della posizione
|
||||
Vector3d vtDtAx = m_ptCalcPos - ptPosH ;
|
||||
|
||||
// calcolo il recupero di lunghezza utensile
|
||||
@@ -1287,7 +1286,7 @@ Machine::GetPositions( const Point3d& ptP, const DBLVECTOR& vAng,
|
||||
bool
|
||||
Machine::GetDirection( const Vector3d& vtDir, const DBLVECTOR& vAng, Vector3d& vtNew) const
|
||||
{
|
||||
// è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di testa)
|
||||
// è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di testa)
|
||||
|
||||
// verifico dimensione vettore angoli rispetto al numero di assi rotanti
|
||||
if ( vAng.size() < m_vCalcRotAx.size())
|
||||
@@ -1314,7 +1313,7 @@ Machine::GetDirection( const Vector3d& vtDir, const DBLVECTOR& vAng, Vector3d& v
|
||||
bool
|
||||
Machine::GetBackDirection( const Vector3d& vtDir, const DBLVECTOR& vAng, Vector3d& vtNew) const
|
||||
{
|
||||
// è espressa nel riferimento del pezzo (tiene conto delle rotazioni di testa e al contrario di quelle di tavola)
|
||||
// è espressa nel riferimento del pezzo (tiene conto delle rotazioni di testa e al contrario di quelle di tavola)
|
||||
|
||||
// verifico dimensione vettore angoli rispetto al numero di assi rotanti
|
||||
if ( vAng.size() < m_vCalcRotAx.size())
|
||||
@@ -1342,7 +1341,7 @@ Machine::GetNoseFromPositions( double dX, double dY, double dZ, const DBLVECTOR&
|
||||
Point3d& ptNose) const
|
||||
{
|
||||
// la posizione deve essere espressa rispetto allo ZERO MACCHINA
|
||||
// è espressa nel riferimento di macchina (tiene conto delle sole traslazioni e rotazioni di testa)
|
||||
// è espressa nel riferimento di macchina (tiene conto delle sole traslazioni e rotazioni di testa)
|
||||
|
||||
// verifico dimensione vettore angoli rispetto al numero di assi rotanti
|
||||
if ( vAng.size() < m_vCalcRotAx.size())
|
||||
@@ -1394,8 +1393,8 @@ Machine::GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR&
|
||||
bool bOverall, bool bBottom, bool bBack, Point3d& ptTip) const
|
||||
{
|
||||
// la posizione deve essere espressa rispetto allo ZERO MACCHINA
|
||||
// è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di testa)
|
||||
// se bBack vero, allora è nel riferimento pezzo
|
||||
// è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di testa)
|
||||
// se bBack vero, allora è nel riferimento pezzo
|
||||
|
||||
// verifico dimensione vettore angoli rispetto al numero di assi rotanti
|
||||
if ( vAng.size() < m_vCalcRotAx.size())
|
||||
@@ -1472,9 +1471,9 @@ Machine::GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR&
|
||||
// se richiesto ingombro totale
|
||||
if ( bOverall)
|
||||
ptTip -= vtDirT * max( m_dCalcTOvLen - m_dCalcTLen, 0.) ;
|
||||
// se richiesto punto più basso e direzione fresa non esattamente verticale
|
||||
// se richiesto punto più basso e direzione fresa non esattamente verticale
|
||||
if ( bBottom && ! vtDirT.IsZplus() && ! vtDirT.IsZminus()) {
|
||||
// calcolo la direzione perpendicolare più verticale possibile
|
||||
// calcolo la direzione perpendicolare più verticale possibile
|
||||
Vector3d vtCorr = FromUprightOrtho( vtDirT) ;
|
||||
// correggo il tip
|
||||
if ( bOverall)
|
||||
@@ -1505,7 +1504,7 @@ Machine::GetAuxDirFromAngles( const DBLVECTOR& vAng, Vector3d& vtDir) const
|
||||
bool
|
||||
Machine::GetPartDirFromAngles( const Vector3d& vtPart, const DBLVECTOR& vAng, Vector3d& vtDir) const
|
||||
{
|
||||
// è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di tavola e asse rotante speciale di testa)
|
||||
// è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di tavola e asse rotante speciale di testa)
|
||||
|
||||
// verifico dimensione vettore angoli rispetto al numero di assi rotanti
|
||||
if ( vAng.size() < m_vCalcRotAx.size())
|
||||
@@ -1651,10 +1650,10 @@ Machine::AdjustAngleInStroke( const STROKE& Stroke, double& dAng) const
|
||||
bool
|
||||
Machine::GetNearestAngleInStroke( int nInd, double dAngRef, double& dAng) const
|
||||
{
|
||||
// se angolo fittizio (non esiste l'asse rotante corrispondente), non c'è alcunchè da fare
|
||||
// se angolo fittizio (non esiste l'asse rotante corrispondente), non c'è alcunchè da fare
|
||||
if ( nInd < 0 || nInd >= int( m_vCalcRotAx.size()))
|
||||
return true ;
|
||||
// cerco l'angolo più vicino stando nella corsa
|
||||
// cerco l'angolo più vicino stando nella corsa
|
||||
while ( dAng - dAngRef > ANG_STRAIGHT + EPS_ANG_ZERO && dAng - ANG_FULL >= m_vCalcRotAx[nInd].stroke.Min)
|
||||
dAng -= ANG_FULL ;
|
||||
while ( dAng - dAngRef < -ANG_STRAIGHT + EPS_ANG_ZERO && dAng + ANG_FULL <= m_vCalcRotAx[nInd].stroke.Max)
|
||||
@@ -1667,10 +1666,10 @@ Machine::GetNearestAngleInStroke( int nInd, double dAngRef, double& dAng) const
|
||||
bool
|
||||
Machine::LimitAngleToStroke( int nInd, double& dAng) const
|
||||
{
|
||||
// se angolo fittizio (non esiste l'asse rotante corrispondente), non c'è alcunchè da fare
|
||||
// se angolo fittizio (non esiste l'asse rotante corrispondente), non c'è alcunchè da fare
|
||||
if ( nInd < 0 || nInd >= int( m_vCalcRotAx.size()))
|
||||
return true ;
|
||||
// se angolo fuori corsa, lo porto all'estremo più vicino
|
||||
// se angolo fuori corsa, lo porto all'estremo più vicino
|
||||
dAng = Clamp( dAng, m_vCalcRotAx[nInd].stroke.Min, m_vCalcRotAx[nInd].stroke.Max) ;
|
||||
return true ;
|
||||
}
|
||||
@@ -1740,7 +1739,7 @@ Machine::VerifyOutstroke( double dX, double dY, double dZ, const DBLVECTOR& vAng
|
||||
}
|
||||
// verifica delle aree protette
|
||||
if ( nStat == 0)
|
||||
return const_cast<Machine*>( this)->VerifyProtectedAreas( dX, dY, dZ, vAng, 0, nStat) ;
|
||||
return const_cast<Machine*>( this)->VerifyProtectedAreas( dX, dY, dZ, vAng, nStat) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -1754,20 +1753,17 @@ Machine::VerifyOutstroke( double dX, double dY, double dZ, const DBLVECTOR& vAng
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machine::VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR& vAng, int nLinkType, int& nStat)
|
||||
Machine::VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR& vAng, int& nStat)
|
||||
{
|
||||
// se non esiste funzione gestione aree protette, non devo fare alcunchè
|
||||
// se non esiste funzione gestione aree protette, non devo fare alcunchè
|
||||
if ( ! LuaExistsFunction( ON_VERIFY_PROTECTEDAREAS))
|
||||
return true ;
|
||||
// se non è collegamento e aree protette solo per questi, non devo fare alcunchè
|
||||
if ( nLinkType == 0 && m_nNewLinkMgr == 1)
|
||||
return true ;
|
||||
// default
|
||||
bool bOk = true ;
|
||||
int nErr = 99 ;
|
||||
// salvo eventuale variabile EMC_VAR già presente
|
||||
// salvo eventuale variabile EMC_VAR già presente
|
||||
bool bOldEMC = LuaChangeNameGlobVar( EMC_VAR, EMC_VAR_BACKUP) ;
|
||||
// definisco variabili (nelle disposizioni l'utensile non è definito e non ha nome)
|
||||
// definisco variabili (nelle disposizioni l'utensile non è definito e non ha nome)
|
||||
string sTool, sHead ; int nExit ;
|
||||
bOk = bOk && LuaCreateGlobTable( EMC_VAR) ;
|
||||
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_VER, GetEMkVer()) ;
|
||||
@@ -1785,7 +1781,6 @@ Machine::VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR&
|
||||
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_R3, vAng[2]) ;
|
||||
if ( vAng.size() >= 4)
|
||||
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_R4, vAng[3]) ;
|
||||
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_LINKTYPE, nLinkType) ;
|
||||
// chiamo funzione
|
||||
bOk = bOk && LuaCallFunction( ON_VERIFY_PROTECTEDAREAS) ;
|
||||
// recupero il risultato
|
||||
@@ -1807,7 +1802,7 @@ Machine::VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR&
|
||||
}
|
||||
// reset variabili
|
||||
bOk = LuaResetGlobVar( EMC_VAR) && bOk ;
|
||||
// ripristino eventuale variabile EMC_VAR già presente
|
||||
// ripristino eventuale variabile EMC_VAR già presente
|
||||
if ( bOldEMC)
|
||||
LuaChangeNameGlobVar( EMC_VAR_BACKUP, EMC_VAR) ;
|
||||
// esco
|
||||
@@ -1854,7 +1849,7 @@ Machine::VerifyOutstroke( const string& sAxName, double dVal) const
|
||||
string
|
||||
Machine::GetOutstrokeInfo( bool bMM) const
|
||||
{
|
||||
// se non c'è extracorsa, ritorno stringa vuota
|
||||
// se non c'è extracorsa, ritorno stringa vuota
|
||||
if ( m_OutstrokeInfo.sAxName.empty())
|
||||
return "" ;
|
||||
// creo stringa con info opportune
|
||||
|
||||
+1
-4
@@ -431,7 +431,7 @@ Machining::ActivateDrillingUnit( int nHeadId, const INTVECTOR& vActExit) const
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Machining::PostApply( bool& bLinkOk, string& sErr)
|
||||
Machining::PostApply( string& sErr)
|
||||
{
|
||||
// recupero la macchina corrente
|
||||
Machine* pMch = m_pMchMgr->GetCurrMachine() ;
|
||||
@@ -441,7 +441,6 @@ Machining::PostApply( bool& bLinkOk, string& sErr)
|
||||
static const string EMC_VAR = "EMC" ; // tabella variabili locali per calcolo
|
||||
static const string EVAR_PHASE = ".PHASE" ; // IN (int) indice fase
|
||||
static const string EVAR_MCHID = ".MCHID" ; // IN (int) identificativo della lavorazione
|
||||
static const string EVAR_LINKOK = ".LINKOK" ; // IN/OUT (bool) flag di validità collegamento con lavorazione precedente
|
||||
static const string EVAR_ERROR = ".ERR" ; // OUT (int) codice di errore ( 0 = ok, > 0 errore, < 0 warning)
|
||||
static const string EVAR_MSG = ".MSG" ; // OUT (string) stringa di errore ( opzionale)
|
||||
static const string ON_POST_APPLY = "OnPostApplyMachining" ;
|
||||
@@ -457,12 +456,10 @@ Machining::PostApply( bool& bLinkOk, string& sErr)
|
||||
bOk = bOk && pMch->LuaCreateGlobTable( EMC_VAR) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_PHASE, m_nPhase) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_MCHID, m_nOwnerId) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_LINKOK, bLinkOk) ;
|
||||
// eseguo
|
||||
bOk = bOk && pMch->LuaCallFunction( ON_POST_APPLY, false) ;
|
||||
// recupero valori parametri obbligatori
|
||||
bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_ERROR, nErr) ;
|
||||
bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_LINKOK, bLinkOk) ;
|
||||
// recupero valori parametri opzionali
|
||||
string sMsg ;
|
||||
bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_MSG, sMsg) ;
|
||||
|
||||
+1
-1
@@ -57,7 +57,7 @@ class Machining : public Operation
|
||||
|
||||
protected :
|
||||
Machining( void) ;
|
||||
bool PostApply( bool& bLinkOk, std::string& sErr) ;
|
||||
bool PostApply( std::string& sErr) ;
|
||||
|
||||
private :
|
||||
int GetToolPreviewNext( int nEntId, int nParentId, int nStId) const ;
|
||||
|
||||
+10
-13
@@ -912,13 +912,19 @@ Milling::Update( bool bPostApply)
|
||||
// assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
// gestione movimenti all'inizio e fine di ogni singolo percorso di lavorazione
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2319, "Error in Milling : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2320, "Error in Milling : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 2321, sErr) ;
|
||||
else
|
||||
@@ -926,15 +932,6 @@ Milling::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2319, "Error in Milling : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2320, "Error in Milling : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+9
-12
@@ -665,12 +665,18 @@ Mortising::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2509, "Error in Mortising : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2510, "Error in Mortising : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 2511, sErr) ;
|
||||
else
|
||||
@@ -678,15 +684,6 @@ Mortising::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2509, "Error in Mortising : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2510, "Error in Mortising : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+416
-376
@@ -2724,6 +2724,18 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
if ( IsEmpty( NEED_ONE_TP_OK))
|
||||
return true ;
|
||||
|
||||
// se nuova gestione collegamenti tra lavorazioni oppure robot
|
||||
if ( m_pMchMgr->GetCurrMachine()->GetNewLinkMgr() || m_pMchMgr->GetCurrIsRobot())
|
||||
return AdjustStartEndMovementsNew( bVerifyPreviousLink) ;
|
||||
// altrimenti modalità standard
|
||||
else
|
||||
return AdjustStartEndMovementsStd( bVerifyPreviousLink) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Operation::AdjustStartEndMovementsStd( bool bVerifyPreviousLink)
|
||||
{
|
||||
// recupero ultima operazione precedente non vuota o che richiede home precedente
|
||||
// (disposizione qui considerata non vuota anche se nella path contiene solo comandi ausiliari)
|
||||
int nPrevOpId = m_pMchMgr->GetPrevActiveOperation( m_nOwnerId) ;
|
||||
@@ -2741,12 +2753,6 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
if ( pPrevOp != nullptr && ! pPrevOp->IsEmpty( NEED_ONE_TP_OK))
|
||||
sPrevTool = pPrevOp->GetToolName() ;
|
||||
|
||||
// flag nuova gestione collegamenti tra lavorazioni
|
||||
bool bNewLink = m_pMchMgr->GetCurrMachine()->GetNewLinkMgr() ;
|
||||
|
||||
// flag per CLIMB a inizio percorso già gestito
|
||||
bool bClimbDone = false ;
|
||||
|
||||
// determino posizione precedente assi
|
||||
DBLVECTOR vAxVal ;
|
||||
bool bMaxZ = false ;
|
||||
@@ -2761,16 +2767,6 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
return false ;
|
||||
// si parte da Z massima
|
||||
bMaxZ = true ;
|
||||
// per nuova gestione collegamenti, verifica aree protette
|
||||
if ( bVerifyPreviousLink && bNewLink && m_pMchMgr->GetCurrIsCenter()) {
|
||||
// recupero posizione iniziale lavorazione
|
||||
DBLVECTOR vAxIni ;
|
||||
if ( ! GetInitialAxesValues( false, vAxIni))
|
||||
return false ;
|
||||
// eseguo verifica
|
||||
if ( ! ManageProtectedAreas( vAxVal, vAxIni, nullptr, this, bClimbDone))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
|
||||
// *** Se utensile non cambiato o su diversa uscita della stessa testa, uso posizione finale della lavorazione precedente
|
||||
@@ -2791,194 +2787,177 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
DBLVECTOR vAxIni ;
|
||||
if ( ! GetInitialAxesValues( false, vAxIni))
|
||||
return false ;
|
||||
// se centro di lavoro
|
||||
if ( m_pMchMgr->GetCurrIsCenter()) {
|
||||
// recupero se ZHome è in basso
|
||||
bool bZHomeDown = GetZHomeDown() ;
|
||||
// recupero quote home e max di Z
|
||||
double dHomeZ ;
|
||||
if ( ! m_pMchMgr->GetCurrAxisHomePos( 2, dHomeZ))
|
||||
// recupero se ZHome è in basso
|
||||
bool bZHomeDown = GetZHomeDown() ;
|
||||
// recupero quote home e max di Z
|
||||
double dHomeZ ;
|
||||
if ( ! m_pMchMgr->GetCurrAxisHomePos( 2, dHomeZ))
|
||||
return false ;
|
||||
// se necessaria, aggiungo risalita parziale
|
||||
double dDeltaZ = ( vAxIni[2] - vAxVal[2]) ;
|
||||
if ( ( ! bZHomeDown && dDeltaZ > 100 * EPS_SMALL && vAxIni[2] <= dHomeZ) ||
|
||||
( bZHomeDown && dDeltaZ < -100 * EPS_SMALL && vAxIni[2] >= dHomeZ)) {
|
||||
if ( ! pPrevOp->AddRise( vAxVal, dDeltaZ))
|
||||
return false ;
|
||||
// se necessaria, aggiungo risalita parziale
|
||||
double dDeltaZ = ( vAxIni[2] - vAxVal[2]) ;
|
||||
if ( ( ! bZHomeDown && dDeltaZ > 100 * EPS_SMALL && vAxIni[2] <= dHomeZ) ||
|
||||
( bZHomeDown && dDeltaZ < -100 * EPS_SMALL && vAxIni[2] >= dHomeZ)) {
|
||||
if ( ! pPrevOp->AddRise( vAxVal, dDeltaZ))
|
||||
return false ;
|
||||
// aggiorno quota in Z della posizione iniziale ( anche se verrà aggiornata solo in seguito)
|
||||
vAxIni[2] = vAxVal[2] ;
|
||||
}
|
||||
// Verifico non ci sia collisione a HomeZ
|
||||
bool bToMaxZ = false ;
|
||||
bool bToMyHomeZ = false ;
|
||||
DBLVECTOR vAxVal2 = vAxVal ; vAxVal2[2] = dHomeZ ;
|
||||
DBLVECTOR vAxIni2 = vAxIni ; vAxIni2[2] = dHomeZ ;
|
||||
if ( ! TestCollisionAvoid( vAxVal2, vAxIni2)) {
|
||||
// se ammessa risalita aggiuntiva
|
||||
Vector3d vtTprev ; pPrevOp->GetFinalToolDir( false, vtTprev) ;
|
||||
Vector3d vtTcurr ; GetInitialToolDir( false, vtTcurr) ;
|
||||
double dExtraZ ;
|
||||
if ( GetExtraZ( vAxVal2, vtTprev, vAxIni2, vtTcurr, dHomeZ, dExtraZ)) {
|
||||
if ( abs( dExtraZ) > EPS_SMALL) {
|
||||
double dMyHomeZ = dHomeZ + dExtraZ ;
|
||||
vAxVal2[2] = dMyHomeZ ;
|
||||
vAxIni2[2] = dMyHomeZ ;
|
||||
if ( TestCollisionAvoid( vAxVal2, vAxIni2)) {
|
||||
dHomeZ = dMyHomeZ ;
|
||||
bToMyHomeZ = true ;
|
||||
}
|
||||
else
|
||||
bToMaxZ = true ;
|
||||
// aggiorno quota in Z della posizione iniziale ( anche se verrà aggiornata solo in seguito)
|
||||
vAxIni[2] = vAxVal[2] ;
|
||||
}
|
||||
// Verifico non ci sia collisione a HomeZ
|
||||
bool bToMaxZ = false ;
|
||||
bool bToMyHomeZ = false ;
|
||||
DBLVECTOR vAxVal2 = vAxVal ; vAxVal2[2] = dHomeZ ;
|
||||
DBLVECTOR vAxIni2 = vAxIni ; vAxIni2[2] = dHomeZ ;
|
||||
if ( ! TestCollisionAvoid( vAxVal2, vAxIni2)) {
|
||||
// se ammessa risalita aggiuntiva
|
||||
Vector3d vtTprev ; pPrevOp->GetFinalToolDir( false, vtTprev) ;
|
||||
Vector3d vtTcurr ; GetInitialToolDir( false, vtTcurr) ;
|
||||
double dExtraZ ;
|
||||
if ( GetExtraZ( vAxVal2, vtTprev, vAxIni2, vtTcurr, dHomeZ, dExtraZ)) {
|
||||
if ( abs( dExtraZ) > EPS_SMALL) {
|
||||
double dMyHomeZ = dHomeZ + dExtraZ ;
|
||||
vAxVal2[2] = dMyHomeZ ;
|
||||
vAxIni2[2] = dMyHomeZ ;
|
||||
if ( TestCollisionAvoid( vAxVal2, vAxIni2)) {
|
||||
dHomeZ = dMyHomeZ ;
|
||||
bToMyHomeZ = true ;
|
||||
}
|
||||
else
|
||||
bToMaxZ = true ;
|
||||
}
|
||||
// se altrimenti ammessa rotazione a Zmax e richiesta rotazione
|
||||
else if ( GetRotationAtZmax() &&
|
||||
(( vAxVal2.size() >= 4 && abs( vAxVal2[3] - vAxIni2[3]) > 5) ||
|
||||
( vAxVal2.size() >= 5 && abs( vAxVal2[4] - vAxIni2[4]) > 5))) {
|
||||
// verifico se va bene rotazione assi iniziale e poi movimento
|
||||
DBLVECTOR vAxMid2 = vAxVal2 ;
|
||||
vAxMid2[3] = vAxIni2[3] ;
|
||||
if ( vAxVal2.size() >= 5)
|
||||
vAxMid2[4] = vAxIni2[4] ;
|
||||
if ( TestCollisionAvoid( vAxVal2, vAxMid2) &&
|
||||
TestCollisionAvoid( vAxMid2, vAxIni2) &&
|
||||
pPrevOp->AddRise( vAxVal2) &&
|
||||
pPrevOp->AddSpecialRise( vAxMid2, true, GDB_ID_NULL, 5)) {
|
||||
vAxVal = vAxMid2 ;
|
||||
bMaxZ = true ;
|
||||
}
|
||||
else
|
||||
return false ;
|
||||
else
|
||||
bToMaxZ = true ;
|
||||
}
|
||||
// se altrimenti ammessa rotazione a Zmax e richiesta rotazione
|
||||
else if ( GetRotationAtZmax() &&
|
||||
(( vAxVal2.size() >= 4 && abs( vAxVal2[3] - vAxIni2[3]) > 5) ||
|
||||
( vAxVal2.size() >= 5 && abs( vAxVal2[4] - vAxIni2[4]) > 5))) {
|
||||
// verifico se va bene rotazione assi iniziale e poi movimento
|
||||
DBLVECTOR vAxMid2 = vAxVal2 ;
|
||||
vAxMid2[3] = vAxIni2[3] ;
|
||||
if ( vAxVal2.size() >= 5)
|
||||
vAxMid2[4] = vAxIni2[4] ;
|
||||
if ( TestCollisionAvoid( vAxVal2, vAxMid2) &&
|
||||
TestCollisionAvoid( vAxMid2, vAxIni2) &&
|
||||
pPrevOp->AddRise( vAxVal2) &&
|
||||
pPrevOp->AddSpecialRise( vAxMid2, true, GDB_ID_NULL, 5)) {
|
||||
vAxVal = vAxMid2 ;
|
||||
bMaxZ = true ;
|
||||
}
|
||||
// altrimenti impossibile
|
||||
else
|
||||
return false ;
|
||||
}
|
||||
// Recupero box complessivo dei grezzi attivi
|
||||
BBox3d b3Raws ;
|
||||
GetCurrRawsGlobBox( b3Raws) ;
|
||||
// Se già a Zmax
|
||||
if ( bMaxZ) {
|
||||
// non devo fare alcunché
|
||||
}
|
||||
// se altrimenti richiesta risalita a Zmax
|
||||
else if ( bToMaxZ || ForcedZmax( vAxVal, vAxIni, b3Raws)) {
|
||||
// cancello eventuale risalita parziale della lavorazione precedente
|
||||
pPrevOp->RemoveRise() ;
|
||||
// aggiungo risalita a HomeZ/MaxZ
|
||||
if ( ! pPrevOp->AddRise( vAxVal, NAN, GDB_ID_NULL, ( bNewLink ? ( bZHomeDown ? -1 : +1) : 0)))
|
||||
return false ;
|
||||
// si parte da Z massima
|
||||
bMaxZ = true ;
|
||||
}
|
||||
// altrimenti, verifico se la testa interferisce con i pezzi o i bloccaggi sulla tavola
|
||||
else if ( bToMyHomeZ || ! TestCollisionAvoid( vAxVal, vAxIni)) {
|
||||
// riprovo con risalita parziale
|
||||
bool bPartRise = false ;
|
||||
double dSafeZ = dHomeZ ;
|
||||
double dUnsafeZ = ( bZHomeDown ? min( vAxVal[2], vAxIni[2]) : max( vAxVal[2], vAxIni[2])) ;
|
||||
if ( ( ! bZHomeDown && dUnsafeZ < dSafeZ) || ( bZHomeDown && dUnsafeZ > dSafeZ)) {
|
||||
DBLVECTOR vAxVal2 = vAxVal ;
|
||||
DBLVECTOR vAxIni2 = vAxIni ;
|
||||
vAxVal2[2] = dUnsafeZ ;
|
||||
vAxIni2[2] = dUnsafeZ ;
|
||||
if ( TestCollisionAvoid( vAxVal2, vAxIni2)) {
|
||||
bPartRise = true ;
|
||||
dSafeZ = dUnsafeZ ;
|
||||
}
|
||||
else {
|
||||
for ( int i = 1 ; i <= 3 ; ++ i) {
|
||||
double dTestSafeZ = ( dUnsafeZ + dSafeZ) / 2 ;
|
||||
vAxVal2[2] = dTestSafeZ ;
|
||||
vAxIni2[2] = dTestSafeZ ;
|
||||
if ( TestCollisionAvoid( vAxVal2, vAxIni2)) {
|
||||
bPartRise = true ;
|
||||
dSafeZ = dTestSafeZ ;
|
||||
}
|
||||
else {
|
||||
dUnsafeZ = dTestSafeZ ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// se necessario, riprovo appena prima di Zmax
|
||||
if ( ! bPartRise) {
|
||||
double dOffsZ = 1 * ( bZHomeDown ? 1 : -1) ;
|
||||
vAxVal2[2] = dHomeZ + dOffsZ ;
|
||||
vAxIni2[2] = dHomeZ + dOffsZ ;
|
||||
if ( TestCollisionAvoid( vAxVal2, vAxIni2)) {
|
||||
bPartRise = true ;
|
||||
dSafeZ = dHomeZ + dOffsZ ;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( ! bPartRise) {
|
||||
// cancello eventuale risalita parziale della lavorazione precedente
|
||||
pPrevOp->RemoveRise() ;
|
||||
// aggiungo risalita a Zmax
|
||||
if ( ! pPrevOp->AddRise( vAxVal))
|
||||
return false ;
|
||||
// si parte da Z massima
|
||||
bMaxZ = true ;
|
||||
}
|
||||
else {
|
||||
// cancello eventuale risalita parziale della lavorazione precedente
|
||||
pPrevOp->RemoveRise() ;
|
||||
// recupero le nuove quote finali (per calcolare il corretto delta)
|
||||
pPrevOp->GetFinalAxesValues( false, vAxVal) ;
|
||||
// aggiungo risalita a Zsafe
|
||||
double dDelta = ( ! bZHomeDown ? max( dSafeZ - vAxVal[2], 0.) : min( dSafeZ - vAxVal[2], 0.)) ;
|
||||
if ( ! pPrevOp->AddRise( vAxVal, dDelta))
|
||||
return false ;
|
||||
// aggiorno quota iniziale in Z
|
||||
vAxIni[2] = dSafeZ ;
|
||||
}
|
||||
}
|
||||
// gestione eventuali aree protette
|
||||
if ( ! ManageProtectedAreas( vAxVal, vAxIni, pPrevOp, this, bClimbDone))
|
||||
// altrimenti impossibile
|
||||
else
|
||||
return false ;
|
||||
}
|
||||
// se robot
|
||||
else if ( m_pMchMgr->GetCurrIsRobot()) {
|
||||
// recupero dati posizione finale lavorazione precedente
|
||||
const CamData* pCdEnd = pPrevOp->GetFinalCamData( false) ;
|
||||
const Point3d& ptPEnd = pCdEnd->GetEndPoint() ;
|
||||
const Vector3d& vtDirEnd = pCdEnd->GetToolDir() ;
|
||||
const Vector3d& vtAuxEnd = pCdEnd->GetAuxDir() ;
|
||||
// recupero dati posizione iniziale lavorazione corrente
|
||||
const CamData* pCdStart = GetInitialCamData( false) ;
|
||||
const Point3d& ptPStart = pCdStart->GetEndPoint() ;
|
||||
const Vector3d& vtDirStart = pCdStart->GetToolDir() ;
|
||||
const Vector3d& vtAuxStart = pCdStart->GetAuxDir() ;
|
||||
// verifico se collegamento diretto tra le due posizioni (muovendosi alla Z maggiore) è possibile senza collisioni
|
||||
int nLowerPos = 0 ;
|
||||
DBLVECTOR vAxEnd = vAxVal ;
|
||||
DBLVECTOR vAxStart = vAxIni ;
|
||||
if ( ptPEnd.z < ptPStart.z - 100 * EPS_SMALL) {
|
||||
nLowerPos = - 1 ;
|
||||
if ( ! CalcRobotAxesAbovePos( ptPEnd, vtDirEnd, vtAuxEnd, ptPStart.z - ptPEnd.z, vAxEnd))
|
||||
return false ;
|
||||
}
|
||||
else if ( ptPEnd.z > ptPStart.z + 100 * EPS_SMALL) {
|
||||
nLowerPos = 1 ;
|
||||
if ( ! CalcRobotAxesAbovePos( ptPStart, vtDirStart, vtAuxStart, ptPEnd.z - ptPStart.z, vAxStart))
|
||||
return false ;
|
||||
}
|
||||
if ( TestCollisionAvoid( vAxEnd, vAxStart)) {
|
||||
if ( nLowerPos == -1) {
|
||||
// aggiungo risalita a Z opportuna
|
||||
if ( ! pPrevOp->AddRise( vAxVal, ptPStart.z - ptPEnd.z))
|
||||
return false ;
|
||||
// Recupero box complessivo dei grezzi attivi
|
||||
BBox3d b3Raws ;
|
||||
GetCurrRawsGlobBox( b3Raws) ;
|
||||
// Se già a Zmax
|
||||
if ( bMaxZ) {
|
||||
// non devo fare alcunché
|
||||
}
|
||||
// se altrimenti richiesta risalita a Zmax
|
||||
else if ( bToMaxZ || ForcedZmax( vAxVal, vAxIni, b3Raws)) {
|
||||
// cancello eventuale risalita parziale della lavorazione precedente
|
||||
pPrevOp->RemoveRise() ;
|
||||
// aggiungo risalita a HomeZ/MaxZ
|
||||
if ( ! pPrevOp->AddRise( vAxVal, NAN, GDB_ID_NULL, 0))
|
||||
return false ;
|
||||
// si parte da Z massima
|
||||
bMaxZ = true ;
|
||||
}
|
||||
// altrimenti, verifico se la testa interferisce con i pezzi o i bloccaggi sulla tavola
|
||||
else if ( bToMyHomeZ || ! TestCollisionAvoid( vAxVal, vAxIni)) {
|
||||
// riprovo con risalita parziale
|
||||
bool bPartRise = false ;
|
||||
double dSafeZ = dHomeZ ;
|
||||
double dUnsafeZ = ( bZHomeDown ? min( vAxVal[2], vAxIni[2]) : max( vAxVal[2], vAxIni[2])) ;
|
||||
if ( ( ! bZHomeDown && dUnsafeZ < dSafeZ) || ( bZHomeDown && dUnsafeZ > dSafeZ)) {
|
||||
DBLVECTOR vAxVal2 = vAxVal ;
|
||||
DBLVECTOR vAxIni2 = vAxIni ;
|
||||
vAxVal2[2] = dUnsafeZ ;
|
||||
vAxIni2[2] = dUnsafeZ ;
|
||||
if ( TestCollisionAvoid( vAxVal2, vAxIni2)) {
|
||||
bPartRise = true ;
|
||||
dSafeZ = dUnsafeZ ;
|
||||
}
|
||||
else {
|
||||
for ( int i = 1 ; i <= 3 ; ++ i) {
|
||||
double dTestSafeZ = ( dUnsafeZ + dSafeZ) / 2 ;
|
||||
vAxVal2[2] = dTestSafeZ ;
|
||||
vAxIni2[2] = dTestSafeZ ;
|
||||
if ( TestCollisionAvoid( vAxVal2, vAxIni2)) {
|
||||
bPartRise = true ;
|
||||
dSafeZ = dTestSafeZ ;
|
||||
}
|
||||
else {
|
||||
dUnsafeZ = dTestSafeZ ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// se necessario, riprovo appena prima di Zmax
|
||||
if ( ! bPartRise) {
|
||||
double dOffsZ = 1 * ( bZHomeDown ? 1 : -1) ;
|
||||
vAxVal2[2] = dHomeZ + dOffsZ ;
|
||||
vAxIni2[2] = dHomeZ + dOffsZ ;
|
||||
if ( TestCollisionAvoid( vAxVal2, vAxIni2)) {
|
||||
bPartRise = true ;
|
||||
dSafeZ = dHomeZ + dOffsZ ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// altrimenti aggiungo risalita a Zmax
|
||||
else {
|
||||
if ( ! bPartRise) {
|
||||
// cancello eventuale risalita parziale della lavorazione precedente
|
||||
pPrevOp->RemoveRise() ;
|
||||
// aggiungo risalita a Zmax
|
||||
if ( ! pPrevOp->AddRise( vAxVal))
|
||||
return false ;
|
||||
// si parte da Z massima
|
||||
bMaxZ = true ;
|
||||
}
|
||||
else {
|
||||
// cancello eventuale risalita parziale della lavorazione precedente
|
||||
pPrevOp->RemoveRise() ;
|
||||
// recupero le nuove quote finali (per calcolare il corretto delta)
|
||||
pPrevOp->GetFinalAxesValues( false, vAxVal) ;
|
||||
// aggiungo risalita a Zsafe
|
||||
double dDelta = ( ! bZHomeDown ? max( dSafeZ - vAxVal[2], 0.) : min( dSafeZ - vAxVal[2], 0.)) ;
|
||||
if ( ! pPrevOp->AddRise( vAxVal, dDelta))
|
||||
return false ;
|
||||
// aggiorno quota iniziale in Z
|
||||
vAxIni[2] = dSafeZ ;
|
||||
}
|
||||
}
|
||||
// se ci sono aree protette...
|
||||
if ( m_pMchMgr->GetCurrMachine()->ExistProtectedAreas()) {
|
||||
// verifico se il collegamento le attraversa
|
||||
const double PA_VERIF_LEN = 10 ;
|
||||
Point3d ptStart( vAxVal[0], vAxVal[1], vAxVal[2]) ;
|
||||
Point3d ptEnd( vAxIni[0], vAxIni[1], vAxIni[2]) ;
|
||||
double dLen = DistXY( ptStart, ptEnd) ;
|
||||
int nStep = int( dLen / PA_VERIF_LEN + 1) ;
|
||||
bool bOutstroke = false ;
|
||||
for ( int i = 1 ; i < nStep ; ++ i) {
|
||||
Point3d ptCurr = Media( ptStart, ptEnd, double( i) / nStep) ;
|
||||
int nStat = 0 ;
|
||||
if ( ! m_pMchMgr->GetCurrMachine()->VerifyProtectedAreas( ptCurr.x, ptCurr.y, ptCurr.z, {}, nStat) || nStat != 0) {
|
||||
bOutstroke = true ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
// in caso di attraversamento dell'area proibita
|
||||
if ( bOutstroke) {
|
||||
// chiamo funzione script OnSpecialRapidMove per avere nuovo punto intermedio
|
||||
DBLVECTOR vAxNew ;
|
||||
bool bModif = false ;
|
||||
bool bOk = ( SpecialMoveRapid( vAxVal, vAxIni, vAxNew, bModif) && bModif) ;
|
||||
// inserisco il nuovo punto alla fine della lavorazione precedente
|
||||
if ( bOk)
|
||||
vAxVal = vAxNew ;
|
||||
if ( ! pPrevOp->AddSpecialRise( vAxVal, bOk))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// altrimenti non richiesta verifica collegamento con lavorazione precedente
|
||||
@@ -3001,18 +2980,6 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
if ( ! pPrevOp->AddRise( vAxVal))
|
||||
return false ;
|
||||
}
|
||||
// per nuova gestione collegamenti, verifica aree protette
|
||||
if ( bVerifyPreviousLink && bNewLink && m_pMchMgr->GetCurrIsCenter()) {
|
||||
// recupero posizione finale lavorazione
|
||||
if ( ! pPrevOp->GetFinalAxesValues( false, vAxVal))
|
||||
return false ;
|
||||
// recupero posizione home
|
||||
DBLVECTOR vAxIni ;
|
||||
if ( ! m_pMchMgr->GetAllCurrAxesHomePos( vAxIni))
|
||||
return false ;
|
||||
if ( ! pPrevOp->ManageProtectedAreas( vAxVal, vAxIni, pPrevOp, nullptr, bClimbDone))
|
||||
return false ;
|
||||
}
|
||||
|
||||
// ripristino la lavorazione corrente
|
||||
m_pMchMgr->SetCurrMachining( GetOwner()) ;
|
||||
@@ -3024,16 +2991,6 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
return false ;
|
||||
// si parte da Z massima
|
||||
bMaxZ = true ;
|
||||
// per nuova gestione collegamenti, verifica aree protette
|
||||
if ( bVerifyPreviousLink && bNewLink && m_pMchMgr->GetCurrIsCenter()) {
|
||||
// recupero posizione iniziale lavorazione
|
||||
DBLVECTOR vAxIni ;
|
||||
if ( ! GetInitialAxesValues( false, vAxIni))
|
||||
return false ;
|
||||
// eseguo verifica
|
||||
if ( ! ManageProtectedAreas( vAxVal, vAxIni, nullptr, this, bClimbDone))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
|
||||
// aggiusto l'inizio di ogni percorso di lavoro
|
||||
@@ -3042,7 +2999,7 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
int nClPathId = GetFirstFullToolpath() ;
|
||||
while ( bOk && nClPathId != GDB_ID_NULL) {
|
||||
// se richiesta verifica collegamento con lavorazione precedente, sistemo inizio
|
||||
if ( bVerifyPreviousLink && ( ! bClimbDone || nPrevClPathId != GDB_ID_NULL)) {
|
||||
if ( bVerifyPreviousLink) {
|
||||
if ( ! AdjustOneStartEndMovement( nClPathId, nPrevClPathId, pPrevOp, vAxVal, bMaxZ))
|
||||
bOk = false ;
|
||||
}
|
||||
@@ -3059,16 +3016,145 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
|
||||
// Aggiungo risalita finale
|
||||
bOk = bOk && AddRise( vAxVal) ;
|
||||
// per nuova gestione collegamenti, verifica aree protette
|
||||
if ( bVerifyPreviousLink && bNewLink && m_pMchMgr->GetCurrIsCenter()) {
|
||||
// recupero posizione finale lavorazione
|
||||
if ( ! GetFinalAxesValues( false, vAxVal))
|
||||
|
||||
// se ultima operazione o la successiva lo richiede, vado in home
|
||||
int nNextOpId = m_pMchMgr->GetNextActiveOperation( m_nOwnerId) ;
|
||||
Operation* pNextOp = GetOperation( m_pGeomDB->GetUserObj( nNextOpId)) ;
|
||||
if ( pNextOp == nullptr || pNextOp->NeedPrevHome() ||
|
||||
( IsValidMachiningType( pNextOp->GetType()) && ! pNextOp->IsAtLeastOnePathOk()))
|
||||
bOk = bOk && AddHome() ;
|
||||
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Operation::AdjustStartEndMovementsNew( bool bVerifyPreviousLink)
|
||||
{
|
||||
// recupero ultima operazione precedente non vuota o che richiede home precedente
|
||||
// (disposizione qui considerata non vuota anche se nella path contiene solo comandi ausiliari)
|
||||
int nPrevOpId = m_pMchMgr->GetPrevActiveOperation( m_nOwnerId) ;
|
||||
Operation* pPrevOp = GetOperation( m_pGeomDB->GetUserObj( nPrevOpId)) ;
|
||||
while ( pPrevOp != nullptr) {
|
||||
if ( ! pPrevOp->IsEmpty( NEED_ONE_TP_OK) || pPrevOp->NeedPrevHome())
|
||||
break ;
|
||||
else {
|
||||
nPrevOpId = m_pMchMgr->GetPrevActiveOperation( nPrevOpId) ;
|
||||
pPrevOp = GetOperation( m_pGeomDB->GetUserObj( nPrevOpId)) ;
|
||||
}
|
||||
}
|
||||
// recupero l'utensile precedente
|
||||
string sPrevTool ;
|
||||
if ( pPrevOp != nullptr && ! pPrevOp->IsEmpty( NEED_ONE_TP_OK))
|
||||
sPrevTool = pPrevOp->GetToolName() ;
|
||||
|
||||
// determino posizione precedente assi
|
||||
bool bMaxZ = false ;
|
||||
|
||||
// *** Se primo utensile o richiesto, uso la posizione home
|
||||
if ( sPrevTool.empty() || NeedPrevHome()) {
|
||||
// imposto l'utensile per i calcoli macchina
|
||||
if ( ! m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr()))
|
||||
return false ;
|
||||
// recupero posizione home
|
||||
DBLVECTOR vAxIni ;
|
||||
if ( ! m_pMchMgr->GetAllCurrAxesHomePos( vAxIni))
|
||||
// si parte da Z massima
|
||||
bMaxZ = true ;
|
||||
// eventuale collegamento speciale
|
||||
if ( bVerifyPreviousLink) {
|
||||
// eseguo collegamento speciale
|
||||
if ( ! ManageSpecialLink( nullptr, GDB_ID_NULL, this, GDB_ID_NULL))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
|
||||
// *** Se utensile non cambiato o su diversa uscita della stessa testa, uso posizione finale della lavorazione precedente
|
||||
else if ( ! ToolChangeNeeded( *pPrevOp, *this)) {
|
||||
// imposto l'utensile per i calcoli macchina
|
||||
if ( ! m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr()))
|
||||
return false ;
|
||||
if ( ! ManageProtectedAreas( vAxVal, vAxIni, this, nullptr, bClimbDone))
|
||||
// se richiesta verifica collegamento con lavorazione precedente
|
||||
if ( bVerifyPreviousLink) {
|
||||
// cancello eventuale risalita finale lavorazione precedente
|
||||
pPrevOp->RemoveRise() ;
|
||||
// recupero posizione finale lavorazione precedente
|
||||
DBLVECTOR vAxVal ;
|
||||
if ( ! pPrevOp->GetFinalAxesValues( false, vAxVal))
|
||||
return false ;
|
||||
// sistemo collegamento con lavorazione precedente
|
||||
if ( ! AdjustOneStartEndMovement( GetFirstFullToolpath(), GDB_ID_NULL, pPrevOp, vAxVal, bMaxZ))
|
||||
return false ;
|
||||
// gestione collegamento speciale
|
||||
if ( ! ManageSpecialLink( pPrevOp, GDB_ID_NULL, this, GDB_ID_NULL))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
|
||||
// *** Altrimenti aggiungo uscita per cambio utensile alla lavorazione precedente e parto da questa
|
||||
else {
|
||||
// imposto la lavorazione precedente come corrente
|
||||
m_pMchMgr->SetCurrMachining( pPrevOp->GetOwner()) ;
|
||||
// imposto l'utensile precedente per i calcoli macchina
|
||||
if ( ! m_pMchMgr->SetCalcTool( pPrevOp->GetToolName(), pPrevOp->GetHeadName(), pPrevOp->GetExitNbr()))
|
||||
return false ;
|
||||
// ricalcolo risalita di lavorazione precedente (se già calcolata)
|
||||
if ( pPrevOp->RemoveRise()) {
|
||||
DBLVECTOR vAxVal ;
|
||||
if ( ! pPrevOp->AddRise( vAxVal))
|
||||
return false ;
|
||||
}
|
||||
// se richiesta verifica collegamento con lavorazione precedente
|
||||
if ( bVerifyPreviousLink) {
|
||||
// eventuale rilascio utensile speciale di lavorazione precedente
|
||||
if ( ! pPrevOp->ManageSpecialLink( pPrevOp, GDB_ID_NULL, nullptr, GDB_ID_NULL))
|
||||
return false ;
|
||||
}
|
||||
|
||||
// ripristino la lavorazione corrente
|
||||
m_pMchMgr->SetCurrMachining( GetOwner()) ;
|
||||
// imposto l'utensile per i calcoli macchina
|
||||
if ( ! m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr()))
|
||||
return false ;
|
||||
// si parte da Z massima
|
||||
bMaxZ = true ;
|
||||
// eventuale presa utensile speciale di lavorazione corrente
|
||||
if ( bVerifyPreviousLink) {
|
||||
// eseguo verifica
|
||||
if ( ! ManageSpecialLink( nullptr, GDB_ID_NULL, this, GDB_ID_NULL))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
|
||||
// aggiusto il collegamento iniziale di ogni percorso di lavoro successivo al primo
|
||||
bool bOk = true ;
|
||||
int nPrevClPathId = GetFirstFullToolpath() ;
|
||||
int nClPathId = GetNextFullToolpath( nPrevClPathId) ;
|
||||
while ( bOk && nClPathId != GDB_ID_NULL) {
|
||||
// se richiesta verifica collegamento con lavorazione precedente
|
||||
if ( bVerifyPreviousLink) {
|
||||
// recupero nuovi finali senza risalite
|
||||
RemoveRise( nPrevClPathId) ;
|
||||
DBLVECTOR vAxVal ;
|
||||
if ( ! GetClPathFinalAxesValues( nPrevClPathId, false, vAxVal))
|
||||
bOk = false ;
|
||||
// sistemo collegamento con precedente
|
||||
if ( ! AdjustOneStartEndMovement( nClPathId, nPrevClPathId, nullptr, vAxVal, bMaxZ))
|
||||
bOk = false ;
|
||||
// gestione collegamento speciale ( tra due percorsi della stessa lavorazione)
|
||||
if ( ! ManageSpecialLink( this, nPrevClPathId, this, nClPathId))
|
||||
return false ;
|
||||
}
|
||||
bMaxZ = false ;
|
||||
// passo al successivo
|
||||
nPrevClPathId = nClPathId ;
|
||||
nClPathId = GetNextFullToolpath( nClPathId) ;
|
||||
pPrevOp = nullptr ;
|
||||
}
|
||||
|
||||
// Aggiungo risalita finale
|
||||
DBLVECTOR vAxVal ;
|
||||
bOk = bOk && AddRise( vAxVal) ;
|
||||
// nuova verifica aree protette alla fine
|
||||
if ( bVerifyPreviousLink) {
|
||||
if ( ! ManageSpecialLink( this, GDB_ID_NULL, nullptr, GDB_ID_NULL))
|
||||
return false ;
|
||||
}
|
||||
|
||||
@@ -3084,116 +3170,58 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Operation::ManageProtectedAreas( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, Operation* pPrevOp, Operation* pNextOp,
|
||||
bool& bClimbDone)
|
||||
Operation::ManageSpecialLink( Operation* pPrevOpe, int nPrevClPathId, Operation* pNextOpe, int nNextClPathId)
|
||||
{
|
||||
// se non ci sono aree protette, esco subito.
|
||||
if ( ! m_pMchMgr->GetCurrMachine()->ExistProtectedAreas())
|
||||
return true ;
|
||||
|
||||
// il numero di assi non deve cambiare
|
||||
if ( vAxStart.size() != vAxEnd.size())
|
||||
// controlli
|
||||
if ( pPrevOpe == nullptr && pNextOpe == nullptr)
|
||||
return false ;
|
||||
int nAxisTot = int( vAxStart.size()) ;
|
||||
|
||||
// recupero flag nuova gestione collegamenti tra lavorazioni
|
||||
bool bNewLink = m_pMchMgr->GetCurrMachine()->GetNewLinkMgr() ;
|
||||
|
||||
// codifica tipo di collegamento
|
||||
int nLinkType = ( pPrevOp == nullptr ? 0 : 2) + ( pNextOp == nullptr ? 0 : 1) ;
|
||||
|
||||
// Verifico se il collegamento le attraversa
|
||||
Point3d ptSta( vAxStart[0], vAxStart[1], vAxStart[2]) ;
|
||||
Point3d ptEnd( vAxEnd[0], vAxEnd[1], vAxEnd[2]) ;
|
||||
DBLVECTOR vAngSta ;
|
||||
for ( int i = 3 ; i < int( vAxStart.size()) && bNewLink ; ++ i)
|
||||
vAngSta.emplace_back( vAxStart[i]) ;
|
||||
DBLVECTOR vAngEnd ;
|
||||
for ( int i = 3 ; i < int( vAxEnd.size()) && bNewLink ; ++ i)
|
||||
vAngEnd.emplace_back( vAxEnd[i]) ;
|
||||
// verifico inizio e fine
|
||||
int nOutstroke = 0 ;
|
||||
int nStSta = 0 ;
|
||||
if ( ! m_pMchMgr->GetCurrMachine()->VerifyProtectedAreas( ptSta.x, ptSta.y, ptSta.z, vAngSta, nLinkType, nStSta) || nStSta != 0)
|
||||
nOutstroke |= 2 ;
|
||||
int nStEnd = 0 ;
|
||||
if ( ! m_pMchMgr->GetCurrMachine()->VerifyProtectedAreas( ptEnd.x, ptEnd.y, ptEnd.z, vAngEnd, nLinkType, nStEnd) || nStEnd != 0)
|
||||
nOutstroke |= 1 ;
|
||||
// verifico i punti intermedi
|
||||
const double PA_VERIF_LEN = 10 ;
|
||||
double dLen = DistXY( ptSta, ptEnd) ;
|
||||
int nStep = int( dLen / PA_VERIF_LEN) + 1 ;
|
||||
for ( int i = 1 ; i < nStep && nOutstroke == 0 ; ++ i) {
|
||||
double dCoeff = double( i) / nStep ;
|
||||
Point3d ptCurr = Media( ptSta, ptEnd, dCoeff) ;
|
||||
DBLVECTOR vAng ;
|
||||
for ( int j = 0 ; j < int( vAngSta.size()) ; ++ j)
|
||||
vAng.emplace_back( ( 1 - dCoeff) * vAngSta[j] + dCoeff * vAngEnd[j]) ;
|
||||
int nStat = 0 ;
|
||||
if ( ! m_pMchMgr->GetCurrMachine()->VerifyProtectedAreas( ptCurr.x, ptCurr.y, ptCurr.z, vAng, nLinkType, nStat) || nStat != 0)
|
||||
nOutstroke |= 4 ;
|
||||
}
|
||||
if ( nOutstroke == 0)
|
||||
return true ;
|
||||
int nLinkType = ( pPrevOpe != nullptr ? 2 : 0) + ( pNextOpe != nullptr ? 1 : 0) ;
|
||||
|
||||
// assegno valori assi iniziali e finali, depurati di approcci/retrazioni aggiuntive (CLIMB e RISE) in area protetta
|
||||
DBLVECTOR vNeatAxSta ;
|
||||
if ( bNewLink && pPrevOp && ( nOutstroke & 2) != 0)
|
||||
pPrevOp->GetFinalAxesValues( true, vNeatAxSta) ;
|
||||
DBLVECTOR vAxSta, vNeatAxSta ;
|
||||
if ( pPrevOpe != nullptr) {
|
||||
if ( nPrevClPathId == GDB_ID_NULL) {
|
||||
pPrevOpe->GetFinalAxesValues( false, vAxSta) ;
|
||||
pPrevOpe->GetFinalAxesValues( true, vNeatAxSta) ;
|
||||
}
|
||||
else {
|
||||
pPrevOpe->GetClPathFinalAxesValues( nPrevClPathId, false, vAxSta) ;
|
||||
pPrevOpe->GetClPathFinalAxesValues( nPrevClPathId, true, vNeatAxSta) ;
|
||||
}
|
||||
}
|
||||
else
|
||||
vNeatAxSta = vAxStart ;
|
||||
DBLVECTOR vNeatAxEnd ;
|
||||
if ( bNewLink && pNextOp && ( nOutstroke & 1) != 0)
|
||||
pNextOp->GetInitialAxesValues( true, vNeatAxEnd) ;
|
||||
m_pMchMgr->GetAllCurrAxesHomePos( vNeatAxSta) ;
|
||||
DBLVECTOR vAxEnd, vNeatAxEnd ;
|
||||
if ( pNextOpe != nullptr) {
|
||||
if ( nNextClPathId == GDB_ID_NULL) {
|
||||
pNextOpe->GetInitialAxesValues( false, vAxEnd) ;
|
||||
pNextOpe->GetInitialAxesValues( true, vNeatAxEnd) ;
|
||||
}
|
||||
else {
|
||||
pNextOpe->GetClPathInitialAxesValues( nNextClPathId, false, vAxEnd) ;
|
||||
pNextOpe->GetClPathInitialAxesValues( nNextClPathId, true, vNeatAxEnd) ;
|
||||
}
|
||||
}
|
||||
else
|
||||
vNeatAxEnd = vAxEnd ;
|
||||
if ( int( vNeatAxSta.size()) != nAxisTot || int( vNeatAxEnd.size()) != nAxisTot)
|
||||
m_pMchMgr->GetAllCurrAxesHomePos( vNeatAxEnd) ;
|
||||
if ( vNeatAxSta.size() != vNeatAxEnd.size())
|
||||
return false ;
|
||||
|
||||
// chiamo funzione script OnSpecialRapidMove per avere posizioni di movimento
|
||||
POSVECTOR vPosNew ;
|
||||
bool bOk = SpecialMoveRapid( vNeatAxSta, vNeatAxEnd, nOutstroke, nLinkType, vPosNew) ;
|
||||
// se tutto bene, eseguo cancellazioni e inserimenti come richiesto
|
||||
if ( bOk) {
|
||||
bClimbDone = bNewLink ;
|
||||
// eventuali cancellazioni
|
||||
if ( bNewLink && ( nOutstroke & 2) != 0 && pPrevOp != nullptr)
|
||||
pPrevOp->RemoveRise() ;
|
||||
if ( bNewLink && ( nOutstroke & 1) != 0 && pNextOp != nullptr)
|
||||
pNextOp->RemoveClimb() ;
|
||||
// eventuali inserimenti
|
||||
for ( const auto& PosNew : vPosNew) {
|
||||
if ( PosNew.nSide == 2) {
|
||||
if ( pPrevOp == nullptr ||
|
||||
! pPrevOp->AddSpecialRise( PosNew.vAxis, true, GDB_ID_NULL,
|
||||
PosNew.nFlag, PosNew.nFlag2, PosNew.nMask, PosNew.sInfo))
|
||||
return false ;
|
||||
}
|
||||
else if ( PosNew.nSide != 1)
|
||||
bool bOk = SpecialLink( vNeatAxSta, vNeatAxEnd, nLinkType, pPrevOpe, pNextOpe) ;
|
||||
|
||||
// in caso di errore eseguo inserimento con segnalazione di errore
|
||||
if ( ! bOk) {
|
||||
if ( pPrevOpe != nullptr) {
|
||||
if ( ! pPrevOpe->AddSpecialRise( vAxSta, false))
|
||||
return false ;
|
||||
}
|
||||
for ( int i = int( vPosNew.size()) - 1 ; i >= 0 ; --i) {
|
||||
const auto& PosNew = vPosNew[i] ;
|
||||
if ( PosNew.nSide == 1) {
|
||||
if ( pNextOp == nullptr ||
|
||||
! pNextOp->AddSpecialClimb( PosNew.vAxis, true, GDB_ID_NULL,
|
||||
PosNew.nFlag, PosNew.nFlag2, PosNew.nMask, PosNew.sInfo))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// altrimenti eseguo inserimento con segnalazione di errore
|
||||
else {
|
||||
if ( pPrevOp != nullptr) {
|
||||
if ( ! pPrevOp->AddSpecialRise( vAxStart, false))
|
||||
if ( pNextOpe != nullptr) {
|
||||
if ( ! pNextOpe->AddSpecialClimb( vAxEnd, false))
|
||||
return false ;
|
||||
}
|
||||
if ( pNextOp != nullptr) {
|
||||
if ( ! pNextOp->AddSpecialClimb( vAxEnd, false))
|
||||
return false ;
|
||||
}
|
||||
if ( pPrevOp == nullptr && pNextOp == nullptr)
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
@@ -3554,18 +3582,18 @@ Operation::AdjustOneStartEndMovement( int nClPathId, int nPrevClPathId, Operatio
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Operation::ToolChangeNeeded( const Operation& Op1, const Operation& Op2) const
|
||||
Operation::ToolChangeNeeded( const Operation& Ope1, const Operation& Ope2) const
|
||||
{
|
||||
// se non cambia l'utensile, non cambia la testa fisica
|
||||
if ( EqualNoCase( Op1.GetToolName(), Op2.GetToolName()))
|
||||
if ( EqualNoCase( Ope1.GetToolName(), Ope2.GetToolName()))
|
||||
return false ;
|
||||
// se non hanno TcPos e stanno sulla stessa testa con uscita diversa, non cambia la testa fisica
|
||||
if ( Op1.GetToolTcPos().empty() && Op2.GetToolTcPos().empty() &&
|
||||
EqualNoCase( Op1.GetHeadName(), Op2.GetHeadName()) && Op1.GetExitNbr() != Op2.GetExitNbr())
|
||||
if ( Ope1.GetToolTcPos().empty() && Ope2.GetToolTcPos().empty() &&
|
||||
EqualNoCase( Ope1.GetHeadName(), Ope2.GetHeadName()) && Ope1.GetExitNbr() != Ope2.GetExitNbr())
|
||||
return false ;
|
||||
// se hanno lo stesso TcPos e stanno sulla stessa testa con uscita diversa, non cambia la testa fisica
|
||||
if ( EqualNoCase( Op1.GetToolTcPos(), Op2.GetToolTcPos()) &&
|
||||
EqualNoCase( Op1.GetHeadName(), Op2.GetHeadName()) && Op1.GetExitNbr() != Op2.GetExitNbr())
|
||||
if ( EqualNoCase( Ope1.GetToolTcPos(), Ope2.GetToolTcPos()) &&
|
||||
EqualNoCase( Ope1.GetHeadName(), Ope2.GetHeadName()) && Ope1.GetExitNbr() != Ope2.GetExitNbr())
|
||||
return false ;
|
||||
// altrimenti necessario un cambio
|
||||
return true ;
|
||||
@@ -4969,8 +4997,63 @@ Operation::SpecialMoveZup( DBLVECTOR& vAx, Vector3d& vtTool, int& nFlag, int& nF
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Operation::SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int nOutstroke, int nLinkType,
|
||||
POSVECTOR& vNewPos)
|
||||
Operation::SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, DBLVECTOR& vAxNew, bool& bModif)
|
||||
{
|
||||
// recupero la macchina corrente
|
||||
Machine* pMch = ( m_pMchMgr != nullptr ? m_pMchMgr->GetCurrMachine() : nullptr) ;
|
||||
if ( pMch == nullptr)
|
||||
return false ;
|
||||
// costanti
|
||||
static const string EMC_VAR = "EMC" ; // tabella variabili locali per calcolo
|
||||
static const string EVAR_ERROR = ".ERR" ; // OUT (int) codice di errore ( 0 = ok)
|
||||
static const string EVAR_MODIF = ".MODIF" ; // OUT (bool) flag di modifica effettuata
|
||||
static const string ON_SPECIAL_MOVERAPID = "OnSpecialMoveRapid" ;
|
||||
|
||||
// se funzione non implementata
|
||||
if ( ! pMch->LuaExistsFunction( ON_SPECIAL_MOVERAPID)) {
|
||||
bModif = false ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
// eseguo l'azione
|
||||
bool bOk = true ;
|
||||
int nErr = 99 ;
|
||||
// imposto valori parametri
|
||||
bOk = bOk && pMch->LuaCreateGlobTable( EMC_VAR) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_TOOL, GetToolName()) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_HEAD, GetHeadName()) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_EXIT, GetExitNbr()) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_TCPOS, GetToolTcPos()) ;
|
||||
// valore degli assi
|
||||
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
|
||||
int nNumAxes = int( vAxStart.size()) ;
|
||||
for ( int i = 1 ; i <= nNumAxes ; ++ i)
|
||||
bOk = bOk && pMch->LuaSetGlobVar( GetGlobVarAxisPrev( i, EMC_VAR, bIsRobot), vAxStart[i-1]) ;
|
||||
for ( int i = 1 ; i <= nNumAxes ; ++ i)
|
||||
bOk = bOk && pMch->LuaSetGlobVar( GetGlobVarAxisValue( i, EMC_VAR, bIsRobot), vAxEnd[i-1]) ;
|
||||
// eseguo
|
||||
bOk = bOk && pMch->LuaCallFunction( ON_SPECIAL_MOVERAPID, false) ;
|
||||
// recupero valori parametri obbligatori
|
||||
bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_ERROR, nErr) ;
|
||||
bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_MODIF, bModif) ;
|
||||
vAxNew.resize( nNumAxes) ;
|
||||
for ( int i = 1 ; i <= nNumAxes ; ++ i)
|
||||
bOk = bOk && pMch->LuaGetGlobVar( GetGlobVarAxisValue( i, EMC_VAR, bIsRobot), vAxNew[i-1]) ;
|
||||
// reset
|
||||
bOk = bOk && pMch->LuaResetGlobVar( EMC_VAR) ;
|
||||
// segnalo errori
|
||||
if ( nErr != 0) {
|
||||
bOk = false ;
|
||||
string sOut = " Error in " + ON_SPECIAL_MOVERAPID + " (" + ToString( nErr) + ")" ;
|
||||
LOG_ERROR( GetEMkLogger(), sOut.c_str())
|
||||
}
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Operation::SpecialLink( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int nLinkType,
|
||||
const Operation* pPrevOpe, const Operation* pNextOpe)
|
||||
{
|
||||
// recupero la macchina corrente
|
||||
Machine* pMch = ( m_pMchMgr != nullptr ? m_pMchMgr->GetCurrMachine() : nullptr) ;
|
||||
@@ -4978,16 +5061,16 @@ Operation::SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd,
|
||||
return false ;
|
||||
// costanti
|
||||
static const string EMC_VAR = "EMC" ; // tabella variabili locali per calcolo
|
||||
static const string EVAR_OUTSTROKE = ".OUTSTROKE" ; // IN (int) codice extracorsa posizioni (1=Inizio, 2=Fine, 3=FinePrec+InizioSucc))
|
||||
static const string EVAR_LINKTYPE = ".LINKTYPE" ; // IN (int) codice tipo collegamento (1=Inizio, 2=Fine, 3=FinePrec+InizioSucc))
|
||||
static const string EVAR_PREVMCHID = ".PREVMCHID" ; // IN (int) identificativo lavorazione precedente
|
||||
static const string EVAR_PREVPHASE = ".PREVPHASE" ; // IN (int) indice fase della lavorazione precedente
|
||||
static const string EVAR_NEXTMCHID = ".NEXTMCHID" ; // IN (int) identificativo lavorazione successiva
|
||||
static const string EVAR_NEXTPHASE = ".NEXTPHASE" ; // IN (int) indice fase della lavorazione successiva
|
||||
static const string EVAR_LINKTYPE = ".LINKTYPE" ; // IN (int) codice tipo collegamento (1=Inizio, 2=Fine, 3=FinePrec+InizioSucc)
|
||||
static const string EVAR_ERROR = ".ERR" ; // OUT (int) codice di errore ( 0 = ok)
|
||||
static const string EVAR_POSTOT = ".POSTOT" ; // OUT (int) numero di nuove posizioni
|
||||
static const string EVAR_POS = ".POS" ; // OUT (table) vettore di posizioni
|
||||
static const string EVAR_SIDE = ".SIDE" ; // OUT (int) codice inserimento movimento (1=Inizio, 2=Fine)
|
||||
static const string ON_SPECIAL_MOVERAPID = "OnSpecialMoveRapid" ;
|
||||
static const string ON_SPECIAL_LINK = "OnSpecialLink" ;
|
||||
|
||||
// se la funzione non è definita, esco
|
||||
if ( ! pMch->LuaExistsFunction( ON_SPECIAL_MOVERAPID))
|
||||
if ( ! pMch->LuaExistsFunction( ON_SPECIAL_LINK))
|
||||
return false ;
|
||||
|
||||
// eseguo
|
||||
@@ -4999,9 +5082,11 @@ Operation::SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd,
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_HEAD, GetHeadName()) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_EXIT, GetExitNbr()) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_TCPOS, GetToolTcPos()) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_MCHID, GetOwner()) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_PREVMCHID, ( pPrevOpe != nullptr ? pPrevOpe->GetOwner() : GDB_ID_NULL)) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_PREVPHASE, ( pPrevOpe != nullptr ? pPrevOpe->m_nPhase : 0)) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_NEXTMCHID, ( pNextOpe != nullptr ? pNextOpe->GetOwner() : GDB_ID_NULL)) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_NEXTPHASE, ( pNextOpe != nullptr ? pNextOpe->m_nPhase : 0)) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_PHASE, m_nPhase) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OUTSTROKE, ( nOutstroke % 4)) ;
|
||||
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_LINKTYPE, nLinkType) ;
|
||||
// valore degli assi
|
||||
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
|
||||
@@ -5011,59 +5096,14 @@ Operation::SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd,
|
||||
for ( int i = 1 ; i <= nNumAxes ; ++ i)
|
||||
bOk = bOk && pMch->LuaSetGlobVar( GetGlobVarAxisValue( i, EMC_VAR, bIsRobot), vAxEnd[i-1]) ;
|
||||
// eseguo
|
||||
bOk = bOk && pMch->LuaCallFunction( ON_SPECIAL_MOVERAPID) ;
|
||||
bOk = bOk && pMch->LuaCallFunction( ON_SPECIAL_LINK) ;
|
||||
// recupero valori parametri obbligatori
|
||||
bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_ERROR, nErr) && nErr == 0 ;
|
||||
// recupero i parametri facoltativi
|
||||
int nPosTot ;
|
||||
if ( ! pMch->LuaGetGlobVar( EMC_VAR + EVAR_POSTOT, nPosTot))
|
||||
nPosTot = -1 ;
|
||||
// recupero gli assi
|
||||
vNewPos.clear() ;
|
||||
if ( nPosTot == -1) {
|
||||
vNewPos.resize( 1) ;
|
||||
vNewPos[0].vAxis.resize( nNumAxes) ;
|
||||
for ( int i = 1 ; i <= nNumAxes && bOk ; ++ i) {
|
||||
if ( ! pMch->LuaGetGlobVar( GetGlobVarAxisValue( i, EMC_VAR, bIsRobot), vNewPos[0].vAxis[i-1])) {
|
||||
bOk = false ;
|
||||
nErr = 91 ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for ( int j = 1 ; j <= nPosTot && bOk ; ++ j) {
|
||||
string sRec = EMC_VAR + EVAR_POS + "." + ToString( j) ;
|
||||
Position CurrPos ;
|
||||
if ( ! pMch->LuaGetGlobVar( sRec + EVAR_SIDE, CurrPos.nSide)) {
|
||||
bOk = false ;
|
||||
nErr = 92 ;
|
||||
break ;
|
||||
}
|
||||
CurrPos.vAxis.resize( nNumAxes) ;
|
||||
for ( int i = 1 ; i <= nNumAxes ; ++ i) {
|
||||
if ( ! pMch->LuaGetGlobVar( GetGlobVarAxisValue( i, sRec, bIsRobot), CurrPos.vAxis[i-1])) {
|
||||
bOk = false ;
|
||||
nErr = 93 ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
if ( ! pMch->LuaGetGlobVar( sRec + GVAR_MASK, CurrPos.nMask))
|
||||
CurrPos.nMask = -1 ;
|
||||
if ( ! pMch->LuaGetGlobVar( sRec + GVAR_FLAG, CurrPos.nFlag))
|
||||
CurrPos.nFlag = 0 ;
|
||||
if ( ! pMch->LuaGetGlobVar( sRec + GVAR_FLAG2, CurrPos.nFlag2))
|
||||
CurrPos.nFlag2 = 0 ;
|
||||
if ( ! pMch->LuaGetGlobVar( sRec + GVAR_INFO, CurrPos.sInfo))
|
||||
CurrPos.sInfo = "" ;
|
||||
vNewPos.emplace_back( CurrPos) ;
|
||||
}
|
||||
}
|
||||
// reset
|
||||
bOk = pMch->LuaResetGlobVar( EMC_VAR) && bOk ;
|
||||
// segnalo errori
|
||||
if ( ! bOk) {
|
||||
string sOut = " Error in " + ON_SPECIAL_MOVERAPID + " (" + ToString( nErr) + ")" ;
|
||||
string sOut = " Error in " + EVAR_LINKTYPE + " (" + ToString( nErr) + ")" ;
|
||||
LOG_ERROR( GetEMkLogger(), sOut.c_str())
|
||||
}
|
||||
return bOk ;
|
||||
|
||||
+8
-5
@@ -231,9 +231,11 @@ class Operation : public IUserObj
|
||||
DBLVECTOR& vAxMid) const ;
|
||||
bool OneMoveTestCollisionAvoid( const STRVECTOR& vAxName, const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd,
|
||||
Machine* pMch, const INTVECTOR& vRawId, const INTVECTOR& vFxtId) const ;
|
||||
bool ManageProtectedAreas( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, Operation* pPrevOp, Operation* pNextOp, bool& bClimbDone) ;
|
||||
bool AdjustOneStartEndMovement( int nClPathId, int nPrevClPathId, Operation* pPrevOp, const DBLVECTOR& vAxPrev, bool bMaxZ) ;
|
||||
bool ToolChangeNeeded( const Operation& Op1, const Operation& Op2) const ;
|
||||
bool AdjustStartEndMovementsStd( bool bVerifyPreviousLink) ;
|
||||
bool AdjustOneStartEndMovement( int nClPathId, int nPrevClPathId, Operation* pPrevOpe, const DBLVECTOR& vAxPrev, bool bMaxZ) ;
|
||||
bool AdjustStartEndMovementsNew( bool bVerifyPreviousLink) ;
|
||||
bool ManageSpecialLink( Operation* pPrevOpe, int nPrevClPathId, Operation* pNextOpe, int nNextClPathId) ;
|
||||
bool ToolChangeNeeded( const Operation& Ope1, const Operation& Ope2) const ;
|
||||
bool AddSpecialClimb( const DBLVECTOR& vAxVal, bool bOk = true, int nClPathId = GDB_ID_NULL,
|
||||
int nFlag = 0, int nFlag2 = 0, int nMask = -1, const std::string& sInfo = "", bool bFirst = true) ;
|
||||
bool RemoveClimb( int nClPathId = GDB_ID_NULL) ;
|
||||
@@ -258,8 +260,9 @@ class Operation : public IUserObj
|
||||
bool GetZHomeDown( void) const ;
|
||||
int SpecialTestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ;
|
||||
bool SpecialMoveZup( DBLVECTOR& vAx, Vector3d& vtTool, int& nFlag, int& nFlag2, bool& bModif) ;
|
||||
bool SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int nOutstroke, int nLinkType,
|
||||
POSVECTOR& vNewPos) ;
|
||||
bool SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, DBLVECTOR& vAxNew, bool& bModif) ;
|
||||
bool SpecialLink( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int nLinkType,
|
||||
const Operation* pPrevOpe, const Operation* pNextOpe) ;
|
||||
|
||||
protected :
|
||||
int m_nOwnerId ; // identificativo dell'oggetto geometrico possessore
|
||||
|
||||
+9
-12
@@ -783,12 +783,18 @@ Pocketing::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2425, "Error in Pocketing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2426, "Error in Pocketing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 2427, sErr) ;
|
||||
else
|
||||
@@ -796,15 +802,6 @@ Pocketing::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2425, "Error in Pocketing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2426, "Error in Pocketing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+9
-12
@@ -853,12 +853,18 @@ PocketingNT::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2425, "Error in PocketingNT : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2426, "Error in PocketingNT : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 2427, sErr) ;
|
||||
else
|
||||
@@ -866,15 +872,6 @@ PocketingNT::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2425, "Error in PocketingNT : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2426, "Error in PocketingNT : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+9
-12
@@ -681,12 +681,18 @@ Probing::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 3406, "Error in Probing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 3407, "Error in Probing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 3408, sErr) ;
|
||||
else
|
||||
@@ -694,15 +700,6 @@ Probing::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 3406, "Error in Probing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 3407, "Error in Probing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+9
-12
@@ -638,12 +638,18 @@ SawFinishing::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2713, "Error in SawFinishing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2714, "Error in SawFinishing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 2715, sErr) ;
|
||||
else
|
||||
@@ -651,15 +657,6 @@ SawFinishing::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2713, "Error in SawFinishing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2714, "Error in SawFinishing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+9
-12
@@ -602,12 +602,18 @@ SawRoughing::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2613, "Error in SawRoughing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2614, "Error in SawRoughing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 2615, sErr) ;
|
||||
else
|
||||
@@ -615,15 +621,6 @@ SawRoughing::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2613, "Error in SawRoughing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2614, "Error in SawRoughing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+9
-12
@@ -784,12 +784,18 @@ Sawing::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2217, "Error in Sawing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2218, "Error in Sawing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 2219, sErr) ;
|
||||
else
|
||||
@@ -797,15 +803,6 @@ Sawing::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 2217, "Error in Sawing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 2218, "Error in Sawing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+17
-19
@@ -18,8 +18,6 @@
|
||||
#include "SurfFinishing.h"
|
||||
#include "OperationConst.h"
|
||||
#include "GeoConst.h"
|
||||
#include "/EgtDev/Include/EXeCmdLogOff.h"
|
||||
#include "/EgtDev/Include/EXeConst.h"
|
||||
#include "/EgtDev/Include/EGkCurveLine.h"
|
||||
#include "/EgtDev/Include/EGkCurveArc.h"
|
||||
#include "/EgtDev/Include/EGkCurveComposite.h"
|
||||
@@ -27,21 +25,24 @@
|
||||
#include "/EgtDev/Include/EGkChainCurves.h"
|
||||
#include "/EgtDev/Include/EGkOffsetCurve.h"
|
||||
#include "/EgtDev/Include/EGkIntersCurves.h"
|
||||
#include "/EgtDev/Include/EGkCurveAux.h"
|
||||
#include "/EgtDev/Include/EGkSfrCreate.h"
|
||||
#include "/EgtDev/Include/EGkSurfLocal.h"
|
||||
#include "/EgtDev/Include/EGkStmFromTriangleSoup.h"
|
||||
#include "/EgtDev/Include/EGkStmFromCurves.h"
|
||||
#include "/EgtDev/Include/EGkSurfTriMeshAux.h"
|
||||
#include "/EgtDev/Include/EGkDistPointCurve.h"
|
||||
#include "/EgtDev/Include/EGkDistPointSurfFr.h"
|
||||
#include "/EgtDev/Include/EGkCAvToolSurfTm.h"
|
||||
#include "/EgtDev/Include/EGkCAvSilhouetteSurfTm.h"
|
||||
#include "/EgtDev/Include/EGkCalcPocketing.h"
|
||||
#include "/EgtDev/Include/EGkIntervals.h"
|
||||
#include "/EgtDev/Include/EGkStringUtils3d.h"
|
||||
#include "/EgtDev/Include/EGkUserObjFactory.h"
|
||||
#include "/EgtDev/Include/EXeCmdLogOff.h"
|
||||
#include "/EgtDev/Include/EXeConst.h"
|
||||
#include "/EgtDev/Include/EGnStringKeyVal.h"
|
||||
#include "/EgtDev/Include/EgtPointerOwner.h"
|
||||
#include "/EgtDev/Include/EGkCurveAux.h"
|
||||
#include "/EgtDev/Include/EGkDistPointCurve.h"
|
||||
#include "/EgtDev/Include/EGkDistPointSurfFr.h"
|
||||
#include "/EgtDev/Include/EGkStmFromTriangleSoup.h"
|
||||
#include "/EgtDev/Include/EGkStmFromCurves.h"
|
||||
#include <thread>
|
||||
#include <future>
|
||||
// per far dimenticare macro di WinUser.h
|
||||
@@ -739,12 +740,18 @@ SurfFinishing::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 3118, "Error in SurfFinishing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 3119, "Error in SurfFinishing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 3120, sErr) ;
|
||||
else
|
||||
@@ -752,15 +759,6 @@ SurfFinishing::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 3118, "Error in SurfFinishing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 3119, "Error in SurfFinishing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+9
-12
@@ -718,12 +718,18 @@ SurfRoughing::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 3018, "Error in SurfRoughing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 3019, "Error in SurfRoughing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 3020, sErr) ;
|
||||
else
|
||||
@@ -731,15 +737,6 @@ SurfRoughing::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 3018, "Error in SurfRoughing : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 3019, "Error in SurfRoughing : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
+9
-12
@@ -771,12 +771,18 @@ WaterJetting::Update( bool bPostApply)
|
||||
CalcAndSetAxesBBox() ;
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
bool bLinkOk = AdjustStartEndMovements() ;
|
||||
string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ;
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
|
||||
if ( sInfo.empty())
|
||||
m_pMchMgr->SetLastError( 3216, "Error in WaterJetting : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 3217, "Error in WaterJetting : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// esecuzione eventuali personalizzazioni
|
||||
string sErr ;
|
||||
if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) {
|
||||
if ( bPostApply && ! PostApply( sErr)) {
|
||||
if ( ! IsEmptyOrSpaces( sErr))
|
||||
m_pMchMgr->SetLastError( 3218, sErr) ;
|
||||
else
|
||||
@@ -784,15 +790,6 @@ WaterJetting::Update( bool bPostApply)
|
||||
return false ;
|
||||
}
|
||||
|
||||
// se non riuscito collegamento con lavorazione precedente
|
||||
if ( ! bLinkOk) {
|
||||
if ( sLinkInfo.empty())
|
||||
m_pMchMgr->SetLastError( 3216, "Error in WaterJetting : link movements not calculable") ;
|
||||
else
|
||||
m_pMchMgr->SetLastError( 3217, "Error in WaterJetting : link outstroke ") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user