1 Commits

Author SHA1 Message Date
DarioS d86f1cf47f EgtMachKernel 2.5a3 :
- pulizia codice.
2023-01-23 16:52:25 +01:00
73 changed files with 6553 additions and 8486 deletions
+13 -16
View File
@@ -17,11 +17,9 @@
#include "Axis.h" #include "Axis.h"
#include "MachConst.h" #include "MachConst.h"
#include "/EgtDev/Include/EGkGdbConst.h" #include "/EgtDev/Include/EGkGdbConst.h"
#include "/EgtDev/Include/EGkGeoVector3d.h"
#include "/EgtDev/Include/EGkUserObjFactory.h" #include "/EgtDev/Include/EGkUserObjFactory.h"
#include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EGkStringUtils3d.h"
#include "/EgtDev/Include/EGkUiUnits.h" #include "/EgtDev/Include/EGkUiUnits.h"
#include "/EgtDev/Include/EgtNumUtils.h"
using namespace std ; using namespace std ;
@@ -139,8 +137,9 @@ Axis::Set( const string& sName, const string& sToken, bool bInvert, double dOffs
bool bool
Axis::Modify( const Point3d& ptPos, double dAxisMaxAdjust) Axis::Modify( const Point3d& ptPos, double dAxisMaxAdjust)
{ {
// Verifico che lo spostamento perpendicolare alla sua direzione non superi il massimo ammesso // Verifico che lo spostamento non superi il massimo ammesso
Vector3d vtDeltaPerp = OrthoCompo( ptPos - m_ptPos, m_vtDir) ; Vector3d vtDelta = ptPos - m_ptPos ;
Vector3d vtDeltaPerp = vtDelta - ( vtDelta * m_vtDir) * m_vtDir ;
if ( vtDeltaPerp.Len() > dAxisMaxAdjust) { if ( vtDeltaPerp.Len() > dAxisMaxAdjust) {
string sOut = " Modify Axis " + m_sName + " Position (" + ToString( ptPos) + ") failed" ; string sOut = " Modify Axis " + m_sName + " Position (" + ToString( ptPos) + ") failed" ;
LOG_ERROR( GetEMkLogger(), sOut.c_str()) ; LOG_ERROR( GetEMkLogger(), sOut.c_str()) ;
@@ -148,11 +147,6 @@ Axis::Modify( const Point3d& ptPos, double dAxisMaxAdjust)
} }
// Assegno la nuova posizione // Assegno la nuova posizione
m_ptPos = ptPos ; m_ptPos = ptPos ;
// Sistemo la geometria dell'asse
int nV = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, m_sName) ;
IGeoVector3d* pGV = GetGeoVector3d( m_pGeomDB->GetGeoObj( nV)) ;
if ( pGV != nullptr)
pGV->ChangeBase( m_ptPos) ;
return true ; return true ;
} }
@@ -170,11 +164,6 @@ Axis::Modify( const Vector3d& vtDir, double dAxisMaxRotAdj)
} }
// Assegno la nuova direzione // Assegno la nuova direzione
m_vtDir = vtDirN ; m_vtDir = vtDirN ;
// Sistemo la geometria dell'asse
int nV = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, m_sName) ;
IGeoVector3d* pGV = GetGeoVector3d( m_pGeomDB->GetGeoObj( nV)) ;
if ( pGV != nullptr)
pGV->ChangeVector( m_vtDir) ;
return true ; return true ;
} }
@@ -183,7 +172,10 @@ bool
Axis::Modify( const STROKE& Stroke) Axis::Modify( const STROKE& Stroke)
{ {
m_Stroke = Stroke ; m_Stroke = Stroke ;
m_dHomeVal = Clamp( m_dHomeVal, m_Stroke.Min, m_Stroke.Max) ; if ( m_dHomeVal < m_Stroke.Min)
m_dHomeVal = m_Stroke.Min ;
else if ( m_dHomeVal > m_Stroke.Max)
m_dHomeVal = m_Stroke.Max ;
return true ; return true ;
} }
@@ -191,7 +183,12 @@ Axis::Modify( const STROKE& Stroke)
bool bool
Axis::Modify( double dHome) Axis::Modify( double dHome)
{ {
m_dHomeVal = Clamp( dHome, m_Stroke.Min, m_Stroke.Max) ; if ( dHome < m_Stroke.Min)
m_dHomeVal = m_Stroke.Min ;
else if ( dHome > m_Stroke.Max)
m_dHomeVal = m_Stroke.Max ;
else
m_dHomeVal = dHome ;
return true ; return true ;
} }
+8 -29
View File
@@ -1,14 +1,13 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// EgalTech 2015-2023 // EgalTech 2015-2016
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// File : CamData.cpp Data : 22.11.23 Versione : 2.5k3 // File : CamData.cpp Data : 24.02.16 Versione : 1.6n8
// Contenuto : Implementazione informazioni Cam di ogni movimento. // Contenuto : Implementazione informazioni Cam di ogni movimento.
// //
// //
// //
// Modifiche : 10.06.15 DS Creazione modulo. // Modifiche : 10.06.15 DS Creazione modulo.
// 24.02.16 DS Versione 2 (aggiunti m_nMove e m_ptCen). // 24.02.16 DS Versione 2 (aggiunti m_nMove e m_ptCen).
// 22.11.23 DS Aggiunto flag ToolShow (forza in ogni caso la visualizzazione della direzione utensile).
// //
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -54,9 +53,7 @@ static int CAM_PARAM_V7 = 22 ;
static string CAM_ORIGFEED = "OrFeed" ; static string CAM_ORIGFEED = "OrFeed" ;
static int CAM_PARAM_V8 = 23 ; static int CAM_PARAM_V8 = 23 ;
static string CAM_FLAG2 = "Flg2" ; static string CAM_FLAG2 = "Flg2" ;
static int CAM_PARAM_V9 = 24 ; static int CAM_TOTPARAM =CAM_PARAM_V8 ;
static string CAM_TOOLSHOW = "TSh" ;
static int CAM_TOTPARAM = CAM_PARAM_V9 ;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -82,7 +79,6 @@ CamData::Clone( void) const
pCam->m_pGeomDB = nullptr ; pCam->m_pGeomDB = nullptr ;
pCam->m_nMove = m_nMove ; pCam->m_nMove = m_nMove ;
pCam->m_nCorre = m_nCorre ; pCam->m_nCorre = m_nCorre ;
pCam->m_bToolShow = m_bToolShow ;
pCam->m_vtTool = m_vtTool ; pCam->m_vtTool = m_vtTool ;
pCam->m_vtCorr = m_vtCorr ; pCam->m_vtCorr = m_vtCorr ;
pCam->m_vtAux = m_vtAux ; pCam->m_vtAux = m_vtAux ;
@@ -143,7 +139,6 @@ CamData::Dump( string& sOut, bool bMM, const char* szNewLine) const
sOut += CAM_AXND + "=" + ToString( m_vtMachN) + szNewLine ; sOut += CAM_AXND + "=" + ToString( m_vtMachN) + szNewLine ;
sOut += CAM_NDLT + "=" + ToString( m_dDeltaN) + szNewLine ; sOut += CAM_NDLT + "=" + ToString( m_dDeltaN) + szNewLine ;
sOut += CAM_BDIR + "=" + ToString( m_vtBackAux) + szNewLine ; sOut += CAM_BDIR + "=" + ToString( m_vtBackAux) + szNewLine ;
sOut += CAM_TOOLSHOW + "=" + ToString( m_bToolShow) + szNewLine ;
return true ; return true ;
} }
@@ -154,8 +149,6 @@ CamData::SetOwner( int nId, IGeomDB* pGDB)
{ {
m_nOwnerId = nId ; m_nOwnerId = nId ;
m_pGeomDB = pGDB ; m_pGeomDB = pGDB ;
if ( m_pGeomDB != nullptr)
m_pGeomDB->SetStipple( m_nOwnerId, ( m_nMove == 0 ? 3 : 0), 0x8C8C) ;
return ( m_nOwnerId != GDB_ID_NULL && m_pGeomDB != nullptr) ; return ( m_nOwnerId != GDB_ID_NULL && m_pGeomDB != nullptr) ;
} }
@@ -210,8 +203,6 @@ CamData::Save( int nBaseId, STRVECTOR& vString) const
vString[++k] = CAM_ORIGFEED + "=" + ToString( m_dOrigFeed) ; vString[++k] = CAM_ORIGFEED + "=" + ToString( m_dOrigFeed) ;
// parametri aggiunti V8 // parametri aggiunti V8
vString[++k] = CAM_FLAG2 + "=" + ToString( m_nFlag2) ; vString[++k] = CAM_FLAG2 + "=" + ToString( m_nFlag2) ;
// parametri aggiunti V9
vString[++k] = CAM_TOOLSHOW + "=" + ToString( m_bToolShow) ;
} }
catch( ...) { catch( ...) {
return false ; return false ;
@@ -304,14 +295,6 @@ CamData::Load( const STRVECTOR& vString, int nBaseGdbId)
else { else {
m_nFlag2 = 0 ; m_nFlag2 = 0 ;
} }
// parametri aggiunti V9
if ( int( vString.size()) >= CAM_PARAM_V9) {
if ( ! GetVal( vString[++k], CAM_TOOLSHOW, m_bToolShow))
return false ;
}
else {
m_bToolShow = false ;
}
return true ; return true ;
} }
@@ -328,7 +311,7 @@ CamData::GetDrawPolyLines( POLYLINELIST& lstPL) const
PolyLine& PL = lstPL.back() ; PolyLine& PL = lstPL.back() ;
// dimensioni // dimensioni
const double TLEN = 40 ; const double TLEN = 40 ;
const double ALEN = 1 ; const double ALEN = 4 ;
// inserisco disegno nella polilinea // inserisco disegno nella polilinea
PL.AddUPoint( 0, m_ptEnd) ; PL.AddUPoint( 0, m_ptEnd) ;
Point3d ptTip = m_ptEnd + m_vtTool * TLEN ; Point3d ptTip = m_ptEnd + m_vtTool * TLEN ;
@@ -350,9 +333,6 @@ CamData::GetDrawPolyLines( POLYLINELIST& lstPL) const
ptP6.ToGlob( frF) ; ptP6.ToGlob( frF) ;
PL.AddUPoint( 6, ptP6) ; PL.AddUPoint( 6, ptP6) ;
PL.AddUPoint( 6, ptTip) ; PL.AddUPoint( 6, ptTip) ;
// da visualizzare sempre se richiesto
if ( m_bToolShow)
PL.SetTempProp( 1) ;
} }
// se vettore correzione non nullo // se vettore correzione non nullo
if ( ! m_vtCorr.IsSmall()) { if ( ! m_vtCorr.IsSmall()) {
@@ -362,14 +342,14 @@ CamData::GetDrawPolyLines( POLYLINELIST& lstPL) const
PolyLine& PL = lstPL.back() ; PolyLine& PL = lstPL.back() ;
// dimensioni // dimensioni
const double CLEN = 20 ; const double CLEN = 20 ;
const double ALEN = 1 ; const double ALEN = 2 ;
// inserisco disegno nella polilinea // inserisco disegno nella polilinea
PL.AddUPoint( 0, m_ptEnd) ; PL.AddUPoint( 0, m_ptEnd) ;
Point3d ptTip = m_ptEnd + m_vtCorr * CLEN ; Point3d ptTip = m_ptEnd + m_vtCorr * CLEN ;
PL.AddUPoint( 1, ptTip) ; PL.AddUPoint( 1, ptTip) ;
// aggiungo simil-freccia // aggiungo simil-freccia
Frame3d frF ; Frame3d frF ;
if ( m_vtTool. IsSmall() || AreSameOrOppositeVectorApprox( m_vtTool, m_vtCorr)) if ( m_vtTool. IsSmall())
frF.Set( ptTip, m_vtCorr) ; frF.Set( ptTip, m_vtCorr) ;
else else
frF.Set( ptTip, m_vtCorr, m_vtTool) ; frF.Set( ptTip, m_vtCorr, m_vtTool) ;
@@ -391,14 +371,14 @@ CamData::GetDrawPolyLines( POLYLINELIST& lstPL) const
PolyLine& PL = lstPL.back() ; PolyLine& PL = lstPL.back() ;
// dimensioni // dimensioni
const double CLEN = 20 ; const double CLEN = 20 ;
const double ALEN = 1 ; const double ALEN = 2 ;
// inserisco disegno nella polilinea // inserisco disegno nella polilinea
PL.AddUPoint( 0, m_ptEnd) ; PL.AddUPoint( 0, m_ptEnd) ;
Point3d ptTip = m_ptEnd + m_vtAux * CLEN ; Point3d ptTip = m_ptEnd + m_vtAux * CLEN ;
PL.AddUPoint( 1, ptTip) ; PL.AddUPoint( 1, ptTip) ;
// aggiungo simil-freccia // aggiungo simil-freccia
Frame3d frF ; Frame3d frF ;
if ( m_vtTool. IsSmall() || AreSameOrOppositeVectorApprox( m_vtTool, m_vtAux)) if ( m_vtTool. IsSmall())
frF.Set( ptTip, m_vtAux) ; frF.Set( ptTip, m_vtAux) ;
else else
frF.Set( ptTip, m_vtAux, m_vtTool) ; frF.Set( ptTip, m_vtAux, m_vtTool) ;
@@ -566,7 +546,6 @@ CamData::CamData( void)
m_pGeomDB = nullptr ; m_pGeomDB = nullptr ;
m_nMove = 0 ; m_nMove = 0 ;
m_nCorre = 0 ; m_nCorre = 0 ;
m_bToolShow = false ;
m_dAngCen = 0 ; m_dAngCen = 0 ;
m_dDeltaN = 0 ; m_dDeltaN = 0 ;
m_dFeed = 0 ; m_dFeed = 0 ;
+5 -10
View File
@@ -68,13 +68,11 @@ class CamData : public IUserObj
bool SetAxesAngCen( double dAngCen) ; bool SetAxesAngCen( double dAngCen) ;
bool SetAxesNormDir( const Vector3d& vtDir) ; bool SetAxesNormDir( const Vector3d& vtDir) ;
bool SetBackAuxDir( const Vector3d& vtDir) ; bool SetBackAuxDir( const Vector3d& vtDir) ;
bool SetToolShow( bool bShow) const int GetMoveType( void) const
{ m_bToolShow = bShow ; return true ; }
int GetMoveType( void) const
{ return m_nMove ; } { return m_nMove ; }
bool IsLine( void) const const bool IsLine( void) const
{ return ( m_nMove == 0 || m_nMove == 1) ; } { return ( m_nMove == 0 || m_nMove == 1) ; }
bool IsArc( void) const const bool IsArc( void) const
{ return ( m_nMove == 2 || m_nMove == 3) ; } { return ( m_nMove == 2 || m_nMove == 3) ; }
const Vector3d& GetToolDir( void) const const Vector3d& GetToolDir( void) const
{ return m_vtTool ; } { return m_vtTool ; }
@@ -110,16 +108,14 @@ class CamData : public IUserObj
{ return m_vMachAxes ; } { return m_vMachAxes ; }
const Point3d& GetAxesCen( void) const const Point3d& GetAxesCen( void) const
{ return m_ptMachCen ; } { return m_ptMachCen ; }
double GetAxesRad( void) const const double GetAxesRad( void) const
{ return m_dMachRad ; } { return m_dMachRad ; }
double GetAxesAngCen( void) const const double GetAxesAngCen( void) const
{ return m_dMachAngCen ; } { return m_dMachAngCen ; }
const Vector3d& GetAxesNormDir( void) const const Vector3d& GetAxesNormDir( void) const
{ return m_vtMachN ; } { return m_vtMachN ; }
const Vector3d& GetBackAuxDir( void) const const Vector3d& GetBackAuxDir( void) const
{ return m_vtBackAux ; } { return m_vtBackAux ; }
bool GetToolShow( void) const
{ return m_bToolShow ; }
public : public :
enum { AS_NONE = 0, enum { AS_NONE = 0,
@@ -143,7 +139,6 @@ class CamData : public IUserObj
IGeomDB* m_pGeomDB ; IGeomDB* m_pGeomDB ;
int m_nMove ; // tipo movimento (0=rapido, 1=lineare, 2=arco CW, 3=arco CCW) int m_nMove ; // tipo movimento (0=rapido, 1=lineare, 2=arco CW, 3=arco CCW)
int m_nCorre ; // tipo correzione (0, 41, 42, 141, 142, 40) int m_nCorre ; // tipo correzione (0, 41, 42, 141, 142, 40)
bool m_bToolShow ; // flag per forzare la visualizzazione della direzione utensile in ogni caso
Vector3d m_vtTool ; // versore fresa Vector3d m_vtTool ; // versore fresa
Vector3d m_vtCorr ; // versore correzione Vector3d m_vtCorr ; // versore correzione
Vector3d m_vtAux ; // versore ausiliario Vector3d m_vtAux ; // versore ausiliario
+5 -28
View File
@@ -595,9 +595,6 @@ Chiseling::Update( bool bPostApply)
return true ; return true ;
} }
// elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo)
RemoveClimbRiseHome() ;
// imposto eventuale asse bloccato da lavorazione // imposto eventuale asse bloccato da lavorazione
SetBlockedRotAxis( m_Params.m_sBlockedAxis) ; SetBlockedRotAxis( m_Params.m_sBlockedAxis) ;
@@ -771,31 +768,11 @@ Chiseling::UpdateToolData( bool* pbChanged)
const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ; const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ;
if ( pTdata == nullptr) if ( pTdata == nullptr)
return false ; return false ;
// salvo posizione TC, testa e uscita originali // verifico se sono diversi (ad esclusione del nome)
string sOrigTcPos = m_TParams.m_sTcPos ; m_TParams.m_sName = pTdata->m_sName ;
string sOrigHead = m_TParams.m_sHead ; bool bChanged = ! SameTool( m_TParams, *pTdata) ;
int nOrigExit = m_TParams.m_nExit ;
// verifico se sono diversi (ad esclusione di nome, posizione TC, testa e uscita)
bool bChanged = ( ! SameTool( m_TParams, *pTdata, false)) ;
// aggiorno comunque i parametri // aggiorno comunque i parametri
m_TParams = *pTdata ; m_TParams = *pTdata ;
// se definito attrezzaggio, aggiorno i parametri che ne possono derivare
string sTcPos ; string sHead ; int nExit ;
if ( m_pMchMgr->GetCurrSetupMgr().GetToolData( m_TParams.m_sName, sTcPos, sHead, nExit)) {
if ( sOrigTcPos != sTcPos ||
sOrigHead != sHead ||
nOrigExit != nExit)
bChanged = true ;
m_TParams.m_sTcPos = sTcPos ;
m_TParams.m_sHead = sHead ;
m_TParams.m_nExit = nExit ;
}
else {
if ( sOrigTcPos != pTdata->m_sTcPos ||
sOrigHead != pTdata->m_sHead ||
nOrigExit != pTdata->m_nExit)
bChanged = true ;
}
// eventuali segnalazioni // eventuali segnalazioni
if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) { if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) {
string sInfo = "Warning in Chiseling : tool name changed (" + string sInfo = "Warning in Chiseling : tool name changed (" +
@@ -1036,8 +1013,8 @@ Chiseling::GetCurves( SelData Id, ICURVEPLIST& lstPC)
for ( int nC = nCstart ; nC < nCend ; ++ nC) { for ( int nC = nCstart ; nC < nCend ; ++ nC) {
// recupero i contorni del chunk // recupero i contorni del chunk
for ( int nL = 0 ; nL < pReg->GetLoopCount( nC) ; ++ nL) { for ( int nL = 0 ; nL < pReg->GetLoopCount( nC) ; ++ nL) {
PtrOwner<ICurveComposite> pCrvCompo ; PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
if ( ! pCrvCompo.Set( ConvertCurveToComposite( pReg->GetLoop( nC, nL)))) if ( IsNull( pCrvCompo) || ! pCrvCompo->AddCurve( pReg->GetLoop( nC, nL)))
return false ; return false ;
// assegno l'estrusione dalla normale alla regione // assegno l'estrusione dalla normale alla regione
pCrvCompo->SetExtrusion( vtN) ; pCrvCompo->SetExtrusion( vtN) ;
+2 -6
View File
@@ -71,10 +71,6 @@ struct ChiselingData : public MachiningData
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline const ChiselingData* GetChiselingData( const MachiningData* pMdata) inline const ChiselingData* GetChiselingData( const MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_CHISELING) { return (dynamic_cast<const ChiselingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<const ChiselingData*>( pMdata)) ; }
inline ChiselingData* GetChiselingData( MachiningData* pMdata) inline ChiselingData* GetChiselingData( MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_CHISELING) { return (dynamic_cast<ChiselingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<ChiselingData*>( pMdata)) ; }
+3 -23
View File
@@ -86,8 +86,6 @@ Disposition::Clone( void) const
// eseguo copia dei dati // eseguo copia dei dati
if ( pDisp != nullptr) { if ( pDisp != nullptr) {
try { pDisp->m_sTabName = m_sTabName ; try { pDisp->m_sTabName = m_sTabName ;
pDisp->m_pMchMgr = m_pMchMgr ;
pDisp->m_nPhase = m_nPhase ;
pDisp->m_ptRef1 = m_ptRef1 ; pDisp->m_ptRef1 = m_ptRef1 ;
pDisp->m_b3Area1 = m_b3Area1 ; pDisp->m_b3Area1 = m_b3Area1 ;
pDisp->m_dAreaOffset = m_dAreaOffset ; pDisp->m_dAreaOffset = m_dAreaOffset ;
@@ -1207,23 +1205,6 @@ Disposition::InsertMoveInfoInList( int nRawId, int nType, const Point3d& ptP, in
return true ; return true ;
} }
//----------------------------------------------------------------------------
bool
Disposition::UpdateRawPartId( int nRawId, int nNewRawId)
{
// aggiorno i movimenti registrati per questo grezzo
while ( true) {
auto iIter = find_if( m_vMvrData.begin(), m_vMvrData.end(),
[ nRawId]( const MoveRawData& Mrv)
{ return ( Mrv.nRawId == nRawId) ; }) ;
if ( iIter == m_vMvrData.end())
break ;
else
iIter->nRawId = nNewRawId ;
}
return true ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Disposition::RemoveRawPart( int nRawId) Disposition::RemoveRawPart( int nRawId)
@@ -1372,8 +1353,7 @@ Disposition::SpecialApply( bool bRecalc)
bOk = bOk && pMch->LuaResetGlobVar( EMC_VAR) ; bOk = bOk && pMch->LuaResetGlobVar( EMC_VAR) ;
// segnalo errori ed esco // segnalo errori ed esco
if ( ! bOk || nErr > 0) { if ( ! bOk || nErr > 0) {
if ( m_nShifts != -1) m_nShifts = - 1 ;
m_nShifts = -2 ;
string sOut = sMsg ; string sOut = sMsg ;
if ( IsEmptyOrSpaces( sOut)) if ( IsEmptyOrSpaces( sOut))
sOut = " Error in " + ON_SPECIAL_APPLY + " (" + ToString( nErr) + ")" ; sOut = " Error in " + ON_SPECIAL_APPLY + " (" + ToString( nErr) + ")" ;
@@ -1413,12 +1393,12 @@ Disposition::SpecialUpdate( void)
// se disposizione vuota, esco // se disposizione vuota, esco
if ( m_nShifts <= 0) { if ( m_nShifts <= 0) {
if ( m_nShifts == -2) if ( m_nShifts < 0)
m_pMchMgr->SetWarning( 2052, "Warning in Disposition : No shifts") ; m_pMchMgr->SetWarning( 2052, "Warning in Disposition : No shifts") ;
return true ; return true ;
} }
// calcolo assi macchina // calcolo assi macchina
if ( ! CalculateAxesValues( "", false)) { if ( ! CalculateAxesValues( "")) {
string sInfo = m_pMchMgr->GetOutstrokeInfo() ; string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
if ( sInfo.empty()) if ( sInfo.empty())
m_pMchMgr->SetLastError( 2007, "Error in Disposition : axes values not calculable") ; m_pMchMgr->SetLastError( 2007, "Error in Disposition : axes values not calculable") ;
+7 -10
View File
@@ -56,14 +56,14 @@ class Disposition : public Operation
{ return true ; } { return true ; }
bool Save( int nBaseId, STRVECTOR& vString) const override ; bool Save( int nBaseId, STRVECTOR& vString) const override ;
bool Load( const STRVECTOR& vString, int nBaseGdbId) override ; bool Load( const STRVECTOR& vString, int nBaseGdbId) override ;
public : // Operation public : // Operation
int GetType( void) const override int GetType( void) const override
{ return OPER_DISP ; } { return OPER_DISP ; }
bool IsEmpty( void) const override bool IsEmpty( void) const override
{ return ( m_nShifts == 0) ; } { return ( m_nShifts == 0) ; }
bool UpdateStatus( int nModif) override bool UpdateStatus( int nModif) override
{ m_nStatus |= nModif ; return true ; } { m_nStatus |= nModif ; return true ; }
protected : // Operation protected : // Operation
const std::string& GetToolName( void) const override ; const std::string& GetToolName( void) const override ;
@@ -71,7 +71,7 @@ class Disposition : public Operation
int GetExitNbr( void) const override ; int GetExitNbr( void) const override ;
const std::string& GetToolTcPos( void) const override ; const std::string& GetToolTcPos( void) const override ;
int GetSolCh( void) const override int GetSolCh( void) const override
{ return 0 ; } { return 0 ; }
bool NeedPrevHome( void) const override ; bool NeedPrevHome( void) const override ;
public : public :
@@ -102,7 +102,6 @@ class Disposition : public Operation
bool MoveRawPart( int nRawId, const Vector3d& vtMove) ; bool MoveRawPart( int nRawId, const Vector3d& vtMove) ;
bool RotateRawPart( int nRawId, const Vector3d& vtAx, double dAngRotDeg) ; bool RotateRawPart( int nRawId, const Vector3d& vtAx, double dAngRotDeg) ;
bool ApplyRotationToRawPart( int nRawId, double dAngCDeg, double dAngADeg, double dAngC1Deg, bool bAddToList = true) ; bool ApplyRotationToRawPart( int nRawId, double dAngCDeg, double dAngADeg, double dAngC1Deg, bool bAddToList = true) ;
bool UpdateRawPartId( int nRawId, int nNewRawId) ;
bool RemoveRawPart( int nRawId) ; bool RemoveRawPart( int nRawId) ;
bool GetFixtureData( int nInd, std::string& sName, int& nId, Point3d& ptPos, bool GetFixtureData( int nInd, std::string& sName, int& nId, Point3d& ptPos,
double& dAngDeg, double& dMov) const ; double& dAngDeg, double& dMov) const ;
@@ -112,8 +111,6 @@ class Disposition : public Operation
bool GetToolData( std::string& sName, std::string& sHead, int& nExit, std::string& sTcPos) const ; bool GetToolData( std::string& sName, std::string& sHead, int& nExit, std::string& sTcPos) const ;
bool GetSomeByHand( void) const bool GetSomeByHand( void) const
{ return m_bSomeByHand ; } { return m_bSomeByHand ; }
bool IsWithTool( void)
{ return ( m_nShifts != -1) ;}
private : private :
bool InsertMoveInfoInList( int nRawId, int nType, const Point3d& ptP, int nFlag) ; bool InsertMoveInfoInList( int nRawId, int nType, const Point3d& ptP, int nFlag) ;
+49 -686
View File
File diff suppressed because it is too large Load Diff
+3 -16
View File
@@ -19,13 +19,7 @@
#include "MachiningConst.h" #include "MachiningConst.h"
struct Hole ; struct Hole ;
struct MHDrill ;
struct HoleInfo ;
struct ToolInfo ;
class ICurve ; class ICurve ;
typedef std::vector<std::vector<MHDrill>> TABMHDRILL ;
typedef std::vector<HoleInfo> VECTORHOLE ;
typedef std::vector<ToolInfo> VECTORTOOL ;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class Drilling : public Machining class Drilling : public Machining
@@ -74,24 +68,18 @@ class Drilling : public Machining
private : private :
bool GetHoleData( SelData Id, Hole& hole) ; bool GetHoleData( SelData Id, Hole& hole) ;
bool StandardProcess( bool bRecalc, int nPvId, int nClId) ; bool StdandardProcess( bool bRecalc, int nPvId, int nClId) ;
bool AlongCurveProcess( bool bRecalc, int nPvId, int nClId) ; bool AlongCurveProcess( bool bRecalc, int nPvId, int nClId) ;
bool Chain( int nGrpDestId) ; bool Chain( int nGrpDestId) ;
ICurve* GetCurve( SelData Id) ; ICurve* GetCurve( SelData Id) ;
bool ProcessPath( int nPathId, int nPvId, int nClId) ; bool ProcessPath( int nPathId, int nPvId, int nClId) ;
bool GenerateHolePv( int nInd, const SelData& nCircId, const std::string& sPName, int nPvId) ; bool GenerateHolePv( int nInd, const SelData& nCircId, const std::string& sPName, int nPvId) ;
bool GenerateHoleCl( int nInd, const SelData& nCircId, const std::string& sPName, int nClId, double dMHOff = .0, Vector3d vtAux = V_NULL) ; bool GenerateHoleCl( int nInd, const SelData& nCircId, const std::string& sPName, int nClId) ;
bool GenerateHoleRegionPv( int nFirstId, int nCount, int nPvId) ; bool GenerateHoleRegionPv( int nFirstId, int nCount, int nPvId) ;
bool VerifyDiameter( double dHdiam, double dTdiam, double ddiamTol) ; bool VerifyDiameter( double dHdiam, double dTdiam, double ddiamTol) ;
bool VerifyHoleFromBottom( const Hole& hole, SelData Id) ; bool VerifyHoleFromBottom( const Hole& hole, SelData Id) ;
bool DoStandardDrilling( const Hole& hole, SelData Id, int nPathId, double nMHOff, Vector3d vtA) ; bool DoStandardDrilling( const Hole& hole, SelData Id, int nPathId) ;
bool DoPeckDrilling( const Hole& hole, SelData Id, int nPathId) ; bool DoPeckDrilling( const Hole& hole, SelData Id, int nPathId) ;
bool MultiHeadDrilling( const SELVECTOR& vId, int nClId, TABMHDRILL& vDrills, double& dMHOff, bool bOrd = true) ;
bool CalcMask( VECTORHOLE& vHoles, const VECTORTOOL& vTools, int nIndMT, const Vector3d& vtTool, const Vector3d& vtAux) ;
bool CheckOtherHolesWithTools( VECTORHOLE& vHoles, const VECTORTOOL& vTools, int nIndTM, int nIndHTM, Hole holeICP,
const Frame3d& frHTM, const Frame3d& frHMTOP, double dDiamToler, int& nDrills) ;
bool MultiHeadVerifyHole( Hole& hole, const ToolData* Tool, double dDiamToler, SelData Id) ;
bool VerifyMultiParallelFixedDrills( void) ;
private : private :
double GetSpeed() const double GetSpeed() const
@@ -112,7 +100,6 @@ class Drilling : public Machining
int m_nStatus ; // stato di aggiornamento della lavorazione int m_nStatus ; // stato di aggiornamento della lavorazione
int m_nDrillings ; // numero di fori generati int m_nDrillings ; // numero di fori generati
bool m_bTiltingTab ; // flag utilizzo tavola basculante bool m_bTiltingTab ; // flag utilizzo tavola basculante
Vector3d m_vtTiltingAx ; // versore direzione eventuale asse basculante
bool m_bAboveHead ; // flag utilizzo testa da sopra bool m_bAboveHead ; // flag utilizzo testa da sopra
bool m_bAggrBottom ; // flag di utilizzo dell'aggregato da sotto bool m_bAggrBottom ; // flag di utilizzo dell'aggregato da sotto
Vector3d m_vtAggrBottom ; // vettore direzione ausiliaria aggregato da sotto Vector3d m_vtAggrBottom ; // vettore direzione ausiliaria aggregato da sotto
+2 -6
View File
@@ -75,10 +75,6 @@ struct DrillingData : public MachiningData
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline const DrillingData* GetDrillingData( const MachiningData* pMdata) inline const DrillingData* GetDrillingData( const MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_DRILLING) { return (dynamic_cast<const DrillingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<const DrillingData*>( pMdata)) ; }
inline DrillingData* GetDrillingData( MachiningData* pMdata) inline DrillingData* GetDrillingData( MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_DRILLING) { return (dynamic_cast<DrillingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<DrillingData*>( pMdata)) ; }
BIN
View File
Binary file not shown.
+3 -5
View File
@@ -21,7 +21,7 @@
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<ProjectGuid>{0BD58222-92F3-48B2-B656-4497D1956874}</ProjectGuid> <ProjectGuid>{0BD58222-92F3-48B2-B656-4497D1956874}</ProjectGuid>
<RootNamespace>EgtMachKernel</RootNamespace> <RootNamespace>EgtMachKernel</RootNamespace>
<WindowsTargetPlatformVersion>10.0.20348.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
@@ -102,10 +102,9 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<PreprocessorDefinitions>WIN32;_WINDOWS;I_AM_EMK;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_WINDOWS;I_AM_EMK;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<OpenMPSupport>false</OpenMPSupport> <OpenMPSupport>true</OpenMPSupport>
<PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeader>Use</PrecompiledHeader>
<CompileAs>CompileAsCpp</CompileAs> <CompileAs>CompileAsCpp</CompileAs>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -167,7 +166,6 @@ copy $(TargetPath) \EgtProg\DllD64</Command>
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations> <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
<EnableParallelCodeGeneration>true</EnableParallelCodeGeneration> <EnableParallelCodeGeneration>true</EnableParallelCodeGeneration>
<WholeProgramOptimization>false</WholeProgramOptimization> <WholeProgramOptimization>false</WholeProgramOptimization>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile> </ClCompile>
<Link> <Link>
<GenerateDebugInformation>false</GenerateDebugInformation> <GenerateDebugInformation>false</GenerateDebugInformation>
@@ -195,7 +193,7 @@ copy $(TargetPath) \EgtProg\Dll32</Command>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers> <OmitFramePointers>true</OmitFramePointers>
<PreprocessorDefinitions>WIN32;_WINDOWS;I_AM_EMK;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_WINDOWS;I_AM_EMK;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet> <EnableEnhancedInstructionSet>AdvancedVectorExtensions2</EnableEnhancedInstructionSet>
<OpenMPSupport>false</OpenMPSupport> <OpenMPSupport>false</OpenMPSupport>
<PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeader>Use</PrecompiledHeader>
<CompileAs>CompileAsCpp</CompileAs> <CompileAs>CompileAsCpp</CompileAs>
-3
View File
@@ -124,9 +124,6 @@ Exit::Modify( const Point3d& ptPos, double dExitMaxAdjust)
} }
// Assegno la nuova posizione // Assegno la nuova posizione
m_ptPos = ptPos ; m_ptPos = ptPos ;
// Sistemo la geometria dell'uscita
if ( ! vtDelta.IsZero())
m_pGeomDB->Translate( m_nOwnerId, vtDelta) ;
return true ; return true ;
} }
+3 -59
View File
@@ -55,17 +55,6 @@ static const string EVAR_STARTPOS = ".STARTPOS" ; // IN (num) quota di inizio l
static const string EVAR_OFFSR = ".OFFSR" ; // IN (num) offset radiale static const string EVAR_OFFSR = ".OFFSR" ; // IN (num) offset radiale
static const string EVAR_OFFSL = ".OFFSL" ; // IN (num) offset longitudinale static const string EVAR_OFFSL = ".OFFSL" ; // IN (num) offset longitudinale
static const string EVAR_TOOL = ".TOOL" ; // IN (string) nome dell'utensile static const string EVAR_TOOL = ".TOOL" ; // IN (string) nome dell'utensile
static const string EVAR_HEAD = ".HEAD" ; // IN (string) nome testa
static const string EVAR_EXIT = ".EXIT" ; // IN (int) indice uscita
static const string EVAR_TTYPE = ".TTYPE" ; // IN (int) tipo utensile
static const string EVAR_TMAXMAT = ".TMAXMAT" ; // IN (num) massimo materiale
static const string EVAR_TDIAM = ".TDIAM" ; // IN (num) diametro utensile
static const string EVAR_TTOTDIAM = ".TTOTDIAM" ; // IN (num) diametro totale utensile
static const string EVAR_TLEN = ".TLEN" ; // IN (num) lunghezza utensile
static const string EVAR_TTOTLEN = ".TTOTLEN" ; // IN (num) lunghezza totale utensile
static const string EVAR_TTHICK = ".THICK" ; // IN (num) spessore per lame o altezza taglienti
static const string EVAR_TCORNRAD = ".TCORNRAD" ; // IN (num) raggio corner
static const string EVAR_TSIDEANG = ".TSIDEANG" ; // IN (num) angolo del fianco rispetto all'asse
static const string EVAR_FEED = ".FEED" ; // IN (num) feed dell'utensile static const string EVAR_FEED = ".FEED" ; // IN (num) feed dell'utensile
static const string EVAR_STARTFEED = ".STARTFEED" ;// IN (num) feed di inizio dell'utensile static const string EVAR_STARTFEED = ".STARTFEED" ;// IN (num) feed di inizio dell'utensile
static const string EVAR_ENDFEED = ".ENDFEED" ; // IN (num) feed di fine dell'utensile static const string EVAR_ENDFEED = ".ENDFEED" ; // IN (num) feed di fine dell'utensile
@@ -492,17 +481,6 @@ GenMachining::Preview( bool bRecalc)
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OFFSR, GetOffsR()) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OFFSR, GetOffsR()) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OFFSL, GetOffsL()) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OFFSL, GetOffsL()) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TOOL, m_TParams.m_sName) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TOOL, m_TParams.m_sName) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_HEAD, m_TParams.m_sHead) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_EXIT, m_TParams.m_nExit) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TTYPE, m_TParams.m_nType) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TMAXMAT, m_TParams.m_dMaxMat) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TDIAM, m_TParams.m_dDiam) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TTOTDIAM, m_TParams.m_dTDiam) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TLEN, m_TParams.m_dLen) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TTOTLEN, m_TParams.m_dTLen) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TTHICK, m_TParams.m_dThick) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TCORNRAD, m_TParams.m_dCornRad) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TSIDEANG, m_TParams.m_dSideAng) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_FEED, GetFeed()) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_FEED, GetFeed()) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_STARTFEED, GetStartFeed()) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_STARTFEED, GetStartFeed()) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_ENDFEED, GetEndFeed()) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_ENDFEED, GetEndFeed()) ;
@@ -606,17 +584,6 @@ GenMachining::Apply( bool bRecalc, bool bPostApply)
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OFFSR, GetOffsR()) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OFFSR, GetOffsR()) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OFFSL, GetOffsL()) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OFFSL, GetOffsL()) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TOOL, m_TParams.m_sName) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TOOL, m_TParams.m_sName) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_HEAD, m_TParams.m_sHead) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_EXIT, m_TParams.m_nExit) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TTYPE, m_TParams.m_nType) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TMAXMAT, m_TParams.m_dMaxMat) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TDIAM, m_TParams.m_dDiam) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TTOTDIAM, m_TParams.m_dTDiam) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TLEN, m_TParams.m_dLen) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TTOTLEN, m_TParams.m_dTLen) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TTHICK, m_TParams.m_dThick) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TCORNRAD, m_TParams.m_dCornRad) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_TSIDEANG, m_TParams.m_dSideAng) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_FEED, GetFeed()) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_FEED, GetFeed()) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_STARTFEED, GetStartFeed()) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_STARTFEED, GetStartFeed()) ;
bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_ENDFEED, GetEndFeed()) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_ENDFEED, GetEndFeed()) ;
@@ -669,9 +636,6 @@ GenMachining::Update( bool bPostApply)
return true ; return true ;
} }
// elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo)
RemoveClimbRiseHome() ;
// imposto eventuale asse bloccato da lavorazione // imposto eventuale asse bloccato da lavorazione
SetBlockedRotAxis( m_Params.m_sBlockedAxis) ; SetBlockedRotAxis( m_Params.m_sBlockedAxis) ;
@@ -842,31 +806,11 @@ GenMachining::UpdateToolData( bool* pbChanged)
const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ; const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ;
if ( pTdata == nullptr) if ( pTdata == nullptr)
return false ; return false ;
// salvo posizione TC, testa e uscita originali // verifico se sono diversi (ad esclusione del nome)
string sOrigTcPos = m_TParams.m_sTcPos ; m_TParams.m_sName = pTdata->m_sName ;
string sOrigHead = m_TParams.m_sHead ; bool bChanged = ! SameTool( m_TParams, *pTdata) ;
int nOrigExit = m_TParams.m_nExit ;
// verifico se sono diversi (ad esclusione di nome, posizione TC, testa e uscita)
bool bChanged = ( ! SameTool( m_TParams, *pTdata, false)) ;
// aggiorno comunque i parametri // aggiorno comunque i parametri
m_TParams = *pTdata ; m_TParams = *pTdata ;
// se definito attrezzaggio, aggiorno i parametri che ne possono derivare
string sTcPos ; string sHead ; int nExit ;
if ( m_pMchMgr->GetCurrSetupMgr().GetToolData( m_TParams.m_sName, sTcPos, sHead, nExit)) {
if ( sOrigTcPos != sTcPos ||
sOrigHead != sHead ||
nOrigExit != nExit)
bChanged = true ;
m_TParams.m_sTcPos = sTcPos ;
m_TParams.m_sHead = sHead ;
m_TParams.m_nExit = nExit ;
}
else {
if ( sOrigTcPos != pTdata->m_sTcPos ||
sOrigHead != pTdata->m_sHead ||
nOrigExit != pTdata->m_nExit)
bChanged = true ;
}
// eventuali segnalazioni // eventuali segnalazioni
if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) { if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) {
string sInfo = "Warning in GenMachining : tool name changed (" + string sInfo = "Warning in GenMachining : tool name changed (" +
+2 -6
View File
@@ -67,10 +67,6 @@ struct GenMachiningData : public MachiningData
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline const GenMachiningData* GetGenMachiningData( const MachiningData* pMdata) inline const GenMachiningData* GetGenMachiningData( const MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_GENMACHINING) { return (dynamic_cast<const GenMachiningData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<const GenMachiningData*>( pMdata)) ; }
inline GenMachiningData* GetGenMachiningData( MachiningData* pMdata) inline GenMachiningData* GetGenMachiningData( MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_GENMACHINING) { return (dynamic_cast<GenMachiningData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<GenMachiningData*>( pMdata)) ; }
+11 -29
View File
@@ -19,7 +19,6 @@
#include "OutputConst.h" #include "OutputConst.h"
#include "/EgtDev/Include/EMkDllMain.h" #include "/EgtDev/Include/EMkDllMain.h"
#include "/EgtDev/Include/EGnFileUtils.h" #include "/EgtDev/Include/EGnFileUtils.h"
#include "/EgtDev/Include/EGnGetKeyData.h"
using namespace std ; using namespace std ;
@@ -47,31 +46,19 @@ Generator::Init( MachMgr* pMchMgr)
bool bool
Generator::Run( const string& sCncFile, const string& sInfo) Generator::Run( const string& sCncFile, const string& sInfo)
{ {
// Controllo della licenza // verifico sia abilitato dalla licenza
unsigned int nOpt1, nOpt2 ; bool bEnabled = false ;
int nOptExpDays ; if ( GetEMkNetHwKey()) {
int nRet = GetEGnKeyOptions( KEY_BASELIB_PROD, KEY_BASELIB_VER, KEY_BASELIB_LEV, bEnabled = true ;
nOpt1, nOpt2, nOptExpDays) ; }
if ( ! GetEMkNetHwKey()) else {
unsigned int nOpt1, nOpt2 ;
int nOptExpDays ;
int nRet = GetKeyOptions( GetEMkKey(), KEY_BASELIB_PROD, KEY_BASELIB_VER, KEY_BASELIB_LEV, int nRet = GetKeyOptions( GetEMkKey(), KEY_BASELIB_PROD, KEY_BASELIB_VER, KEY_BASELIB_LEV,
nOpt1, nOpt2, nOptExpDays) ; nOpt1, nOpt2, nOptExpDays) ;
bEnabled = ( nRet == KEY_OK && ( nOpt1 & KEYOPT_EMK_NC_OFF) == 0) ;
// Verifica della abilitazione }
bool bMinTime = false ; if ( bEnabled) {
if ( nOptExpDays >= GetMinDay())
bMinTime = true ;
bool bCurrTime = false ;
if ( nOptExpDays >= GetCurrDay())
bCurrTime = true ;
bool bKey = false ;
if ( nRet == KEY_OK)
bKey = true ;
bool bOption = false ;
if ( ( nOpt1 & KEYOPT_EMK_NC_OFF) == 0)
bOption = true ;
// Esecuzione
if ( bMinTime && bCurrTime && bKey && bOption) {
// emetto info di log // emetto info di log
{ string sOut = "Generator Run : " + sCncFile ; { string sOut = "Generator Run : " + sCncFile ;
@@ -92,11 +79,6 @@ Generator::Run( const string& sCncFile, const string& sInfo)
return bOk ; return bOk ;
} }
// cancello l'eventuale file di uscita (e anche il file errore)
EraseFile( sCncFile) ;
string sErrFile = ChangeFileExtension( sCncFile, ERR_EXT) ;
EraseFile( sErrFile) ;
// Generazione non abilitata // Generazione non abilitata
m_pMchMgr->SetLastError( 1000, "NC_OFF") ; m_pMchMgr->SetLastError( 1000, "NC_OFF") ;
std::string sErr = "Warning on Key (MKC/NCO)" ; std::string sErr = "Warning on Key (MKC/NCO)" ;
+1 -1
View File
@@ -82,7 +82,7 @@ GetRotationComponent( const Vector3d& vtDir1, double dComp, const Vector3d& vtDi
double dDenom = dT0uv * dSinG ; double dDenom = dT0uv * dSinG ;
double dNumer = dComp - dT0w * dCosG ; double dNumer = dComp - dT0w * dCosG ;
// due angoli possibili // due angoli possibili
if ( abs( dDenom) > abs( dNumer) + SIN_EPS_ANG_ZERO) { if ( abs( dDenom) > abs( dNumer)) {
double dDeltaAngRad = acos( dNumer / dDenom) ; double dDeltaAngRad = acos( dNumer / dDenom) ;
dAng1Deg = ( dOffsAngRad + dDeltaAngRad) * RADTODEG ; dAng1Deg = ( dOffsAngRad + dDeltaAngRad) * RADTODEG ;
dAng2Deg = ( dOffsAngRad - dDeltaAngRad) * RADTODEG ; dAng2Deg = ( dOffsAngRad - dDeltaAngRad) * RADTODEG ;
+1 -3
View File
@@ -19,10 +19,8 @@
//----------- Costanti per approssimazioni con polilinee o poliarchi -------- //----------- Costanti per approssimazioni con polilinee o poliarchi --------
const double LIN_TOL_STD = 0.1 ; const double LIN_TOL_STD = 0.1 ;
const double LIN_TOL_MID = 0.05 ; const double LIN_TOL_MID = 0.05 ;
const double LIN_TOL_RAW = 0.5 ;
const double ANG_TOL_STD_DEG = 15 ;
const double ANG_TOL_MID_DEG = 45 ;
const double ANG_TOL_MAX_DEG = 90 ; const double ANG_TOL_MAX_DEG = 90 ;
const double ANG_TOL_STD_DEG = 15 ;
const double LIN_FEA_STD = 20 ; const double LIN_FEA_STD = 20 ;
//----------- Costante per offset salva spigoli di lama su cornici curve ---- //----------- Costante per offset salva spigoli di lama su cornici curve ----
+2 -8
View File
@@ -52,7 +52,6 @@ Head::Clone( void) const
pHead->m_bMaxDeltaR2On1 = m_bMaxDeltaR2On1 ; pHead->m_bMaxDeltaR2On1 = m_bMaxDeltaR2On1 ;
pHead->m_Rot2Stroke = m_Rot2Stroke ; pHead->m_Rot2Stroke = m_Rot2Stroke ;
pHead->m_nSolCh = m_nSolCh ; pHead->m_nSolCh = m_nSolCh ;
pHead->m_vsOtherColl = m_vsOtherColl ;
} }
catch( ...) { catch( ...) {
delete pHead ; delete pHead ;
@@ -74,7 +73,6 @@ Head::Dump( string& sOut, bool bMM, const char* szNewLine) const
sOut += "ExitCount=" + ToString( m_nExitCount) + szNewLine ; sOut += "ExitCount=" + ToString( m_nExitCount) + szNewLine ;
sOut += "HSet=" + ToString( m_vsHSet) + szNewLine ; sOut += "HSet=" + ToString( m_vsHSet) + szNewLine ;
sOut += "ADir=" + ToString( m_vtADir) + szNewLine ; sOut += "ADir=" + ToString( m_vtADir) + szNewLine ;
sOut += "OtherColl=" + ToString( m_vsOtherColl) + szNewLine ;
return true ; return true ;
} }
@@ -105,7 +103,7 @@ Head::GetGeomDB( void) const
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
Head::Head( void) Head::Head( void)
: m_nOwnerId( GDB_ID_NULL), m_pGeomDB( nullptr), m_nType( MCH_HT_NONE), m_nExitCount( 0), : m_nOwnerId( GDB_ID_NULL), m_pGeomDB( nullptr), m_nType( MCH_HT_NONE), m_nExitCount( 0),
m_nSelectType( MCH_SLT_FIXEDEXITS), m_dRot1W( 1), m_bMaxDeltaR2On1( true), m_nSolCh( MCH_SCC_NONE) m_dRot1W( 1), m_bMaxDeltaR2On1( true), m_nSolCh( MCH_SCC_NONE)
{ {
m_Rot2Stroke.Min = - INFINITO ; m_Rot2Stroke.Min = - INFINITO ;
m_Rot2Stroke.Max = INFINITO ; m_Rot2Stroke.Max = INFINITO ;
@@ -113,7 +111,7 @@ Head::Head( void)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Head::Set( const string& sName, int nType, int nExitCount, const string& sHSet, int nSelectType, const Vector3d& vtADir, Head::Set( const string& sName, int nType, int nExitCount, const string& sHSet, const Vector3d& vtADir,
double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl) double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl)
{ {
m_sName = sName ; m_sName = sName ;
@@ -124,10 +122,6 @@ Head::Set( const string& sName, int nType, int nExitCount, const string& sHSet,
m_nExitCount = 1 ; m_nExitCount = 1 ;
m_vsHSet.clear() ; m_vsHSet.clear() ;
m_vsHSet.push_back( sHSet) ; m_vsHSet.push_back( sHSet) ;
if ( nSelectType == MCH_SLT_FIXEDEXITS || nSelectType == MCH_SLT_ONEEXIT || nSelectType == MCH_SLT_MULTIEXITS)
m_nSelectType = nSelectType ;
else
m_nSelectType = MCH_SLT_FIXEDEXITS ;
m_vtADir = vtADir ; m_vtADir = vtADir ;
m_vtADir.Normalize() ; m_vtADir.Normalize() ;
m_dRot1W = dRot1W ; m_dRot1W = dRot1W ;
+1 -4
View File
@@ -30,7 +30,7 @@ class Head : public IUserObj
public : public :
Head( void) ; Head( void) ;
bool Set( const std::string& sName, int nType, int nExitCount, const std::string& sHSet, int nSelectType, bool Set( const std::string& sName, int nType, int nExitCount, const std::string& sHSet,
const Vector3d& vtADir, double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const Vector3d& vtADir, double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh,
const STRVECTOR& vsOthColl) ; const STRVECTOR& vsOthColl) ;
bool AddHeadToHSet( const std::string& sHead) ; bool AddHeadToHSet( const std::string& sHead) ;
@@ -43,8 +43,6 @@ class Head : public IUserObj
{ return m_nExitCount ; } { return m_nExitCount ; }
const STRVECTOR& GetHSet(void) const const STRVECTOR& GetHSet(void) const
{ return m_vsHSet ; } { return m_vsHSet ; }
int GetSelectType( void) const
{ return m_nSelectType ; }
const Vector3d& GetADir( void) const const Vector3d& GetADir( void) const
{ return m_vtADir ; } { return m_vtADir ; }
double GetRot1W( void) const double GetRot1W( void) const
@@ -65,7 +63,6 @@ class Head : public IUserObj
int m_nType ; int m_nType ;
int m_nExitCount ; int m_nExitCount ;
STRVECTOR m_vsHSet ; STRVECTOR m_vsHSet ;
int m_nSelectType ;
Vector3d m_vtADir ; Vector3d m_vtADir ;
double m_dRot1W ; double m_dRot1W ;
bool m_bMaxDeltaR2On1 ; bool m_bMaxDeltaR2On1 ;
-5
View File
@@ -47,10 +47,6 @@ const std::string MACH_RAW_SOLID = "RawSolid" ;
const std::string MACH_RAW_CENTER = "RawCenter" ; const std::string MACH_RAW_CENTER = "RawCenter" ;
// Nome del contorno esterno del grezzo // Nome del contorno esterno del grezzo
const std::string MACH_RAW_OUTLINE = "RawOutline" ; const std::string MACH_RAW_OUTLINE = "RawOutline" ;
// Nome della regione superiore del grezzo
const std::string MACH_RAW_UP_REG = "RawUpReg" ;
// Nome della regione inferiore del grezzo
const std::string MACH_RAW_DOWN_REG = "RawDwnReg" ;
// Nome del kerf del grezzo // Nome del kerf del grezzo
const std::string MACH_RAW_KERF = "Kerf" ; const std::string MACH_RAW_KERF = "Kerf" ;
@@ -135,7 +131,6 @@ const double LIO_ELEV_TOL = 2.0 ;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Per FlatParts (vedi Nesting di EgtExecutor) // Per FlatParts (vedi Nesting di EgtExecutor)
const std::string NST_EXT_LAYER = "OutLoop" ; const std::string NST_EXT_LAYER = "OutLoop" ;
const std::string NST_PARTREG_LAYER = "Region" ;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Minima componente zeta di versore utensile per lavorazione da sopra (-45deg) // Minima componente zeta di versore utensile per lavorazione da sopra (-45deg)
+4 -18
View File
@@ -1,7 +1,7 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// EgalTech 2015-2024 // EgalTech 2015-2022
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// File : MachMgr.h Data : 02.04.24 Versione : 2.6d1 // File : MachMgr.h Data : 21.09.22 Versione : 2.4i4
// Contenuto : Dichiarazione della classe MachMgr. // Contenuto : Dichiarazione della classe MachMgr.
// //
// //
@@ -11,10 +11,6 @@
// 17.08.20 DS Aggiunte GetAxisMin e GetAxisMax. // 17.08.20 DS Aggiunte GetAxisMin e GetAxisMax.
// 17.03.21 DS Aggiunte funzioni per import/export utensili. // 17.03.21 DS Aggiunte funzioni per import/export utensili.
// 21.09.22 DS Aggiunta GetAxisOffset. // 21.09.22 DS Aggiunta GetAxisOffset.
// 25.08.23 DS Aggiunta CopyMachGroup.
// 28.10.23 DS Aggiunte GetClEntAxesVal e GetToolSetupPosInCurrSetup.
// 30.03.24 DS Aggiunte GetAllAxesNames e GetCalcTable.
// 02.04.24 DS Aggiunta GetClEntAxesMask.
// //
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -99,9 +95,7 @@ class MachMgr : public IMachMgr
int GetPrevMachGroup( int nId) const override ; int GetPrevMachGroup( int nId) const override ;
bool GetMachGroupNewName( std::string& sName) const override ; bool GetMachGroupNewName( std::string& sName) const override ;
int AddMachGroup( const std::string& sName, const std::string& sMachineName) override ; int AddMachGroup( const std::string& sName, const std::string& sMachineName) override ;
int CopyMachGroup( const std::string& sSouName, const std::string& sName) override ;
bool RemoveMachGroup( int nId) override ; bool RemoveMachGroup( int nId) override ;
bool ChangeMachGroupName( int nId, const std::string& sNewName) override ;
std::string GetMachGroupName( int nId) const override ; std::string GetMachGroupName( int nId) const override ;
std::string GetMachGroupMachineName( int nId) const override ; std::string GetMachGroupMachineName( int nId) const override ;
int GetMachGroupId( const std::string& sName) const override ; int GetMachGroupId( const std::string& sName) const override ;
@@ -209,7 +203,6 @@ class MachMgr : public IMachMgr
bool ImportSetup( const std::string& sName) override ; bool ImportSetup( const std::string& sName) override ;
bool VerifyCurrSetup( STRVECTOR& vsErrors) override ; bool VerifyCurrSetup( STRVECTOR& vsErrors) override ;
bool FindToolInCurrSetup( const std::string& sTool) override ; bool FindToolInCurrSetup( const std::string& sTool) override ;
bool GetToolSetupPosInCurrSetup( const std::string& sTool, std::string& sTcPos) override ;
bool GetToolsInCurrSetupPos( const std::string& sTcPos, STRVECTOR& vsTools) override ; bool GetToolsInCurrSetupPos( const std::string& sTcPos, STRVECTOR& vsTools) override ;
bool UpdateCurrSetup( void) override ; bool UpdateCurrSetup( void) override ;
bool EraseCurrSetup( void) override ; bool EraseCurrSetup( void) override ;
@@ -308,10 +301,8 @@ class MachMgr : public IMachMgr
bool GetMachiningEndPoint( Point3d& ptEnd) const override ; bool GetMachiningEndPoint( Point3d& ptEnd) const override ;
// CL Entities Interrogations // CL Entities Interrogations
bool GetClEntMove( int nEntId, int& nMove) const override ; bool GetClEntMove( int nEntId, int& nMove) const override ;
bool GetClEntFlag( int nEntId, int& nFlag, int& nFlag2) const override ; bool GetClEntFlag( int nEntId, int& nFlag) const override ;
bool GetClEntIndex( int nEntId, int& nIndex) const override ; bool GetClEntIndex( int nEntId, int& nIndex) const override ;
bool GetClEntAxesMask( int nEntId, int& nMask) const override ;
bool GetClEntAxesVal( int nEntId, DBLVECTOR& vAxes) const override ;
// Simulation // Simulation
bool SimInit( void) override ; bool SimInit( void) override ;
bool SimStart( bool bFirst) override ; bool SimStart( bool bFirst) override ;
@@ -330,10 +321,8 @@ class MachMgr : public IMachMgr
// Machine Calc // Machine Calc
bool SetCalcTable( const std::string& sTable) override ; bool SetCalcTable( const std::string& sTable) override ;
bool SetCalcTool( const std::string& sTool, const std::string& sHead, int nExit) override ; bool SetCalcTool( const std::string& sTool, const std::string& sHead, int nExit) override ;
bool GetAllCurrAxesNames( STRVECTOR& vAxName) const override ;
bool SetRotAxisBlock( const std::string& sAxis, double dVal) override ; bool SetRotAxisBlock( const std::string& sAxis, double dVal) override ;
bool GetRotAxisBlocked( int nInd, std::string& sAxis, double& dVal) const override ; bool GetRotAxisBlocked( int nInd, std::string& sAxis, double& dVal) const override ;
bool GetCalcTable( std::string& sTable) const override ;
bool GetCalcTool( std::string& sTool) const override ; bool GetCalcTool( std::string& sTool) const override ;
bool GetCalcHead( std::string& sHead) const override ; bool GetCalcHead( std::string& sHead) const override ;
bool GetCalcExit( int& nExit) const override ; bool GetCalcExit( int& nExit) const override ;
@@ -374,7 +363,6 @@ class MachMgr : public IMachMgr
bool ResetAxisPos( const std::string& sAxis) override ; bool ResetAxisPos( const std::string& sAxis) override ;
bool ResetAllAxesPos( void) override ; bool ResetAllAxesPos( void) override ;
bool GetAllTablesNames( STRVECTOR& vNames) const override ; bool GetAllTablesNames( STRVECTOR& vNames) const override ;
bool GetAllAxesNames( STRVECTOR& vNames) const override ;
bool GetAllHeadsNames( STRVECTOR& vNames) const override ; bool GetAllHeadsNames( STRVECTOR& vNames) const override ;
bool GetAllTcPosNames( STRVECTOR& vNames) const override ; bool GetAllTcPosNames( STRVECTOR& vNames) const override ;
bool LoadTool( const std::string& sHead, int nExit, const std::string& sTool) override ; bool LoadTool( const std::string& sHead, int nExit, const std::string& sTool) override ;
@@ -442,11 +430,10 @@ class MachMgr : public IMachMgr
// MachineCalc // MachineCalc
int GetCurrLinAxes( void) const ; int GetCurrLinAxes( void) const ;
int GetCurrRotAxes( void) const ; int GetCurrRotAxes( void) const ;
bool GetAllCurrAxesName( STRVECTOR& vAxName) const ;
bool GetAllCurrAxesHomePos( DBLVECTOR& vAxHomeVal) const ; bool GetAllCurrAxesHomePos( DBLVECTOR& vAxHomeVal) const ;
bool GetCurrAxisHomePos( int nInd, double& dHome) const ; bool GetCurrAxisHomePos( int nInd, double& dHome) const ;
const Frame3d& GetCurrLinAxesFrame( void) const ; const Frame3d& GetCurrLinAxesFrame( void) const ;
bool GetCurrIsCenter( void) const ;
bool GetCurrIsRobot( void) const ;
bool ApplyRotAxisBlock( void) ; bool ApplyRotAxisBlock( void) ;
void ClearRotAxisBlock( void) void ClearRotAxisBlock( void)
{ m_vAxisBlock.clear() ; } { m_vAxisBlock.clear() ; }
@@ -499,7 +486,6 @@ class MachMgr : public IMachMgr
// RawParts // RawParts
int AddRawPart( int nCrvId, double dOverMat, double dZmin, double dHeight, Color cCol) ; int AddRawPart( int nCrvId, double dOverMat, double dZmin, double dHeight, Color cCol) ;
int AddRawPart( int nSurfId, Color cCol) ; int AddRawPart( int nSurfId, Color cCol) ;
int AddRawPart( int nSurfUpId, int nSurfDownId, double dHeight, Color cCol) ;
bool SetRawPartCenter( int nRawId) ; bool SetRawPartCenter( int nRawId) ;
bool ResetRawPartCenter( int nRawId) ; bool ResetRawPartCenter( int nRawId) ;
// Parts // Parts
+4 -42
View File
@@ -1,7 +1,7 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// EgalTech 2019-2023 // EgalTech 2019-2019
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// File : MachMgrClEntities.cpp Data : 27.10.23 Versione : 2.5j4 // File : MachMgrClEntities.cpp Data : 15.10.19 Versione : 2.1j4
// Contenuto : Implementazione interrogazione entità CL della classe MachMgr. // Contenuto : Implementazione interrogazione entità CL della classe MachMgr.
// //
// //
@@ -39,11 +39,10 @@ MachMgr::GetClEntMove( int nEntId, int& nMove) const
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
MachMgr::GetClEntFlag( int nEntId, int& nFlag, int& nFlag2) const MachMgr::GetClEntFlag( int nEntId, int& nFlag) const
{ {
// default // default
nFlag = 0 ; nFlag = 0 ;
nFlag2 = 0 ;
// verifico validita GeomDB // verifico validita GeomDB
if ( m_pGeomDB == nullptr) if ( m_pGeomDB == nullptr)
return false ; return false ;
@@ -51,9 +50,8 @@ MachMgr::GetClEntFlag( int nEntId, int& nFlag, int& nFlag2) const
const CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nEntId)) ; const CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nEntId)) ;
if ( pCamData == nullptr) if ( pCamData == nullptr)
return false ; return false ;
// recupero i flag // recupero il flag
nFlag = pCamData->GetFlag() ; nFlag = pCamData->GetFlag() ;
nFlag2 = pCamData->GetFlag2() ;
return true ; return true ;
} }
@@ -74,39 +72,3 @@ MachMgr::GetClEntIndex( int nEntId, int& nIndex) const
nIndex = pCamData->GetIndex() ; nIndex = pCamData->GetIndex() ;
return true ; return true ;
} }
//----------------------------------------------------------------------------
bool
MachMgr::GetClEntAxesMask( int nEntId, int& nMask) const
{
// default
nMask = 0 ;
// verifico validita GeomDB
if ( m_pGeomDB == nullptr)
return false ;
// recupero l'oggetto CamData
const CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nEntId)) ;
if ( pCamData == nullptr)
return false ;
// recupero il tipo di movimento
nMask = pCamData->GetAxesMask() ;
return true ;
}
//----------------------------------------------------------------------------
bool
MachMgr::GetClEntAxesVal( int nEntId, DBLVECTOR& vAxes) const
{
// default
vAxes.clear() ;
// verifico validita GeomDB
if ( m_pGeomDB == nullptr)
return false ;
// recupero l'oggetto CamData
const CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nEntId)) ;
if ( pCamData == nullptr)
return false ;
// recupero i valori degli assi
vAxes = pCamData->GetAxesVal() ;
return true ;
}
+2 -7
View File
@@ -1,7 +1,7 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// EgalTech 2015-2024 // EgalTech 2015-2015
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// File : MachMgrDBMachinings.cpp Data : 29.03.24 Versione : 2.6d1 // File : MachMgrDBMachinings.cpp Data : 11.11.15 Versione : 1.6k5
// Contenuto : Implementazione gestione DB lavorazioni della classe MachMgr. // Contenuto : Implementazione gestione DB lavorazioni della classe MachMgr.
// //
// //
@@ -304,8 +304,6 @@ MachMgr::MdbSetGeneralParam( int nType, double dVal)
return pMsMgr->SetSafeAggrBottZ( dVal) ; return pMsMgr->SetSafeAggrBottZ( dVal) ;
case MGP_MAXDEPTHSAFE : case MGP_MAXDEPTHSAFE :
return pMsMgr->SetMaxDepthSafe( dVal) ; return pMsMgr->SetMaxDepthSafe( dVal) ;
case MGP_APPROXLINTOL :
return pMsMgr->SetApproxLinTol( dVal) ;
} }
return false ; return false ;
} }
@@ -381,9 +379,6 @@ MachMgr::MdbGetGeneralParam( int nType, double& dVal) const
case MGP_MAXDEPTHSAFE : case MGP_MAXDEPTHSAFE :
dVal = pMsMgr->GetMaxDepthSafe() ; dVal = pMsMgr->GetMaxDepthSafe() ;
return true ; return true ;
case MGP_APPROXLINTOL :
dVal = pMsMgr->GetApproxLinTol() ;
return true ;
} }
return false ; return false ;
} }
+1 -17
View File
@@ -631,8 +631,6 @@ MachMgr::UpdateStandardToolDraw( const ToolData* pTdata, int nGenCtx, int nToolC
pTdata->GetParam( TPA_TOTDIAM, dTotDiam) ; pTdata->GetParam( TPA_TOTDIAM, dTotDiam) ;
double dDist = 0 ; double dDist = 0 ;
pTdata->GetParam( TPA_DIST, dDist) ; pTdata->GetParam( TPA_DIST, dDist) ;
double dStemDiam = 0 ;
pTdata->GetParam( TPA_STEMDIAM, dStemDiam) ;
double dMaxMat = 0 ; double dMaxMat = 0 ;
pTdata->GetParam( TPA_MAXMAT, dMaxMat) ; pTdata->GetParam( TPA_MAXMAT, dMaxMat) ;
double dCornRad = 0 ; double dCornRad = 0 ;
@@ -696,7 +694,6 @@ MachMgr::UpdateStandardToolDraw( const ToolData* pTdata, int nGenCtx, int nToolC
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.LEN", dLen) ; bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.LEN", dLen) ;
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.TOTDIAM", dTotDiam) ; bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.TOTDIAM", dTotDiam) ;
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.DIAM", dDiam) ; bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.DIAM", dDiam) ;
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.STEMDIAM", dStemDiam) ;
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.MAXMAT", dMaxMat) ; bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.MAXMAT", dMaxMat) ;
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.HEIGHT", dThick) ; bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.HEIGHT", dThick) ;
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.SIDEANG", dSideAng) ; bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.SIDEANG", dSideAng) ;
@@ -721,7 +718,7 @@ MachMgr::UpdateStandardToolDraw( const ToolData* pTdata, int nGenCtx, int nToolC
if ( ! ExeLuaGetGlobIntVar( "TOOL.ERR", &nErr) || nErr != 0) if ( ! ExeLuaGetGlobIntVar( "TOOL.ERR", &nErr) || nErr != 0)
return nErr ; return nErr ;
// Se per salvataggio // Se per salvataggio
if ( bOk && bToSave) { if ( bOk && bToSave) {
// Nascondo layer ausiliario // Nascondo layer ausiliario
int nAuxId = ExeGetFirstNameInGroup( ExeGetFirstGroupInGroup( GDB_ID_ROOT), "AUX") ; int nAuxId = ExeGetFirstNameInGroup( ExeGetFirstGroupInGroup( GDB_ID_ROOT), "AUX") ;
ExeSetStatus( { nAuxId}, GDB_ST_OFF) ; ExeSetStatus( { nAuxId}, GDB_ST_OFF) ;
@@ -731,16 +728,6 @@ MachMgr::UpdateStandardToolDraw( const ToolData* pTdata, int nGenCtx, int nToolC
ExeRotate( { nPartId}, ORIG, Z_AX, -90, RTY_GLOB) ; ExeRotate( { nPartId}, ORIG, Z_AX, -90, RTY_GLOB) ;
} }
} }
// altrimenti per visualizzazione
else if ( bOk) {
// Nascondo oggetto/i Carter
int nSolidId = ExeGetFirstNameInGroup( ExeGetFirstGroupInGroup( GDB_ID_ROOT), "SOLID") ;
int nCarterId = ExeGetFirstNameInGroup( nSolidId, "Carter") ;
while ( nCarterId != GDB_ID_NULL) {
ExeSetStatus( { nCarterId}, GDB_ST_OFF) ;
nCarterId = ExeGetNextName( nCarterId, "Carter") ;
}
}
return ( bOk ? 0 : TD_INT_ERR) ; return ( bOk ? 0 : TD_INT_ERR) ;
} }
@@ -760,8 +747,6 @@ MachMgr::UpdateCustomToolDraw( const ToolData* pTdata, int nGenCtx, int nToolCtx
pTdata->GetParam( TPA_DIAM, dDiam) ; pTdata->GetParam( TPA_DIAM, dDiam) ;
double dDist = 0 ; double dDist = 0 ;
pTdata->GetParam( TPA_DIST, dDist) ; pTdata->GetParam( TPA_DIST, dDist) ;
double dSpeed = 0 ;
pTdata->GetParam( TPA_SPEED, dSpeed) ;
// Imposto contesto per il disegno utensile // Imposto contesto per il disegno utensile
if ( ! ExeSetCurrentContext( nToolCtx)) if ( ! ExeSetCurrentContext( nToolCtx))
return TD_INT_ERR ; return TD_INT_ERR ;
@@ -771,7 +756,6 @@ MachMgr::UpdateCustomToolDraw( const ToolData* pTdata, int nGenCtx, int nToolCtx
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.LEN", dLen) ; bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.LEN", dLen) ;
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.DIAM", dDiam) ; bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.DIAM", dDiam) ;
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.DIST", dDist) ; bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.DIST", dDist) ;
bOk = bOk && ExeLuaSetGlobNumVar( "TOOL.SPEED", dSpeed) ;
// Eseguo aggiornamento utensile // Eseguo aggiornamento utensile
bOk = bOk && ExeLuaCallFunction( "AdjustCustomTool") ; bOk = bOk && ExeLuaCallFunction( "AdjustCustomTool") ;
// Recupero errore // Recupero errore
+21 -80
View File
@@ -182,52 +182,6 @@ MachMgr::AddMachGroup( const string& sName, const string& sMachineName)
return nNewId ; return nNewId ;
} }
//----------------------------------------------------------------------------
int
MachMgr::CopyMachGroup( const string& sSouName, const string& sName)
{
// recupero il gruppo sorgente
int nSouMGrpId = GetMachGroupId( sSouName) ;
if ( nSouMGrpId == GDB_ID_NULL)
return GDB_ID_NULL ;
// verifico esista la sua macchina
string sMachineName ;
m_pGeomDB->GetInfo( nSouMGrpId, MACH_MACHINE_KEY, sMachineName) ;
if ( sMachineName.empty() || ! LoadMachine( sMachineName))
return GDB_ID_NULL ;
// verifico nome nuovo gruppo (non deve essere vuoto e non deve esserci già un gruppo con questo nome)
if ( &sName == nullptr || sName.empty() || GetMachGroupId( sName) != GDB_ID_NULL)
return GDB_ID_NULL ;
// reset gruppo corrente
ResetCurrMachGroup() ;
// eseguo la copia del gruppo sorgente e la metto in coda
int nNewMGrpId = m_pGeomDB->Copy( nSouMGrpId, GDB_ID_NULL, m_nMachBaseId) ;
if ( nNewMGrpId == GDB_ID_NULL)
return GDB_ID_NULL ;
// assegno il nome
m_pGeomDB->SetName( nNewMGrpId, sName) ;
// converto opportunamente gli indicativi dei grezzi nelle disposizioni
int nSouRawPartId = m_pGeomDB->GetFirstGroupInGroup( m_pGeomDB->GetFirstNameInGroup( nSouMGrpId, MACH_RAW_GROUP)) ;
int nNewRawPartId = m_pGeomDB->GetFirstGroupInGroup( m_pGeomDB->GetFirstNameInGroup( nNewMGrpId, MACH_RAW_GROUP)) ;
while ( nSouRawPartId != GDB_ID_NULL && nNewRawPartId != GDB_ID_NULL) {
// ciclo sulle disposizioni del nuovo gruppo di lavoro
int nOperId = m_pGeomDB->GetFirstGroupInGroup( m_pGeomDB->GetFirstNameInGroup( nNewMGrpId, MACH_OPER_GROUP)) ;
while ( nOperId != GDB_ID_NULL) {
Disposition* pDisp = GetDisposition( m_pGeomDB->GetUserObj( nOperId)) ;
if ( pDisp != nullptr)
pDisp->UpdateRawPartId( nSouRawPartId, nNewRawPartId) ;
nOperId = m_pGeomDB->GetNextGroup( nOperId) ;
}
// passo alla coppia successiva
nSouRawPartId = m_pGeomDB->GetNextGroup( nSouRawPartId) ;
nNewRawPartId = m_pGeomDB->GetNextGroup( nNewRawPartId) ;
}
// lo rendo corrente
SetCurrMachGroup( nNewMGrpId) ;
// restituisco l'identificativo del gruppo
return nNewMGrpId ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
MachMgr::RemoveMachGroup( int nId) MachMgr::RemoveMachGroup( int nId)
@@ -268,60 +222,44 @@ MachMgr::VerifyMachGroup( int nId, MachGrp& mgData) const
// verifica della macchina // verifica della macchina
bool bMName = m_pGeomDB->GetInfo( nId, MACH_MACHINE_KEY, mgData.MGeoName) ; bool bMName = m_pGeomDB->GetInfo( nId, MACH_MACHINE_KEY, mgData.MGeoName) ;
// scansiono i sottogruppi // scansiono i sottogruppi
PtrOwner<IGdbIterator> pIter( CreateGdbIterator( m_pGeomDB)) ;
if ( IsNull( pIter))
return false ;
bool bSetup = false ; bool bSetup = false ;
bool bFixt = false ; bool bFixt = false ;
bool bRaw = false ; bool bRaw = false ;
bool bOper = false ; bool bOper = false ;
int nGrpId = m_pGeomDB->GetFirstGroupInGroup( nId) ; bool bIter = pIter->GoToFirstGroupInGroup( nId) ;
while ( nGrpId != GDB_ID_NULL) { while ( bIter) {
string sName ; string sName ;
if ( m_pGeomDB->GetName( nGrpId, sName)) { if ( pIter->GetName( sName)) {
if ( sName == MACH_SETUP_GROUP) { if ( sName == MACH_SETUP_GROUP) {
if ( ! bSetup) if ( ! bSetup)
mgData.SetupGroupId = nGrpId ; mgData.SetupGroupId = pIter->GetId() ;
bSetup = true ; bSetup = true ;
} }
else if ( sName == MACH_FIXT_GROUP) { else if ( sName == MACH_FIXT_GROUP) {
if ( ! bFixt) if ( ! bFixt)
mgData.FixtGroupId = nGrpId ; mgData.FixtGroupId = pIter->GetId() ;
bFixt = true ; bFixt = true ;
} }
else if ( sName == MACH_RAW_GROUP) { else if ( sName == MACH_RAW_GROUP) {
if ( ! bRaw) if ( ! bRaw)
mgData.RawGroupId = nGrpId ; mgData.RawGroupId = pIter->GetId() ;
bRaw = true ; bRaw = true ;
} }
else if ( sName == MACH_OPER_GROUP) { else if ( sName == MACH_OPER_GROUP) {
if ( ! bOper) if ( ! bOper)
mgData.OperGroupId = nGrpId ; mgData.OperGroupId = pIter->GetId() ;
bOper = true ; bOper = true ;
} }
} }
// passo al successivo // passo al successivo
nGrpId = m_pGeomDB->GetNextGroup( nGrpId) ; bIter = pIter->GoToNextGroup() ;
} }
return ( bMName && bSetup && bRaw && bOper) ; return ( bMName && bSetup && bRaw && bOper) ;
} }
//----------------------------------------------------------------------------
bool
MachMgr::ChangeMachGroupName( int nId, const string& sNewName)
{
// verifica del gruppo base per le lavorazioni
if ( ! VerifyMachBase())
return false ;
// verifico che il gruppo ricevuto sia corretto
if ( m_pGeomDB->GetParentId( nId) != m_nMachBaseId)
return false ;
// verifico nome non vuoto e non esista già un gruppo con lo stesso nome
if ( &sNewName == nullptr || sNewName.empty() || GetMachGroupId( sNewName) != GDB_ID_NULL)
return false ;
// cambio il nome del gruppo di lavoro
if ( ! m_pGeomDB->SetName( nId, sNewName))
return false ;
return true ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
string string
MachMgr::GetMachGroupName( int nId) const MachMgr::GetMachGroupName( int nId) const
@@ -360,19 +298,22 @@ MachMgr::GetMachGroupId( const string& sName) const
{ {
// verifica dei parametri // verifica dei parametri
if ( &sName == nullptr || sName.empty()) if ( &sName == nullptr || sName.empty())
return GDB_ID_NULL ; return false ;
// verifica del gruppo base per le lavorazioni // verifica del gruppo base per le lavorazioni
if ( ! VerifyMachBase()) if ( ! VerifyMachBase())
return GDB_ID_NULL ; return false ;
// recupero l'identificativo del gruppo con il nome indicato // recupero l'identificativo del gruppo con il nome indicato
int nGrpId = m_pGeomDB->GetFirstGroupInGroup( m_nMachBaseId) ; PtrOwner<IGdbIterator> pIter( CreateGdbIterator( m_pGeomDB)) ;
while ( nGrpId != GDB_ID_NULL) { if ( IsNull( pIter))
return false ;
bool bIter = pIter->GoToFirstGroupInGroup( m_nMachBaseId) ;
while( bIter) {
// verifico il nome // verifico il nome
string sMGroupName ; string sMGroupName ;
if ( m_pGeomDB->GetName( nGrpId, sMGroupName) && EqualNoCase( sMGroupName, sName)) if ( pIter->GetName( sMGroupName) && EqualNoCase( sMGroupName, sName))
return nGrpId ; return pIter->GetId() ;
// passo al successivo // passo al successivo
nGrpId = m_pGeomDB->GetNextGroup( nGrpId) ; bIter = pIter->GoToNextGroup() ;
} }
return GDB_ID_NULL ; return GDB_ID_NULL ;
} }
+3 -42
View File
@@ -356,7 +356,7 @@ bool
MachMgr::SetAxisPos( const string& sAxis, double dVal, double* pdNewVal) MachMgr::SetAxisPos( const string& sAxis, double dVal, double* pdNewVal)
{ {
Machine* pMch = GetCurrMachine() ; Machine* pMch = GetCurrMachine() ;
return ( ( pMch != nullptr) ? pMch->SetAxisPos( sAxis, dVal, true, pdNewVal) : false) ; return ( ( pMch != nullptr) ? pMch->SetAxisPos( sAxis, dVal, pdNewVal) : false) ;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -534,14 +534,6 @@ MachMgr::SetCalcSolCh( int nScc, bool bExact)
return pMch->SetSolCh( nScc, bExact) ; return pMch->SetSolCh( nScc, bExact) ;
} }
//----------------------------------------------------------------------------
bool
MachMgr::GetCalcTable( string& sTable) const
{
Machine* pMch = GetCurrMachine() ;
return ( ( pMch != nullptr) ? pMch->GetCurrTable( sTable) : false) ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
MachMgr::GetCalcTool( string& sTool) const MachMgr::GetCalcTool( string& sTool) const
@@ -617,17 +609,6 @@ MachMgr::GetAllTablesNames( STRVECTOR& vNames) const
return ( ( pMch != nullptr) ? pMch->GetAllTablesNames( vNames) : false) ; return ( ( pMch != nullptr) ? pMch->GetAllTablesNames( vNames) : false) ;
} }
//----------------------------------------------------------------------------
bool
MachMgr::GetAllAxesNames( STRVECTOR& vNames) const
{
// pulisco il vettore
vNames.clear() ;
// richiedo elenco assi alla macchina corrente
Machine* pMch = GetCurrMachine() ;
return ( ( pMch != nullptr) ? pMch->GetAllAxesNames( vNames) : false) ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
MachMgr::GetAllHeadsNames( STRVECTOR& vNames) const MachMgr::GetAllHeadsNames( STRVECTOR& vNames) const
@@ -668,10 +649,10 @@ MachMgr::GetCurrRotAxes( void) const
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
MachMgr::GetAllCurrAxesNames( STRVECTOR& vAxName) const MachMgr::GetAllCurrAxesName( STRVECTOR& vAxName) const
{ {
Machine* pMch = GetCurrMachine() ; Machine* pMch = GetCurrMachine() ;
return ( ( pMch != nullptr) ? pMch->GetAllCurrAxesNames( vAxName) : false) ; return ( ( pMch != nullptr) ? pMch->GetAllCurrAxesName( vAxName) : false) ;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -702,26 +683,6 @@ MachMgr::GetCurrLinAxesFrame( void) const
return pMch->GetCurrLinAxesFrame() ; return pMch->GetCurrLinAxesFrame() ;
} }
//----------------------------------------------------------------------------
bool
MachMgr::GetCurrIsCenter( void) const
{
Machine* pMch = GetCurrMachine() ;
if ( pMch == nullptr)
return false ;
return ( pMch->GetCurrKinematicChainType() == KIN_CHAIN_CENTER) ;
}
//----------------------------------------------------------------------------
bool
MachMgr::GetCurrIsRobot( void) const
{
Machine* pMch = GetCurrMachine() ;
if ( pMch == nullptr)
return false ;
return ( pMch->GetCurrKinematicChainType() == KIN_CHAIN_ROBOT) ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
MachMgr::GetCalcAngles( const Vector3d& vtDirT, const Vector3d& vtDirA, MachMgr::GetCalcAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
+134 -410
View File
@@ -29,7 +29,6 @@
#include "/EgtDev/Include/EGkStmStandard.h" #include "/EgtDev/Include/EGkStmStandard.h"
#include "/EgtDev/Include/EGkStmFromCurves.h" #include "/EgtDev/Include/EGkStmFromCurves.h"
#include "/EgtDev/Include/EgtPointerOwner.h" #include "/EgtDev/Include/EgtPointerOwner.h"
#include "/EgtDev/Include/EXeConst.h"
using namespace std ; using namespace std ;
@@ -97,7 +96,7 @@ MachMgr::AddRawPart( const Point3d& ptOrig, double dLen, double dWidth, double d
m_pGeomDB->SetInfo( nRawId, MACH_RAW_PHASE, m_nCurrPhase) ; m_pGeomDB->SetInfo( nRawId, MACH_RAW_PHASE, m_nCurrPhase) ;
// creo solido e outline // creo solido e outline
bOk = bOk && ModifyRawPart( nRawId, ptOrig, dLen, dWidth, dHeight, cCol) ; bOk = bOk && ModifyRawPart( nRawId, ptOrig, dLen, dWidth, dHeight, cCol) ;
// se qualcosa è andato storto, cancello tutto // se qualcosa è andato storto, cancello tutto
if ( ! bOk) { if ( ! bOk) {
m_pGeomDB->Erase( nRawId) ; m_pGeomDB->Erase( nRawId) ;
return GDB_ID_NULL ; return GDB_ID_NULL ;
@@ -113,7 +112,7 @@ MachMgr::ModifyRawPart( int nRawId, const Point3d& ptOrig, double dLen, double d
// le dimensioni non possono essere nulle // le dimensioni non possono essere nulle
if ( dLen < EPS_SMALL || dWidth < EPS_SMALL || dHeight < EPS_SMALL) if ( dLen < EPS_SMALL || dWidth < EPS_SMALL || dHeight < EPS_SMALL)
return false ; return false ;
// verifica validità grezzo // verifica validità grezzo
if ( ! VerifyRawPart( nRawId)) if ( ! VerifyRawPart( nRawId))
return false ; return false ;
// creo il solido // creo il solido
@@ -172,7 +171,7 @@ MachMgr::AddRawPartWithPart( int nPartId, int nCrvSrfId, double dOverMat, Color
// verifico il gruppo dei grezzi nella macchinata corrente // verifico il gruppo dei grezzi nella macchinata corrente
if ( GetCurrRawGroupId() == GDB_ID_NULL) if ( GetCurrRawGroupId() == GDB_ID_NULL)
return GDB_ID_NULL ; return GDB_ID_NULL ;
// verifico che il pezzo non sia già usato nella macchinata corrente // verifico che il pezzo non sia già usato nella macchinata corrente
if ( m_pGeomDB->GetParentId( nPartId) != GDB_ID_ROOT) if ( m_pGeomDB->GetParentId( nPartId) != GDB_ID_ROOT)
return GDB_ID_NULL ; return GDB_ID_NULL ;
// recupero il tipo di oggetto per definire il grezzo // recupero il tipo di oggetto per definire il grezzo
@@ -181,7 +180,7 @@ MachMgr::AddRawPartWithPart( int nPartId, int nCrvSrfId, double dOverMat, Color
Point3d ptRef ; Point3d ptRef ;
// costruzione del grezzo // costruzione del grezzo
int nRawId = GDB_ID_NULL ; int nRawId = GDB_ID_NULL ;
// se grezzo da superficie (per ora senza possibilità di offset) // se grezzo da superficie (per ora senza possibilità di offset)
if ( ( nGtype & GEO_SURF) != 0) { if ( ( nGtype & GEO_SURF) != 0) {
// inserisco il grezzo // inserisco il grezzo
nRawId = AddRawPart( nCrvSrfId, cCol) ; nRawId = AddRawPart( nCrvSrfId, cCol) ;
@@ -285,7 +284,7 @@ MachMgr::AddRawPart( int nCrvId, double dOverMat, double dZmin, double dHeight,
m_pGeomDB->SetInfo( nRawId, MACH_RAW_PHASE, m_nCurrPhase) ; m_pGeomDB->SetInfo( nRawId, MACH_RAW_PHASE, m_nCurrPhase) ;
// creo solido e outline // creo solido e outline
bOk = bOk && ModifyRawPart( nRawId, nCrvId, dOverMat, dZmin, dHeight, cCol) ; bOk = bOk && ModifyRawPart( nRawId, nCrvId, dOverMat, dZmin, dHeight, cCol) ;
// se qualcosa è andato storto, cancello tutto // se qualcosa è andato storto, cancello tutto
if ( ! bOk) { if ( ! bOk) {
m_pGeomDB->Erase( nRawId) ; m_pGeomDB->Erase( nRawId) ;
return GDB_ID_NULL ; return GDB_ID_NULL ;
@@ -298,7 +297,7 @@ MachMgr::AddRawPart( int nCrvId, double dOverMat, double dZmin, double dHeight,
bool bool
MachMgr::ModifyRawPart( int nRawId, int nCrvId, double dOverMat, double dZmin, double dHeight, Color cCol) MachMgr::ModifyRawPart( int nRawId, int nCrvId, double dOverMat, double dZmin, double dHeight, Color cCol)
{ {
// verifica validità grezzo // verifica validità grezzo
if ( ! VerifyRawPart( nRawId)) if ( ! VerifyRawPart( nRawId))
return false ; return false ;
// recupero il riferimento della curva // recupero il riferimento della curva
@@ -322,7 +321,7 @@ MachMgr::ModifyRawPart( int nRawId, int nCrvId, double dOverMat, double dZmin, d
// la schiaccio a Z = 0 // la schiaccio a Z = 0
if ( ! pMyCrv->Scale( Frame3d(), 1, 1, 0)) if ( ! pMyCrv->Scale( Frame3d(), 1, 1, 0))
return false ; return false ;
// se non è chiusa, la chiudo // se non è chiusa, la chiudo
pMyCrv->Close() ; pMyCrv->Close() ;
// la oriento in senso CCW // la oriento in senso CCW
double dAreaXY ; double dAreaXY ;
@@ -376,11 +375,11 @@ MachMgr::AddRawPart( int nSurfId, Color cCol)
if ( nRawGroupId == GDB_ID_NULL) if ( nRawGroupId == GDB_ID_NULL)
return GDB_ID_NULL ; return GDB_ID_NULL ;
// recupero l'ingombro della superficie in globale // recupero l'ingombro della superficie in globale
BBox3d b3Surf ; BBox3d b3Crv ;
if ( ! m_pGeomDB->GetGlobalBBox( nSurfId, b3Surf)) if ( ! m_pGeomDB->GetGlobalBBox( nSurfId, b3Crv))
return GDB_ID_NULL ; return GDB_ID_NULL ;
// inserisco il gruppo del grezzo nella macchinata // inserisco il gruppo del grezzo nella macchinata
Frame3d frRaw( b3Surf.GetMin()) ; Frame3d frRaw( b3Crv.GetMin()) ;
int nRawId = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawGroupId, frRaw) ; int nRawId = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawGroupId, frRaw) ;
if ( nRawId == GDB_ID_NULL) if ( nRawId == GDB_ID_NULL)
return GDB_ID_NULL ; return GDB_ID_NULL ;
@@ -457,11 +456,11 @@ MachMgr::AddRawPart( int nSurfId, Color cCol)
int nCrvId = ( bOk ? m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pCrvCompo)) : GDB_ID_NULL) ; int nCrvId = ( bOk ? m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pCrvCompo)) : GDB_ID_NULL) ;
bOk = bOk && ( nCrvId != GDB_ID_NULL) ; bOk = bOk && ( nCrvId != GDB_ID_NULL) ;
// assegno il nome alla curva // assegno il nome alla curva
bOk = bOk && m_pGeomDB->SetName( nCrvId, MACH_RAW_OUTLINE) ; bOk = bOk && m_pGeomDB->SetName( nCrvId, MACH_RAW_SOLID) ;
// assegno il colore alla curva // assegno il colore alla curva
bOk = bOk && m_pGeomDB->SetMaterial( nCrvId, cCol) ; bOk = bOk && m_pGeomDB->SetMaterial( nCrvId, cCol) ;
} }
// se qualcosa è andato storto, cancello tutto // se qualcosa è andato storto, cancello tutto
if ( ! bOk) { if ( ! bOk) {
m_pGeomDB->Erase( nRawId) ; m_pGeomDB->Erase( nRawId) ;
return GDB_ID_NULL ; return GDB_ID_NULL ;
@@ -472,156 +471,6 @@ MachMgr::AddRawPart( int nSurfId, Color cCol)
return nRawId ; return nRawId ;
} }
//----------------------------------------------------------------------------
int
MachMgr::AddRawPart( int nSfrUpId, int nSfrDownId, double dHeight, Color cCol)
{
// recupero il gruppo dei grezzi nella macchinata corrente
int nRawGroupId = GetCurrRawGroupId() ;
if ( nRawGroupId == GDB_ID_NULL)
return GDB_ID_NULL ;
// recupero l'ingombro della superficie up in globale
BBox3d b3Surf ;
if ( ! m_pGeomDB->GetGlobalBBox( nSfrUpId, b3Surf))
return GDB_ID_NULL ;
// inserisco il gruppo del grezzo nella macchinata
Frame3d frRaw( b3Surf.GetMin()) ;
int nRawId = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawGroupId, frRaw) ;
if ( nRawId == GDB_ID_NULL)
return GDB_ID_NULL ;
// assegno il nome al gruppo
bool bOk = m_pGeomDB->SetName( nRawId, MACH_RAW_PART) ;
// assegno la fase al gruppo
bOk = bOk && m_pGeomDB->SetInfo( nRawId, MACH_RAW_PHASE, m_nCurrPhase) ;
// recupero il frame originale della superficie up ( deve essere lo stesso della down)
Frame3d frSurf ;
bOk = bOk && m_pGeomDB->GetGlobFrame( nSfrUpId, frSurf) ;
// creo il volume in modo approssimativo a partire dalle due superfici considerando soltanto un'approssimazione dei bordi esterni
// regione up
PtrOwner<ISurfFlatRegion> pSurfUp( CloneSurfFlatRegion( m_pGeomDB->GetGeoObj( nSfrUpId))) ;
bOk = bOk && ( ! IsNull( pSurfUp)) ;
// calcolo offset e contro-offset per unificare i chunk ed eliminare eventuali rientranze nella superficie
double dOffs = 8 ;
bOk = bOk && pSurfUp->Offset( dOffs, ICurve::OFF_FILLET) ;
bOk = bOk && pSurfUp->Offset( -dOffs, ICurve::OFF_FILLET) ;
// recupero il chunk di area maggiore
int nKMax = 0 ;
if ( bOk && pSurfUp->GetChunkCount() > 1) {
double dAreaMax = -1 ;
for ( int k = 0 ; k < pSurfUp->GetChunkCount() ; k ++) {
PtrOwner<ISurfFlatRegion> pSfrChunk( pSurfUp->CloneChunk( k)) ;
double dArea = -1 ; pSfrChunk->GetGrossArea( dArea) ;
if ( dArea > dAreaMax) {
nKMax = k ;
dAreaMax = dArea ;
}
}
}
PtrOwner<ICurve> pCrvUp ;
bOk = bOk && pCrvUp.Set( pSurfUp->GetLoop( nKMax, 0)) ;
bOk = bOk && ( ! IsNull( pCrvUp)) ;
// regione down
PtrOwner<ISurfFlatRegion> pSurfDown( CloneSurfFlatRegion( m_pGeomDB->GetGeoObj( nSfrDownId))) ;
bOk = bOk && ( ! IsNull( pSurfDown)) ;
bOk = bOk && pSurfDown->Offset( dOffs, ICurve::OFF_FILLET) ;
bOk = bOk && pSurfDown->Offset( -dOffs, ICurve::OFF_FILLET) ;
nKMax = 0 ;
if ( bOk && pSurfDown->GetChunkCount() > 1) {
double dAreaMax = -1 ;
for ( int k = 0 ; k < pSurfDown->GetChunkCount() ; k ++) {
PtrOwner<ISurfFlatRegion> pSfrChunk( pSurfDown->CloneChunk( k)) ;
double dArea = -1 ; pSfrChunk->GetGrossArea( dArea) ;
if ( dArea > dAreaMax) {
nKMax = k ;
dAreaMax = dArea ;
}
}
}
PtrOwner<ICurveComposite> pCrvDown ;
bOk = bOk && pCrvDown.Set( ConvertCurveToComposite( pSurfDown->GetLoop( nKMax, 0))) ;
bOk = bOk && ( ! IsNull( pCrvDown)) ;
// sposto il punto di inizio il più vicino possibile a quello della curva up per migliorare il calcolo della rigata
if ( bOk) {
Point3d ptS ; pCrvUp->GetStartPoint( ptS) ;
DistPointCurve distPC( ptS, *pCrvDown) ;
double dPar ; int nFlag ;
bOk = bOk && distPC.GetParamAtMinDistPoint( 0, dPar, nFlag) ;
bOk = bOk && pCrvDown->ChangeStartPoint( dPar) ;
}
// volume
PtrOwner<ISurfTriMesh> pStmRaw ;
bOk = bOk && pStmRaw.Set( GetSurfTriMeshByFlatContour( pCrvUp)) ;
bOk = bOk && ( ! IsNull( pStmRaw)) ;
PtrOwner<ISurfTriMesh> pStmLat ;
bOk = bOk && pStmLat.Set( GetSurfTriMeshRuled( pCrvDown, pCrvUp, ISurfTriMesh::RLT_MINDIST)) ;
bOk = bOk && ( ! IsNull( pStmLat)) ;
bOk = bOk && pStmRaw->DoSewing( *pStmLat) ;
PtrOwner<ISurfTriMesh> pStmDown ;
bOk = bOk && pStmDown.Set( GetSurfTriMeshByFlatContour( pCrvDown)) ;
bOk = bOk && pStmDown->Invert() ;
bOk = bOk && pStmRaw->DoSewing( *pStmDown) ;
bOk = bOk && pStmRaw->DoCompacting() ;
bOk = bOk && pStmRaw->Repair() ;
bOk = bOk && pStmRaw->LocToLoc( frSurf, frRaw) ;
int nId = bOk ? m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pStmRaw)) : GDB_ID_NULL ;
bOk = bOk && ( nId != GDB_ID_NULL) ;
// assegno il nome al solido
bOk = bOk && m_pGeomDB->SetName( nId, MACH_RAW_SOLID) ;
// assegno il colore al solido
bOk = bOk && m_pGeomDB->SetMaterial( nId, cCol) ;
// rendo visibile il solido
bOk = bOk && m_pGeomDB->SetStatus( nId, GDB_ST_ON) ;
// calcolo il punto centro del solido
bOk = bOk && SetRawPartCenter( nRawId) ;
if ( bOk) {
// costruisco la curva di contorno
PtrOwner<ISurfFlatRegion> pSfrUp( CloneSurfFlatRegion( m_pGeomDB->GetGeoObj( nSfrUpId))) ;
PtrOwner<ISurfFlatRegion> pSfrDown( CloneSurfFlatRegion( m_pGeomDB->GetGeoObj( nSfrDownId))) ;
bOk = bOk && ( ! IsNull( pSfrUp)) && ( ! IsNull( pSfrDown)) ;
if ( bOk)
pSfrUp->Add( *pSfrDown) ;
PtrOwner<ICurve> pCrv ;
bOk = bOk && pCrv.Set( pSfrUp->GetLoop( 0, 0)) ;
bOk = bOk && ( ! IsNull( pCrv)) ;
bOk = bOk && pCrv->LocToLoc( frSurf, frRaw) ;
int nLoop = bOk ? m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pCrv)) : GDB_ID_NULL ;
bOk = bOk && ( nLoop != GDB_ID_NULL) ;
bOk = bOk && ExeMove( {nLoop}, -dHeight * Z_AX, RTY_LOC) ;
// assegno il nome alla curva
bOk = bOk && m_pGeomDB->SetName( nLoop, MACH_RAW_OUTLINE) ;
// assegno il colore alla curva
bOk = bOk && m_pGeomDB->SetMaterial( nLoop, cCol) ;
// recupero le superfici up e down
int nSurfUpId = ( bOk ? m_pGeomDB->CopyGlob( nSfrUpId, GDB_ID_NULL, nRawId) : GDB_ID_NULL) ;
bOk = bOk && ( nSurfUpId != GDB_ID_NULL) ;
bOk = bOk && m_pGeomDB->SetName( nSurfUpId, MACH_RAW_UP_REG) ;
bOk = bOk && m_pGeomDB->SetMaterial( nSurfUpId, cCol) ;
bOk = bOk && m_pGeomDB->SetStatus( nSurfUpId, GDB_ST_OFF) ;
int nSurfDownId = ( bOk ? m_pGeomDB->CopyGlob( nSfrDownId, GDB_ID_NULL, nRawId) : GDB_ID_NULL) ;
bOk = bOk && ( nSurfDownId != GDB_ID_NULL) ;
bOk = bOk && m_pGeomDB->SetName( nSurfDownId, MACH_RAW_DOWN_REG) ;
bOk = bOk && m_pGeomDB->SetMaterial( nSurfDownId, cCol) ;
bOk = bOk && m_pGeomDB->SetStatus( nSurfDownId, GDB_ST_OFF) ;
}
// se qualcosa è andato storto, cancello tutto
if ( ! bOk) {
m_pGeomDB->Erase( nRawId) ;
return GDB_ID_NULL ;
}
// tutto ok
return nRawId ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
MachMgr::ModifyRawPartSize( int nRawId, double dLength, double dWidth, double dHeight) MachMgr::ModifyRawPartSize( int nRawId, double dLength, double dWidth, double dHeight)
@@ -629,7 +478,7 @@ MachMgr::ModifyRawPartSize( int nRawId, double dLength, double dWidth, double dH
// le nuove dimensioni non possono essere nulle // le nuove dimensioni non possono essere nulle
if ( dLength < EPS_SMALL || dWidth < EPS_SMALL || dHeight < EPS_SMALL) if ( dLength < EPS_SMALL || dWidth < EPS_SMALL || dHeight < EPS_SMALL)
return false ; return false ;
// verifica validità grezzo // verifica validità grezzo
if ( ! VerifyRawPart( nRawId)) if ( ! VerifyRawPart( nRawId))
return false ; return false ;
// recupero il solido del grezzo // recupero il solido del grezzo
@@ -671,10 +520,10 @@ MachMgr::ModifyRawPartSize( int nRawId, double dLength, double dWidth, double dH
bool bool
MachMgr::ModifyRawPartHeight( int nRawId, double dHeight) MachMgr::ModifyRawPartHeight( int nRawId, double dHeight)
{ {
// la nuova altezza non può essere nulla // la nuova altezza non può essere nulla
if ( dHeight < EPS_SMALL) if ( dHeight < EPS_SMALL)
return false ; return false ;
// verifica validità grezzo // verifica validità grezzo
if ( ! VerifyRawPart( nRawId)) if ( ! VerifyRawPart( nRawId))
return false ; return false ;
// recupero il solido del grezzo // recupero il solido del grezzo
@@ -703,10 +552,10 @@ MachMgr::GetRawPartPhases( int nRawId, INTVECTOR& vPhase) const
{ {
// pulisco parametro di ritorno // pulisco parametro di ritorno
vPhase.clear() ; vPhase.clear() ;
// verifica validità grezzo // verifica validità grezzo
if ( ! VerifyRawPart( nRawId)) if ( ! VerifyRawPart( nRawId))
return false ; return false ;
// recupero le fasi in cui è presente il grezzo (se manca è fase 1) // recupero le fasi in cui è presente il grezzo (se manca è fase 1)
if ( ! m_pGeomDB->GetInfo( nRawId, MACH_RAW_PHASE, vPhase) || vPhase.empty()) if ( ! m_pGeomDB->GetInfo( nRawId, MACH_RAW_PHASE, vPhase) || vPhase.empty())
vPhase.emplace_back( 1) ; vPhase.emplace_back( 1) ;
return true ; return true ;
@@ -716,11 +565,11 @@ MachMgr::GetRawPartPhases( int nRawId, INTVECTOR& vPhase) const
bool bool
MachMgr::KeepRawPart( int nRawId, int nSouPhase) MachMgr::KeepRawPart( int nRawId, int nSouPhase)
{ {
// verifico validità e recupero fasi in cui è presente // verifico validità e recupero fasi in cui è presente
INTVECTOR vPhase ; INTVECTOR vPhase ;
if ( ! GetRawPartPhases( nRawId, vPhase)) if ( ! GetRawPartPhases( nRawId, vPhase))
return false ; return false ;
// se fase corrente già presente, non devo fare alcunché // se fase corrente già presente, non devo fare alcunché
if ( find( vPhase.begin(), vPhase.end(), m_nCurrPhase) != vPhase.end()) if ( find( vPhase.begin(), vPhase.end(), m_nCurrPhase) != vPhase.end())
return true ; return true ;
// aggiungo la fase corrente // aggiungo la fase corrente
@@ -772,11 +621,10 @@ MachMgr::KeepRawPart( int nRawId, int nSouPhase)
bool bool
MachMgr::VerifyRawPartPhase( int nRawId, int nPhase) const MachMgr::VerifyRawPartPhase( int nRawId, int nPhase) const
{ {
// verifico validità e recupero fasi in cui è presente // verifico validità e recupero fasi in cui è presente
INTVECTOR vPhase ; INTVECTOR vPhase ;
if ( ! GetRawPartPhases( nRawId, vPhase)) if ( ! GetRawPartPhases( nRawId, vPhase))
return false ; return false ;
// verifico presenza nella fase indicata
return ( find( vPhase.begin(), vPhase.end(), nPhase) != vPhase.end()) ; return ( find( vPhase.begin(), vPhase.end(), nPhase) != vPhase.end()) ;
} }
@@ -784,11 +632,11 @@ MachMgr::VerifyRawPartPhase( int nRawId, int nPhase) const
bool bool
MachMgr::RemoveRawPartFromCurrPhase( int nRawId) MachMgr::RemoveRawPartFromCurrPhase( int nRawId)
{ {
// verifico validità e recupero fasi in cui è presente // verifico validità e recupero fasi in cui è presente
INTVECTOR vPhase ; INTVECTOR vPhase ;
if ( ! GetRawPartPhases( nRawId, vPhase)) if ( ! GetRawPartPhases( nRawId, vPhase))
return false ; return false ;
// se non appartiene alla fase corrente, non devo fare alcunché // se non appartiene alla fase corrente, non devo fare alcunché
auto iIter = find( vPhase.begin(), vPhase.end(), m_nCurrPhase) ; auto iIter = find( vPhase.begin(), vPhase.end(), m_nCurrPhase) ;
if ( iIter == vPhase.end()) if ( iIter == vPhase.end())
return true ; return true ;
@@ -815,7 +663,7 @@ MachMgr::RemoveRawPartFromCurrPhase( int nRawId)
bool bool
MachMgr::RemoveRawPart( int nRawId) MachMgr::RemoveRawPart( int nRawId)
{ {
// verifica validità grezzo // verifica validità grezzo
if ( ! VerifyRawPart( nRawId)) if ( ! VerifyRawPart( nRawId))
return false ; return false ;
// tolgo dalle disposizioni in cui compare gli eventuali movimenti registrati di questo grezzo // tolgo dalle disposizioni in cui compare gli eventuali movimenti registrati di questo grezzo
@@ -839,7 +687,7 @@ MachMgr::VerifyRawPart( int nRawId, bool bLinkedAllowed) const
int nRawGroupId = GetCurrRawGroupId() ; int nRawGroupId = GetCurrRawGroupId() ;
if ( nRawGroupId != GDB_ID_NULL && m_pGeomDB->GetParentId( nRawId) == nRawGroupId) if ( nRawGroupId != GDB_ID_NULL && m_pGeomDB->GetParentId( nRawId) == nRawGroupId)
return true ; return true ;
// se consentito linkaggio ed il grezzo è linkato ad un gruppo della macchina corrente, va bene // se consentito linkaggio ed il grezzo è linkato ad un gruppo della macchina corrente, va bene
if ( bLinkedAllowed) { if ( bLinkedAllowed) {
Machine* pMch = GetCurrMachine() ; Machine* pMch = GetCurrMachine() ;
if ( pMch != nullptr && pMch->IsLinkedRawPart( nRawId)) if ( pMch != nullptr && pMch->IsLinkedRawPart( nRawId))
@@ -959,12 +807,12 @@ MachMgr::ResetRawPartCenter( int nRawId)
bool bool
MachMgr::GetRawPartCenter( int nRawId, Point3d& ptCen) MachMgr::GetRawPartCenter( int nRawId, Point3d& ptCen)
{ {
// verifica validità grezzo // verifica validità grezzo
if ( ! VerifyRawPart( nRawId)) if ( ! VerifyRawPart( nRawId))
return false ; return false ;
// cerco di recuperare l'oggetto // cerco di recuperare l'oggetto
int nGPntId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_CENTER) ; int nGPntId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_CENTER) ;
// ne verifico la validità // ne verifico la validità
int nMode ; int nMode ;
if ( nGPntId == GDB_ID_NULL || if ( nGPntId == GDB_ID_NULL ||
! m_pGeomDB->GetMode( nGPntId, nMode) || nMode != GDB_MD_STD) { ! m_pGeomDB->GetMode( nGPntId, nMode) || nMode != GDB_MD_STD) {
@@ -992,7 +840,7 @@ MachMgr::GetRawPartCenter( int nRawId, Point3d& ptCen)
bool bool
MachMgr::GetRawPartBBox( int nRawId, BBox3d& b3Raw) MachMgr::GetRawPartBBox( int nRawId, BBox3d& b3Raw)
{ {
// verifica validità grezzo // verifica validità grezzo
if ( ! VerifyRawPart( nRawId)) if ( ! VerifyRawPart( nRawId))
return false ; return false ;
// recupero solido del grezzo // recupero solido del grezzo
@@ -1000,103 +848,6 @@ MachMgr::GetRawPartBBox( int nRawId, BBox3d& b3Raw)
return m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw) ; return m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw) ;
} }
//---------------------------------------------------------------------------
static bool
AssociateSurfs( IGeomDB* pGeomDB, int nSurfUpId, int nSurfDownId, vector<pair<int,int>>& vRawSurfs)
{
// vRawSurfs contiene tutte le coppie ( id regioneUp, id regioneDown) che definiscono i nuovi grezzi
vRawSurfs.clear() ;
int nUpCnt = ExeSurfFrChunkCount( nSurfUpId) ;
int nDownCnt = ExeSurfFrChunkCount( nSurfDownId) ;
// se non sono stati creati più grezzi
if ( nUpCnt == 1 || nDownCnt == 1) {
vRawSurfs.emplace_back( nSurfUpId, nSurfDownId) ;
return true ;
}
int nUpFirstId = ExeExplodeSurface( nSurfUpId, &nUpCnt) ;
int nDownFirstId = ExeExplodeSurface( nSurfDownId, &nDownCnt) ;
// ad ogni chunk della regione up associo i chunk corrispondenti della regione down
INTVECTOR vChunks( nUpCnt, GDB_ID_NULL) ;
for ( int nIdD = nDownFirstId ; nIdD < nDownFirstId + nDownCnt ; nIdD ++) {
ISurfFlatRegion* pSfrD = GetSurfFlatRegion( pGeomDB->GetGeoObj( nIdD)) ;
if ( pSfrD == nullptr)
return false ;
BBox3d bBoxD ; ExeGetBBox( nIdD, BBF_STANDARD, bBoxD) ;
// inidividuo il chunk della superficie up che interagisce maggiormente con il chunk corrente della superficie down
int k = -1 ;
double dMaxArea = -1 ;
for ( int j = 0 ; j < nUpCnt ; j ++) {
BBox3d bBoxU ; ExeGetBBox( nUpFirstId + j, BBF_STANDARD, bBoxU) ;
if ( bBoxU.OverlapsXY( bBoxD)) {
PtrOwner<ISurfFlatRegion> pSfrU( CloneSurfFlatRegion( pGeomDB->GetGeoObj( nUpFirstId + j))) ;
if ( IsNull( pSfrU))
return false ;
// le due superfici sono nello stesso frame
pSfrU->Intersect( *pSfrD) ;
double dArea = -1 ; pSfrU->GetArea( dArea) ;
if ( dArea > dMaxArea) {
k = j ;
dMaxArea = dArea ;
}
}
}
// aggiorno le superfici con l'associazione trovata
if ( k == -1)
return false ;
if ( vChunks[k] == GDB_ID_NULL)
vChunks[k] = nIdD ;
else {
ExeSurfFrAdd( vChunks[k], nIdD) ;
ExeErase( {nIdD}) ;
}
}
// controllo per ogni chunk della superficie up il corrispondente della nuova superficie down
for ( int i = 0 ; i < nUpCnt ; i ++) {
ISurfFlatRegion* pSfrU = GetSurfFlatRegion( pGeomDB->GetGeoObj( nUpFirstId + i)) ;
if ( pSfrU == nullptr)
return false ;
BBox3d bBoxU ; ExeGetBBox( nUpFirstId + i, BBF_STANDARD, bBoxU) ;
// individuo il chunk della superficie down che interagisce maggiormente con il chunk corrente della superficie up
int k = -1 ;
double dMaxArea = -1 ;
for ( int j = 0 ; j < int( vChunks.size()) ; j ++) {
BBox3d bBoxD ; ExeGetBBox( vChunks[j], BBF_STANDARD, bBoxD) ;
// se i box interferiscono allora verifico di quanto si sovrappongono le due regioni
if ( bBoxD.OverlapsXY( bBoxU)) {
PtrOwner<ISurfFlatRegion> pSfrD( CloneSurfFlatRegion( pGeomDB->GetGeoObj( vChunks[j]))) ;
if ( IsNull( pSfrD))
return false ;
pSfrD->Intersect( *pSfrU) ;
double dArea = -1 ; pSfrD->GetArea( dArea) ;
if ( dArea > dMaxArea) {
k = j ;
dMaxArea = dArea ;
}
}
}
if ( k == -1)
return false ;
// se è la stessa associazione individuata da vChunks allora aggiorno il vettore finale dei grezzi
if ( k == i)
vRawSurfs.emplace_back( nUpFirstId + i, vChunks[i]) ;
else {
// altrimenti unisco le regioni associate appena individuate sia per la superficie up sia per la down
ExeSurfFrAdd( nUpFirstId + k, nUpFirstId + i) ;
ExeErase( {nUpFirstId + i}) ;
ExeSurfFrAdd( vChunks[k], vChunks[i]) ;
ExeErase( {vChunks[i]}) ;
}
}
return true ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
int int
MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId) MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
@@ -1120,6 +871,7 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
BBox3d b3Raw ; BBox3d b3Raw ;
if ( ! m_pGeomDB->GetGlobalBBox( nRawSolId, b3Raw)) if ( ! m_pGeomDB->GetGlobalBBox( nRawSolId, b3Raw))
return GDB_ID_NULL ; return GDB_ID_NULL ;
double dZmin = b3Raw.GetMin().z ;
double dHeight = b3Raw.GetMax().z - b3Raw.GetMin().z ; double dHeight = b3Raw.GetMax().z - b3Raw.GetMin().z ;
// il colore del grezzo // il colore del grezzo
Color cCol = AQUA ; Color cCol = AQUA ;
@@ -1128,31 +880,19 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
Frame3d frRaw ; Frame3d frRaw ;
if ( ! m_pGeomDB->GetGroupGlobFrame( nRawId, frRaw)) if ( ! m_pGeomDB->GetGroupGlobFrame( nRawId, frRaw))
return GDB_ID_NULL ; return GDB_ID_NULL ;
// creo la regione del grezzo a partire dal suo contorno
// recupero il contorno // recupero il contorno
int nOutCrvId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_OUTLINE) ; int nOutCrvId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_OUTLINE) ;
if ( nOutCrvId == GDB_ID_NULL) if ( nOutCrvId == GDB_ID_NULL)
return GDB_ID_NULL ; return GDB_ID_NULL ;
// creo la regione
// creo le regioni inferiore e superiore del grezzo da aggiornare con le lavorazioni INTVECTOR vCrvIds ;
int nSfrDownId = GDB_ID_NULL, nSfrUpId = GDB_ID_NULL ; vCrvIds.emplace_back( nOutCrvId) ;
int nSfrDownOrigId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_DOWN_REG) ; int nSfrId = ExeCreateSurfFlatRegion( nRawId, vCrvIds, nullptr) ;
int nSfrUpOrigId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_UP_REG) ; if ( nSfrId == GDB_ID_NULL)
if ( nSfrDownOrigId == GDB_ID_NULL || nSfrUpOrigId == GDB_ID_NULL) { return GDB_ID_NULL ;
// se le regioni del grezzo di partenza non sono definite, le creo a partire dall'outline m_pGeomDB->SetLevel( nSfrId, GDB_LV_TEMP) ;
nSfrDownId = ExeCreateSurfFlatRegion( nRawId, {nOutCrvId}, nullptr) ;
if ( nSfrDownId == GDB_ID_NULL)
return GDB_ID_NULL ;
nSfrUpId = ExeCopyGlob( nSfrDownId, nRawId, GDB_LAST_SON) ;
if ( nSfrUpId == GDB_ID_NULL)
return GDB_ID_NULL ;
ExeMove( { nSfrUpId}, dHeight * Z_AX, RTY_LOC) ;
}
else {
nSfrDownId = ExeCopyGlob( nSfrDownOrigId, nRawId, GDB_LAST_SON) ;
nSfrUpId = ExeCopyGlob( nSfrUpOrigId, nRawId, GDB_LAST_SON) ;
if ( nSfrDownId == GDB_ID_NULL || nSfrUpId == GDB_ID_NULL)
return GDB_ID_NULL ;
}
// se esiste il kerf, ne creo la regione // se esiste il kerf, ne creo la regione
PtrOwner<ISurfFlatRegion> pSfrKerf ; PtrOwner<ISurfFlatRegion> pSfrKerf ;
@@ -1167,8 +907,7 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
} }
// recupero le regioni delle lavorazioni // recupero le regioni delle lavorazioni
INTVECTOR vMchRRegUp ; INTVECTOR vMchRReg ;
INTVECTOR vMchRRegDown ;
for ( auto nMchId : vMchId) { for ( auto nMchId : vMchId) {
// recupero gruppo preview lavorazioni nella lavorazione // recupero gruppo preview lavorazioni nella lavorazione
int nPVGrp = m_pGeomDB->GetFirstNameInGroup( nMchId, MCH_PV) ; int nPVGrp = m_pGeomDB->GetFirstNameInGroup( nMchId, MCH_PV) ;
@@ -1176,110 +915,94 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
return GDB_ID_NULL ; return GDB_ID_NULL ;
// se vuoto, cerco il rimando al preview nel pezzo // se vuoto, cerco il rimando al preview nel pezzo
if ( m_pGeomDB->GetGroupObjs( nPVGrp) == 0 && if ( m_pGeomDB->GetGroupObjs( nPVGrp) == 0 &&
! m_pGeomDB->GetInfo( nPVGrp, MCH_PV_KEY_RELOCATE, nPVGrp)) ! m_pGeomDB->GetInfo( nPVGrp, MCH_PV_KEY_RELOCATE, nPVGrp))
return GDB_ID_NULL ; return GDB_ID_NULL ;
// ciclo sui percorsi utensile (CL) // ciclo sui percorsi utensile (CL)
int nClId = m_pGeomDB->GetFirstGroupInGroup( nPVGrp) ; int nClId = m_pGeomDB->GetFirstGroupInGroup( nPVGrp) ;
while ( nClId != GDB_ID_NULL) { while ( nClId != GDB_ID_NULL) {
// lavorazioni per regione inferiore // tagli ridotti
int nCrDownId = m_pGeomDB->GetFirstNameInGroup( nClId, MCH_PV_DOWN_RAWCUT) ; int nCrId = m_pGeomDB->GetFirstNameInGroup( nClId, MCH_PV_RRCUT) ;
// se non esiste la regione inferiore la lavorazione non è passante quindi può essere ignorata while ( nCrId != GDB_ID_NULL) {
if ( nCrDownId != GDB_ID_NULL) { vMchRReg.emplace_back( nCrId) ;
while ( nCrDownId != GDB_ID_NULL) { nCrId = m_pGeomDB->GetNextName( nCrId, MCH_PV_RRCUT) ;
vMchRRegDown.emplace_back( nCrDownId) ; }
nCrDownId = m_pGeomDB->GetNextName( nCrDownId, MCH_PV_DOWN_RAWCUT) ;
}
// lavorazioni per regione superiore
int nCrUpId = m_pGeomDB->GetFirstNameInGroup( nClId, MCH_PV_UP_RAWCUT) ;
while ( nCrUpId != GDB_ID_NULL) {
vMchRRegUp.emplace_back( nCrUpId) ;
nCrUpId = m_pGeomDB->GetNextName( nCrUpId, MCH_PV_UP_RAWCUT) ;
}
}
// passo al successivo percorso utensile // passo al successivo percorso utensile
nClId = m_pGeomDB->GetNextGroup( nClId) ; nClId = m_pGeomDB->GetNextGroup( nClId) ;
} }
} }
// sottraggo le lavorazioni alle superfici del grezzo // sottraggo queste regioni a quella del grezzo
for ( auto nMchRReg : vMchRRegUp) for ( auto nMchRReg : vMchRReg) {
ExeSurfFrSubtract( nSfrUpId, nMchRReg) ; ExeSurfFrSubtract( nSfrId, nMchRReg) ;
for ( auto nMchRReg : vMchRRegDown) }
ExeSurfFrSubtract( nSfrDownId, nMchRReg) ;
// classifico i chunks della regione up e down per individuare le regioni che definiscono i nuovi grezzi
vector<pair<int,int>> vSurfRaws ;
AssociateSurfs( m_pGeomDB, nSfrUpId, nSfrDownId, vSurfRaws) ;
// creo i grezzi risultanti // creo i grezzi risultanti
INTVECTOR vNewIds ; // creo i nuovi grezzi
for ( int i = 0 ; i < int( vSurfRaws.size()) ; i++) { INTVECTOR vNewIds ;
int nCount ;
// aggiungo il grezzo int nChunk = 0 ;
int nId = AddRawPart( vSurfRaws[i].first, vSurfRaws[i].second, dHeight, cCol) ; int nFirstLoopId = ExeExtractSurfFrChunkLoops( nSfrId, nChunk, nRawId, &nCount) ;
m_pGeomDB->Erase( vSurfRaws[i].first) ; while ( nFirstLoopId != GDB_ID_NULL) {
m_pGeomDB->Erase( vSurfRaws[i].second) ; // !!! in attesa di gestire i grezzi con i buchi !!!
if ( nId == GDB_ID_NULL) // cancello le eventuali curve successive (sono i loop interni ovvero i buchi)
return GDB_ID_NULL ; for ( int i = 1 ; i < nCount ; ++ i) {
vNewIds.emplace_back( nId) ; m_pGeomDB->Erase( nFirstLoopId + i) ;
}
// imposto lo stato del contorno di questo grezzo come quello del grezzo di partenza // dichiaro temporanea la curva
int nStat = GDB_ST_ON ; m_pGeomDB->SetLevel( nFirstLoopId, GDB_LV_TEMP) ;
if ( m_pGeomDB->GetStatus( nOutCrvId, nStat) && nStat == GDB_ST_OFF) // creo il grezzo
m_pGeomDB->SetStatus( m_pGeomDB->GetFirstNameInGroup( nId, MACH_RAW_OUTLINE), nStat) ; int nId = AddRawPart( nFirstLoopId, 0, dZmin, dHeight, cCol) ;
// assegno la fase al gruppo if ( nId == GDB_ID_NULL)
m_pGeomDB->SetInfo( nId, MACH_RAW_PHASE, m_nCurrPhase) ; return GDB_ID_NULL ;
// se esiste il kerf uso questa curva per creare il kerf del nuovo grezzo vNewIds.emplace_back( nId) ;
if ( ! IsNull( pSfrKerf)) { // imposto lo stato del contorno di questo grezzo come quello del grezzo di partenza
// riferimento del nuovo grezzo int nStat = GDB_ST_ON ;
Frame3d frNewRaw ; if ( m_pGeomDB->GetStatus( nOutCrvId, nStat) && nStat == GDB_ST_OFF)
if ( ! m_pGeomDB->GetGroupGlobFrame( nId, frNewRaw)) m_pGeomDB->SetStatus( m_pGeomDB->GetFirstNameInGroup( nId, MACH_RAW_OUTLINE), nStat) ;
return GDB_ID_NULL ; // assegno la fase al gruppo
// considero il nuovo kerf come la regione superiore del nuovo grezzo m_pGeomDB->SetInfo( nId, MACH_RAW_PHASE, m_nCurrPhase) ;
int nSfrUpId = m_pGeomDB->GetFirstNameInGroup( nId, MACH_RAW_UP_REG) ; // se esiste il kerf uso questa curva per creare il kerf del nuovo grezzo
if ( nSfrUpId == GDB_ID_NULL) if ( ! IsNull( pSfrKerf)) {
return GDB_ID_NULL ; // creo la regione con la curva
PtrOwner<ISurfFlatRegion> pSfrNewKerf( CloneSurfFlatRegion( m_pGeomDB->GetGeoObj( nSfrUpId))) ; SurfFlatRegionByContours SfrCntr ;
if ( IsNull( pSfrNewKerf)) SfrCntr.AddCurve( GetCurve( m_pGeomDB->RemoveGeoObjAndErase( nFirstLoopId))) ;
return GDB_ID_NULL ; PtrOwner<ISurfFlatRegion> pSfrNewKerf( SfrCntr.GetSurf()) ;
// porto nello stesso riferimento del grezzo originale if ( IsNull( pSfrNewKerf))
pSfrNewKerf->LocToLoc( frNewRaw, frRaw) ; return GDB_ID_NULL ;
// la limito con la regione di kerf precedente ( va bene anche se fallisce) // la limito con la regione di kerf precedente (va bene anche se fallisce)
pSfrNewKerf->Intersect( *pSfrKerf) ; pSfrNewKerf->Intersect( *pSfrKerf) ;
// se risultato non vuoto // se risultato non vuoto
if ( pSfrNewKerf->IsValid()) { if ( pSfrNewKerf->IsValid()) {
// la porto dal riferimento del grezzo originale al riferimento di questo grezzo // riferimento del nuovo grezzo
pSfrNewKerf->LocToLoc( frRaw, frNewRaw) ; Frame3d frNewRaw ;
// recupero il contorno esterno del chunk più grande e lo inserisco come kerf del nuovo grezzo if ( ! m_pGeomDB->GetGroupGlobFrame( nId, frNewRaw))
double dAreaMax = -1 ; return GDB_ID_NULL ;
int nKMax = 0 ; // la porto dal riferimento del grezzo originale al riferimento di questo grezzo
for ( int k = 0 ; k < pSfrNewKerf->GetChunkCount() ; k ++) { pSfrNewKerf->LocToLoc( frRaw, frNewRaw) ;
PtrOwner<ISurfFlatRegion> pSfrChunk( pSfrNewKerf->CloneChunk( k)) ; // la porto sulla faccia sopra del grezzo
double dArea = -1 ; pSfrChunk->GetGrossArea( dArea) ; pSfrNewKerf->Translate( Vector3d( 0, 0, dHeight)) ;
if ( dArea > dAreaMax) { // recupero il contorno e lo inserisco come kerf del nuovo grezzo
nKMax = k ; PtrOwner<ICurve> pCrv( pSfrNewKerf->GetLoop( 0, 0)) ;
dAreaMax = dArea ; int nNewKerfId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nId, Release( pCrv)) ;
} if ( nNewKerfId == GDB_ID_NULL)
} return GDB_ID_NULL ;
PtrOwner<ICurve> pCrv( pSfrNewKerf->GetLoop( nKMax, 0)) ; m_pGeomDB->CopyMaterial( nKerfId, nNewKerfId) ;
if ( IsNull( pCrv)) m_pGeomDB->SetName( nNewKerfId, MACH_RAW_KERF) ;
return GDB_ID_NULL ; }
int nNewKerfId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nId, Release( pCrv)) ; }
if ( nNewKerfId == GDB_ID_NULL) // altrimenti la cancello
return GDB_ID_NULL ; else
m_pGeomDB->CopyMaterial( nKerfId, nNewKerfId) ; m_pGeomDB->Erase( nFirstLoopId) ;
m_pGeomDB->SetName( nNewKerfId, MACH_RAW_KERF) ; // passo alla prossima curva
} ++ nChunk ;
} nFirstLoopId = ExeExtractSurfFrChunkLoops( nSfrId, nChunk, nRawId, &nCount) ;
} }
// cancello la regione
// cancello le regioni usate per i conti m_pGeomDB->Erase( nSfrId) ;
m_pGeomDB->Erase( nSfrUpId) ;
m_pGeomDB->Erase( nSfrDownId) ;
// verifico esista almeno un nuovo grezzo // verifico esista almeno un nuovo grezzo
if ( vNewIds.empty()) if ( vNewIds.empty())
return GDB_ID_NULL ; return GDB_ID_NULL ;
// inserisco i pezzi del grezzo originale nei nuovi grezzi // inserisco i pezzi del grezzo originale nei nuovi grezzi
int nGroupId = m_pGeomDB->GetFirstGroupInGroup( nRawId) ; int nGroupId = m_pGeomDB->GetFirstGroupInGroup( nRawId) ;
while ( nGroupId != GDB_ID_NULL) { while ( nGroupId != GDB_ID_NULL) {
@@ -1289,31 +1012,32 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
// scambio con pezzo // scambio con pezzo
int nPartId = SwapRawPartPart( nNewGroupId, true) ; int nPartId = SwapRawPartPart( nNewGroupId, true) ;
// verifico se il pezzo sta nel grezzo // verifico se il pezzo sta nel grezzo
int nLayerId = m_pGeomDB->GetFirstNameInGroup( nPartId, NST_PARTREG_LAYER) ; int nLayerId = m_pGeomDB->GetFirstNameInGroup( nPartId, NST_EXT_LAYER) ;
if ( nLayerId == GDB_ID_NULL || m_pGeomDB->GetGdbType( nLayerId) != GDB_TY_GROUP) if ( nLayerId == GDB_ID_NULL || m_pGeomDB->GetGdbType( nLayerId) != GDB_TY_GROUP)
nLayerId = m_pGeomDB->GetFirstGroupInGroup( nPartId) ; nLayerId = m_pGeomDB->GetFirstGroupInGroup( nPartId) ;
// cerco la regione del pezzo int nEntId = m_pGeomDB->GetFirstInGroup( nLayerId) ;
int nEntId = m_pGeomDB->GetFirstInGroup( nLayerId) ; int nEntGeoType = m_pGeomDB->GetGeoType( nEntId) ;
while ( nEntId != GDB_ID_NULL) { Point3d ptTest ;
int nEntGeoType = m_pGeomDB->GetGeoType( nEntId) ; if ( ( ( nEntGeoType & GEO_CURVE) != 0 && ExeMidPoint( nEntId, nNewId, ptTest)) ||
if ( nEntGeoType == SRF_FLATRGN) ( ( nEntGeoType & GEO_CURVE) == 0 && ExeCenterPoint( nEntId, nNewId, ptTest))) {
break ;
nEntId = m_pGeomDB->GetNext( nEntId) ;
}
if ( nEntId != GDB_ID_NULL) {
// verifico se è interna al grezzo
int nOutCrvId = m_pGeomDB->GetFirstNameInGroup( nNewId, MACH_RAW_OUTLINE) ; int nOutCrvId = m_pGeomDB->GetFirstNameInGroup( nNewId, MACH_RAW_OUTLINE) ;
BBox3d b3Raw ; m_pGeomDB->GetGlobalBBox( nOutCrvId, b3Raw) ; BBox3d b3Raw ; m_pGeomDB->GetGlobalBBox( nOutCrvId, b3Raw) ;
double dRawDiam = 0 ; b3Raw.GetDiameter( dRawDiam) ; double dRawDiam = 0 ; b3Raw.GetDiameter( dRawDiam) ;
BBox3d b3Part ; m_pGeomDB->GetGlobalBBox( nEntId, b3Part) ; BBox3d b3Part ; m_pGeomDB->GetGlobalBBox( nEntId, b3Part) ;
double dPartDiam = 0 ; b3Part.GetDiameter( dPartDiam) ; double dPartDiam = 0 ; b3Part.GetDiameter( dPartDiam) ;
if ( dRawDiam > 0.9 * dPartDiam) { if ( dRawDiam > 0.9 * dPartDiam) {
int nSfrUp = m_pGeomDB->GetFirstNameInGroup( nNewId, MACH_RAW_UP_REG) ; ICurve* pCurve = GetCurve( m_pGeomDB->GetGeoObj( nOutCrvId)) ;
if ( ! ExeSurfFrTestExternal( nSfrUp, nEntId, EPS_SMALL)) if ( pCurve != nullptr) {
break ; int nSide ;
} double dDist ;
} DistPointCurve distPC( ptTest, *pCurve) ;
if ( distPC.GetDist( dDist) &&
( dDist < 100 * EPS_SMALL ||
( distPC.GetSideAtMinDistPoint( 0, Z_AX, nSide) && nSide != MDS_RIGHT)))
break ;
}
}
}
// altrimenti scambio pezzo ed elimino gruppo // altrimenti scambio pezzo ed elimino gruppo
nNewGroupId = SwapRawPartPart( nPartId, false) ; nNewGroupId = SwapRawPartPart( nPartId, false) ;
m_pGeomDB->Erase( nNewGroupId) ; m_pGeomDB->Erase( nNewGroupId) ;
@@ -1321,5 +1045,5 @@ MachMgr::SplitFlatRawPartWithMachinings( int nRawId, const INTVECTOR& vMchId)
nGroupId = m_pGeomDB->GetNextGroup( nGroupId) ; nGroupId = m_pGeomDB->GetNextGroup( nGroupId) ;
} }
return vNewIds[0] ; return vNewIds[0] ;
} }
-7
View File
@@ -130,13 +130,6 @@ MachMgr::FindToolInCurrSetup( const string& sTool)
return m_stuMgr.FindTool( sTool) ; return m_stuMgr.FindTool( sTool) ;
} }
//----------------------------------------------------------------------------
bool
MachMgr::GetToolSetupPosInCurrSetup( const string& sTool, string& sTcPos)
{
return m_stuMgr.GetToolSetupPos( sTool, sTcPos) ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
MachMgr::GetToolsInCurrSetupPos( const string& sTcPos, STRVECTOR& vsTools) MachMgr::GetToolsInCurrSetupPos( const string& sTcPos, STRVECTOR& vsTools)
+1 -1
View File
@@ -198,7 +198,7 @@ MachMgr::SimMoveAxes( int nMoveType, const SAMVECTOR& vAxNaEpSt)
{ {
// verifico simulatore // verifico simulatore
if ( m_pSimul == nullptr) if ( m_pSimul == nullptr)
return SIM_AXMV_RES_ERR ; return false ;
// lancio movimento assi // lancio movimento assi
return m_pSimul->MoveAxes( nMoveType, vAxNaEpSt) ; return m_pSimul->MoveAxes( nMoveType, vAxNaEpSt) ;
} }
+13 -82
View File
@@ -58,8 +58,6 @@ Machine::Machine( void)
m_nHeadRotAxes = 0 ; m_nHeadRotAxes = 0 ;
m_nHeadSpecRotAxis = -1 ; m_nHeadSpecRotAxis = -1 ;
m_frLinAx.Reset( false) ; m_frLinAx.Reset( false) ;
m_frRobot.Reset( false) ;
m_nCalcChainType = KIN_CHAIN_NONE ;
m_nMachineLook = MCH_LOOK_NONE ; m_nMachineLook = MCH_LOOK_NONE ;
} }
@@ -143,8 +141,6 @@ Machine::Init( const string& sMachineName, const string& sMachineDir, MachMgr* p
m_nMachineLook = ( bOk ? MCH_LOOK_ALL : MCH_LOOK_NONE) ; m_nMachineLook = ( bOk ? MCH_LOOK_ALL : MCH_LOOK_NONE) ;
// metto tutti gli assi in posizione home // metto tutti gli assi in posizione home
bOk = bOk && ResetAllAxesPos() ; bOk = bOk && ResetAllAxesPos() ;
// reset catena cinematica corrente
m_nCalcChainType = KIN_CHAIN_NONE ;
return bOk ; return bOk ;
} }
@@ -213,7 +209,7 @@ Machine::AdjustAuxGeometry( const STRVECTOR& vsAux, int nLay)
bool bool
Machine::LoadMachineTable( const string& sName, const string& sParent, int nType, Machine::LoadMachineTable( const string& sName, const string& sParent, int nType,
const Point3d& ptRef1, double dCoeffX, double dCoeffY, double dCoeffZ, const Point3d& ptRef1, double dCoeffX, double dCoeffY, double dCoeffZ,
const STRVECTOR& vsColl, const string& sGeo, const STRVECTOR& vsAux) const string& sGeo, const STRVECTOR& vsAux)
{ {
// recupero pezzo e layer della geometria originale della tavola // recupero pezzo e layer della geometria originale della tavola
string sPart, sLay ; string sPart, sLay ;
@@ -252,7 +248,7 @@ Machine::LoadMachineTable( const string& sName, const string& sParent, int nType
Table* pTab = new(nothrow) Table ; Table* pTab = new(nothrow) Table ;
if ( pTab == nullptr) if ( pTab == nullptr)
return false ; return false ;
pTab->Set( sName, nType, ptRef1, b3Area1, vsColl) ; pTab->Set( sName, nType, ptRef1, b3Area1) ;
m_pGeomDB->SetUserObj( nLay, pTab) ; m_pGeomDB->SetUserObj( nLay, pTab) ;
// lo inserisco nel dizionario dei gruppi della macchina // lo inserisco nel dizionario dei gruppi della macchina
return m_mapGroups.emplace( sName, nLay).second ; return m_mapGroups.emplace( sName, nLay).second ;
@@ -445,16 +441,8 @@ Machine::ModifyMachineAxisPosition( const string& sName, const Point3d& ptPos)
Axis* pAx = GetAxis( nAxGrp) ; Axis* pAx = GetAxis( nAxGrp) ;
if ( pAx == nullptr) if ( pAx == nullptr)
return false ; return false ;
// se valore dell'asse non nullo, lo annullo
double dCurrVal = pAx->GetCurrVal() ;
if ( abs( dCurrVal) > EPS_ZERO)
SetAxisPos( sName, 0, false) ;
// eseguo la modifica // eseguo la modifica
bool bOk = pAx->Modify( ptPos, m_dAxisMaxAdjust) ; return pAx->Modify( ptPos, m_dAxisMaxAdjust) ;
// ripristino l'asse al valore corrente
if ( abs( dCurrVal) > EPS_ZERO)
SetAxisPos( sName, dCurrVal, false) ;
return bOk ;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -470,16 +458,8 @@ Machine::ModifyMachineAxisDirection( const string& sName, const Vector3d& vtDir)
Axis* pAx = GetAxis( nAxGrp) ; Axis* pAx = GetAxis( nAxGrp) ;
if ( pAx == nullptr) if ( pAx == nullptr)
return false ; return false ;
// se valore dell'asse non nullo, lo annullo
double dCurrVal = pAx->GetCurrVal() ;
if ( abs( dCurrVal) > EPS_ZERO)
SetAxisPos( sName, 0, false) ;
// eseguo la modifica // eseguo la modifica
bool bOk = pAx->Modify( vtDir, m_dAxisMaxRotAdj) ; return pAx->Modify( vtDir, m_dAxisMaxRotAdj) ;
// ripristino l'asse al valore corrente
if ( abs( dCurrVal) > EPS_ZERO)
SetAxisPos( sName, dCurrVal, false) ;
return bOk ;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -548,7 +528,7 @@ Machine::LoadMachineStdHead( const string& sName, const string& sParent, const s
Head* pHead = new(nothrow) Head ; Head* pHead = new(nothrow) Head ;
if ( pHead == nullptr) if ( pHead == nullptr)
return false ; return false ;
pHead->Set( sName, MCH_HT_STD, 1, sHSet, 0, vtADir, dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl) ; pHead->Set( sName, MCH_HT_STD, 1, sHSet, vtADir, dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl) ;
m_pGeomDB->SetUserObj( nLay, pHead) ; m_pGeomDB->SetUserObj( nLay, pHead) ;
// aggiorno la testa capostipite // aggiorno la testa capostipite
if ( ! AddHeadToSet( sHSet, sName)) if ( ! AddHeadToSet( sHSet, sName))
@@ -568,7 +548,7 @@ Machine::LoadMachineStdHead( const string& sName, const string& sParent, const s
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Machine::LoadMachineMultiHead( const string& sName, const string& sParent, const string& sHSet, Machine::LoadMachineMultiHead( const string& sName, const string& sParent, const string& sHSet,
int nSelectType, const MUEXITVECTOR& vMuExit, const Vector3d& vtADir, const MUEXITVECTOR& vMuExit, const Vector3d& vtADir,
double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl, double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl,
const string& sGeo, const STRVECTOR& vsAux) const string& sGeo, const STRVECTOR& vsAux)
{ {
@@ -597,8 +577,7 @@ Machine::LoadMachineMultiHead( const string& sName, const string& sParent, const
Head* pHead = new(nothrow) Head ; Head* pHead = new(nothrow) Head ;
if ( pHead == nullptr) if ( pHead == nullptr)
return false ; return false ;
pHead->Set( sName, MCH_HT_MULTI, int( vMuExit.size()), sHSet, nSelectType, pHead->Set( sName, MCH_HT_MULTI, int( vMuExit.size()), sHSet, vtADir, dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl) ;
vtADir, dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl) ;
m_pGeomDB->SetUserObj( nLay, pHead) ; m_pGeomDB->SetUserObj( nLay, pHead) ;
// aggiorno la testa capostipite // aggiorno la testa capostipite
if ( ! AddHeadToSet( sHSet, sName)) if ( ! AddHeadToSet( sHSet, sName))
@@ -645,7 +624,7 @@ Machine::LoadMachineSpecialHead( const string& sName, const string& sParent, con
Head* pHead = new(nothrow) Head ; Head* pHead = new(nothrow) Head ;
if ( pHead == nullptr) if ( pHead == nullptr)
return false ; return false ;
pHead->Set( sName, MCH_HT_SPECIAL, 1, sHSet, 0, vtADir, dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl) ; pHead->Set( sName, MCH_HT_SPECIAL, 1, sHSet, vtADir, dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl) ;
m_pGeomDB->SetUserObj( nLay, pHead) ; m_pGeomDB->SetUserObj( nLay, pHead) ;
// aggiorno la testa capostipite // aggiorno la testa capostipite
if ( ! AddHeadToSet( sHSet, sName)) if ( ! AddHeadToSet( sHSet, sName))
@@ -664,9 +643,9 @@ Machine::LoadMachineSpecialHead( const string& sName, const string& sParent, con
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Machine::LoadMachineStdTcPos( const string& sName, const string& sParent, Machine::LoadMachineTcPos( const string& sName, const string& sParent,
const Point3d& ptPos, const Vector3d& vtTDir, const Vector3d& vtADir, const Point3d& ptPos, const Vector3d& vtTDir, const Vector3d& vtADir,
const string& sGeo, const STRVECTOR& vsAux) const string& sGeo, const STRVECTOR& vsAux)
{ {
// recupero pezzo e layer della geometria originale della posizione nel cambio utensile // recupero pezzo e layer della geometria originale della posizione nel cambio utensile
string sPart, sLay ; string sPart, sLay ;
@@ -706,48 +685,6 @@ Machine::LoadMachineStdTcPos( const string& sName, const string& sParent,
return m_mapGroups.emplace( sName, nLay).second ; return m_mapGroups.emplace( sName, nLay).second ;
} }
//----------------------------------------------------------------------------
bool
Machine::LoadMachineMultiTcPos( const string& sName, const string& sParent,
const MUEXITVECTOR& vMuExit, const Vector3d& vtADir,
const string& sGeo, const STRVECTOR& vsAux)
{
// recupero pezzo e layer della geometria originale della posizione nel cambio utensile
string sPart, sLay ;
Split( sGeo, "/", true, sPart, sLay) ;
// cerco il gruppo nella geometria originale
int nPart = m_pGeomDB->GetFirstNameInGroup( m_nTempGroupId, sPart) ;
int nLay = m_pGeomDB->GetFirstNameInGroup( nPart, sLay) ;
if ( nLay == GDB_ID_NULL)
return false ;
// cerco il gruppo padre per spostarvelo
int nParentId = GetGroup( sParent) ;
if ( nParentId == GDB_ID_NULL ||
! m_pGeomDB->RelocateGlob( nLay, nParentId, GDB_LAST_SON))
return false ;
// sistemo lo stato di visualizzazione
m_pGeomDB->SetStatus( nLay, GDB_ST_ON) ;
// gli assegno il nome
m_pGeomDB->SetName( nLay, sName) ;
// sistemo la geometria ausiliaria
if ( ! AdjustAuxGeometry( vsAux, nLay))
return false ;
// installo e inizializzo il gestore della posizione nel cambio utensile
TcPos* pTcPos = new(nothrow) TcPos ;
if ( pTcPos == nullptr)
return false ;
pTcPos->Set( sName, vtADir) ;
m_pGeomDB->SetUserObj( nLay, pTcPos) ;
// sistemo il riferimento dell'uscita rispetto alla direzione ausiliaria
if ( ! AdjustExitFrames( nLay, vMuExit, vtADir))
return false ;
// trasformazione del riferimento di uscita in gruppo di uscita
if ( ! CreateExitGroups( nLay, vMuExit))
return false ;
// lo inserisco nel dizionario dei gruppi della macchina
return m_mapGroups.emplace( sName, nLay).second ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
int int
Machine::GetGroup( const string& sGroup) const Machine::GetGroup( const string& sGroup) const
@@ -981,7 +918,7 @@ Machine::CreateExitGroups( int nLay, const MUEXITVECTOR& vMuExit)
return false ; return false ;
} }
else { else {
Vector3d vtRotAx = vtTDir ^ vtDirN ; vtRotAx.Normalize( EPS_ZERO) ; Vector3d vtRotAx = vtTDir ^ vtDirN ; vtRotAx.Normalize() ;
string sOut = " Exit " + sName + " rotation = (" + ToString( dAngRot) + "/" + ToString( vtRotAx) + ")" ; string sOut = " Exit " + sName + " rotation = (" + ToString( dAngRot) + "/" + ToString( vtRotAx) + ")" ;
LOG_DBG_INFO( GetEMkLogger(), sOut.c_str()) ; LOG_DBG_INFO( GetEMkLogger(), sOut.c_str()) ;
vtRotAx.ToLoc( frHead) ; vtRotAx.ToLoc( frHead) ;
@@ -1039,11 +976,7 @@ Machine::ModifyMachineExitPosition( const string& sHead, int nExit, const Point3
if ( pExit == nullptr) if ( pExit == nullptr)
return false ; return false ;
// eseguo la modifica // eseguo la modifica
if ( ! pExit->Modify( ptPos, m_dExitMaxAdjust)) return pExit->Modify( ptPos, m_dExitMaxAdjust) ;
return false ;
// eventuale aggiornamento variabile lua EMC.EXITPOS con la nuova posizione
LuaSetGlobVar( "EMC.EXITPOS", ptPos) ;
return true ;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -1067,8 +1000,6 @@ Machine::SetLook( int nFlag)
nTabId = GetFirstTable() ; nTabId = GetFirstTable() ;
if ( nTabId == GDB_ID_NULL) if ( nTabId == GDB_ID_NULL)
return false ; return false ;
// il gruppo tavola corrente deve essere sempre visibile
m_pGeomDB->SetStatus( nTabId, GDB_ST_ON) ;
// nascondo o visualizzo i fratelli e tutti i fratelli degli ascendenti della tavola // nascondo o visualizzo i fratelli e tutti i fratelli degli ascendenti della tavola
bool bTabOnly = ( nFlag != MCH_LOOK_ALL) ; bool bTabOnly = ( nFlag != MCH_LOOK_ALL) ;
int nTabCurrId = nTabId ; int nTabCurrId = nTabId ;
+10 -28
View File
@@ -53,7 +53,7 @@ class Machine
int GetHeadId( const std::string& sHead) const int GetHeadId( const std::string& sHead) const
{ int nId = GetGroup( sHead) ; { int nId = GetGroup( sHead) ;
return ( IsHeadGroup( nId) ? nId : GDB_ID_NULL) ; } return ( IsHeadGroup( nId) ? nId : GDB_ID_NULL) ; }
int GetExitId( const std::string& sHead, int nExit) const int GetExitId( const std::string& sHead, int nExit) const
{ int nHeadId = GetHeadId( sHead) ; { int nHeadId = GetHeadId( sHead) ;
int nId = ( m_pGeomDB != nullptr ? m_pGeomDB->GetFirstNameInGroup( nHeadId, MCH_EXIT + ToString( nExit)) : GDB_ID_NULL) ; int nId = ( m_pGeomDB != nullptr ? m_pGeomDB->GetFirstNameInGroup( nHeadId, MCH_EXIT + ToString( nExit)) : GDB_ID_NULL) ;
return ( IsExitGroup( nId) ? nId : GDB_ID_NULL) ; } return ( IsExitGroup( nId) ? nId : GDB_ID_NULL) ; }
@@ -61,14 +61,12 @@ class Machine
{ int nId = GetGroup( sTcPos) ; { int nId = GetGroup( sTcPos) ;
return ( IsTcPosGroup( nId) ? nId : GDB_ID_NULL) ; } return ( IsTcPosGroup( nId) ? nId : GDB_ID_NULL) ; }
bool GetAllTablesNames( STRVECTOR& vNames) const ; bool GetAllTablesNames( STRVECTOR& vNames) const ;
bool GetAllAxesNames( STRVECTOR& vNames) const ;
bool GetAllHeadsNames( STRVECTOR& vNames) const ; bool GetAllHeadsNames( STRVECTOR& vNames) const ;
bool GetAllTcPosNames( STRVECTOR& vNames) const ; bool GetAllTcPosNames( STRVECTOR& vNames) const ;
int GetFirstTable( void) const ; int GetFirstTable( void) const ;
int GetHeadExitCount( const std::string& sHead) const ; int GetHeadExitCount( const std::string& sHead) const ;
int GetHeadExitPosDirAux( const std::string& sHead, int nExit, Point3d& ptPos, Vector3d& vtDir, Vector3d& vtAux) const ; int GetHeadExitPosDirAux( const std::string& sHead, int nExit, Point3d& ptPos, Vector3d& vtDir, Vector3d& vtAux) const ;
int GetHeadSolCh( const std::string& sHead) const ; int GetHeadSolCh( const std::string& sHead) const ;
int GetHeadSelectType(const std::string& sHead) const ;
double GetAngDeltaMinForHome( void) const double GetAngDeltaMinForHome( void) const
{ return m_dAngDeltaMinForHome ; } { return m_dAngDeltaMinForHome ; }
bool LoadTool( const std::string& sHead, int nExit, const std::string& sTool) ; bool LoadTool( const std::string& sHead, int nExit, const std::string& sTool) ;
@@ -83,7 +81,7 @@ class Machine
bool GetAxisInvert( const std::string& sAxis, bool& bInvert) const ; bool GetAxisInvert( const std::string& sAxis, bool& bInvert) const ;
bool GetAxisOffset( const std::string& sAxis, double& dOffset) const ; bool GetAxisOffset( const std::string& sAxis, double& dOffset) const ;
bool GetAxisType( const std::string& sAxis, bool& bLinear) const ; bool GetAxisType( const std::string& sAxis, bool& bLinear) const ;
bool SetAxisPos( const std::string& sAxis, double dVal, bool bInStroke = true, double* pdNewVal = nullptr) ; bool SetAxisPos( const std::string& sAxis, double dVal, double* pdNewVal = nullptr) ;
bool GetAxisPos( const std::string& sAxis, double& dVal) const ; bool GetAxisPos( const std::string& sAxis, double& dVal) const ;
bool GetAxisMin( const std::string& sAxis, double& dMin) const ; bool GetAxisMin( const std::string& sAxis, double& dMin) const ;
bool GetAxisMax( const std::string& sAxis, double& dMax) const ; bool GetAxisMax( const std::string& sAxis, double& dMax) const ;
@@ -97,8 +95,7 @@ class Machine
bool GetCurrTableRef1( Point3d& ptRef1) const ; bool GetCurrTableRef1( Point3d& ptRef1) const ;
bool GetCurrTableArea1( BBox3d& b3Area1) const ; bool GetCurrTableArea1( BBox3d& b3Area1) const ;
bool GetCurrTableDeltaRef1( Vector3d& vtDelta1) const ; bool GetCurrTableDeltaRef1( Vector3d& vtDelta1) const ;
bool GetCurrTableIsTilting( bool& bTilting, Vector3d& vtTiltingAx) const ; bool GetCurrTableIsTilting( bool& bTilting) const ;
bool GetCurrTableCollGroups( INTVECTOR& vIds) const ;
bool SetCurrTool( const std::string& sTool, const std::string& sHead, int nExit) ; bool SetCurrTool( const std::string& sTool, const std::string& sHead, int nExit) ;
bool ResetCurrTool( void) ; bool ResetCurrTool( void) ;
int GetCurrTool( void) const ; int GetCurrTool( void) const ;
@@ -123,27 +120,21 @@ class Machine
int GetCurrLinAxes( void) const ; int GetCurrLinAxes( void) const ;
int GetCurrRotAxes( void) const ; int GetCurrRotAxes( void) const ;
bool GetCurrAxisName( int nInd, std::string& sAxName) const ; bool GetCurrAxisName( int nInd, std::string& sAxName) const ;
bool GetAllCurrAxesNames( STRVECTOR& vAxName) const ; bool GetAllCurrAxesName( STRVECTOR& vAxName) const ;
bool GetCurrAxisToken( int nInd, std::string& sAxToken) const ; bool GetCurrAxisToken( int nInd, std::string& sAxToken) const ;
bool GetAllCurrAxesTokens( STRVECTOR& vAxToken) const ; bool GetAllCurrAxesToken( STRVECTOR& vAxToken) const ;
bool GetCurrAxisMin( int nInd, double& dMin) const ; bool GetCurrAxisMin( int nInd, double& dMin) const ;
bool GetCurrAxisMax( int nInd, double& dMax) const ; bool GetCurrAxisMax( int nInd, double& dMax) const ;
bool GetCurrAxisOffset( int nInd, double& dOffset) const ;
bool GetCurrAxisInvert( int nInd, bool& bInvert) const ;
bool GetCurrAxisHomePos( int nInd, double& dHome) const ; bool GetCurrAxisHomePos( int nInd, double& dHome) const ;
bool GetAllCurrAxesHomePos( DBLVECTOR& vAxHomeVal) const ; bool GetAllCurrAxesHomePos( DBLVECTOR& vAxHomeVal) const ;
const Frame3d& GetCurrLinAxesFrame( void) const const Frame3d& GetCurrLinAxesFrame( void) const
{ return m_frLinAx ; } { return m_frLinAx ; }
int GetCurrKinematicChainType( void) const
{ return m_nCalcChainType ; }
bool GetAngles( const Vector3d& vtDirT, const Vector3d& vtDirA, bool GetAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
int& nStat, double& dAngA1, double& dAngB1, double& dAngA2, double& dAngB2) const ; int& nStat, double& dAngA1, double& dAngB1, double& dAngA2, double& dAngB2) const ;
bool GetAngles( const Vector3d& vtDirT, const Vector3d& vtDirA, bool GetAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
int& nStat, DBLVECTOR& vAng1, DBLVECTOR& vAng2) const ; int& nStat, DBLVECTOR& vAng1, DBLVECTOR& vAng2) const ;
bool GetPositions( const Point3d& ptP, const DBLVECTOR& vAng, bool GetPositions( const Point3d& ptP, const DBLVECTOR& vAng,
int& nStat, double& dX, double& dY, double& dZ) const ; int& nStat, double& dX, double& dY, double& dZ) const ;
bool GetRobotAngles( const Point3d& ptP, const Vector3d& vtDirT, const Vector3d& vtDirA,
DBLVECTOR& vAng1, DBLVECTOR& vAng2) const ;
bool GetNoseFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng, bool GetNoseFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng,
Point3d& ptNose) const ; Point3d& ptNose) const ;
bool GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng, bool GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng,
@@ -199,7 +190,7 @@ class Machine
bool AdjustAuxGeometry( const STRVECTOR& vsAux, int nLay) ; bool AdjustAuxGeometry( const STRVECTOR& vsAux, int nLay) ;
bool LoadMachineTable( const std::string& sName, const std::string& sParent, int nType, bool LoadMachineTable( const std::string& sName, const std::string& sParent, int nType,
const Point3d& ptRef1, double dCoeffX, double dCoeffY, double dCoeffZ, const Point3d& ptRef1, double dCoeffX, double dCoeffY, double dCoeffZ,
const STRVECTOR& vsColl, const std::string& sGeo, const STRVECTOR& vsAux) ; const std::string& sGeo, const STRVECTOR& vsAux) ;
bool AdjustTable( int nLay, const Point3d& ptRef1) ; bool AdjustTable( int nLay, const Point3d& ptRef1) ;
bool LoadMachineAxis( const std::string& sName, const std::string& sParent, const std::string& sToken, bool bInvert, bool LoadMachineAxis( const std::string& sName, const std::string& sParent, const std::string& sToken, bool bInvert,
double dOffset, int nType, const Point3d& ptPos, const Vector3d& vtDir, const STROKE& Stroke, double dOffset, int nType, const Point3d& ptPos, const Vector3d& vtDir, const STROKE& Stroke,
@@ -215,19 +206,16 @@ class Machine
double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl, double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl,
const std::string& sGeo, const STRVECTOR& vsAux) ; const std::string& sGeo, const STRVECTOR& vsAux) ;
bool LoadMachineMultiHead( const std::string& sName, const std::string& sParent, const std::string& sHSet, bool LoadMachineMultiHead( const std::string& sName, const std::string& sParent, const std::string& sHSet,
int nSelectType, const MUEXITVECTOR& vMuExit, const Vector3d& vtADir, const MUEXITVECTOR& vMuExit, const Vector3d& vtADir,
double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl, double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl,
const std::string& sGeo, const STRVECTOR& vsAux) ; const std::string& sGeo, const STRVECTOR& vsAux) ;
bool LoadMachineSpecialHead( const std::string& sName, const std::string& sParent, const std::string& sHSet, bool LoadMachineSpecialHead( const std::string& sName, const std::string& sParent, const std::string& sHSet,
const Point3d& ptPos, const Vector3d& vtTDir, const Vector3d& vtADir, const Point3d& ptPos, const Vector3d& vtTDir, const Vector3d& vtADir,
double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl, double dRot1W, bool bMaxDeltaR2On1, const STROKE& Rot2Stroke, int nSolCh, const STRVECTOR& vsOthColl,
const std::string& sGeo, const STRVECTOR& vsAux) ; const std::string& sGeo, const STRVECTOR& vsAux) ;
bool LoadMachineStdTcPos( const std::string& sName, const std::string& sParent, bool LoadMachineTcPos( const std::string& sName, const std::string& sParent,
const Point3d& ptPos, const Vector3d& vtTDir, const Vector3d& vtADir, const Point3d& ptPos, const Vector3d& vtTDir, const Vector3d& vtADir,
const std::string& sGeo, const STRVECTOR& vsAux) ; const std::string& sGeo, const STRVECTOR& vsAux) ;
bool LoadMachineMultiTcPos( const std::string& sName, const std::string& sParent,
const MUEXITVECTOR& vMuExit, const Vector3d& vtADir,
const std::string& sGeo, const STRVECTOR& vsAux) ;
int GetGroup( const std::string& sGroup) const ; int GetGroup( const std::string& sGroup) const ;
bool IsBaseGroup( int nGroup) const ; bool IsBaseGroup( int nGroup) const ;
Axis* GetAxis( int nGroup) const ; Axis* GetAxis( int nGroup) const ;
@@ -317,10 +305,6 @@ class Machine
KINAXISVECTOR m_vCalcLinAx ; // vettore assi lineari attivi per calcoli KINAXISVECTOR m_vCalcLinAx ; // vettore assi lineari attivi per calcoli
KINAXISVECTOR m_vCalcRotAx ; // vettore assi rotanti attivi per calcoli KINAXISVECTOR m_vCalcRotAx ; // vettore assi rotanti attivi per calcoli
Frame3d m_frLinAx ; // sistema di riferimento definito dagli assi lineari Frame3d m_frLinAx ; // sistema di riferimento definito dagli assi lineari
Frame3d m_frRobot ; // sistema di riferimento canonico del robot
int m_nCalcChainType ; // tipologia testa attiva (nulla, centro di lavoro o robot)
Point3d m_ptWristCen ; // centro del polso sferico nel riferimento testa/uscita di calcolo
Vector3d m_vtWristRef ; // direzione del polso sferico nel riferimento testa/uscita di calcolo
mutable OutStroke m_OutstrokeInfo ; // informazioni su ultima extra corsa mutable OutStroke m_OutstrokeInfo ; // informazioni su ultima extra corsa
// stato di visualizzazione // stato di visualizzazione
int m_nMachineLook ; // stato di visualizzazione della macchina int m_nMachineLook ; // stato di visualizzazione della macchina
@@ -339,8 +323,6 @@ class Machine
static int LuaEmtMultiHead( lua_State* L) ; static int LuaEmtMultiHead( lua_State* L) ;
static int LuaEmtSpecialHead( lua_State* L) ; static int LuaEmtSpecialHead( lua_State* L) ;
static int LuaEmtTcPos( lua_State* L) ; static int LuaEmtTcPos( lua_State* L) ;
static int LuaEmtStdTcPos( lua_State* L) ;
static int LuaEmtMultiTcPos( lua_State* L) ;
static int LuaEmtModifyAxisPosition( lua_State* L) ; static int LuaEmtModifyAxisPosition( lua_State* L) ;
static int LuaEmtModifyAxisDirection( lua_State* L) ; static int LuaEmtModifyAxisDirection( lua_State* L) ;
static int LuaEmtModifyAxisStroke( lua_State* L) ; static int LuaEmtModifyAxisStroke( lua_State* L) ;
+5 -19
View File
@@ -19,26 +19,9 @@
#include "/EgtDev/Include/EGkGeoVector3d.h" #include "/EgtDev/Include/EGkGeoVector3d.h"
#include "/EgtDev/Include/EGnStringUtils.h" #include "/EgtDev/Include/EGnStringUtils.h"
#include "/EgtDev/Include/EGnFileUtils.h" #include "/EgtDev/Include/EGnFileUtils.h"
#include "/EgtDev/Include/EgtNumUtils.h"
using namespace std ; using namespace std ;
//----------------------------------------------------------------------------
bool
Machine::GetAllAxesNames( STRVECTOR& vNames) const
{
// reset lista nomi
vNames.clear() ;
// ricerca degli assi
for ( const auto& snGro : m_mapGroups) {
if ( IsAxisGroup( snGro.second))
vNames.push_back( snGro.first) ;
}
// ordino alfabeticamente
sort( vNames.begin(), vNames.end()) ;
return true ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Machine::GetAxisToken( const string& sAxis, string& sToken) const Machine::GetAxisToken( const string& sAxis, string& sToken) const
@@ -105,7 +88,7 @@ Machine::GetAxisType( const string& sAxis, bool& bLinear) const
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Machine::SetAxisPos( const string& sAxis, double dVal, bool bInStroke, double* pdNewVal) Machine::SetAxisPos( const string& sAxis, double dVal, double* pdNewVal)
{ {
// controllo GeomDB // controllo GeomDB
if ( m_pGeomDB == nullptr) if ( m_pGeomDB == nullptr)
@@ -131,7 +114,10 @@ Machine::SetAxisPos( const string& sAxis, double dVal, bool bInStroke, double* p
Vector3d vtDir = pGV->GetVector() ; Vector3d vtDir = pGV->GetVector() ;
vtDir.Normalize() ; vtDir.Normalize() ;
// limito il movimento alla corsa dell'asse // limito il movimento alla corsa dell'asse
dVal = Clamp( dVal, Stroke.Min, Stroke.Max) ; if ( dVal > Stroke.Max)
dVal = Stroke.Max ;
else if ( dVal < Stroke.Min)
dVal = Stroke.Min ;
// eseguo il movimento // eseguo il movimento
if ( bLinear) if ( bLinear)
m_pGeomDB->TranslateGroup( nAxGrp, vtDir * ( dVal - dCurrVal)) ; m_pGeomDB->TranslateGroup( nAxGrp, vtDir * ( dVal - dCurrVal)) ;
+65 -370
View File
@@ -24,13 +24,11 @@
#include "/EgtDev/Include/EGkGeoVector3d.h" #include "/EgtDev/Include/EGkGeoVector3d.h"
#include "/EgtDev/Include/EGnStringUtils.h" #include "/EgtDev/Include/EGnStringUtils.h"
#include "/EgtDev/Include/EGnFileUtils.h" #include "/EgtDev/Include/EGnFileUtils.h"
#include "/EgtDev/Include/EgtNumUtils.h"
using namespace std ; using namespace std ;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
static const string EMC_VAR = "EMC" ; // tabella variabili locali per calcolo static const string EMC_VAR = "EMC" ; // tabella variabili locali per calcolo
static const string EVAR_VER = ".VER" ; // (string) versione della Dll
static const string EVAR_TABNAME = ".TABNAME" ; // (string) nome della tavola macchina static const string EVAR_TABNAME = ".TABNAME" ; // (string) nome della tavola macchina
static const string EVAR_HEAD = ".HEAD" ; // (string) nome della testa static const string EVAR_HEAD = ".HEAD" ; // (string) nome della testa
static const string EVAR_EXIT = ".EXIT" ; // (int) numero dell'uscita static const string EVAR_EXIT = ".EXIT" ; // (int) numero dell'uscita
@@ -39,7 +37,6 @@ static const string EVAR_TOTDIAM = ".TOTDIAM" ; // (num) diametro di in
static const string EVAR_TOTLEN = ".TOTLEN" ; // (num) lunghezza di ingombro dell'utensile static const string EVAR_TOTLEN = ".TOTLEN" ; // (num) lunghezza di ingombro dell'utensile
static const string EVAR_DIST = ".DIST" ; // (num) distanza dell'utensile (per seghe a catena) static const string EVAR_DIST = ".DIST" ; // (num) distanza dell'utensile (per seghe a catena)
static const string EVAR_EXITPOS = ".EXITPOS" ; // (point) posizione attuale dell'uscita static const string EVAR_EXITPOS = ".EXITPOS" ; // (point) posizione attuale dell'uscita
static const string EVAR_USERNOTES = ".USERNOTES" ; // (string) note utente dell'utensile
static const string EVAR_TCPOS = ".TCPOS" ; // (string) posizione nell'attrezzaggio static const string EVAR_TCPOS = ".TCPOS" ; // (string) posizione nell'attrezzaggio
static const string EVAR_L1 = ".L1" ; // (num) valore del primo asse lineare static const string EVAR_L1 = ".L1" ; // (num) valore del primo asse lineare
static const string EVAR_L2 = ".L2" ; // (num) valore del secondo asse lineare static const string EVAR_L2 = ".L2" ; // (num) valore del secondo asse lineare
@@ -71,15 +68,12 @@ Machine::SetCurrTable( const string& sTable)
m_nCalcTabId = GDB_ID_NULL ; m_nCalcTabId = GDB_ID_NULL ;
return false ; return false ;
} }
// il gruppo tavola corrente deve essere sempre visibile
m_pGeomDB->SetStatus( m_nCalcTabId, GDB_ST_ON) ;
// lancio eventuale funzione lua di personalizzazione // lancio eventuale funzione lua di personalizzazione
if ( LuaExistsFunction( ON_SET_TABLE)) { 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) ; bool bOldEMC = LuaChangeNameGlobVar( EMC_VAR, EMC_VAR_BACKUP) ;
// definisco variabili // definisco variabili
bool bOk = LuaCreateGlobTable( EMC_VAR) ; bool bOk = LuaCreateGlobTable( EMC_VAR) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_VER, GetEMkVer()) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_TABNAME, sTable) ; bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_TABNAME, sTable) ;
// chiamo funzione // chiamo funzione
bOk = bOk && LuaCallFunction( ON_SET_TABLE) ; bOk = bOk && LuaCallFunction( ON_SET_TABLE) ;
@@ -173,23 +167,17 @@ Machine::GetCurrTableDeltaRef1( Vector3d& vtDelta1) const
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Machine::GetCurrTableIsTilting( bool& bTilting, Vector3d& vtTiltingAx) const Machine::GetCurrTableIsTilting( bool& bTilting) const
{ {
// default // default
bTilting = false ; bTilting = false ;
vtTiltingAx = V_NULL ;
// verifico esistenza tavola // verifico esistenza tavola
if ( m_nCalcTabId == GDB_ID_NULL) if ( m_nCalcTabId == GDB_ID_NULL)
return false ; return false ;
// verifico se presente flag che lo forza come tale // verifico se presente flag che lo forza come tale
int nTiltingLike ; bool bTiltingLike ;
if ( m_pGeomDB->GetInfo( m_nCalcTabId, MCH_TILTINGLIKE, nTiltingLike) && nTiltingLike != 0) { if ( m_pGeomDB->GetInfo( m_nCalcTabId, MCH_TILTINGLIKE, bTiltingLike) && bTiltingLike) {
bTilting = true ; bTilting = true ;
switch ( abs( nTiltingLike)) {
default : vtTiltingAx = X_AX ; break ;
case 2 : vtTiltingAx = Y_AX ; break ;
case 3 : vtTiltingAx = Z_AX ; break ;
}
return true ; return true ;
} }
// recupero gli eventuali assi rotanti della tavola // recupero gli eventuali assi rotanti della tavola
@@ -204,7 +192,6 @@ Machine::GetCurrTableIsTilting( bool& bTilting, Vector3d& vtTiltingAx) const
// verifico se asse rotante orizzontale // verifico se asse rotante orizzontale
if ( pAx->GetType() == MCH_AT_ROTARY && abs( pAx->GetDir().z) < EPS_SMALL) { if ( pAx->GetType() == MCH_AT_ROTARY && abs( pAx->GetDir().z) < EPS_SMALL) {
bTilting = true ; bTilting = true ;
vtTiltingAx = pAx->GetDir() ;
return true ; return true ;
} }
// risalgo lungo la catena // risalgo lungo la catena
@@ -214,31 +201,6 @@ Machine::GetCurrTableIsTilting( bool& bTilting, Vector3d& vtTiltingAx) const
return true ; return true ;
} }
//----------------------------------------------------------------------------
bool
Machine::GetCurrTableCollGroups( INTVECTOR& vIds) const
{
// controllo GeomDB
if ( m_pGeomDB == nullptr)
return false ;
// recupero la tavola corrente
Table* pTab = GetTable( m_nCalcTabId) ;
if ( pTab == nullptr)
return false ;
// recupero stringhe con gruppi ausiliari di collisione
const STRVECTOR& vsColl = pTab->GetCollGroups() ;
for ( const auto& sColl : vsColl) {
string sGrp, sSub ;
Split( sColl, "/", true, sGrp, sSub) ;
int nId = GetGroup( sGrp) ;
if ( ! sSub.empty() && nId != GDB_ID_NULL)
nId = m_pGeomDB->GetFirstNameInGroup( nId, sSub) ;
if ( nId != GDB_ID_NULL)
vIds.push_back( nId) ;
}
return true ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit) Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit)
@@ -276,7 +238,6 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit)
double dTOvLen = 0 ; double dTOvLen = 0 ;
double dTOvDiam = 0 ; double dTOvDiam = 0 ;
double dTDist = 0 ; double dTDist = 0 ;
string sTUserNotes = "" ;
string sTcPos = "" ; string sTcPos = "" ;
// se definito // se definito
if ( ! sTool.empty()) { if ( ! sTool.empty()) {
@@ -295,8 +256,7 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit)
! m_pMchMgr->TdbGetCurrToolParam( TPA_LEN, dTLen) || ! m_pMchMgr->TdbGetCurrToolParam( TPA_LEN, dTLen) ||
! m_pMchMgr->TdbGetCurrToolParam( TPA_DIAM, dTDiam) || ! m_pMchMgr->TdbGetCurrToolParam( TPA_DIAM, dTDiam) ||
! m_pMchMgr->TdbGetCurrToolParam( TPA_TOTLEN, dTOvLen) || ! m_pMchMgr->TdbGetCurrToolParam( TPA_TOTLEN, dTOvLen) ||
! m_pMchMgr->TdbGetCurrToolParam( TPA_TOTDIAM, dTOvDiam) || ! m_pMchMgr->TdbGetCurrToolParam( TPA_TOTDIAM, dTOvDiam))
! m_pMchMgr->TdbGetCurrToolParam( TPA_USERNOTES, sTUserNotes))
return false ; return false ;
m_pMchMgr->TdbGetCurrToolParam( TPA_DIST, dTDist) ; // opzionale m_pMchMgr->TdbGetCurrToolParam( TPA_DIST, dTDist) ; // opzionale
if ( ! m_pMchMgr->GetCurrSetupMgr().GetToolSetupPos( sTool, sTcPos)) if ( ! m_pMchMgr->GetCurrSetupMgr().GetToolSetupPos( sTool, sTcPos))
@@ -336,7 +296,6 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit)
bool bOldEMC = LuaChangeNameGlobVar( EMC_VAR, EMC_VAR_BACKUP) ; bool bOldEMC = LuaChangeNameGlobVar( EMC_VAR, EMC_VAR_BACKUP) ;
// definisco variabili // definisco variabili
bool bOk = LuaCreateGlobTable( EMC_VAR) ; bool bOk = LuaCreateGlobTable( EMC_VAR) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_VER, GetEMkVer()) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_HEAD, sHead) ; bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_HEAD, sHead) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_EXIT, nExit) ; bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_EXIT, nExit) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_TOOL, sTool) ; bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_TOOL, sTool) ;
@@ -344,7 +303,6 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit)
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_TOTDIAM, dTOvDiam) ; bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_TOTDIAM, dTOvDiam) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_TOTLEN, dTOvLen) ; bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_TOTLEN, dTOvLen) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_DIST, dTDist) ; bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_DIST, dTDist) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_USERNOTES, sTUserNotes) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_TCPOS, sTcPos) ; bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_TCPOS, sTcPos) ;
// chiamo funzione // chiamo funzione
bOk = bOk && LuaCallFunction( ON_SET_HEAD) ; bOk = bOk && LuaCallFunction( ON_SET_HEAD) ;
@@ -493,15 +451,14 @@ Machine::CalculateKinematicChain( void)
m_nHeadSpecRotAxis = -1 ; m_nHeadSpecRotAxis = -1 ;
m_vCalcLinAx.clear() ; m_vCalcLinAx.clear() ;
m_vCalcRotAx.clear() ; m_vCalcRotAx.clear() ;
m_frLinAx.Reset( false) ;
m_frRobot.Reset( false) ;
m_nCalcChainType = KIN_CHAIN_NONE ;
// recupero gli assi di tavola // recupero gli assi di tavola
if ( m_nCalcTabId == GDB_ID_NULL) if ( m_nCalcTabId == GDB_ID_NULL)
return false ; return false ;
int nTParId = m_pGeomDB->GetParentId( m_nCalcTabId) ; int nTParId = m_pGeomDB->GetParentId( m_nCalcTabId) ;
if ( nTParId == GDB_ID_NULL) if ( nTParId == GDB_ID_NULL)
return false ; return false ;
m_nTabLinAxes = 0 ;
m_nTabRotAxes = 0 ;
while ( IsAxisGroup( nTParId)) { while ( IsAxisGroup( nTParId)) {
if ( ! AddKinematicAxis( false, nTParId)) if ( ! AddKinematicAxis( false, nTParId))
return false ; return false ;
@@ -513,75 +470,14 @@ Machine::CalculateKinematicChain( void)
int nHParId = m_pGeomDB->GetParentId( m_nCalcHeadId) ; int nHParId = m_pGeomDB->GetParentId( m_nCalcHeadId) ;
if ( nHParId == GDB_ID_NULL) if ( nHParId == GDB_ID_NULL)
return false ; return false ;
m_nHeadLinAxes = 0 ;
m_nHeadRotAxes = 0 ;
while ( IsAxisGroup( nHParId)) { while ( IsAxisGroup( nHParId)) {
if ( ! AddKinematicAxis( true, nHParId)) if ( ! AddKinematicAxis( true, nHParId))
return false ; return false ;
nHParId = m_pGeomDB->GetParentId( nHParId) ; nHParId = m_pGeomDB->GetParentId( nHParId) ;
} }
// 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")
return false ;
}
// se nessun asse lineare deve essere un robot (in futuro va permesso un lineare di tavola)
if ( m_nTabLinAxes == 0 && m_nHeadLinAxes == 0) {
// verifico ci siano 6 assi rotanti tutti di testa (in futuro va permesso un rotante di tavola)
if ( m_nTabRotAxes != 0 || m_nHeadRotAxes != 6) {
LOG_ERROR( GetEMkLogger(), "Robot with errors in Rotary Axes : number or type")
return false ;
}
// riordino gli assi rotanti
swap( m_vCalcRotAx[0], m_vCalcRotAx[5]) ;
swap( m_vCalcRotAx[1], m_vCalcRotAx[4]) ;
swap( m_vCalcRotAx[2], m_vCalcRotAx[3]) ;
// determino il riferimento canonico del robot
if ( ! m_frRobot.Set( m_vCalcRotAx[0].ptPos, m_vCalcRotAx[0].vtDir, m_vCalcRotAx[3].vtDir)) {
LOG_ERROR( GetEMkLogger(), "Robot with errors in Rotary Axes : impossible canonic frame")
return false ;
}
// porto tutti gli assi cinematici e i dati testa nel riferimento canonico
for ( int i = 0 ; i < m_nHeadRotAxes ; ++ i) {
m_vCalcRotAx[i].ptPos.ToLoc( m_frRobot) ;
m_vCalcRotAx[i].vtDir.ToLoc( m_frRobot) ;
}
m_ptCalcPos.ToLoc( m_frRobot) ;
m_vtCalcDir.ToLoc( m_frRobot) ;
m_vtCalcADir.ToLoc( m_frRobot) ;
// direzione assi rotanti deve essere Z Y Y X Y X
if ( ! m_vCalcRotAx[0].vtDir.IsZ() ||
! m_vCalcRotAx[1].vtDir.IsY() ||
! m_vCalcRotAx[2].vtDir.IsY() ||
! m_vCalcRotAx[3].vtDir.IsX() ||
! m_vCalcRotAx[4].vtDir.IsY() ||
! m_vCalcRotAx[5].vtDir.IsX()) {
LOG_ERROR( GetEMkLogger(), "Robot with errors in Rotary Axes : not ZYY-XYX")
return false ;
}
// verifico che gli ultimi 3 assi formino un polso sferico (ovvero passino per uno stesso punto)
if ( abs( m_vCalcRotAx[3].ptPos.y - m_vCalcRotAx[5].ptPos.y) > EPS_SMALL ||
abs( m_vCalcRotAx[3].ptPos.z - m_vCalcRotAx[5].ptPos.z) > EPS_SMALL ||
abs( m_vCalcRotAx[4].ptPos.z - m_vCalcRotAx[3].ptPos.z) > EPS_SMALL) {
LOG_ERROR( GetEMkLogger(), "Robot with errors in Rotary Axes : not spherical Wrist")
return false ;
}
// calcolo il centro del polso in coordinate globali (R5.x, R6.y, R5.z)
Point3d ptCenG( m_vCalcRotAx[4].ptPos.x, m_vCalcRotAx[5].ptPos.y, m_vCalcRotAx[4].ptPos.z) ;
// recupero il riferimento dell'uscita (da posizione, direzione utensile e direzione ausiliaria)
Frame3d frExit ;
if ( ! frExit.Set( m_ptCalcPos, m_vtCalcDir, m_vtCalcADir))
return false ;
// calcolo il centro del polso in locale a questo riferimento
m_ptWristCen = GetToLoc( ptCenG, frExit) ;
// calcolo la direzione di riferimento del polso in locale a questo riferimento
m_vtWristRef = GetToLoc( m_vCalcRotAx[5].vtDir, frExit) ;
// dichiaro tipo robot
m_nCalcChainType = KIN_CHAIN_ROBOT ;
return true ;
}
// verifiche sugli assi lineari : // verifiche sugli assi lineari :
// aggiusto gli indici di ordine sulla sua catena cinematica (1-based) // aggiusto gli indici di ordine sulla sua catena cinematica (1-based)
for ( int i = 0 ; i < int( m_vCalcLinAx.size()) ; ++ i) { for ( int i = 0 ; i < int( m_vCalcLinAx.size()) ; ++ i) {
@@ -591,10 +487,8 @@ Machine::CalculateKinematicChain( void)
m_vCalcLinAx[i].nInd *= -1 ; m_vCalcLinAx[i].nInd *= -1 ;
} }
// devono essere 3 // devono essere 3
if ( m_vCalcLinAx.size() != 3) { if ( m_vCalcLinAx.size() != 3)
LOG_ERROR( GetEMkLogger(), "Linear Axes are not 3 in number")
return false ; return false ;
}
// devono essere ordinabili come XYZ // devono essere ordinabili come XYZ
if ( ! m_vCalcLinAx[0].vtDir.IsX()) { if ( ! m_vCalcLinAx[0].vtDir.IsX()) {
if ( m_vCalcLinAx[1].vtDir.IsX()) if ( m_vCalcLinAx[1].vtDir.IsX())
@@ -620,6 +514,7 @@ Machine::CalculateKinematicChain( void)
} }
// verifiche sugli assi rotanti : // verifiche sugli assi rotanti :
bool bOk = false ;
// aggiusto gli indici di ordine sulla sua catena cinematica (1-based) // aggiusto gli indici di ordine sulla sua catena cinematica (1-based)
for ( int i = 0 ; i < int( m_vCalcRotAx.size()) ; ++ i) { for ( int i = 0 ; i < int( m_vCalcRotAx.size()) ; ++ i) {
if ( m_vCalcRotAx[i].bHead) if ( m_vCalcRotAx[i].bHead)
@@ -629,7 +524,7 @@ Machine::CalculateKinematicChain( void)
} }
// se 0 o 1 va bene // se 0 o 1 va bene
if ( m_vCalcRotAx.size() <= 1) if ( m_vCalcRotAx.size() <= 1)
; bOk = true ;
// se 2 va bene // se 2 va bene
else if ( m_vCalcRotAx.size() == 2) { else if ( m_vCalcRotAx.size() == 2) {
// se entrambi di testa devo invertirne l'ordine // se entrambi di testa devo invertirne l'ordine
@@ -643,6 +538,7 @@ Machine::CalculateKinematicChain( void)
m_vCalcRotAx[1].stroke.Max = min( m_vCalcRotAx[1].stroke.Max, pHead->GetRot2Stroke().Max) ; m_vCalcRotAx[1].stroke.Max = min( m_vCalcRotAx[1].stroke.Max, pHead->GetRot2Stroke().Max) ;
} }
} }
bOk = true ;
} }
// 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) { else if ( m_vCalcRotAx.size() == 3) {
@@ -665,13 +561,10 @@ Machine::CalculateKinematicChain( void)
m_vCalcRotAx[n2ndHeadRotAx].stroke.Max = min( m_vCalcRotAx[n2ndHeadRotAx].stroke.Max, pHead->GetRot2Stroke().Max) ; m_vCalcRotAx[n2ndHeadRotAx].stroke.Max = min( m_vCalcRotAx[n2ndHeadRotAx].stroke.Max, pHead->GetRot2Stroke().Max) ;
} }
} }
bOk = true ;
} }
// se più di 3 if ( ! bOk)
else {
// altrimenti non ancora gestito, quindi errore
LOG_ERROR( GetEMkLogger(), "Rotary Axes not manageable")
return false ; return false ;
}
// verifico esistenza eventuale asse rotante speciale di testa // verifico esistenza eventuale asse rotante speciale di testa
if ( m_nHeadRotAxes > 0 && m_nHeadLinAxes > 0) { if ( m_nHeadRotAxes > 0 && m_nHeadLinAxes > 0) {
// indice di posizione primo asse di testa // indice di posizione primo asse di testa
@@ -707,9 +600,11 @@ Machine::CalculateKinematicChain( void)
} }
} }
} }
// dichiaro tipo centro di lavoro
m_nCalcChainType = KIN_CHAIN_CENTER ;
return true ; return true ;
// altrimenti non ancora gestito, quindi errore
LOG_ERROR( GetEMkLogger(), "Rotary Axes not manageable")
return false ;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -1056,8 +951,8 @@ Machine::GetMyAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
vtAx2.Invert() ; vtAx2.Invert() ;
// calcolo secondo angolo di rotazione // calcolo secondo angolo di rotazione
nStat = GetRotationComponent( vtDirHn, dCompTSuAxR1, vtAx1, vtAx2, dAngB1, dAngB2, bDet) ; nStat = GetRotationComponent( vtDirHn, dCompTSuAxR1, vtAx1, vtAx2, dAngB1, dAngB2, bDet) ;
// se indeterminato, provo ricalcolo con direzione aux // se indeterminato con richiesta direzione ausiliaria esatta, ricalcolo con direzione aux
if ( nStat >= 1 && ! bDet) { if ( nStat >= 1 && ! bDet && m_bSolChExact) {
// componente versore ausiliario desiderato su direzione primo asse rotante // componente versore ausiliario desiderato su direzione primo asse rotante
Vector3d vtSccDir ; Vector3d vtSccDir ;
if ( GetSccDir( m_nCalcSolCh, vtDirAn, vtSccDir)) { if ( GetSccDir( m_nCalcSolCh, vtDirAn, vtSccDir)) {
@@ -1107,7 +1002,7 @@ Machine::GetMyAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
// calcolo primo angolo di rotazione per seconda soluzione // calcolo primo angolo di rotazione per seconda soluzione
bool bDet2 = true ; bool bDet2 = true ;
if ( nStat == 2) { if ( nStat == 2) {
if ( ! vtDirH2.GetRotation( vtDirTn, vtAx1, SIN_EPS_ANG_SMALL, dAngA2, bDet2)) if ( ! vtDirH2.GetRotation( vtDirTn, vtAx1, dAngA2, bDet2) )
nStat = 1 ; nStat = 1 ;
else { else {
// se indeterminato, provo a determinarlo con la direzione ausiliaria // se indeterminato, provo a determinarlo con la direzione ausiliaria
@@ -1130,7 +1025,7 @@ Machine::GetMyAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
// calcolo primo angolo di rotazione per prima soluzione // calcolo primo angolo di rotazione per prima soluzione
bool bDet1 = true ; bool bDet1 = true ;
if ( nStat >= 1) { if ( nStat >= 1) {
if ( ! vtDirH1.GetRotation( vtDirTn, vtAx1, SIN_EPS_ANG_SMALL, dAngA1, bDet1)) if ( ! vtDirH1.GetRotation( vtDirTn, vtAx1, dAngA1, bDet1) )
nStat = 0 ; nStat = 0 ;
else { else {
// se indeterminato, provo a determinarlo con la direzione ausiliaria // se indeterminato, provo a determinarlo con la direzione ausiliaria
@@ -1175,7 +1070,7 @@ Machine::GetMyAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
} }
if ( nStat >= 1) { if ( nStat >= 1) {
// se non riesco ad aggiustare, elimino // se non riesco ad aggiustare, elimino
if ( ( bDet1 && ! AdjustAngleInStroke( RotAx1.stroke, dAngA1)) || if ( ! AdjustAngleInStroke( RotAx1.stroke, dAngA1) ||
( nNumRotAx == 2 && ! AdjustAngleInStroke( RotAx2.stroke, dAngB1))) { ( nNumRotAx == 2 && ! AdjustAngleInStroke( RotAx2.stroke, dAngB1))) {
-- nStat ; -- nStat ;
// riloco eventuale soluzione rimasta // riloco eventuale soluzione rimasta
@@ -1281,10 +1176,6 @@ Machine::GetDirection( const Vector3d& vtDir, const DBLVECTOR& vAng, Vector3d& v
vtNew.Rotate( m_vCalcRotAx[i-1].vtDir, vAng[i-1]) ; vtNew.Rotate( m_vCalcRotAx[i-1].vtDir, vAng[i-1]) ;
} }
// nel caso di robot devo passare dal riferimento canonico robot a quello di macchina
if ( m_nCalcChainType == KIN_CHAIN_ROBOT)
vtNew.ToGlob( m_frRobot) ;
return true ; return true ;
} }
@@ -1322,46 +1213,26 @@ Machine::GetNoseFromPositions( double dX, double dY, double dZ, const DBLVECTOR&
// la posizione deve essere espressa rispetto allo ZERO MACCHINA // 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 // aggiorno posizione testa a riposo mediante ciclo inverso sugli assi rotanti di testa
if ( vAng.size() < m_vCalcRotAx.size()) ptNose = m_ptCalcPos ;
return false ; for ( int i = int( m_vCalcRotAx.size()) - 1 ; i >= 0 ; -- i) {
// se asse di testa non speciale
// se centro di lavoro if ( m_vCalcRotAx[i].bHead && i != m_nHeadSpecRotAxis)
if ( m_nCalcChainType == KIN_CHAIN_CENTER) { ptNose.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
// aggiorno posizione testa a riposo mediante ciclo inverso sugli assi rotanti di testa
ptNose = m_ptCalcPos ;
for ( int i = int( m_vCalcRotAx.size()) - 1 ; i >= 0 ; -- i) {
// se asse di testa non speciale
if ( m_vCalcRotAx[i].bHead && i != m_nHeadSpecRotAxis)
ptNose.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
}
// aggiorno posizione testa con assi lineari di testa
DBLVECTOR vMov( {dX, dY, dZ}) ;
for ( int i = 0 ; i < int( m_vCalcLinAx.size()) ; ++ i) {
if ( m_vCalcLinAx[i].bHead)
ptNose += m_vCalcLinAx[i].vtDir * vMov[i] ;
}
// eseguo rotazione eventuale asse rotante speciale di testa
if ( m_nHeadSpecRotAxis != -1) {
if ( m_nHeadSpecRotAxis < 0 || m_nHeadSpecRotAxis >= int( m_vCalcRotAx.size()))
return false ;
int i = m_nHeadSpecRotAxis ;
ptNose.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
}
} }
// se robot // aggiorno posizione testa con assi lineari di testa
else if ( m_nCalcChainType == KIN_CHAIN_ROBOT) { DBLVECTOR vMov( {dX, dY, dZ}) ;
// aggiorno posizione testa a riposo mediante ciclo inverso sugli assi rotanti di testa for ( int i = 0 ; i < int( m_vCalcLinAx.size()) ; ++ i) {
ptNose = m_ptCalcPos ; if ( m_vCalcLinAx[i].bHead)
for ( int i = int( m_vCalcRotAx.size()) - 1 ; i >= 0 ; -- i) { ptNose += m_vCalcLinAx[i].vtDir * vMov[i] ;
// se asse di testa }
if ( m_vCalcRotAx[i].bHead) // eseguo rotazione eventuale asse rotante speciale di testa
ptNose.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ; if ( m_nHeadSpecRotAxis != -1) {
} if ( m_nHeadSpecRotAxis < 0 || m_nHeadSpecRotAxis >= int( m_vCalcRotAx.size()))
return false ;
int i = m_nHeadSpecRotAxis ;
ptNose.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
} }
// altrimenti errore
else
return false ;
return true ; return true ;
} }
@@ -1374,50 +1245,26 @@ Machine::GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR&
// la posizione deve essere espressa rispetto allo ZERO MACCHINA // la posizione deve essere espressa rispetto allo ZERO MACCHINA
// è 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 // aggiorno posizione tip utensile a riposo mediante ciclo inverso sugli assi rotanti di testa
if ( vAng.size() < m_vCalcRotAx.size()) ptTip = m_ptCalcPos - m_vtCalcDir * m_dCalcTLen ;
return false ; for ( int i = int( m_vCalcRotAx.size()) - 1 ; i >= 0 ; -- i) {
// se asse di testa non speciale
// se centro di lavoro if ( m_vCalcRotAx[i].bHead && i != m_nHeadSpecRotAxis)
if ( m_nCalcChainType == KIN_CHAIN_CENTER) { ptTip.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
// aggiorno posizione tip utensile a riposo mediante ciclo inverso sugli assi rotanti di testa
ptTip = m_ptCalcPos - m_vtCalcDir * m_dCalcTLen ;
for ( int i = int( m_vCalcRotAx.size()) - 1 ; i >= 0 ; -- i) {
// se asse di testa non speciale
if ( m_vCalcRotAx[i].bHead && i != m_nHeadSpecRotAxis)
ptTip.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
}
// aggiorno posizione tip utensile con assi lineari di testa
DBLVECTOR vMov( {dX, dY, dZ}) ;
for ( int i = 0 ; i < int( m_vCalcLinAx.size()) ; ++ i) {
if ( m_vCalcLinAx[i].bHead)
ptTip += m_vCalcLinAx[i].vtDir * vMov[i] ;
}
// eseguo rotazione eventuale asse rotante speciale di testa
if ( m_nHeadSpecRotAxis != -1) {
if ( m_nHeadSpecRotAxis < 0 || m_nHeadSpecRotAxis >= int( m_vCalcRotAx.size()))
return false ;
int i = m_nHeadSpecRotAxis ;
ptTip.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
}
} }
// se robot // aggiorno posizione tip utensile con assi lineari di testa
else if ( m_nCalcChainType == KIN_CHAIN_ROBOT) { DBLVECTOR vMov( {dX, dY, dZ}) ;
// aggiorno posizione tip utensile a riposo mediante ciclo inverso sugli assi rotanti di testa for ( int i = 0 ; i < int( m_vCalcLinAx.size()) ; ++ i) {
ptTip = m_ptCalcPos - m_vtCalcDir * m_dCalcTLen ; if ( m_vCalcLinAx[i].bHead)
for ( int i = int( m_vCalcRotAx.size()) - 1 ; i >= 0 ; -- i) { ptTip += m_vCalcLinAx[i].vtDir * vMov[i] ;
// se asse di testa }
if ( m_vCalcRotAx[i].bHead) // eseguo rotazione eventuale asse rotante speciale di testa
ptTip.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ; if ( m_nHeadSpecRotAxis != -1) {
} if ( m_nHeadSpecRotAxis < 0 || m_nHeadSpecRotAxis >= int( m_vCalcRotAx.size()))
return false ;
int i = m_nHeadSpecRotAxis ;
ptTip.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, vAng[i]) ;
} }
// altrimenti errore
else
return false ;
// nel caso di robot devo passare dal riferimento canonico robot a quello di macchina
if ( m_nCalcChainType == KIN_CHAIN_ROBOT)
ptTip.ToGlob( m_frRobot) ;
// Se richiesto ingombro totale o punto sotto del tip utensile // Se richiesto ingombro totale o punto sotto del tip utensile
if ( bOverall || bBottom) { if ( bOverall || bBottom) {
@@ -1627,7 +1474,10 @@ Machine::LimitAngleToStroke( int nInd, double& dAng) const
if ( nInd < 0 || nInd >= int( m_vCalcRotAx.size())) if ( nInd < 0 || nInd >= int( m_vCalcRotAx.size()))
return true ; 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) ; if ( dAng < m_vCalcRotAx[nInd].stroke.Min)
dAng = m_vCalcRotAx[nInd].stroke.Min ;
else if ( dAng > m_vCalcRotAx[nInd].stroke.Max)
dAng = m_vCalcRotAx[nInd].stroke.Max ;
return true ; return true ;
} }
@@ -1722,7 +1572,6 @@ Machine::VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR&
bool bOldEMC = LuaChangeNameGlobVar( EMC_VAR, EMC_VAR_BACKUP) ; bool bOldEMC = LuaChangeNameGlobVar( EMC_VAR, EMC_VAR_BACKUP) ;
// definisco variabili // definisco variabili
bOk = bOk && LuaCreateGlobTable( EMC_VAR) ; bOk = bOk && LuaCreateGlobTable( EMC_VAR) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_VER, GetEMkVer()) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_L1, dX) ; bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_L1, dX) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_L2, dY) ; bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_L2, dY) ;
bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_L3, dZ) ; bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_L3, dZ) ;
@@ -1853,7 +1702,7 @@ Machine::GetCurrAxisName( int nInd, string& sAxName) const
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Machine::GetAllCurrAxesNames( STRVECTOR& vAxName) const Machine::GetAllCurrAxesName( STRVECTOR& vAxName) const
{ {
vAxName.clear() ; vAxName.clear() ;
bool bOk = true ; bool bOk = true ;
@@ -1902,7 +1751,7 @@ Machine::GetCurrAxisToken( int nInd, string& sAxToken) const
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Machine::GetAllCurrAxesTokens( STRVECTOR& vAxToken) const Machine::GetAllCurrAxesToken( STRVECTOR& vAxToken) const
{ {
vAxToken.clear() ; vAxToken.clear() ;
bool bOk = true ; bool bOk = true ;
@@ -1971,52 +1820,6 @@ Machine::GetCurrAxisMax( int nInd, double& dMax) const
return false ; return false ;
} }
//----------------------------------------------------------------------------
bool
Machine::GetCurrAxisOffset( int nInd, double& dOffset) const
{
int nLinAxes = int( m_vCalcLinAx.size()) ;
int nRotAxes = int( m_vCalcRotAx.size()) ;
if ( nInd >= 0 && nInd < nLinAxes) {
Axis* pAx = GetAxis( m_vCalcLinAx[nInd].nGrpId) ;
if ( pAx == nullptr)
return false ;
dOffset = pAx->GetOffset() ;
return true ;
}
else if ( nInd >= nLinAxes && nInd < nLinAxes + nRotAxes) {
Axis* pAx = GetAxis( m_vCalcRotAx[nInd-nLinAxes].nGrpId) ;
if ( pAx == nullptr)
return false ;
dOffset = pAx->GetOffset() ;
return true ;
}
return false ;
}
//----------------------------------------------------------------------------
bool
Machine::GetCurrAxisInvert( int nInd, bool& bInvert) const
{
int nLinAxes = int( m_vCalcLinAx.size()) ;
int nRotAxes = int( m_vCalcRotAx.size()) ;
if ( nInd >= 0 && nInd < nLinAxes) {
Axis* pAx = GetAxis( m_vCalcLinAx[nInd].nGrpId) ;
if ( pAx == nullptr)
return false ;
bInvert = pAx->GetInvert() ;
return true ;
}
else if ( nInd >= nLinAxes && nInd < nLinAxes + nRotAxes) {
Axis* pAx = GetAxis( m_vCalcRotAx[nInd-nLinAxes].nGrpId) ;
if ( pAx == nullptr)
return false ;
bInvert = pAx->GetInvert() ;
return true ;
}
return false ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Machine::GetCurrAxisHomePos( int nInd, double& dHome) const Machine::GetCurrAxisHomePos( int nInd, double& dHome) const
@@ -2064,111 +1867,3 @@ Machine::GetAllCurrAxesHomePos( DBLVECTOR& vAxHomeVal) const
} }
return bOk ; return bOk ;
} }
//----------------------------------------------------------------------------
bool
Machine::GetRobotAngles( const Point3d& ptP, const Vector3d& vtDirT, const Vector3d& vtDirA,
DBLVECTOR& vAng1, DBLVECTOR& vAng2) const
{
// pulisco il risultato
vAng1.clear() ;
vAng2.clear() ;
// porto i dati nel riferimento robot
Point3d ptPL = GetToLoc( ptP, m_frRobot) ;
Vector3d vtDirTL = GetToLoc( vtDirT, m_frRobot) ;
Vector3d vtDirAL = GetToLoc( vtDirA, m_frRobot) ;
// riferimento utensile
Frame3d frTool ;
frTool.Set( ORIG, vtDirTL, vtDirAL) ;
// deduco la posizione richiesta del centro del polso
Point3d ptCen = ptPL + m_ptWristCen.x * frTool.VersX() +
m_ptWristCen.y * frTool.VersY() +
( m_dCalcTLen + m_ptWristCen.z) * frTool.VersZ() ;
// deduco la direzione richiesta del centro del polso
Vector3d vtCen = m_vtWristRef.x * frTool.VersX() +
m_vtWristRef.y * frTool.VersY() +
m_vtWristRef.z * frTool.VersZ() ;
// calcolo il primo asse rotante
Vector3d vtArm = ptCen - m_vCalcRotAx[0].ptPos ;
double dAng1 ; bool bDet1 ;
if ( ! X_AX.GetRotation( vtArm, m_vCalcRotAx[0].vtDir, EPS_SMALL, dAng1, bDet1) || ! bDet1) {
LOG_ERROR( GetEMkLogger(), "Error : direction unreachable (robot)")
return false ;
}
vAng1.push_back( dAng1) ;
vAng2.push_back( dAng1) ;
// calcolo secondo e terzo asse rotante
Point3d ptR2 = m_vCalcRotAx[1].ptPos ;
ptR2.Rotate( m_vCalcRotAx[0].ptPos, m_vCalcRotAx[0].vtDir, dAng1) ;
Vector3d vtR2 = m_vCalcRotAx[1].vtDir ;
vtR2.Rotate( m_vCalcRotAx[0].vtDir, dAng1) ;
Vector3d vtR2Cen = ptCen - ( ptR2 + ( ptCen - ptR2) * vtR2 * vtR2) ;
double dDistR2Cen = vtR2Cen.Len() ;
double dDistR2R3 = m_vCalcRotAx[2].ptPos.z - m_vCalcRotAx[1].ptPos.z ;
Vector3d vtR3R5 = m_vCalcRotAx[4].ptPos - m_vCalcRotAx[2].ptPos ; vtR3R5.y = 0 ;
double dDistR3R5 = vtR3R5.Len() ;
double dAngR3R5 = atan2( vtR3R5.z, vtR3R5.x) * RADTODEG ;
double dCosB = ( dDistR2R3 * dDistR2R3 + dDistR2Cen * dDistR2Cen - dDistR3R5 * dDistR3R5) / ( 2 * dDistR2R3 * dDistR2Cen) ;
double dCosC = ( dDistR3R5 * dDistR3R5 + dDistR2Cen * dDistR2Cen - dDistR2R3 * dDistR2R3) / ( 2 * dDistR3R5 * dDistR2Cen) ;
if ( abs( dCosB) > 1 || abs( dCosC) > 1) {
LOG_ERROR( GetEMkLogger(), "Error : position unreachable (robot)")
return false ;
}
double dAngB = acos( dCosB) * RADTODEG ;
double dAng2 ; bool bDet2 ;
if ( ! Z_AX.GetRotation( vtR2Cen, vtR2, EPS_SMALL, dAng2, bDet2) || ! bDet2) {
LOG_ERROR( GetEMkLogger(), "Error : R2 not calculable (robot)")
return false ;
}
dAng2 -= dAngB ;
vAng1.push_back( dAng2) ;
vAng2.push_back( dAng2) ;
double dAngC = acos( dCosC) * RADTODEG ;
double dAng3 = dAngB + dAngC + dAngR3R5 - ANG_RIGHT ;
vAng1.push_back( dAng3) ;
vAng2.push_back( dAng3) ;
// calcolo i primi due assi rotanti del polso
Frame3d frWrist ;
frWrist.Set( m_vCalcRotAx[3].ptPos, m_vCalcRotAx[3].vtDir, m_vCalcRotAx[4].vtDir ^ m_vCalcRotAx[3].vtDir) ;
frWrist.Rotate( m_vCalcRotAx[2].ptPos, m_vCalcRotAx[2].vtDir, dAng3) ;
frWrist.Rotate( m_vCalcRotAx[1].ptPos, m_vCalcRotAx[1].vtDir, dAng2) ;
frWrist.Rotate( m_vCalcRotAx[0].ptPos, m_vCalcRotAx[0].vtDir, dAng1) ;
Vector3d vtCenL = GetToLoc( vtCen, frWrist) ;
double dAng4, dAng5 ;
vtCenL.ToSpherical( nullptr, &dAng5, &dAng4) ;
if ( dAng4 > ANG_STRAIGHT)
dAng4 -= ANG_FULL ;
if ( dAng4 > ANG_RIGHT) {
dAng4 -= ANG_STRAIGHT ;
dAng5 = -dAng5 ;
}
else if ( dAng4 < -ANG_RIGHT) {
dAng4 += ANG_STRAIGHT ;
dAng5 = -dAng5 ;
}
vAng1.push_back( dAng4) ;
vAng1.push_back( dAng5) ;
vAng2.push_back( dAng4 + ( dAng4 > EPS_ANG_ZERO ? -ANG_STRAIGHT : ANG_STRAIGHT)) ;
vAng2.push_back( -dAng5) ;
// calcolo il terzo asse rotante del polso
Vector3d vtR6 = m_vCalcRotAx[5].vtDir ;
for ( int i = 4; i >= 0 ; --i)
vtR6.Rotate( m_vCalcRotAx[i].vtDir, vAng1[i]) ;
Vector3d vtTool = m_vtCalcDir ;
for ( int i = 4; i >= 0 ; --i)
vtTool.Rotate( m_vCalcRotAx[i].vtDir, vAng1[i]) ;
double dAng6 ; bool bDet6 ;
if ( ! vtTool.GetRotation( vtDirTL, vtR6, EPS_SMALL, dAng6, bDet6) || ! bDet6) {
Vector3d vtAux = m_vtCalcADir ;
for ( int i = 4; i >= 0 ; --i)
vtAux.Rotate( m_vCalcRotAx[i].vtDir, vAng1[i]) ;
if ( ! vtAux.GetRotation( vtDirAL, vtR6, EPS_SMALL, dAng6, bDet6) || ! bDet6) {
LOG_ERROR( GetEMkLogger(), "Error : R6 not calculable (robot)")
return false ;
}
}
vAng1.push_back( dAng6) ;
vAng2.push_back( dAng6 + ( dAng6 > EPS_ANG_ZERO ? -ANG_STRAIGHT : ANG_STRAIGHT)) ;
return true ;
}
-12
View File
@@ -98,18 +98,6 @@ Machine::GetHeadSolCh( const string& sHead) const
return pHead->GetSolCh() ; return pHead->GetSolCh() ;
} }
//----------------------------------------------------------------------------
int
Machine::GetHeadSelectType( const string& sHead) const
{
// recupero testa
Head* pHead = GetHead( GetGroup( sHead)) ;
if ( pHead == nullptr)
return MCH_SCC_NONE ;
// recupero tipo di selezione delle uscite della testa
return pHead->GetSelectType() ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Machine::LoadTool( const string& sHead, int nExit, const string& sTool) Machine::LoadTool( const string& sHead, int nExit, const string& sTool)
+19 -103
View File
@@ -44,14 +44,12 @@ static const string FLD_INVERT = "Invert" ;
static const string FLD_AXIS_OFFSET = "Offset" ; static const string FLD_AXIS_OFFSET = "Offset" ;
static const string FLD_REF1 = "Ref1" ; static const string FLD_REF1 = "Ref1" ;
static const string FLD_SCALE = "Scale" ; static const string FLD_SCALE = "Scale" ;
static const string FLD_EXIT_NBR = "ExitNbr" ;
static const string FLD_POS = "Pos" ; static const string FLD_POS = "Pos" ;
static const string FLD_DIR = "Dir" ; static const string FLD_DIR = "Dir" ;
static const string FLD_STROKE = "Stroke" ; static const string FLD_STROKE = "Stroke" ;
static const string FLD_HOME = "Home" ; static const string FLD_HOME = "Home" ;
static const string FLD_ADJUSTAUX = "AdjustAux" ; static const string FLD_ADJUSTAUX = "AdjustAux" ;
static const string FLD_HSET = "HSet" ; static const string FLD_HSET = "HSet" ;
static const string FLD_SEL_TYPE = "SelType" ;
static const string FLD_TDIR = "TDir" ; static const string FLD_TDIR = "TDir" ;
static const string FLD_ADIR = "ADir" ; static const string FLD_ADIR = "ADir" ;
static const string FLD_ROT1W = "Rot1W" ; static const string FLD_ROT1W = "Rot1W" ;
@@ -59,7 +57,6 @@ static const string FLD_MAXDELTAR2ON1 = "MaxDeltaR2OnFirst" ;
static const string FLD_ROT2STROKE = "Rot2Stroke" ; static const string FLD_ROT2STROKE = "Rot2Stroke" ;
static const string FLD_SOLCH = "SolCh" ; static const string FLD_SOLCH = "SolCh" ;
static const string FLD_OTHCOLL = "OthColl" ; static const string FLD_OTHCOLL = "OthColl" ;
static const string FLD_COLL = "Coll" ;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
Machine* Machine::m_pMchLua = nullptr ; Machine* Machine::m_pMchLua = nullptr ;
@@ -453,9 +450,6 @@ Machine::LuaEmtTable( lua_State* L)
// lettura eventuale campo 'Scale' dalla tabella // lettura eventuale campo 'Scale' dalla tabella
double vScale[3] = {1.0, 1.0, 1.0} ; double vScale[3] = {1.0, 1.0, 1.0} ;
LuaGetTabFieldParam( L, 1, FLD_SCALE, vScale) ; LuaGetTabFieldParam( L, 1, FLD_SCALE, vScale) ;
// lettura eventuale campo 'Coll' dalla tabella
STRVECTOR vsColl ;
LuaGetTabFieldParam( L, 1, FLD_COLL, vsColl) ;
// lettura campo 'Geo' dalla tabella // lettura campo 'Geo' dalla tabella
string sGeo ; string sGeo ;
LuaCheckTabFieldParam( L, 1, FLD_GEO, sGeo) LuaCheckTabFieldParam( L, 1, FLD_GEO, sGeo)
@@ -473,7 +467,7 @@ Machine::LuaEmtTable( lua_State* L)
return luaL_error( L, " Unknown Machine") ; return luaL_error( L, " Unknown Machine") ;
// carico i dati della tavola // carico i dati della tavola
if ( ! m_pMchLua->LoadMachineTable( sName, sParent, nType, Ref1, vScale[0], vScale[1], vScale[2], vsColl, sGeo, vsAux)) if ( ! m_pMchLua->LoadMachineTable( sName, sParent, nType, Ref1, vScale[0], vScale[1], vScale[2], sGeo, vsAux))
return luaL_error( L, " Load Machine Table failed") ; return luaL_error( L, " Load Machine Table failed") ;
// restituisco l'indice della tavola // restituisco l'indice della tavola
@@ -665,12 +659,9 @@ Machine::LuaEmtMultiHead( lua_State* L)
// lettura campo 'HSet' dalla tabella // lettura campo 'HSet' dalla tabella
string sHSet ; string sHSet ;
LuaCheckTabFieldParam( L, 1, FLD_HSET, sHSet) LuaCheckTabFieldParam( L, 1, FLD_HSET, sHSet)
// lettura eventuale campo tipo di selezione ammessa per le uscite
int nSelectType = MCH_SLT_FIXEDEXITS ;
LuaGetTabFieldParam( L, 1, FLD_SEL_TYPE, nSelectType) ;
// lettura campo 'ExitNbr' dalla tabella // lettura campo 'ExitNbr' dalla tabella
int nExitNbr ; int nExitNbr ;
LuaCheckTabFieldParam( L, 1, FLD_EXIT_NBR, nExitNbr) LuaCheckTabFieldParam( L, 1, "ExitNbr", nExitNbr)
// lettura campi 'PosN' e 'TDirN' per ogni uscita dalla tabella // lettura campi 'PosN' e 'TDirN' per ogni uscita dalla tabella
MUEXITVECTOR vMuExit ; MUEXITVECTOR vMuExit ;
vMuExit.reserve( nExitNbr) ; vMuExit.reserve( nExitNbr) ;
@@ -685,7 +676,7 @@ Machine::LuaEmtMultiHead( lua_State* L)
// inserimento nell'array // inserimento nell'array
vMuExit.emplace_back( ptPos, vtTDir) ; vMuExit.emplace_back( ptPos, vtTDir) ;
} }
// lettura eventuale campo 'ADir' dalla tabella // lettura campo 'ADir' dalla tabella
Vector3d vtADir ; Vector3d vtADir ;
LuaGetTabFieldParam( L, 1, FLD_ADIR, vtADir) ; LuaGetTabFieldParam( L, 1, FLD_ADIR, vtADir) ;
// lettura eventuale campo 'Rot1W' dalla tabella (default 1) // lettura eventuale campo 'Rot1W' dalla tabella (default 1)
@@ -720,9 +711,9 @@ Machine::LuaEmtMultiHead( lua_State* L)
return luaL_error( L, " Unknown Machine") ; return luaL_error( L, " Unknown Machine") ;
// carico i dati della testa multipla // carico i dati della testa multipla
if ( ! m_pMchLua->LoadMachineMultiHead( sName, sParent, sHSet, nSelectType, vMuExit, vtADir, if ( ! m_pMchLua->LoadMachineMultiHead( sName, sParent, sHSet, vMuExit, vtADir,
dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl, sGeo, vsAux)) dRot1W, bMaxDeltaR2On1, Rot2Stroke, nSolCh, vsOthColl, sGeo, vsAux))
return luaL_error( L, " Load Machine Multi Head failed") ; return luaL_error( L, " Load Machine Standard Head failed") ;
// restituisco l'indice della testa // restituisco l'indice della testa
int nHeadId = m_pMchLua->GetHeadId( sName) ; int nHeadId = m_pMchLua->GetHeadId( sName) ;
@@ -806,26 +797,6 @@ Machine::LuaEmtSpecialHead( lua_State* L)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
int int
Machine::LuaEmtTcPos( lua_State* L) Machine::LuaEmtTcPos( lua_State* L)
{
// Il parametro 1 deve essere una tabella
if ( ! lua_istable( L, 1))
return luaL_error( L, " Invalid Parameter, required a table") ;
// lettura campo opzionale 'ExitNbr' dalla tabella
int nExitNbr = 1 ;
LuaGetTabFieldParam( L, 1, FLD_EXIT_NBR, nExitNbr) ;
// Procedo alla lettura a seconda del tnumero di uscite
if ( nExitNbr == 1)
return LuaEmtStdTcPos( L) ;
else if ( nExitNbr > 1)
return LuaEmtMultiTcPos( L) ;
else
return luaL_error( L, " Tc Position type unknown") ;
}
//----------------------------------------------------------------------------
int
Machine::LuaEmtStdTcPos( lua_State* L)
{ {
// Il parametro 1 deve essere una tabella // Il parametro 1 deve essere una tabella
if ( ! lua_istable( L, 1)) if ( ! lua_istable( L, 1))
@@ -862,70 +833,8 @@ Machine::LuaEmtStdTcPos( lua_State* L)
return luaL_error( L, " Unknown Machine") ; return luaL_error( L, " Unknown Machine") ;
// carico i dati della posizione cambio utensile // carico i dati della posizione cambio utensile
if ( ! m_pMchLua->LoadMachineStdTcPos( sName, sParent, ptPos, vtTDir, vtADir, sGeo, vsAux)) if ( ! m_pMchLua->LoadMachineTcPos( sName, sParent, ptPos, vtTDir, vtADir, sGeo, vsAux))
return luaL_error( L, " Load Machine Standard Tc Position failed") ; return luaL_error( L, " Load Machine Tc Position failed") ;
// restituisco l'indice della posizione cambio utensile
int nTcPosId = m_pMchLua->GetTcPosId( sName) ;
if ( nTcPosId != GDB_ID_NULL)
LuaSetParam( L, nTcPosId) ;
else
LuaSetParam( L) ;
return 1 ;
}
//----------------------------------------------------------------------------
int
Machine::LuaEmtMultiTcPos( lua_State* L)
{
// Il parametro 1 deve essere una tabella
if ( ! lua_istable( L, 1))
return luaL_error( L, " Invalid Parameter, required a table") ;
// lettura campo 'Name' dalla tabella
string sName ;
LuaCheckTabFieldParam( L, 1, FLD_NAME, sName)
// lettura campo 'Parent' dalla tabella
string sParent ;
LuaCheckTabFieldParam( L, 1, FLD_PARENT, sParent)
// lettura campo 'ExitNbr' dalla tabella
int nExitNbr ;
LuaCheckTabFieldParam( L, 1, FLD_EXIT_NBR, nExitNbr)
// lettura campi 'PosN' e 'TDirN' per ogni uscita dalla tabella
MUEXITVECTOR vMuExit ;
vMuExit.reserve( nExitNbr) ;
for ( int i = 0 ; i < nExitNbr ; ++ i) {
// lettura
string sPos = FLD_POS + ToString( i + 1) ;
Point3d ptPos ;
LuaCheckTabFieldParam( L, 1, sPos.c_str(), ptPos)
string sTDir = FLD_TDIR + ToString( i + 1) ;
Vector3d vtTDir ;
LuaCheckTabFieldParam( L, 1, sTDir.c_str(), vtTDir)
// inserimento nell'array
vMuExit.emplace_back( ptPos, vtTDir) ;
}
// lettura eventuale campo 'ADir' dalla tabella
Vector3d vtADir ;
LuaGetTabFieldParam( L, 1, FLD_ADIR, vtADir) ;
// lettura campo 'Geo' dalla tabella
string sGeo ;
LuaCheckTabFieldParam( L, 1, FLD_GEO, sGeo)
// lettura eventuale campo 'Aux' dalla tabella
STRVECTOR vsAux ;
LuaGetTabFieldParam( L, 1, FLD_AUX, vsAux) ;
LuaClearStack( L) ;
// info
string sOut = "LuaEmtTcPos : " + sName ;
LOG_DBG_INFO( GetEMkLogger(), sOut.c_str())
// verifico ci sia una macchina attiva
if ( m_pMchLua == nullptr)
return luaL_error( L, " Unknown Machine") ;
// carico i dati della posizione cambio utensile
if ( ! m_pMchLua->LoadMachineMultiTcPos( sName, sParent, vMuExit, vtADir, sGeo, vsAux))
return luaL_error( L, " Load Machine Multi Tc Position failed") ;
// restituisco l'indice della posizione cambio utensile // restituisco l'indice della posizione cambio utensile
int nTcPosId = m_pMchLua->GetTcPosId( sName) ; int nTcPosId = m_pMchLua->GetTcPosId( sName) ;
@@ -1486,12 +1395,19 @@ Machine::LuaEmtAddToolForVmill( lua_State* L)
int int
Machine::LuaEmtMoveAxes( lua_State* L) Machine::LuaEmtMoveAxes( lua_State* L)
{ {
// 4, ..., 31 parametri : nMoveType, sAx1, dPos1, dStep1 [, sAx2, dPos2, dStep2] ... [, sAx10, dPos10, dStep10] // 4, ..., 16 parametri : nMoveType, sAx1, dPos1, dStep1 [, sAx2, dPos2, dStep2] [, sAx3, dPos3, dStep3] [, sAx4, dPos4, dStep4] [, sAx5, dPos5, dStep5]
int nMoveType = 0 ; int nMoveType ;
LuaGetParam( L, 1, nMoveType) ; LuaCheckParam( L, 1, nMoveType)
string sAx1 ;
LuaCheckParam( L, 2, sAx1) ;
double dEnd1 ;
LuaCheckParam( L, 3, dEnd1) ;
double dStep1 ;
LuaCheckParam( L, 4, dStep1) ;
SAMVECTOR vAxNaEpSt ; SAMVECTOR vAxNaEpSt ;
for ( int i = 0 ; i < 10 ; ++ i) { vAxNaEpSt.emplace_back( sAx1, dEnd1, dStep1) ;
int nInd = 2 + 3 * i ; for ( int i = 0 ; i < 4 ; ++ i) {
int nInd = 5 + 3 * i ;
string sAxN ; string sAxN ;
double dEndN ; double dEndN ;
double dStepN ; double dStepN ;
+4 -16
View File
@@ -31,7 +31,7 @@ using namespace std ;
int int
Machine::LuaEmtAddRapidStart( lua_State* L) Machine::LuaEmtAddRapidStart( lua_State* L)
{ {
// 6 o 7 parametri : nPathId, ptP, vtTool, vtCorr, vtAux, nFlag [, bToolShow] // 6 parametri : nPathId, ptP, vtTool, vtCorr, vtAux, nFlag
int nPathId ; int nPathId ;
LuaCheckParam( L, 1, nPathId) LuaCheckParam( L, 1, nPathId)
Point3d ptP ; Point3d ptP ;
@@ -44,8 +44,6 @@ Machine::LuaEmtAddRapidStart( lua_State* L)
LuaCheckParam( L, 5, vtAux) LuaCheckParam( L, 5, vtAux)
int nFlag ; int nFlag ;
LuaCheckParam( L, 6, nFlag) LuaCheckParam( L, 6, nFlag)
bool bToolShow = false ;
LuaGetParam( L, 7, bToolShow) ;
LuaClearStack( L) ; LuaClearStack( L) ;
// verifico ci sia una macchina attiva valida // verifico ci sia una macchina attiva valida
if ( m_pMchLua == nullptr || if ( m_pMchLua == nullptr ||
@@ -71,7 +69,6 @@ Machine::LuaEmtAddRapidStart( lua_State* L)
pCam->SetEndPoint( ptP) ; pCam->SetEndPoint( ptP) ;
pCam->SetFeed( 0) ; pCam->SetFeed( 0) ;
pCam->SetFlag( nFlag) ; pCam->SetFlag( nFlag) ;
pCam->SetToolShow( bToolShow) ;
// associo questo oggetto a quello geometrico // associo questo oggetto a quello geometrico
m_pMchLua->m_pGeomDB->SetUserObj( nId, Release( pCam)) ; m_pMchLua->m_pGeomDB->SetUserObj( nId, Release( pCam)) ;
} }
@@ -87,7 +84,7 @@ Machine::LuaEmtAddRapidStart( lua_State* L)
int int
Machine::LuaEmtAddRapidMove( lua_State* L) Machine::LuaEmtAddRapidMove( lua_State* L)
{ {
// 7 o 8 parametri : nPathId, ptIni, ptFin, vtTool, vtCorr, vtAux, nFlag [, bToolShow] // 7 parametri : nPathId, ptIni, ptFin, vtTool, vtCorr, vtAux, nFlag
int nPathId ; int nPathId ;
LuaCheckParam( L, 1, nPathId) LuaCheckParam( L, 1, nPathId)
Point3d ptIni ; Point3d ptIni ;
@@ -102,8 +99,6 @@ Machine::LuaEmtAddRapidMove( lua_State* L)
LuaCheckParam( L, 6, vtAux) LuaCheckParam( L, 6, vtAux)
int nFlag ; int nFlag ;
LuaCheckParam( L, 7, nFlag) LuaCheckParam( L, 7, nFlag)
bool bToolShow = false ;
LuaGetParam( L, 8, bToolShow) ;
LuaClearStack( L) ; LuaClearStack( L) ;
// verifico ci sia una macchina attiva valida // verifico ci sia una macchina attiva valida
if ( m_pMchLua == nullptr || if ( m_pMchLua == nullptr ||
@@ -129,7 +124,6 @@ Machine::LuaEmtAddRapidMove( lua_State* L)
pCam->SetEndPoint( ptFin) ; pCam->SetEndPoint( ptFin) ;
pCam->SetFeed( 0) ; pCam->SetFeed( 0) ;
pCam->SetFlag( nFlag) ; pCam->SetFlag( nFlag) ;
pCam->SetToolShow( bToolShow) ;
// associo questo oggetto a quello geometrico // associo questo oggetto a quello geometrico
m_pMchLua->m_pGeomDB->SetUserObj( nId, Release( pCam)) ; m_pMchLua->m_pGeomDB->SetUserObj( nId, Release( pCam)) ;
} }
@@ -145,7 +139,7 @@ Machine::LuaEmtAddRapidMove( lua_State* L)
int int
Machine::LuaEmtAddLinearMove( lua_State* L) Machine::LuaEmtAddLinearMove( lua_State* L)
{ {
// 8 o 9 parametri : nPathId, ptIni, ptFin, vtTool, vtCorr, vtAux, dFeed, nFlag [, bToolShow] // 8 parametri : nPathId, ptIni, ptFin, vtTool, vtCorr, vtAux, dFeed, nFlag
int nPathId ; int nPathId ;
LuaCheckParam( L, 1, nPathId) LuaCheckParam( L, 1, nPathId)
Point3d ptIni ; Point3d ptIni ;
@@ -162,8 +156,6 @@ Machine::LuaEmtAddLinearMove( lua_State* L)
LuaCheckParam( L, 7, dFeed) LuaCheckParam( L, 7, dFeed)
int nFlag ; int nFlag ;
LuaCheckParam( L, 8, nFlag) LuaCheckParam( L, 8, nFlag)
bool bToolShow = false ;
LuaGetParam( L, 9, bToolShow) ;
LuaClearStack( L) ; LuaClearStack( L) ;
// verifico ci sia una macchina attiva valida // verifico ci sia una macchina attiva valida
if ( m_pMchLua == nullptr || if ( m_pMchLua == nullptr ||
@@ -189,7 +181,6 @@ Machine::LuaEmtAddLinearMove( lua_State* L)
pCam->SetEndPoint( ptFin) ; pCam->SetEndPoint( ptFin) ;
pCam->SetFeed( dFeed) ; pCam->SetFeed( dFeed) ;
pCam->SetFlag( nFlag) ; pCam->SetFlag( nFlag) ;
pCam->SetToolShow( bToolShow) ;
// associo questo oggetto a quello geometrico // associo questo oggetto a quello geometrico
m_pMchLua->m_pGeomDB->SetUserObj( nId, Release( pCam)) ; m_pMchLua->m_pGeomDB->SetUserObj( nId, Release( pCam)) ;
} }
@@ -205,7 +196,7 @@ Machine::LuaEmtAddLinearMove( lua_State* L)
int int
Machine::LuaEmtAddArcMove( lua_State* L) Machine::LuaEmtAddArcMove( lua_State* L)
{ {
// 11 o 12 parametri : nPathId, ptIni, ptFin, ptCen, dAngCen, vtN, vtTool, vtCorr, vtAux, dFeed, nFlag [, bToolShow] // 11 parametri : nPathId, ptIni, ptFin, ptCen, dAngCen, vtN, vtTool, vtCorr, vtAux, dFeed, nFlag
int nPathId ; int nPathId ;
LuaCheckParam( L, 1, nPathId) LuaCheckParam( L, 1, nPathId)
Point3d ptIni ; Point3d ptIni ;
@@ -228,8 +219,6 @@ Machine::LuaEmtAddArcMove( lua_State* L)
LuaCheckParam( L, 10, dFeed) LuaCheckParam( L, 10, dFeed)
int nFlag ; int nFlag ;
LuaCheckParam( L, 11, nFlag) LuaCheckParam( L, 11, nFlag)
bool bToolShow = false ;
LuaGetParam( L, 12, bToolShow) ;
LuaClearStack( L) ; LuaClearStack( L) ;
// verifico ci sia una macchina attiva valida // verifico ci sia una macchina attiva valida
if ( m_pMchLua == nullptr || if ( m_pMchLua == nullptr ||
@@ -263,7 +252,6 @@ Machine::LuaEmtAddArcMove( lua_State* L)
pCam->SetNormDir( vtN) ; pCam->SetNormDir( vtN) ;
pCam->SetFeed( dFeed) ; pCam->SetFeed( dFeed) ;
pCam->SetFlag( nFlag) ; pCam->SetFlag( nFlag) ;
pCam->SetToolShow( bToolShow) ;
// associo questo oggetto a quello geometrico // associo questo oggetto a quello geometrico
m_pMchLua->m_pGeomDB->SetUserObj( nId, Release( pCam)) ; m_pMchLua->m_pGeomDB->SetUserObj( nId, Release( pCam)) ;
} }
+2 -14
View File
@@ -1,7 +1,7 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// EgalTech 2015-2024 // EgalTech 2015-2015
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// File : MachineStruConst.h Data : 15.01.24 Versione : 2.5l6 // File : MachineStruConst.h Data : 25.05.15 Versione : 1.6e7
// Contenuto : Strutture e costanti di macchina. // Contenuto : Strutture e costanti di macchina.
// //
// //
@@ -88,18 +88,6 @@ enum MchHeadType { MCH_HT_NONE = 0,
MCH_HT_MULTI = 2, MCH_HT_MULTI = 2,
MCH_HT_SPECIAL = 3} ; MCH_HT_SPECIAL = 3} ;
//----------------------------------------------------------------------------
// Tipo di selezione ammessa per le uscite
enum MchSelType { MCH_SLT_FIXEDEXITS = 0,
MCH_SLT_ONEEXIT = 1,
MCH_SLT_MULTIEXITS = 2} ;
//----------------------------------------------------------------------------
// Tipo della catena cinematica
enum KinChainType { KIN_CHAIN_NONE = 0,
KIN_CHAIN_CENTER = 1,
KIN_CHAIN_ROBOT = 2} ;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Identificativo iniziale riferimenti di tavola // Identificativo iniziale riferimenti di tavola
const std::string MCH_TREF = "R" ; const std::string MCH_TREF = "R" ;
+2 -11
View File
@@ -148,15 +148,6 @@ Machining::PrepareToolPreview( void) const
int nId = m_pGeomDB->CopyGlob( nHeadId, GDB_ID_NULL, nStId) ; int nId = m_pGeomDB->CopyGlob( nHeadId, GDB_ID_NULL, nStId) ;
m_pGeomDB->SetMode( nId, GDB_MD_STD) ; m_pGeomDB->SetMode( nId, GDB_MD_STD) ;
m_pGeomDB->SetStatus( nId, GDB_ST_OFF) ; m_pGeomDB->SetStatus( nId, GDB_ST_OFF) ;
// elimino eventuali gruppi opportunamente indicati
int nSubId = m_pGeomDB->GetFirstGroupInGroup( nId) ;
while ( nSubId != GDB_ID_NULL) {
int nNextSubId = m_pGeomDB->GetNextGroup( nSubId) ;
bool bShow = true ;
if ( m_pGeomDB->GetInfo( nSubId, KEY_PREVIEWSHOW, bShow) && ! bShow)
m_pGeomDB->Erase( nSubId) ;
nSubId = nNextSubId ;
}
return ( nId != GDB_ID_NULL) ; return ( nId != GDB_ID_NULL) ;
} }
@@ -296,12 +287,12 @@ Machining::ToolPreview( int nEntId, int nFlag) const
Frame3d frHead ; Frame3d frHead ;
m_pGeomDB->GetGroupGlobFrame( nId, frHead) ; m_pGeomDB->GetGroupGlobFrame( nId, frHead) ;
Frame3d frRef ; Frame3d frRef ;
if ( vtAux.IsSmall() || AreSameOrOppositeVectorApprox( vtAux, vtDir)) if ( vtAux.IsSmall())
frRef.Set( ptOrig, vtDir) ; frRef.Set( ptOrig, vtDir) ;
else else
frRef.Set( ptOrig, vtDir, vtAux) ; frRef.Set( ptOrig, vtDir, vtAux) ;
Frame3d frShow ; Frame3d frShow ;
if ( vtBAux.IsSmall() || AreSameOrOppositeVectorApprox( vtBAux, vtTool)) if ( vtBAux.IsSmall())
frShow.Set( ptEnd + vtTool * GetToolData().m_dLen, vtTool) ; frShow.Set( ptEnd + vtTool * GetToolData().m_dLen, vtTool) ;
else else
frShow.Set( ptEnd + vtTool * GetToolData().m_dLen, vtTool, vtBAux) ; frShow.Set( ptEnd + vtTool * GetToolData().m_dLen, vtTool, vtBAux) ;
+1 -10
View File
@@ -103,11 +103,7 @@ GetMachiningTitle( int nMchType)
"SawRoughing", "SawRoughing",
"SawFinishing", "SawFinishing",
"GenMachining", "GenMachining",
"Chiseling", "Chiseling"} ;
"SurfRoughing",
"SurfFinishing",
"Waterjetting",
"5axMachining"} ;
switch ( nMchType) { switch ( nMchType) {
case MT_DRILLING : return MchTitle[1] ; case MT_DRILLING : return MchTitle[1] ;
case MT_SAWING : return MchTitle[2] ; case MT_SAWING : return MchTitle[2] ;
@@ -118,11 +114,6 @@ GetMachiningTitle( int nMchType)
case MT_SAWFINISHING : return MchTitle[7] ; case MT_SAWFINISHING : return MchTitle[7] ;
case MT_GENMACHINING : return MchTitle[8] ; case MT_GENMACHINING : return MchTitle[8] ;
case MT_CHISELING : return MchTitle[9] ; case MT_CHISELING : return MchTitle[9] ;
case MT_SURFROUGHING : return MchTitle[10] ;
case MT_SURFFINISHING : return MchTitle[11] ;
case MT_WATERJETTING : return MchTitle[12] ;
case MT_5AXMACHINING : return MchTitle[13] ;
} }
return MchTitle[0] ; return MchTitle[0] ;
} }
+3 -27
View File
@@ -1,7 +1,7 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// EgalTech 2015-2024 // EgalTech 2015-2022
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// File : MachiningsMgr.cpp Data : 29.03.24 Versione : 2.6d1 // File : MachiningsMgr.cpp Data : 04.02.22 Versione : 2.4b1
// Contenuto : Implementazione gestore database lavorazioni. // Contenuto : Implementazione gestore database lavorazioni.
// //
// //
@@ -16,7 +16,6 @@
// 22.06.20 DS Agg. per nuovi parametri attacco tagli di lama (MF_CURR_VER = 1010). // 22.06.20 DS Agg. per nuovi parametri attacco tagli di lama (MF_CURR_VER = 1010).
// 09.11.20 DS Agg. per nuovi parametri tagli di lama (MF_CURR_VER = 1011). // 09.11.20 DS Agg. per nuovi parametri tagli di lama (MF_CURR_VER = 1011).
// 04.02.22 DS Agg. per nuovi parametri svuotature con epicicli (MF_CURR_VER = 1012). // 04.02.22 DS Agg. per nuovi parametri svuotature con epicicli (MF_CURR_VER = 1012).
// 29.03.24 DS Agg. parametro APPROX_LINTOL (MF_CURR_VER = 1013).
// //
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -43,7 +42,7 @@ const string MF_HEADER = "[HEADER]" ;
const string MF_VERSION = "VERSION" ; const string MF_VERSION = "VERSION" ;
const string MF_TOTAL = "TOTAL" ; const string MF_TOTAL = "TOTAL" ;
const string MF_SIZE = "SIZE" ; const string MF_SIZE = "SIZE" ;
const int MF_CURR_VER = 1013 ; const int MF_CURR_VER = 1012 ;
const string MF_GENERAL = "[GENERAL]" ; const string MF_GENERAL = "[GENERAL]" ;
const string MF_3AXCOMP = "3AXCOMP" ; const string MF_3AXCOMP = "3AXCOMP" ;
const bool MF_CURR_3AXCOMP = false ; const bool MF_CURR_3AXCOMP = false ;
@@ -65,8 +64,6 @@ const string MF_INTSAWARCMAXSIDEANG = "INTSAWARCMAXSIDEANG" ;
const double MF_CURR_INTSAWARCMAXSIDEANG = 45 ; const double MF_CURR_INTSAWARCMAXSIDEANG = 45 ;
const string MF_SPLITARCS = "SPLITARCS" ; const string MF_SPLITARCS = "SPLITARCS" ;
const int MF_CURR_SPLITARCS = SPLAR_NEVER ; const int MF_CURR_SPLITARCS = SPLAR_NEVER ;
const string MF_APPROX_LINTOL = "APPROX_LINTOL" ;
const double MF_CURR_APPROX_LINTOL = 0.05 ;
const string MF_MAXDEPTHSAFE = "MAXDEPTHSAFE" ; const string MF_MAXDEPTHSAFE = "MAXDEPTHSAFE" ;
const double MF_CURR_MAXDEPTHSAFE = 2.0 ; const double MF_CURR_MAXDEPTHSAFE = 2.0 ;
@@ -88,7 +85,6 @@ MachiningsMgr::MachiningsMgr( void)
m_dExtSawArcMinRad = MF_CURR_EXTSAWARCMINRAD ; m_dExtSawArcMinRad = MF_CURR_EXTSAWARCMINRAD ;
m_dIntSawArcMaxSideAng = MF_CURR_INTSAWARCMAXSIDEANG ; m_dIntSawArcMaxSideAng = MF_CURR_INTSAWARCMAXSIDEANG ;
m_nSplitArcs = MF_CURR_SPLITARCS ; m_nSplitArcs = MF_CURR_SPLITARCS ;
m_dApproxLinTol = MF_CURR_APPROX_LINTOL ;
m_dMaxDepthSafe = MF_CURR_MAXDEPTHSAFE ; m_dMaxDepthSafe = MF_CURR_MAXDEPTHSAFE ;
} }
@@ -316,8 +312,6 @@ MachiningsMgr::LoadGeneral( Scanner& TheScanner, bool& bEnd)
bOk = FromString( sVal, m_dIntSawArcMaxSideAng) ; bOk = FromString( sVal, m_dIntSawArcMaxSideAng) ;
else if ( ToUpper( sKey) == MF_SPLITARCS) else if ( ToUpper( sKey) == MF_SPLITARCS)
bOk = FromString( sVal, m_nSplitArcs) ; bOk = FromString( sVal, m_nSplitArcs) ;
else if ( ToUpper( sKey) == MF_APPROX_LINTOL)
bOk = FromString( sVal, m_dApproxLinTol) ;
else if ( ToUpper( sKey) == MF_MAXDEPTHSAFE) else if ( ToUpper( sKey) == MF_MAXDEPTHSAFE)
bOk = FromString( sVal, m_dMaxDepthSafe) ; bOk = FromString( sVal, m_dMaxDepthSafe) ;
else else
@@ -505,10 +499,6 @@ MachiningsMgr::SaveGeneral( Writer& TheWriter) const
sOut = MF_MAXDEPTHSAFE + "=" + ToString( m_dMaxDepthSafe) ; sOut = MF_MAXDEPTHSAFE + "=" + ToString( m_dMaxDepthSafe) ;
bOk = bOk && TheWriter.OutText( sOut) ; bOk = bOk && TheWriter.OutText( sOut) ;
} }
if ( m_nDbVer >= 1013) {
sOut = MF_APPROX_LINTOL + "=" + ToString( m_dApproxLinTol) ;
bOk = bOk && TheWriter.OutText( sOut) ;
}
return bOk ; return bOk ;
} }
@@ -1185,20 +1175,6 @@ MachiningsMgr::SetSplitArcs( int nFlag)
return true ; return true ;
} }
//----------------------------------------------------------------------------
bool
MachiningsMgr::SetApproxLinTol( double dLinTol)
{
// verifico non sia inferiore al minimo
dLinTol = max( dLinTol, EPS_SMALL) ;
// se cambiato, salvo e setto modifica
if ( abs( dLinTol - m_dApproxLinTol) > EPS_SMALL) {
m_dApproxLinTol = dLinTol ;
m_bModified = true ;
}
return true ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
MachiningsMgr::SetMaxDepthSafe( double dSafe) MachiningsMgr::SetMaxDepthSafe( double dSafe)
+2 -6
View File
@@ -1,7 +1,7 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// EgalTech 2015-2024 // EgalTech 2015-2015
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// File : MachiningsMgr.h Data : 29.03.24 Versione : 2.6d1 // File : MachiningsMgr.h Data : 02.06.15 Versione : 1.6f1
// Contenuto : Dichiarazione della classe MachiningsMgr. // Contenuto : Dichiarazione della classe MachiningsMgr.
// //
// //
@@ -79,9 +79,6 @@ class MachiningsMgr
bool SetSplitArcs( int nFlag) ; bool SetSplitArcs( int nFlag) ;
int GetSplitArcs( void) const int GetSplitArcs( void) const
{ return m_nSplitArcs ; } { return m_nSplitArcs ; }
bool SetApproxLinTol( double dLinTol) ;
double GetApproxLinTol( void) const
{ return m_dApproxLinTol ; }
bool SetMaxDepthSafe( double dSafe) ; bool SetMaxDepthSafe( double dSafe) ;
double GetMaxDepthSafe( void) const double GetMaxDepthSafe( void) const
{ return m_dMaxDepthSafe ; } { return m_dMaxDepthSafe ; }
@@ -134,6 +131,5 @@ class MachiningsMgr
double m_dExtSawArcMinRad ; double m_dExtSawArcMinRad ;
double m_dIntSawArcMaxSideAng ; double m_dIntSawArcMaxSideAng ;
int m_nSplitArcs ; int m_nSplitArcs ;
double m_dApproxLinTol ;
double m_dMaxDepthSafe ; double m_dMaxDepthSafe ;
} ; } ;
+770 -1678
View File
File diff suppressed because it is too large Load Diff
+12 -35
View File
@@ -85,7 +85,7 @@ class Milling : public Machining
bool AdjustPathDrawForSaw( int nClPathId) ; bool AdjustPathDrawForSaw( int nClPathId) ;
bool CalcPathElevation( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dRad, double& dElev) const ; bool CalcPathElevation( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dRad, double& dElev) const ;
bool VerifyPathFromBottom( const ICurveComposite* pCompo, const Vector3d& vtTool) ; bool VerifyPathFromBottom( const ICurveComposite* pCompo, const Vector3d& vtTool) ;
bool GenerateMillingPv( int nPathId, const ICurveComposite* pCompo, double dRbDist, double dDepth) ; bool GenerateMillingPv( int nPathId, const ICurveComposite* pCompo) ;
bool AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTool, bool AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTool,
double dDepth, double dElev, bool bSplitArcs, bool bPathTabsEnable, bool bPathOscEnable) ; double dDepth, double dElev, bool bSplitArcs, bool bPathTabsEnable, bool bPathOscEnable) ;
bool AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dElev, bool AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dElev,
@@ -96,26 +96,21 @@ class Milling : public Machining
double dDepth, double dElev, double dOkStep, bool bSplitArcs, bool bPathTabsEnable, bool bPathOscEnable) ; double dDepth, double dElev, double dOkStep, bool bSplitArcs, bool bPathTabsEnable, bool bPathOscEnable) ;
bool AddSawZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool, bool AddSawZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool,
double dDepth, double dElev, double dOkStep, bool bSplitArcs) ; double dDepth, double dElev, double dOkStep, bool bSplitArcs) ;
bool AddSawOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool,
double dDepth, double dElev, double dOkStep, bool bSplitArcs) ;
bool AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ, bool AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
double dElev, double dAppr, bool bOutStart, bool bAboveStart, bool bFirst, bool bSplitArcs) ; double dElev, double dAppr, bool bOutStart, bool bAboveStart) ;
bool AddSawBladeSideApproach( const Point3d& ptP, const Vector3d& vtAppr, const Vector3d& vtTool, bool AddSawBladeSideApproach( const Point3d& ptP, const Vector3d& vtAppr, double dSafeZ, double dStElev, double dAppr) ;
double dSafeZ, double dSawStElev, double dStElev, double dAppr, bool AddDirectApproach( const Point3d& ptP) ;
bool bFirst, bool bSplitArcs, bool bAddInsert = false) ;
bool AddDirectApproach( const Point3d& ptP, bool bSplitArcs) ;
bool AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ, bool AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
double dElev, double dAppr, bool bAboveEnd, bool bSplitArcs) ; double dElev, double dAppr, bool bAboveEnd) ;
bool AddSawBladeSideRetract( const Point3d& ptP, const Vector3d& vtRetr, const Vector3d& vtTool, bool AddSawBladeSideRetract( const Point3d& ptP, const Vector3d& vtRetr, double dSafeZ, double dEndElev, double dAppr) ;
double dSafeZ, double dSawEndElev, double dEndElev, double dAppr, bool bAddExtract = false) ;
bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtTool, bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtTool,
double dStElev, bool bInvert, const ICurveComposite* pCompo, Point3d& ptP1, Vector3d& vtDir1) const ; double dStElev, bool bInvert, const ICurveComposite* pCompo, Point3d& ptP1) const ;
bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart,
const Vector3d& vtTool, double dStElev, bool bInvert, const ICurveComposite* pCompo, bool bSplitArcs) ; const Vector3d& vtTool, bool bInvert, const ICurveComposite* pCompo, bool bSplitArcs) ;
bool CalcLeadOutEnd( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d& vtTool, bool CalcLeadOutEnd( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d& vtTool,
double dEndElev, bool bInvert, const ICurveComposite* pCompo, Point3d& ptP1) const ; double dEndElev, bool bInvert, const ICurveComposite* pCompo, Point3d& ptP1) const ;
bool AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d& vtTool, double dEndElev, bool AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d& vtTool, double dEndElev,
bool bInvert, const ICurveComposite* pCompo, bool bSplitArcs, Point3d& ptP1, Vector3d& vtDir1) ; bool bInvert, const ICurveComposite* pCompo, bool bSplitArcs, Point3d& ptP1) ;
bool AdjustOscillParams( const ICurve* pCrv, bool& bPathOscEnable, double& dRampLen, double& dFlatLen) ; bool AdjustOscillParams( const ICurve* pCrv, bool& bPathOscEnable, double& dRampLen, double& dFlatLen) ;
bool AddOscillLine( const ICurveLine* pLine, const Vector3d& vtTool, double dRampLen, double dFlatLen) ; bool AddOscillLine( const ICurveLine* pLine, const Vector3d& vtTool, double dRampLen, double dFlatLen) ;
bool AddOscillArc( const ICurveArc* pArc, const Vector3d& vtTool, double dRampLen, double dFlatLen) ; bool AddOscillArc( const ICurveArc* pArc, const Vector3d& vtTool, double dRampLen, double dFlatLen) ;
@@ -124,14 +119,11 @@ class Milling : public Machining
bool AddTabsLine( const ICurveLine* pLine, const Vector3d& vtTool, const DBLVECTOR& vdTabs, const TabData& tdTabs) ; bool AddTabsLine( const ICurveLine* pLine, const Vector3d& vtTool, const DBLVECTOR& vdTabs, const TabData& tdTabs) ;
bool AddTabsArc( const ICurveArc* pArc, const Vector3d& vtTool, const DBLVECTOR& vdTabs, const TabData& tdTabs) ; bool AddTabsArc( const ICurveArc* pArc, const Vector3d& vtTool, const DBLVECTOR& vdTabs, const TabData& tdTabs) ;
double GetRadiusForStartEndElevation( bool bExtra = true) const ; double GetRadiusForStartEndElevation( bool bExtra = true) const ;
bool GetSimplePointOutOfRaw( const Point3d& ptP, const Vector3d& vtTool, const Vector3d& vtCorr) const ;
bool GetPointOutOfRaw( const Point3d& ptP, const Vector3d& vtTool, const Vector3d& vtCorr, double dElev, double dSafeZ) const ; bool GetPointOutOfRaw( const Point3d& ptP, const Vector3d& vtTool, const Vector3d& vtCorr, double dElev, double dSafeZ) const ;
bool GetPointAboveRaw( const Point3d& ptP, const Vector3d& vtTool) const ; bool GetPointAboveRaw( const Point3d& ptP, const Vector3d& vtTool) const ;
bool GetPointBelowRaw( const Point3d& ptP, const Vector3d& vtTool) const ; bool CalcAndSetCorrAuxDir( const ICurveComposite* pCompo, double dU) ;
bool CalcAndSetCorrAuxDir( const ICurveComposite* pCompo, double dU, bool bInvertSide = false, bool bSawSpecial = false) ; Vector3d CalcCorrDir( const ICurveComposite* pCompo, double dU) ;
Vector3d CalcCorrDir( const ICurveComposite* pCompo, double dU, bool bInvertSide = false, bool bSawSpecial = false) ;
bool CalcOffset( ICurveComposite* pCompo, double dSignOffs) ; bool CalcOffset( ICurveComposite* pCompo, double dSignOffs) ;
bool TrimExtendCurveToClosedStm( ICurveComposite* pCompo, int nCstmId, bool bInvert) ;
private : private :
double GetSpeed() const double GetSpeed() const
@@ -153,17 +145,7 @@ class Milling : public Machining
bool IsLeadInHelixOrZigzag() const bool IsLeadInHelixOrZigzag() const
{ int nType = GetLeadInType() ; { int nType = GetLeadInType() ;
return ( nType == MILL_LI_ZIGZAG || nType == MILL_LI_HELIX) ; } return ( nType == MILL_LI_ZIGZAG || nType == MILL_LI_HELIX) ; }
bool IsLeadInHelixOrZigzagOrGlide() const friend class LeadIOStatus ;
{ int nType = GetLeadInType() ;
return ( nType == MILL_LI_ZIGZAG || nType == MILL_LI_HELIX || nType == MILL_LI_GLIDE) ; }
bool LeadInRawIsOk( void) const
{ if ( ( m_TParams.m_nType & TF_SAWBLADE) != 0)
return false ;
if ( m_TParams.m_nType != TT_MILL_NOTIP)
return true ;
return ( IsLeadInHelixOrZigzag() &&
m_Params.m_dLiTang >= 0.9 * m_TParams.m_dDiam && m_Params.m_dLiElev <= 2) ; }
friend class LeadIOStatus ;
private : private :
SELVECTOR m_vId ; // identificativi entità geometriche da lavorare SELVECTOR m_vId ; // identificativi entità geometriche da lavorare
@@ -178,15 +160,10 @@ class Milling : public Machining
double m_dAddedOverlap ; // overlap effettivamente aggiunto a percorso chiuso double m_dAddedOverlap ; // overlap effettivamente aggiunto a percorso chiuso
int m_nHeadSolCh ; // criterio scelta soluzione impostato nella testa int m_nHeadSolCh ; // criterio scelta soluzione impostato nella testa
bool m_bTiltingTab ; // flag utilizzo tavola basculante bool m_bTiltingTab ; // flag utilizzo tavola basculante
Vector3d m_vtTiltingAx ; // versore direzione eventuale asse basculante
bool m_bAboveHead ; // flag utilizzo testa da sopra bool m_bAboveHead ; // flag utilizzo testa da sopra
bool m_bAggrBottom ; // flag utilizzo di aggregato da sotto bool m_bAggrBottom ; // flag utilizzo di aggregato da sotto
Vector3d m_vtAggrBottom ; // vettore direzione ausiliaria aggregato da sotto Vector3d m_vtAggrBottom ; // vettore direzione ausiliaria aggregato da sotto
AggrBottom m_AggrBottom ; // dati eventuale aggregato da sotto AggrBottom m_AggrBottom ; // dati eventuale aggregato da sotto
double m_dCurrOscillLen ; // lunghezza corrente lungo il percorso per l'oscillazione double m_dCurrOscillLen ; // lunghezza corrente lungo il percorso per l'oscillazione
double m_dCurrTabsLen ; // lunghezza corrente lungo il percorso per tabs double m_dCurrTabsLen ; // lunghezza corrente lungo il percorso per tabs
bool m_bStartOutRaw ; // flag forzatura inizio fuori dal grezzo
bool m_bEndOutRaw ; // flag forzatura fine fuori dal grezzo
Vector3d m_vtStartDir ; // direzione iniziale del percorso in elaborazione
Vector3d m_vtEndDir ; // direzione finale del percorso in elaborazione
} ; } ;
+2 -6
View File
@@ -110,10 +110,6 @@ struct MillingData : public MachiningData
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline const MillingData* GetMillingData( const MachiningData* pMdata) inline const MillingData* GetMillingData( const MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_MILLING) { return (dynamic_cast<const MillingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<const MillingData*>( pMdata)) ; }
inline MillingData* GetMillingData( MachiningData* pMdata) inline MillingData* GetMillingData( MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_MILLING) { return (dynamic_cast<MillingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<MillingData*>( pMdata)) ; }
+9 -32
View File
@@ -634,9 +634,6 @@ Mortising::Update( bool bPostApply)
return true ; return true ;
} }
// elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo)
RemoveClimbRiseHome() ;
// imposto eventuale asse bloccato da lavorazione // imposto eventuale asse bloccato da lavorazione
SetBlockedRotAxis( m_Params.m_sBlockedAxis) ; SetBlockedRotAxis( m_Params.m_sBlockedAxis) ;
@@ -644,7 +641,7 @@ Mortising::Update( bool bPostApply)
string sHint = ExtractHint( m_Params.m_sUserNotes) ; string sHint = ExtractHint( m_Params.m_sUserNotes) ;
if ( ! m_Params.m_sInitAngs.empty()) if ( ! m_Params.m_sInitAngs.empty())
sHint = m_Params.m_sInitAngs ; sHint = m_Params.m_sInitAngs ;
if ( ! CalculateAxesValues( sHint, true, true)) { if ( ! CalculateAxesValues( sHint, true)) {
string sInfo = m_pMchMgr->GetOutstrokeInfo() ; string sInfo = m_pMchMgr->GetOutstrokeInfo() ;
if ( sInfo.empty()) if ( sInfo.empty())
m_pMchMgr->SetLastError( 2507, "Error in Mortising : axes values not calculable") ; m_pMchMgr->SetLastError( 2507, "Error in Mortising : axes values not calculable") ;
@@ -819,31 +816,11 @@ Mortising::UpdateToolData( bool* pbChanged)
const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ; const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ;
if ( pTdata == nullptr) if ( pTdata == nullptr)
return false ; return false ;
// salvo posizione TC, testa e uscita originali // verifico se sono diversi (ad esclusione del nome)
string sOrigTcPos = m_TParams.m_sTcPos ; m_TParams.m_sName = pTdata->m_sName ;
string sOrigHead = m_TParams.m_sHead ; bool bChanged = ! SameTool( m_TParams, *pTdata) ;
int nOrigExit = m_TParams.m_nExit ;
// verifico se sono diversi (ad esclusione di nome, posizione TC, testa e uscita)
bool bChanged = ( ! SameTool( m_TParams, *pTdata, false)) ;
// aggiorno comunque i parametri // aggiorno comunque i parametri
m_TParams = *pTdata ; m_TParams = *pTdata ;
// se definito attrezzaggio, aggiorno i parametri che ne possono derivare
string sTcPos ; string sHead ; int nExit ;
if ( m_pMchMgr->GetCurrSetupMgr().GetToolData( m_TParams.m_sName, sTcPos, sHead, nExit)) {
if ( sOrigTcPos != sTcPos ||
sOrigHead != sHead ||
nOrigExit != nExit)
bChanged = true ;
m_TParams.m_sTcPos = sTcPos ;
m_TParams.m_sHead = sHead ;
m_TParams.m_nExit = nExit ;
}
else {
if ( sOrigTcPos != pTdata->m_sTcPos ||
sOrigHead != pTdata->m_sHead ||
nOrigExit != pTdata->m_nExit)
bChanged = true ;
}
// eventuali segnalazioni // eventuali segnalazioni
if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) { if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) {
string sInfo = "Warning in Mortising : tool name changed (" + string sInfo = "Warning in Mortising : tool name changed (" +
@@ -1560,8 +1537,8 @@ Mortising::GenerateOnePlungeCl( const Point3d& ptStart, const Point3d& ptEnd, co
double dSafeZ = m_pMchMgr->GetCurrMachiningsMgr()->GetSafeZ() + m_pMchMgr->GetDeltaSafeZ( m_TParams.m_sHead) ; double dSafeZ = m_pMchMgr->GetCurrMachiningsMgr()->GetSafeZ() + m_pMchMgr->GetDeltaSafeZ( m_TParams.m_sHead) ;
double dStartElev = 0 ; double dStartElev = 0 ;
Point3d ptLi = ( nPlunge != MORTISE_PLUNGE_END ? ptStart : ptEnd) + vtTool * dDelta ; Point3d ptLi = ( nPlunge != MORTISE_PLUNGE_END ? ptStart : ptEnd) + vtTool * dDelta ;
bool bUnderStart = GetAhPointUnderRaw( ptLi, vtTool, 0, bool bUnderStart = GetPointUnderRaw( ptLi, vtTool, 0,
GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, vtTool, dStartElev) ; GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, vtTool, dStartElev) ;
// altrimenti ridetermino elevazione su inizio percorso di lavoro // altrimenti ridetermino elevazione su inizio percorso di lavoro
if ( ! bUnderStart) if ( ! bUnderStart)
GetElevation( m_nPhase, ptLi, vtTool, GetRadiusForStartEndElevation(), vtTool, dStartElev) ; GetElevation( m_nPhase, ptLi, vtTool, GetRadiusForStartEndElevation(), vtTool, dStartElev) ;
@@ -1570,7 +1547,7 @@ Mortising::GenerateOnePlungeCl( const Point3d& ptStart, const Point3d& ptEnd, co
int nFirstFlag = ( bFirst ? 1 : 0) ; int nFirstFlag = ( bFirst ? 1 : 0) ;
SetFlag( nFirstFlag) ; SetFlag( nFirstFlag) ;
Point3d ptP1 = ( nPlunge != MORTISE_PLUNGE_END ? ptStart : ptEnd) + vtTool * ( dDelta + dStartElev + dSafeZ) ; Point3d ptP1 = ( nPlunge != MORTISE_PLUNGE_END ? ptStart : ptEnd) + vtTool * ( dDelta + dStartElev + dSafeZ) ;
int nStart = AddRapidStartOrMove( ptP1, bFirst) ; int nStart = ( bFirst ? AddRapidStart( ptP1) : AddRapidMove( ptP1)) ;
if ( nStart == GDB_ID_NULL) if ( nStart == GDB_ID_NULL)
return false ; return false ;
SetFlag( 0) ; SetFlag( 0) ;
@@ -1666,8 +1643,8 @@ Mortising::GenerateOnePlungeCl( const Point3d& ptStart, const Point3d& ptEnd, co
// determino se la fine dell'uscita è esattamente sotto il grezzo, nel qual caso ricalcolo l'elevazione // determino se la fine dell'uscita è esattamente sotto il grezzo, nel qual caso ricalcolo l'elevazione
double dEndElev = 0 ; double dEndElev = 0 ;
Point3d ptLo = ptLast + vtTool * dDelta ; Point3d ptLo = ptLast + vtTool * dDelta ;
bool bUnderEnd = GetAhPointUnderRaw( ptLo, vtTool, 0, bool bUnderEnd = GetPointUnderRaw( ptLo, vtTool, 0,
GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, vtTool, dEndElev) ; GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, vtTool, dEndElev) ;
// altrimenti ridetermino elevazione su fine percorso di lavoro // altrimenti ridetermino elevazione su fine percorso di lavoro
if ( ! bUnderEnd) if ( ! bUnderEnd)
GetElevation( m_nPhase, ptLo, vtTool, GetRadiusForStartEndElevation(), vtTool, dEndElev) ; GetElevation( m_nPhase, ptLo, vtTool, GetRadiusForStartEndElevation(), vtTool, dEndElev) ;
+2 -6
View File
@@ -77,10 +77,6 @@ struct MortisingData : public MachiningData
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline const MortisingData* GetMortisingData( const MachiningData* pMdata) inline const MortisingData* GetMortisingData( const MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_MORTISING) { return (dynamic_cast<const MortisingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<const MortisingData*>( pMdata)) ; }
inline MortisingData* GetMortisingData( MachiningData* pMdata) inline MortisingData* GetMortisingData( MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_MORTISING) { return (dynamic_cast<MortisingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<MortisingData*>( pMdata)) ; }
+517 -1385
View File
File diff suppressed because it is too large Load Diff
+14 -71
View File
@@ -14,7 +14,6 @@
#pragma once #pragma once
#include "MachMgr.h"
#include "MachConst.h" #include "MachConst.h"
#include "MachineStruConst.h" #include "MachineStruConst.h"
#include "/EgtDev/Include/EGkPoint3d.h" #include "/EgtDev/Include/EGkPoint3d.h"
@@ -22,6 +21,7 @@
#include "/EgtDev/Include/EGkSelection.h" #include "/EgtDev/Include/EGkSelection.h"
#include "/EgtDev/Include/EgtNumCollection.h" #include "/EgtDev/Include/EgtNumCollection.h"
class MachMgr ;
class CamData ; class CamData ;
class ICurve ; class ICurve ;
class ICurveComposite ; class ICurveComposite ;
@@ -43,7 +43,7 @@ class Operation : public IUserObj
virtual int GetPhase( void) const virtual int GetPhase( void) const
{ return m_nPhase ; } { return m_nPhase ; }
virtual bool RemoveHome( void) ; virtual bool RemoveHome( void) ;
std::string GetName( void) const ; std::string GetName( void) const ;
public : public :
virtual int GetType( void) const = 0 ; virtual int GetType( void) const = 0 ;
@@ -61,21 +61,6 @@ class Operation : public IUserObj
{ return true ; } { return true ; }
virtual bool AdjustArcCenterForAxesCalc( const CamData* pCamData, Point3d& ptCen) const virtual bool AdjustArcCenterForAxesCalc( const CamData* pCamData, Point3d& ptCen) const
{ return true ; } { return true ; }
virtual bool NeedSplit( bool bSplit = true, bool bFeed = true) const
{ return ( bSplit && ( m_pMchMgr == nullptr || m_pMchMgr->GetCurrIsRobot())) ; }
virtual double GetMaxSplitLen( bool bSplit = true, bool bFeed = true) const
{ return ( bSplit && ( m_pMchMgr == nullptr || m_pMchMgr->GetCurrIsRobot()) ? ( bFeed ? 5 : 50) : 0) ; }
virtual bool GetSplitArcs( const Vector3d& vtTool) const
{ if ( m_pMchMgr == nullptr || m_pMchMgr->GetCurrIsRobot())
return true ;
int nSplitArcs = m_pMchMgr->GetCurrMachiningsMgr()->GetSplitArcs() ;
return ( nSplitArcs == SPLAR_ALWAYS ||
( nSplitArcs == SPLAR_NO_XY_PLANE && ! vtTool.IsZplus()) ||
( nSplitArcs == SPLAR_GEN_PLANE && vtTool.IsGeneric())) ; }
virtual double GetApproxLinTol( void) const
{ if ( m_pMchMgr == nullptr)
return 50 * EPS_SMALL ;
return m_pMchMgr->GetCurrMachiningsMgr()->GetApproxLinTol() ; }
protected : protected :
Operation( void) ; Operation( void) ;
@@ -86,24 +71,14 @@ class Operation : public IUserObj
const Vector3d& vtDir, double& dElev) const ; const Vector3d& vtDir, double& dElev) const ;
bool GetElevation( int nPhase, const Point3d& ptP, bool GetElevation( int nPhase, const Point3d& ptP,
const Vector3d& vtDir, double& dElev, Vector3d& vtNorm) const ; const Vector3d& vtDir, double& dElev, Vector3d& vtNorm) const ;
bool GetElevation( int nPhase, const Point3d& ptP,
const Vector3d& vtDir, double& dElev, INTVECTOR& vRawStmId) const ;
bool GetElevation( int nPhase, const Point3d& ptP,
const Vector3d& vtDir, double& dElev, Vector3d& vtNorm, INTVECTOR& vRawStmId) const ;
bool GetElevation( int nPhase, const Point3d& ptP1, const Point3d& ptP2, bool GetElevation( int nPhase, const Point3d& ptP1, const Point3d& ptP2,
const Vector3d& vtDir, double& dElev) const ; const Vector3d& vtDir, double& dElev) const ;
bool GetElevation( int nPhase, const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptP3, bool GetElevation( int nPhase, const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptP3,
const Vector3d& vtDir, double& dElev) const ; const Vector3d& vtDir, double& dElev) const ;
bool GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtTool, double dRad, bool GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtTool, double dRad,
const Vector3d& vtDir, double& dElev) const ; const Vector3d& vtDir, double& dElev) const ;
bool GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtTool, double dRad, double dLen, bool GetPointUnderRaw( const Point3d& ptP, const Vector3d& vtTool, double dToolRad, double dToolRadForElev,
const Vector3d& vtDir, double& dElev) const ; double dToolLen, bool bIsSaw, double dSafeZ, const Vector3d& vtDir, double& dElev) const ;
bool GetElevation( int nPhase, const Point3d& ptS, const Point3d& ptE, const Vector3d& vtTool, double dRad, double dLen,
const Vector3d& vtDir, double& dElev) const ;
bool GetAhPointUnderRaw( const Point3d& ptP, const Vector3d& vtTool, double dToolRad, double dToolRadForElev,
double dToolLen, bool bIsSaw, double dSafeZ, const Vector3d& vtDir, double& dElev) const ;
bool GetUhPointAboveRaw( const Point3d& ptP, const Vector3d& vtTool, double dToolRad, double dToolRadForElev,
double dToolLen, bool bIsSaw, double dSafeZ, const Vector3d& vtDir, double& dElev) const ;
bool GetDistanceFromRawSide( int nPhase, const Point3d& ptP, const Vector3d& vtDir, double& dDist) const ; bool GetDistanceFromRawSide( int nPhase, const Point3d& ptP, const Vector3d& vtDir, double& dDist) const ;
bool GetMinDistanceFromRawSide( int nPhase, const Point3d& ptP, double dExpand, bool GetMinDistanceFromRawSide( int nPhase, const Point3d& ptP, double dExpand,
double& dDist, Vector3d& vtDir) const ; double& dDist, Vector3d& vtDir) const ;
@@ -114,20 +89,18 @@ class Operation : public IUserObj
{ double dDummy ; { double dDummy ;
return GetDistanceFromRawBottom( nPhase, nPathId, dToler, dRbDist, dDummy) ; } return GetDistanceFromRawBottom( nPhase, nPathId, dToler, dRbDist, dDummy) ; }
bool GetDistanceFromRawBottom( int nPhase, int nPathId, double dToler, double& dRbDist, double& dAllRbDist) const ; bool GetDistanceFromRawBottom( int nPhase, int nPathId, double dToler, double& dRbDist, double& dAllRbDist) const ;
bool GetDistanceFromRawBottom( int nPhase, BBox3d& b3Test, double dToler, double& dRbDist, double& dAllRbDist) const;
bool GetRawGlobBox( int nPhase, int nPathId, double dToler, BBox3d& b3Raw) const ; bool GetRawGlobBox( int nPhase, int nPathId, double dToler, BBox3d& b3Raw) const ;
bool GetRawGlobBox( int nPhase, const BBox3d& b3Test, double dToler, BBox3d& b3Raw) const ; bool GetRawGlobBox( int nPhase, const BBox3d& b3Test, double dToler, BBox3d& b3Raw) const ;
bool GetCurrRawsGlobBox( BBox3d& b3Raw) const ;
bool AdjustCurveFromSurf( ICurveComposite* pCrvCompo, int nToolDir, int nFaceUse, double dToolThick, int nGrade = 3) ; bool AdjustCurveFromSurf( ICurveComposite* pCrvCompo, int nToolDir, int nFaceUse, double dToolThick, int nGrade = 3) ;
bool ApproxWithArcsIfUseful( ICurveComposite* pCompo, bool bCareTempProp = false) const ; bool ApproxWithArcsIfUseful( ICurveComposite* pCompo, bool bCareTempProp = false) const ;
bool ApproxWithLines( ICurveComposite* pCompo, bool bFeed = true) const ; bool ApproxWithLines( ICurveComposite* pCompo) const ;
bool VerifyArcs( ICurveComposite* pCompo, double dMaxAngCen = MAX_ANG_CEN) const ; bool VerifyArcs( ICurveComposite* pCompo, double dMaxAngCen = MAX_ANG_CEN) const ;
bool CalcAndSetBBox( int nClId) ; bool CalcAndSetBBox( int nClId) ;
bool CalcAndSetAxesBBox( void) ; bool CalcAndSetAxesBBox( void) ;
bool CalcMirrorByDouble( int nClId, const std::string& sUserNotes) ;
bool GetInitialAxesValues( bool bSkipClimb, DBLVECTOR& vAxVal) const ; bool GetInitialAxesValues( bool bSkipClimb, DBLVECTOR& vAxVal) const ;
bool GetClPathInitialAxesValues( int nClPathId, bool bSkipClimb, DBLVECTOR& vAxVal) const ; bool GetClPathInitialAxesValues( int nClPathId, bool bSkipClimb, DBLVECTOR& vAxVal) const ;
bool GetFinalAxesValues( bool bSkipRise, DBLVECTOR& vAxVal) const ; bool GetFinalAxesValues( bool bSkipRise, DBLVECTOR& vAxVal) const ;
@@ -143,16 +116,9 @@ class Operation : public IUserObj
std::string ExtractInfo( const std::string& sNotes, const std::string& sKey) const ; std::string ExtractInfo( const std::string& sNotes, const std::string& sKey) const ;
std::string ExtractHint( const std::string& sNotes) const ; std::string ExtractHint( const std::string& sNotes) const ;
bool SetBlockedRotAxis( const std::string& sBlockedAxis) const ; bool SetBlockedRotAxis( const std::string& sBlockedAxis) const ;
bool CalculateAxesValues( const std::string& sHint, bool bRotContOnNext = true, bool bSolChExact = false) ; bool CalculateAxesValues( const std::string& sHint, bool bSolChExact = false) ;
bool CalculateClPathCenterAxesValues( int nClPathId, int nLinAxes, int nRotAxes, double dRot1W, bool CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, double dRot1W, bool bMaxDeltaR2OnFirst,
bool bMaxDeltaR2OnFirst, bool bRotContOnNext, double dAngDeltaMinForHome, double dAngDeltaMinForHome, const DBLVECTOR& vAxRotHome, DBLVECTOR& vAxRotPrec, int& nOutStrC) ;
const DBLVECTOR& vAxRotHome, DBLVECTOR& vAxRotPrec) ;
bool CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, double dRot1W,
bool bMaxDeltaR2OnFirst, bool bRotContOnNext, double dAngDeltaMinForHome,
const DBLVECTOR& vAxRotHome, DBLVECTOR& vAxRotPrec, int& nOutStrC) ;
bool CalculateClPathRobotAxesValues( int nClPathId, int nLinAxes, int nRotAxes, double dRot1W,
bool bMaxDeltaR2OnFirst, bool bRotContOnNext, double dAngDeltaMinForHome,
const DBLVECTOR& vAxRotHome, DBLVECTOR& vAxRotPrec) ;
bool AdjustStartEndMovements( bool bVerifyPreviousLink = true) ; bool AdjustStartEndMovements( bool bVerifyPreviousLink = true) ;
bool AdjustOneStartMovement( int nClPathId, int nPrevClPathId, Operation* pPrevOp, const DBLVECTOR& vAxPrev, bool bMaxZ) ; bool AdjustOneStartMovement( int nClPathId, int nPrevClPathId, Operation* pPrevOp, const DBLVECTOR& vAxPrev, bool bMaxZ) ;
bool ToolChangeNeeded( const Operation& Op1, const Operation& Op2) const ; bool ToolChangeNeeded( const Operation& Op1, const Operation& Op2) const ;
@@ -161,28 +127,22 @@ class Operation : public IUserObj
bool AddSpecialRise( const DBLVECTOR& vAxVal, bool bOk = true, int nClPathId = GDB_ID_NULL, int nFlag = 0) ; bool AddSpecialRise( const DBLVECTOR& vAxVal, bool bOk = true, int nClPathId = GDB_ID_NULL, int nFlag = 0) ;
bool RemoveRise( int nClPathId = GDB_ID_NULL) ; bool RemoveRise( int nClPathId = GDB_ID_NULL) ;
bool AddHome( void) ; bool AddHome( void) ;
bool RemoveClimbRiseHome( void) ;
bool AddRobotClimb( int nEntId, double dDeltaZ) ;
bool CalcRobotAxesAbovePos( const Point3d& ptP, const Vector3d& vtT, const Vector3d& vtA, double dDeltaZ,
DBLVECTOR& vAx, double* pdNewDeltaZ = nullptr) const ;
bool CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, double& dDeltaZ) const ; bool CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, double& dDeltaZ) const ;
bool GetExtraZ( const DBLVECTOR& vAx1, const Vector3d& vtTool1, bool GetExtraZ( const DBLVECTOR& vAx1, const Vector3d& vtTool1,
const DBLVECTOR& vAx2, const Vector3d& vtTool2, const DBLVECTOR& vAx2, const Vector3d& vtTool2,
double dHomeZ, double& dExtraZ) const ; double dSafeZ, double& dExtraZ) const ;
bool SpecialGetMaxZ( const DBLVECTOR& vAx1, const Vector3d& vtTool1, bool SpecialGetMaxZ( const DBLVECTOR& vAx1, const Vector3d& vtTool1,
const DBLVECTOR& vAx2, const Vector3d& vtTool2, const DBLVECTOR& vAx2, const Vector3d& vtTool2,
double& dMaxZ) const ; double& dMaxZ) const ;
bool GetRotationAtZmax( void) const ; bool GetRotationAtZmax( void) const ;
bool ForcedZmax( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, const BBox3d& b3Raws) const ; bool ForcedZmax( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ;
int GetUserNotesZmax( void) const ; int GetUserNotesZmax( void) const ;
bool GetZHomeDown( void) const ; bool GetZHomeDown( void) const ;
bool TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ; bool TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ;
int SpecialTestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ; bool SpecialMoveZup( DBLVECTOR& vAx, Vector3d& vtTool, int& nFlag, int& nFlag2, bool& bModif) ;
bool SpecialMoveZup( DBLVECTOR& vAx, Vector3d& vtTool, int& nFlag, int& nFlag2, bool& bModif) ;
bool SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, DBLVECTOR& vAxNew, bool& bModif) ; bool SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, DBLVECTOR& vAxNew, bool& bModif) ;
bool GetAggrBottomData( const std::string& sHead, AggrBottom& agbData) const ; bool GetAggrBottomData( const std::string& sHead, AggrBottom& agbData) const ;
bool IsAggrBottom( const std::string& sHead) const ;
protected : protected :
int m_nOwnerId ; // identificativo dell'oggetto geometrico possessore int m_nOwnerId ; // identificativo dell'oggetto geometrico possessore
@@ -198,7 +158,6 @@ class Operation : public IUserObj
bool SetCorrAuxDir( const Vector3d& vtDir) ; bool SetCorrAuxDir( const Vector3d& vtDir) ;
bool SetFeed( double dFeed) ; bool SetFeed( double dFeed) ;
bool SetFlag( int nFlag) ; bool SetFlag( int nFlag) ;
bool SetFlagOnLastMove( int nFlag) ;
bool SetFlag2( int nFlag2) ; bool SetFlag2( int nFlag2) ;
bool SetIndex( int nIndex) ; bool SetIndex( int nIndex) ;
bool GetCurrPos( Point3d& ptCurr) const bool GetCurrPos( Point3d& ptCurr) const
@@ -213,26 +172,12 @@ class Operation : public IUserObj
int AddRapidStart( const Point3d& ptP, const std::string& sName) ; int AddRapidStart( const Point3d& ptP, const std::string& sName) ;
int AddRapidMove( const Point3d& ptP) ; int AddRapidMove( const Point3d& ptP) ;
int AddRapidMove( const Point3d& ptP, const std::string& sName) ; int AddRapidMove( const Point3d& ptP, const std::string& sName) ;
int AddRapidMove( const Point3d& ptP, bool bSplit) ;
int AddRapidMove( const Point3d& ptP, bool bSplit, const std::string& sName) ;
int AddRapidStartOrMove( const Point3d& ptP, bool bFirst)
{ return ( bFirst ? AddRapidStart( ptP) : AddRapidMove( ptP)) ; }
int AddRapidStartOrMove( const Point3d& ptP, bool bFirst, const std::string& sName)
{ return ( bFirst ? AddRapidStart( ptP, sName) : AddRapidMove( ptP, sName)) ; }
int AddRapidStartOrMove( const Point3d& ptP, bool bFirst, bool bSplit)
{ return ( bFirst ? AddRapidStart( ptP) : AddRapidMove( ptP, bSplit)) ; }
int AddRapidStartOrMove( const Point3d& ptP, bool bFirst, bool bSplit, const std::string& sName)
{ return ( bFirst ? AddRapidStart( ptP, sName) : AddRapidMove( ptP, bSplit, sName)) ; }
int AddLinearMove( const Point3d& ptP) ; int AddLinearMove( const Point3d& ptP) ;
int AddLinearMove( const Point3d& ptP, const std::string& sName) ; int AddLinearMove( const Point3d& ptP, const std::string& sName) ;
int AddLinearMove( const Point3d& ptP, bool bSplit) ;
int AddLinearMove( const Point3d& ptP, bool bSplit, const std::string& sName) ;
int AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN) ; int AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN) ;
int AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN, const std::string& sName) ; int AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN, const std::string& sName) ;
int AddCurveMove( const ICurve* pCrv) ; int AddCurveMove( const ICurve* pCrv, bool bOnlySimple = false) ;
int AddCurveMove( const ICurve* pCrv, const std::string& sName) ; int AddCurveMove( const ICurve* pCrv, const std::string& sName, bool bOnlySimple = false) ;
int AddCurveMove( const ICurve* pCrv, bool bSplit) ;
int AddCurveMove( const ICurve* pCrv, bool bSplit, const std::string& sName) ;
bool ResetMoveData( void) ; bool ResetMoveData( void) ;
protected : protected :
@@ -259,5 +204,3 @@ inline Operation* GetOperation( IUserObj* pUserObj)
enum { TOOL_PARAL = 1, TOOL_ORTHO = 2, TOOL_ORTUP = 3, TOOL_PAR_SLANT= 4} ; enum { TOOL_PARAL = 1, TOOL_ORTHO = 2, TOOL_ORTUP = 3, TOOL_PAR_SLANT= 4} ;
// tipo di utilizzo contorno faccia // tipo di utilizzo contorno faccia
enum { FACE_DOWN = 1, FACE_TOP = 2, FACE_FRONT = 3, FACE_BACK = 4, FACE_LEFT = 5, FACE_RIGHT = 6, FACE_CONT = 7} ; enum { FACE_DOWN = 1, FACE_TOP = 2, FACE_FRONT = 3, FACE_BACK = 4, FACE_LEFT = 5, FACE_RIGHT = 6, FACE_CONT = 7} ;
// risultato di SpecialTestCollisionAvoid
enum { SCAV_ERROR = -1, SCAV_COLLIDE = 0, SCAV_AVOID = 1, SCAV_TOTEST = 2};
+6 -123
View File
@@ -82,18 +82,6 @@ Operation::SetFlag( int nFlag)
return true ; return true ;
} }
//----------------------------------------------------------------------------
bool
Operation::SetFlagOnLastMove( int nFlag)
{
int nLastEntId = m_pGeomDB->GetLastInGroup( m_nPathId) ;
CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nLastEntId)) ;
if ( pCamData == nullptr)
return false ;
pCamData->SetFlag( nFlag) ;
return true ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Operation::SetFlag2( int nFlag2) Operation::SetFlag2( int nFlag2)
@@ -212,46 +200,6 @@ Operation::AddRapidMove( const Point3d& ptP, const string& sName)
return nId ; return nId ;
} }
//----------------------------------------------------------------------------
int
Operation::AddRapidMove( const Point3d& ptP, bool bSplit)
{
// se non richiesta spezzatura con massima lunghezza, emissione normale
if ( ! NeedSplit( bSplit))
return AddRapidMove( ptP) ;
// altrimenti opportuna spezzatura
Point3d ptS ;
if ( ! GetCurrPos( ptS))
return GDB_ID_NULL ;
double dLen = Dist( ptS, ptP) ;
double dStep = GetMaxSplitLen( true, false) ;
int nStep = int( dLen / dStep + 0.999) ;
int nFirstId = GDB_ID_NULL ;
for ( int i = 1 ; i <= nStep ; ++ i) {
int nId = AddRapidMove( Media( ptS, ptP, i * 1.0 / nStep)) ;
if ( nId == GDB_ID_NULL)
return GDB_ID_NULL ;
if ( nFirstId == GDB_ID_NULL)
nFirstId = nId ;
SetFlag( 0) ;
SetFlag2( 0) ;
}
return nFirstId ;
}
//----------------------------------------------------------------------------
int
Operation::AddRapidMove( const Point3d& ptP, bool bSplit, const string& sName)
{
int nFirstId = AddRapidMove( ptP, bSplit) ;
int nId = nFirstId ;
while ( nId != GDB_ID_NULL) {
m_pGeomDB->SetName( nId, sName) ;
nId = m_pGeomDB->GetNext( nId) ;
}
return nFirstId ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
int int
Operation::AddLinearMove( const Point3d& ptP) Operation::AddLinearMove( const Point3d& ptP)
@@ -310,44 +258,6 @@ Operation::AddLinearMove( const Point3d& ptP, const string& sName)
return nId ; return nId ;
} }
//----------------------------------------------------------------------------
int
Operation::AddLinearMove( const Point3d& ptP, bool bSplit)
{
// se non richiesta spezzatura con massima lunghezza, emissione normale
if ( ! NeedSplit( bSplit))
return AddLinearMove( ptP) ;
// altrimenti opportuna spezzatura
Point3d ptS ;
if ( ! GetCurrPos( ptS))
return GDB_ID_NULL ;
double dLen = Dist( ptS, ptP) ;
double dStep = GetMaxSplitLen( true, true) ;
int nStep = int( dLen / dStep + 0.999) ;
int nFirstId = GDB_ID_NULL ;
for ( int i = 1 ; i <= nStep ; ++ i) {
int nId = AddLinearMove( Media( ptS, ptP, i * 1.0 / nStep)) ;
if ( nId == GDB_ID_NULL)
return GDB_ID_NULL ;
if ( nFirstId == GDB_ID_NULL)
nFirstId = nId ;
}
return nFirstId ;
}
//----------------------------------------------------------------------------
int
Operation::AddLinearMove( const Point3d& ptP, bool bSplit, const string& sName)
{
int nFirstId = AddLinearMove( ptP, bSplit) ;
int nId = nFirstId ;
while ( nId != GDB_ID_NULL) {
m_pGeomDB->SetName( nId, sName) ;
nId = m_pGeomDB->GetNext( nId) ;
}
return nFirstId ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
int int
Operation::AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN) Operation::AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN)
@@ -424,7 +334,7 @@ Operation::AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen,
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
int int
Operation::AddCurveMove( const ICurve* pCrv) Operation::AddCurveMove( const ICurve* pCrv, bool bOnlySimple)
{ {
// verifico che la curva esista // verifico che la curva esista
if ( pCrv == nullptr) if ( pCrv == nullptr)
@@ -445,8 +355,8 @@ Operation::AddCurveMove( const ICurve* pCrv)
pArc->GetEndPoint( ptP3) ; pArc->GetEndPoint( ptP3) ;
return AddArcMove( ptP3, ptCen, dAngCen, vtN) ; return AddArcMove( ptP3, ptCen, dAngCen, vtN) ;
} }
// se arco o curva composita // se ammesse curve composite
else if ( pCrv->GetType() == CRV_ARC || pCrv->GetType() == CRV_COMPO) { else if ( ! bOnlySimple) {
// in ogni caso, converto in archi e rette // in ogni caso, converto in archi e rette
PtrOwner<ICurveComposite> pCompo( CreateCurveComposite()) ; PtrOwner<ICurveComposite> pCompo( CreateCurveComposite()) ;
if ( ! pCompo->AddCurve( *pCrv)) if ( ! pCompo->AddCurve( *pCrv))
@@ -485,43 +395,16 @@ Operation::AddCurveMove( const ICurve* pCrv)
} }
return nFirstId ; return nFirstId ;
} }
// altre curve non ammesse // altrimenti
else else
return GDB_ID_NULL ; return GDB_ID_NULL ;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
int int
Operation::AddCurveMove( const ICurve* pCrv, const string& sName) Operation::AddCurveMove( const ICurve* pCrv, const string& sName, bool bOnlySimple)
{ {
int nFirstId = AddCurveMove( pCrv) ; int nFirstId = AddCurveMove( pCrv, bOnlySimple) ;
int nId = nFirstId ;
while ( nId != GDB_ID_NULL) {
m_pGeomDB->SetName( nId, sName) ;
nId = m_pGeomDB->GetNext( nId) ;
}
return nFirstId ;
}
//----------------------------------------------------------------------------
int
Operation::AddCurveMove( const ICurve* pCrv, bool bSplit)
{
// se non richiesta spezzatura, emissione normale
if ( ! bSplit)
return AddCurveMove( pCrv) ;
// altrimenti opportuna spezzatura
PtrOwner<ICurveComposite> pCompo ;
if ( ! pCompo.Set( ConvertCurveToComposite( pCrv->Clone())) || ! ApproxWithLines( pCompo))
return false ;
return AddCurveMove( pCompo) ;
}
//----------------------------------------------------------------------------
int
Operation::AddCurveMove( const ICurve* pCrv, bool bSplit, const string& sName)
{
int nFirstId = AddCurveMove( pCrv, bSplit) ;
int nId = nFirstId ; int nId = nFirstId ;
while ( nId != GDB_ID_NULL) { while ( nId != GDB_ID_NULL) {
m_pGeomDB->SetName( nId, sName) ; m_pGeomDB->SetName( nId, sName) ;
+44 -115
View File
@@ -60,7 +60,6 @@ static const std::string GVAR_TOOL = ".TOOL" ; // (string) nome uten
static const std::string GVAR_HEAD = ".HEAD" ; // (string) nome testa static const std::string GVAR_HEAD = ".HEAD" ; // (string) nome testa
static const std::string GVAR_EXIT = ".EXIT" ; // (int) indice uscita static const std::string GVAR_EXIT = ".EXIT" ; // (int) indice uscita
static const std::string GVAR_TCPOS = ".TCPOS" ; // (string) eventuale posizione utensile nel TC static const std::string GVAR_TCPOS = ".TCPOS" ; // (string) eventuale posizione utensile nel TC
static const std::string GVAR_TTYPE = ".TTYPE" ; // (int) tipo utensile
static const std::string GVAR_TCOMP = ".TCOMP" ; // (int) numero correttore utensile static const std::string GVAR_TCOMP = ".TCOMP" ; // (int) numero correttore utensile
static const std::string GVAR_TDIAM = ".TDIAM" ; // (num) diametro utensile static const std::string GVAR_TDIAM = ".TDIAM" ; // (num) diametro utensile
static const std::string GVAR_TTOTDIAM = ".TTOTDIAM" ; // (num) diametro totale utensile static const std::string GVAR_TTOTDIAM = ".TTOTDIAM" ; // (num) diametro totale utensile
@@ -103,9 +102,6 @@ static const std::string GVAR_R1 = ".R1" ; // (num) valore de
static const std::string GVAR_R2 = ".R2" ; // (num) valore del secondo asse rotante static const std::string GVAR_R2 = ".R2" ; // (num) valore del secondo asse rotante
static const std::string GVAR_R3 = ".R3" ; // (num) valore del terzo asse rotante static const std::string GVAR_R3 = ".R3" ; // (num) valore del terzo asse rotante
static const std::string GVAR_R4 = ".R4" ; // (num) valore del quarto asse rotante static const std::string GVAR_R4 = ".R4" ; // (num) valore del quarto asse rotante
static const std::string GVAR_R5 = ".R5" ; // (num) valore del quinto asse rotante
static const std::string GVAR_R6 = ".R6" ; // (num) valore del sesto asse rotante
static const std::string GVAR_R7 = ".R7" ; // (num) valore del settimo asse rotante
static const std::string GVAR_C1 = ".C1" ; // (num) valore del primo asse lineare per centro arco static const std::string GVAR_C1 = ".C1" ; // (num) valore del primo asse lineare per centro arco
static const std::string GVAR_C2 = ".C2" ; // (num) valore del secondo asse lineare per centro arco static const std::string GVAR_C2 = ".C2" ; // (num) valore del secondo asse lineare per centro arco
static const std::string GVAR_C3 = ".C3" ; // (num) valore del terzo asse lineare per centro arco static const std::string GVAR_C3 = ".C3" ; // (num) valore del terzo asse lineare per centro arco
@@ -121,9 +117,6 @@ static const std::string GVAR_R1P = ".R1p" ; // (num) valore pr
static const std::string GVAR_R2P = ".R2p" ; // (num) valore precedente del secondo asse rotante static const std::string GVAR_R2P = ".R2p" ; // (num) valore precedente del secondo asse rotante
static const std::string GVAR_R3P = ".R3p" ; // (num) valore precedente del terzo asse rotante static const std::string GVAR_R3P = ".R3p" ; // (num) valore precedente del terzo asse rotante
static const std::string GVAR_R4P = ".R4p" ; // (num) valore precedente del quarto asse rotante static const std::string GVAR_R4P = ".R4p" ; // (num) valore precedente del quarto asse rotante
static const std::string GVAR_R5P = ".R5p" ; // (num) valore precedente del quinto asse rotante
static const std::string GVAR_R6P = ".R6p" ; // (num) valore precedente del sesto asse rotante
static const std::string GVAR_R7P = ".R7p" ; // (num) valore precedente del settimo asse rotante
static const std::string GVAR_L1T = ".L1t" ; // (string) token del primo asse lineare static const std::string GVAR_L1T = ".L1t" ; // (string) token del primo asse lineare
static const std::string GVAR_L2T = ".L2t" ; // (string) token del secondo asse lineare static const std::string GVAR_L2T = ".L2t" ; // (string) token del secondo asse lineare
static const std::string GVAR_L3T = ".L3t" ; // (string) token del terzo asse lineare static const std::string GVAR_L3T = ".L3t" ; // (string) token del terzo asse lineare
@@ -131,9 +124,6 @@ static const std::string GVAR_R1T = ".R1t" ; // (string) token del
static const std::string GVAR_R2T = ".R2t" ; // (string) token del secondo asse rotante static const std::string GVAR_R2T = ".R2t" ; // (string) token del secondo asse rotante
static const std::string GVAR_R3T = ".R3t" ; // (string) token del terzo asse rotante static const std::string GVAR_R3T = ".R3t" ; // (string) token del terzo asse rotante
static const std::string GVAR_R4T = ".R4t" ; // (string) token del quarto asse rotante static const std::string GVAR_R4T = ".R4t" ; // (string) token del quarto asse rotante
static const std::string GVAR_R5T = ".R5t" ; // (string) token del quinto asse rotante
static const std::string GVAR_R6T = ".R6t" ; // (string) token del sesto asse rotante
static const std::string GVAR_R7T = ".R7t" ; // (string) token del settimo asse rotante
static const std::string GVAR_C1T = ".C1t" ; // (string) token del primo asse lineare per centro arco static const std::string GVAR_C1T = ".C1t" ; // (string) token del primo asse lineare per centro arco
static const std::string GVAR_C2T = ".C2t" ; // (string) token del secondo asse lineare per centro arco static const std::string GVAR_C2T = ".C2t" ; // (string) token del secondo asse lineare per centro arco
static const std::string GVAR_C3T = ".C3t" ; // (string) token del terzo asse lineare per centro arco static const std::string GVAR_C3T = ".C3t" ; // (string) token del terzo asse lineare per centro arco
@@ -148,9 +138,6 @@ static const std::string GVAR_R1N = ".R1n" ; // (string) nome del
static const std::string GVAR_R2N = ".R2n" ; // (string) nome del secondo asse rotante static const std::string GVAR_R2N = ".R2n" ; // (string) nome del secondo asse rotante
static const std::string GVAR_R3N = ".R3n" ; // (string) nome del terzo asse rotante static const std::string GVAR_R3N = ".R3n" ; // (string) nome del terzo asse rotante
static const std::string GVAR_R4N = ".R4n" ; // (string) nome del quarto asse rotante static const std::string GVAR_R4N = ".R4n" ; // (string) nome del quarto asse rotante
static const std::string GVAR_R5N = ".R5n" ; // (string) nome del quinto asse rotante
static const std::string GVAR_R6N = ".R6n" ; // (string) nome del sesto asse rotante
static const std::string GVAR_R7N = ".R7n" ; // (string) nome del settimo asse rotante
static const std::string GVAR_MASK = ".MASK" ; // (int) mask associato ai movimenti in rapido static const std::string GVAR_MASK = ".MASK" ; // (int) mask associato ai movimenti in rapido
static const std::string GVAR_FLAG = ".FLAG" ; // (int) flag associato ad ogni movimento static const std::string GVAR_FLAG = ".FLAG" ; // (int) flag associato ad ogni movimento
static const std::string GVAR_FLAG2 = ".FLAG2" ; // (int) secondo flag associato ad ogni movimento static const std::string GVAR_FLAG2 = ".FLAG2" ; // (int) secondo flag associato ad ogni movimento
@@ -218,8 +205,6 @@ static const std::string ON_ESTIM_RAPID = "OnEstimRapid" ;
static const std::string ON_ESTIM_LINEAR = "OnEstimLinear" ; static const std::string ON_ESTIM_LINEAR = "OnEstimLinear" ;
static const std::string ON_ESTIM_ARC = "OnEstimArc" ; static const std::string ON_ESTIM_ARC = "OnEstimArc" ;
// Funzioni simulazione // Funzioni simulazione
static const std::string ON_SIMUL_INIT = "OnSimulInit" ;
static const std::string ON_SIMUL_EXIT = "OnSimulExit" ;
static const std::string ON_SIMUL_START = "OnSimulStart" ; static const std::string ON_SIMUL_START = "OnSimulStart" ;
static const std::string ON_SIMUL_END = "OnSimulEnd" ; static const std::string ON_SIMUL_END = "OnSimulEnd" ;
static const std::string ON_SIMUL_DISPOSITION_STARTING = "OnSimulDispositionStarting" ; static const std::string ON_SIMUL_DISPOSITION_STARTING = "OnSimulDispositionStarting" ;
@@ -241,120 +226,64 @@ static const std::string ON_RESET_MACHINE = "OnResetMachine" ;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline std::string inline std::string
GetGlobVarAxisValue( int nAx, const std::string& sVar = GLOB_VAR, bool bIsRobot = false) GetGlobVarAxisValue( int nAx, const std::string& sVar = GLOB_VAR)
{ {
if ( ! bIsRobot) { switch ( nAx) {
switch ( nAx) { case 1 : return ( sVar + GVAR_L1) ;
case 1 : return ( sVar + GVAR_L1) ; case 2 : return ( sVar + GVAR_L2) ;
case 2 : return ( sVar + GVAR_L2) ; case 3 : return ( sVar + GVAR_L3) ;
case 3 : return ( sVar + GVAR_L3) ; case 4 : return ( sVar + GVAR_R1) ;
case 4 : return ( sVar + GVAR_R1) ; case 5 : return ( sVar + GVAR_R2) ;
case 5 : return ( sVar + GVAR_R2) ; case 6 : return ( sVar + GVAR_R3) ;
case 6 : return ( sVar + GVAR_R3) ; case 7 : return ( sVar + GVAR_R4) ;
case 7 : return ( sVar + GVAR_R4) ; default : return "" ;
default : return "" ; }
}
}
else {
switch ( nAx) {
case 1 : return ( sVar + GVAR_R1) ;
case 2 : return ( sVar + GVAR_R2) ;
case 3 : return ( sVar + GVAR_R3) ;
case 4 : return ( sVar + GVAR_R4) ;
case 5 : return ( sVar + GVAR_R5) ;
case 6 : return ( sVar + GVAR_R6) ;
case 7 : return ( sVar + GVAR_R7) ;
default : return "" ;
}
}
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline std::string inline std::string
GetGlobVarAxisPrev( int nAx, const std::string& sVar = GLOB_VAR, bool bIsRobot = false) GetGlobVarAxisPrev( int nAx, const std::string& sVar = GLOB_VAR)
{ {
if ( ! bIsRobot) { switch ( nAx) {
switch ( nAx) { case 1 : return ( sVar + GVAR_L1P) ;
case 1 : return ( sVar + GVAR_L1P) ; case 2 : return ( sVar + GVAR_L2P) ;
case 2 : return ( sVar + GVAR_L2P) ; case 3 : return ( sVar + GVAR_L3P) ;
case 3 : return ( sVar + GVAR_L3P) ; case 4 : return ( sVar + GVAR_R1P) ;
case 4 : return ( sVar + GVAR_R1P) ; case 5 : return ( sVar + GVAR_R2P) ;
case 5 : return ( sVar + GVAR_R2P) ; case 6 : return ( sVar + GVAR_R3P) ;
case 6 : return ( sVar + GVAR_R3P) ; case 7 : return ( sVar + GVAR_R4P) ;
case 7 : return ( sVar + GVAR_R4P) ; default : return "" ;
default : return "" ; }
}
}
else {
switch ( nAx) {
case 1 : return ( sVar + GVAR_R1P) ;
case 2 : return ( sVar + GVAR_R2P) ;
case 3 : return ( sVar + GVAR_R3P) ;
case 4 : return ( sVar + GVAR_R4P) ;
case 5 : return ( sVar + GVAR_R5P) ;
case 6 : return ( sVar + GVAR_R6P) ;
case 7 : return ( sVar + GVAR_R7P) ;
default : return "" ;
}
}
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline std::string inline std::string
GetGlobVarAxisToken( int nAx, bool bIsRobot = false) GetGlobVarAxisToken( int nAx)
{ {
if ( ! bIsRobot) { switch ( nAx) {
switch ( nAx) { case 1 : return ( GLOB_VAR + GVAR_L1T) ;
case 1 : return ( GLOB_VAR + GVAR_L1T) ; case 2 : return ( GLOB_VAR + GVAR_L2T) ;
case 2 : return ( GLOB_VAR + GVAR_L2T) ; case 3 : return ( GLOB_VAR + GVAR_L3T) ;
case 3 : return ( GLOB_VAR + GVAR_L3T) ; case 4 : return ( GLOB_VAR + GVAR_R1T) ;
case 4 : return ( GLOB_VAR + GVAR_R1T) ; case 5 : return ( GLOB_VAR + GVAR_R2T) ;
case 5 : return ( GLOB_VAR + GVAR_R2T) ; case 6 : return ( GLOB_VAR + GVAR_R3T) ;
case 6 : return ( GLOB_VAR + GVAR_R3T) ; case 7 : return ( GLOB_VAR + GVAR_R4T) ;
case 7 : return ( GLOB_VAR + GVAR_R4T) ; default : return "" ;
default : return "" ; }
}
}
else {
switch ( nAx) {
case 1 : return ( GLOB_VAR + GVAR_R1T) ;
case 2 : return ( GLOB_VAR + GVAR_R2T) ;
case 3 : return ( GLOB_VAR + GVAR_R3T) ;
case 4 : return ( GLOB_VAR + GVAR_R4T) ;
case 5 : return ( GLOB_VAR + GVAR_R5T) ;
case 6 : return ( GLOB_VAR + GVAR_R6T) ;
case 7 : return ( GLOB_VAR + GVAR_R7T) ;
default : return "" ;
}
}
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline std::string inline std::string
GetGlobVarAxisName( int nAx, bool bIsRobot = false) GetGlobVarAxisName( int nAx)
{ {
if ( ! bIsRobot) { switch ( nAx) {
switch ( nAx) { case 1 : return ( GLOB_VAR + GVAR_L1N) ;
case 1 : return ( GLOB_VAR + GVAR_L1N) ; case 2 : return ( GLOB_VAR + GVAR_L2N) ;
case 2 : return ( GLOB_VAR + GVAR_L2N) ; case 3 : return ( GLOB_VAR + GVAR_L3N) ;
case 3 : return ( GLOB_VAR + GVAR_L3N) ; case 4 : return ( GLOB_VAR + GVAR_R1N) ;
case 4 : return ( GLOB_VAR + GVAR_R1N) ; case 5 : return ( GLOB_VAR + GVAR_R2N) ;
case 5 : return ( GLOB_VAR + GVAR_R2N) ; case 6 : return ( GLOB_VAR + GVAR_R3N) ;
case 6 : return ( GLOB_VAR + GVAR_R3N) ; case 7 : return ( GLOB_VAR + GVAR_R4N) ;
case 7 : return ( GLOB_VAR + GVAR_R4N) ; default : return "" ;
default : return "" ; }
}
}
else {
switch ( nAx) {
case 1 : return ( GLOB_VAR + GVAR_R1N) ;
case 2 : return ( GLOB_VAR + GVAR_R2N) ;
case 3 : return ( GLOB_VAR + GVAR_R3N) ;
case 4 : return ( GLOB_VAR + GVAR_R4N) ;
case 5 : return ( GLOB_VAR + GVAR_R5N) ;
case 6 : return ( GLOB_VAR + GVAR_R6N) ;
case 7 : return ( GLOB_VAR + GVAR_R7N) ;
default : return "" ;
}
}
} }
+4285 -1884
View File
File diff suppressed because it is too large Load Diff
+67 -43
View File
@@ -19,6 +19,7 @@
#include "/EgtDev/Include/EGkCurveComposite.h" #include "/EgtDev/Include/EGkCurveComposite.h"
#include "/EgtDev/Include/EGkCurveLine.h" #include "/EgtDev/Include/EGkCurveLine.h"
#include "/EgtDev/Include/EgtNumUtils.h" #include "/EgtDev/Include/EgtNumUtils.h"
#include "/EgtDev/Include/EGkSurfFlatRegion.h"
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class Pocketing : public Machining class Pocketing : public Machining
@@ -68,38 +69,64 @@ class Pocketing : public Machining
private : private :
bool VerifyGeometry( SelData Id, int& nSubs, int& nType) ; bool VerifyGeometry( SelData Id, int& nSubs, int& nType) ;
bool GetCurves( SelData Id, ICURVEPLIST& lstPC) ; bool GetCurves( SelData Id, ICURVEPLIST& lstPC) ;
bool SetCurveAllTempProp( int nCrvId, bool bForcedClose, ICurve* pCurve, bool* pbSomeOpen = nullptr) ; bool SetCurveAllTempProp( int nCrvId, ICurve* pCurve) ;
bool ResetCurveAllTempProp( ICurve* pCurve) ; bool ResetCurveAllTempProp( ICurve* pCurve) ;
bool Chain( int nGrpDestId) ; bool Chain( int nGrpDestId) ;
bool ProcessPath( int nPathId, int nPvId, int nClId) ; bool ProcessPath( int nPathId, int nPvId, int nClId) ;
bool CalcRegionElevation( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dRad, double dLen, double& dElev) const ; bool CalcRegionElevation( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dRad, double& dElev) const ;
bool VerifyPathFromBottom( const ICurveComposite* pCompo, const Vector3d& vtTool) ; bool VerifyPathFromBottom( const ISurfFlatRegion* pSrf, const Vector3d& vtTool) ;
bool GeneratePocketingPv( int nPathId, const ICurveComposite* pCompo) ; bool GeneratePocketingPv( int nPathId, const ISurfFlatRegion* pSrfPock) ;
bool AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr,
double dDepth, double dElev, double dOkStep, bool bSplitArcs, int nPathId) ; bool ModifyCurveToSmooted( ICurveComposite* pCrvOffset, double dRightPer, double dleftPer) ;
bool CalcZigZag( const ICurveComposite* pOffs, ICRVCOMPOPOVECTOR& vpCrvs) ;
bool OptimizedZigZag( int nPathId, const Vector3d& vtTool, double dDepth, double dSafeZ, // ===== ZigZag =====
Frame3d& frPocket, bool& bOptimizedZigZag, ICRVCOMPOPOVECTOR& vpCrvs, double& dOffs) ; bool AddZigZag( const ISurfFlatRegion* pSrfPock, const Vector3d& vtTool, const Vector3d& vtExtr, double dDepth, double dElev, double dOkStep,
bool ZigZagOptimizedNoClosedEdges( ICurveComposite* pCrvPocket, bool& bOptimizedZigZag, Vector3d& vtDir, double& dOffs) ; bool bSplitArcs, int nPathId) ;
bool ZigZagOptimizedOneClosedEdge( ICurveComposite* pCrvPocket, int nClosedId, bool& bOptimizedZigZag, Vector3d& vtDir, double& dOffs) ; bool CalcZigZag( const ISurfFlatRegion* pSrfZigZag, ICRVCOMPOPOVECTOR& vpCrvs) ;
bool CalcBoundedZigZagLink( ICurveLine* pCrv1, ICurveLine* pCrv2, ICRVCOMPOPOVECTOR& vOffIslands, ICurveComposite* pCrvLink, int nIndexCut = 3) ;
bool OptimizedZigZag( ISurfFlatRegion* pSrf, const Vector3d & vtTool, double dDepth, double dSafeZ, Frame3d & frPocket, bool & bOptimizedZigZag,
ICRVCOMPOPOVECTOR & vpCrvs) ;
bool ZigZagOptimizedNoClosedEdges( ICurveComposite* pCrvPocket, bool& bOptimizedZigZag, Vector3d& vtDir) ;
bool ZigZagOptimizedOneClosedEdge( ICurveComposite* pCrvPocket, int nClosedId, bool& bOptimizedZigZag, Vector3d& vtDir) ;
bool ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INTVECTOR& vnClosedIds, bool& bOptimizedZigZag, bool ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INTVECTOR& vnClosedIds, bool& bOptimizedZigZag,
bool& bOpposite, Vector3d& vtDir, double& dOffs) ; bool& bOpposite, Vector3d& vtDir) ;
bool ZigZagOptimizedThreeClosedEdges( ICurveComposite* pCrvPocket, const INTVECTOR& vnClosedIds, bool& bOptimizedZigZag, bool ZigZagOptimizedThreeClosedEdges( ICurveComposite* pCrvPocket, const INTVECTOR& vnClosedIds, bool& bOptimizedZigZag,
bool& bOpposite, Vector3d& vtDir, double& dOffs) ; bool& bOpposite, Vector3d& vtDir) ;
bool ZigZagOptimizedComputeOffset( ICurveComposite* pCrvPocket, const Vector3d& vtMainDir, int nOffsettedEdgesOnY, bool ZigZagOptimizedComputeOffset( ICurveComposite* pCrvPocket, const Vector3d& vtMainDir, int nOffsettedEdgesOnY,
const INTVECTOR& vnClosedIds, double& dOffs) ; const INTVECTOR& vnClosedIds) ;
bool CutCurveWithLine( ICurveComposite* pCrvA, const ICurveLine* pCrvB) ; bool CutCurveWithLine( ICurveComposite* pCrvA, const ICurveLine* pCrvB) ;
bool AddOneWay( const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr, bool GetUnclearedRegion( ICRVCOMPOPOVECTOR& vFirstOffs, ICRVCOMPOPOVECTOR& vCrvs, ICURVEPOVECTOR& vLinks, ISurfFlatRegion* pSrfToCut) ;
double dDepth, double dElev, double dOkStep, bool bSplitArcs) ; // ==================
bool AddSpiralIn( const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr,
double dDepth, double dElev, double dOkStep, bool bSplitArcs, bool bMidOpen, // ==== OneWay ======
const Point3d& ptMidOpen, const Vector3d& vtMidOut, int nPathId) ; bool AddOneWay( const ISurfFlatRegion* pSrfPock, const Vector3d& vtTool, const Vector3d& vtExtr, double dDepth, double dElev, double dOkStep, bool bSplitArcs) ;
bool AddSpiralOut( const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr, // ==================
double dDepth, double dElev, double dOkStep, bool bSplitArcs, int nPathId) ;
bool CalcSpiral( const ICurveComposite* pCompo, int nReg, bool bSplitArcs, // ==== SpiralIn/Out ====
ICurveComposite* pMCrv, ICurveComposite* pRCrv, int nPathId, bool& bOptimizedTrap) ; bool AddSpiralIn( const ISurfFlatRegion* pSrfPock, const PNTVECTOR vPtStart, const Vector3d& vtTool, const Vector3d& vtExtr, double dDepth,
bool CalcBoundedLink( const Point3d& ptStart, const Point3d& ptEnd, const ICurve* pCrvBound, double dElev, double dOkStep, bool bSplitArcs, BOOLVECTOR vbMidOpen, PNTVECTOR vPtMidOpen, VCT3DVECTOR vVtMidOut, int nPathId) ;
ICurveComposite* pCrvLink) ; bool AddSpiralOut( const ISurfFlatRegion* pSrfpock, const PNTVECTOR vPtStart, const Vector3d& vtTool, const Vector3d& vtExtr, double dDepth, double dElev,
double dOkStep, bool bSplitArcs, int nPathId) ;
bool CalcSpiral( const ISurfFlatRegion* pSrfChunk, int nReg, Point3d ptStart, bool bSplitArcs, ICurveComposite* pMCrv, ICurveComposite* pRCrv, int nPathId,
bool& bOptimizedTrap) ;
bool RemoveExtraParts( ISurfFlatRegion* pSrfToCut, ICRVCOMPOPOVECTOR& vOffs, ICRVCOMPOPOVECTOR& vOffsClosedCurves, ICRVCOMPOPOVECTOR& vOffsFirstCurve,
ICURVEPOVECTOR& vLinks) ;
bool RemoveExtraPartByMedialAxis( ISurfFlatRegion* pChunkToCut, ICRVCOMPOPOVECTOR& vOffsFirstCurve, int& nOptFlag, Point3d& ptCentroid,
ICurveComposite* pCrvPath) ;
bool CalcBoundedLink( const Point3d& ptStart, const Point3d& ptEnd, ICRVCOMPOPOVECTOR& vOffIslands, ICurveComposite* pCrvLink) ;
bool CalcBoundedSmootedLink( const Point3d& ptStart, const Vector3d& vtStart, const Point3d& ptEnd, const Vector3d& vtEnd, double dParMeet,
ICRVCOMPOPOVECTOR& vOffIslands, ICurveComposite* pCrvLink) ;
bool ModifyBiArc( ICurve* pCrvBiArc, double dCutToll, ICurveComposite* pNewCrv) ;
bool CutCurveByOffsets( ICurveComposite* pCurve, ICRVCOMPOPOVECTOR& vOffs) ;
bool GetCurveWeightInfo( ICurveComposite* pCrvCompo, double dMaxLen, double& dToTRot, int& nSmallArcs, int& nSmallLines) ;
bool ChoosePath( ICurveComposite* pCrv1, ICurveComposite* pCrv2, int nP, double dPerP, double dMaxLen, int& nC) ;
bool CutCurveToConnect( ICurveComposite* pCrvS, ICurveComposite* pCrvE, ICRVCOMPOPOVECTOR& vOffs, ICRVCOMPOPOVECTOR& vOffIslands,
ICurveComposite* pCrvLink, double dLenPercS = 0.01, double dLenPercE = 0.01, int nMaxIter = 2) ;
bool GetNewCurvetWithCentroid( ICurveComposite* pCrvH1, ICurveComposite* pCrvH2, Point3d& ptC, bool bCir, ICRVCOMPOPOVECTOR& VFirstOff,
ICurveComposite* pCrvNewCurve) ;
bool GetNewCurvetWithPath( ICurveComposite* pCrvH1, ICurveComposite* pCrvH2, ICurveComposite* pCrvPath, ICRVCOMPOPOVECTOR& VFirstOff, ICRVCOMPOPOVECTOR& VoffsCl,
ICurveComposite* pCrvNewCurve) ;
bool ManageSmoothAndAutoInters( ICurveComposite* pCrv, ICurveComposite* pCrvPath, ICurveComposite* pPath1, ICurveComposite* pPath2, ICRVCOMPOPOVECTOR& vOffsCL) ;
bool CalcBoundedLinkWithBiArcs( const Point3d& ptStart, const Vector3d& vtStart, const Point3d& ptEnd, const Vector3d& vtEnd, bool CalcBoundedLinkWithBiArcs( const Point3d& ptStart, const Vector3d& vtStart, const Point3d& ptEnd, const Vector3d& vtEnd,
const ICurve* pCrvBound, ICurveComposite* pCrvLink) ; const ICurve* pCrvBound, ICurveComposite* pCrvLink) ;
bool CalcCircleSpiral( const Point3d& ptCen, const Vector3d& vtN, double dOutRad, double dIntRad, bool CalcCircleSpiral( const Point3d& ptCen, const Vector3d& vtN, double dOutRad, double dIntRad,
@@ -112,35 +139,33 @@ class Pocketing : public Machining
bool SpecialAdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* pCrvPocket) ; bool SpecialAdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const ICurveComposite* pCrvPocket) ;
bool AdjustTrapezoidSpiralForLeadInLeadOut( ICurveComposite * pCompo, ICurveComposite * pRCrv, const Vector3d& vtTool, bool AdjustTrapezoidSpiralForLeadInLeadOut( ICurveComposite * pCompo, ICurveComposite * pRCrv, const Vector3d& vtTool,
double dDepth, int& nOutsideRaw) ; double dDepth, int& nOutsideRaw) ;
bool ComputeTrapezoidSpiralLeadInLeadOut( ICurveComposite * pCompo, const Vector3d& vtMainDir, bool bLeadIn, const Vector3d& vtTool, double dDepth, bool& bIsOutsideRaw) ; bool ComputeTrapezoidSpiralLeadInLeadOut( ICurveComposite * pCompo, const Vector3d& vtMainDir, bool bLeadIn, const Vector3d& vtTool, double dDepth,
bool& bIsOutsideRaw) ;
// ==================
bool ComputePolishingPath( ICurveComposite* pMCrv, ICurveComposite* pRCrv, bool bSplitArcs) ; bool ComputePolishingPath( ICurveComposite* pMCrv, ICurveComposite* pRCrv, bool bSplitArcs) ;
bool AddEpicycles( ICurveComposite * pCompo, ICurveComposite * pCrv, ICurveComposite * pCrvBound = nullptr) ; bool AddEpicycles( ICurveComposite * pCompo, ICurveComposite * pCrv, ICurveComposite * pCrvBound = nullptr) ;
bool AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ, bool AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
double dElev, double dAppr, bool bSplitArcs, bool bOutStart) ; double dElev, double dAppr, bool bOutStart) ;
bool AddLinkApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ, bool AddLinkApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
double dElev, double dAppr, bool bSplitArcs, bool bOutStart = false) ; double dElev, double dAppr, bool bOutStart = false) ;
bool AddLinkRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ, bool AddLinkRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
double dElev, double dAppr, bool bSplitArcs) ; double dElev, double dAppr) ;
bool AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ, bool AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ,
double dElev, double dAppr, bool bSplitArcs) ; double dElev, double dAppr) ;
bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN, bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN,
const ICurveComposite* pRCrv, Point3d& ptP1) const ; const ICurveComposite* pRCrv, Point3d& ptP1) const ;
bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN, bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN,
const ICurveComposite* pCompo, const ICurveComposite* pRCrv, bool bAtLeft, bool bSplitArcs, ISurfFlatRegion* pSrfChunk, const ICurveComposite* pRCrv, bool bAtLeft, bool bSplitArcs,
bool bNoneForced = false, bool bSkipControl = false) ; bool bNoneForced = false, bool bSkipControl = false) ;
bool AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d& vtN, bool AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d& vtN,
const ICurveComposite* pRCrv, bool bSplitArcs, bool bNoneForced, const ICurveComposite* pRCrv, bool bSplitArcs, Point3d& ptP1, double& dElev, bool bNoneForced = false) ;
Point3d& ptP1, double& dElev) ;
bool AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d& vtN,
const ICurveComposite* pRCrv, bool bSplitArcs, bool bNoneForced,
Point3d& ptP1, double& dElev, bool& bOppositeHome) ;
double GetRadiusForStartEndElevation( void) const ; double GetRadiusForStartEndElevation( void) const ;
bool GetForcedClosed( void) ;
bool GetMidOfLongestOpenSide( const ICurveComposite* pCompo, Point3d& ptMid, Vector3d& vtMidOut) ; bool GetMidOfLongestOpenSide( const ICurveComposite* pCompo, Point3d& ptMid, Vector3d& vtMidOut) ;
bool AdjustContourWithOpenEdges( ICurveComposite* pCompo) ; bool AdjustContourWithOpenEdges( ICurveComposite* pCompo) ;
bool AdjustContourStart( ICurveComposite* pCompo) ; bool AdjustContourStart( ICurveComposite* pCompo) ;
bool VerifyLeadInHelix( const ICurveComposite* pCompo, const Point3d& ptCen, double dRad) const ; bool VerifyLeadInHelix( ISurfFlatRegion* pSrfChunk, const Point3d& ptCen, double dRad) const ;
bool VerifyLeadInZigZag( const ICurveComposite* pCompo, const Point3d& ptPa, const Point3d& ptPb) const ; bool VerifyLeadInZigZag( ISurfFlatRegion* pSrfChunk, const Point3d& ptPa, const Point3d& ptPb) const ;
bool CalcDistanceFromRawSurface( int nPhase, const Point3d& ptP, const Vector3d& vtDir, double& dDist, Vector3d& vtNorm) ; bool CalcDistanceFromRawSurface( int nPhase, const Point3d& ptP, const Vector3d& vtDir, double& dDist, Vector3d& vtNorm) ;
private : private :
@@ -166,7 +191,7 @@ class Pocketing : public Machining
if ( m_Params.m_nLeadInType != POCKET_LI_GLIDE && m_Params.m_dLiElev < 10 * EPS_SMALL) if ( m_Params.m_nLeadInType != POCKET_LI_GLIDE && m_Params.m_dLiElev < 10 * EPS_SMALL)
return POCKET_LI_NONE ; return POCKET_LI_NONE ;
return m_Params.m_nLeadInType ; } return m_Params.m_nLeadInType ; }
bool LeadInRawIsOk( void) const int LeadInIsOk( void) const
{ if ( m_TParams.m_nType != TT_MILL_NOTIP) { if ( m_TParams.m_nType != TT_MILL_NOTIP)
return true ; return true ;
return (( GetLeadInType() == POCKET_LI_ZIGZAG || GetLeadInType() == POCKET_LI_HELIX) && return (( GetLeadInType() == POCKET_LI_ZIGZAG || GetLeadInType() == POCKET_LI_HELIX) &&
@@ -187,11 +212,10 @@ class Pocketing : public Machining
int m_nStatus ; // stato di aggiornamento della lavorazione int m_nStatus ; // stato di aggiornamento della lavorazione
int m_nPockets ; // numero di percorsi di svuotatura generati int m_nPockets ; // numero di percorsi di svuotatura generati
bool m_bTiltingTab ; // flag utilizzo tavola basculante bool m_bTiltingTab ; // flag utilizzo tavola basculante
Vector3d m_vtTiltingAx ; // versore direzione eventuale asse basculante
bool m_bAboveHead ; // flag utilizzo testa da sopra bool m_bAboveHead ; // flag utilizzo testa da sopra
bool m_bAggrBottom ; // flag di utilizzo dell'aggregato da sotto bool m_bAggrBottom ; // flag di utilizzo dell'aggregato da sotto
Vector3d m_vtAggrBottom ; // vettore direzione ausiliaria aggregato da sotto Vector3d m_vtAggrBottom ; // vettore direzione ausiliaria aggregato da sotto
AggrBottom m_AggrBottom ; // dati eventuale aggregato da sotto AggrBottom m_AggrBottom ; // dati eventuale aggregato da sotto
bool m_bOpenOutRaw ; // flag forzatura lati aperti sempre fuori dal grezzo bool m_bOpenOutRaw ; // flag forzatura lati aperti sempre fuori dal grezzo
double m_dOpenMinSafe ; // minima distanza di sicurezza di attacco su lato aperto POLYLINEVECTOR m_VplIsland ; // vettore che contiene le curve che descrivono le isole
} ; } ;
+2 -6
View File
@@ -83,10 +83,6 @@ struct PocketingData : public MachiningData
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline const PocketingData* GetPocketingData( const MachiningData* pMdata) inline const PocketingData* GetPocketingData( const MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_POCKETING) { return (dynamic_cast<const PocketingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<const PocketingData*>( pMdata)) ; }
inline PocketingData* GetPocketingData( MachiningData* pMdata) inline PocketingData* GetPocketingData( MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_POCKETING) { return (dynamic_cast<PocketingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<PocketingData*>( pMdata)) ; }
+16 -31
View File
@@ -84,9 +84,6 @@ Processor::Run( const string& sOutFile, const string& sInfo)
if ( ! VerifySetup()) if ( ! VerifySetup())
return false ; return false ;
// imposto la fase iniziale come corrente
m_pMchMgr->SetCurrPhase( 1) ;
// evento inizio esecuzione // evento inizio esecuzione
bool bOk = true ; bool bOk = true ;
if ( ! OnStart()) { if ( ! OnStart()) {
@@ -148,9 +145,6 @@ Processor::Run( const string& sOutFile, const string& sInfo)
LOG_ERROR( GetEMkLogger(), "OnEnd error") ; LOG_ERROR( GetEMkLogger(), "OnEnd error") ;
} }
// imposto la fase iniziale come corrente
m_pMchMgr->SetCurrPhase( 1) ;
return bOk ; return bOk ;
} }
@@ -190,8 +184,8 @@ Processor::ProcessDisposition( int nOpId, int nOpInd)
bool bEmpty = pDisp->IsEmpty() ; bool bEmpty = pDisp->IsEmpty() ;
bool bSomeByHand = pDisp->GetSomeByHand() ; bool bSomeByHand = pDisp->GetSomeByHand() ;
// Se disposizione con movimenti autonomi e utensile associato // Se disposizione con movimenti macchina
if ( ! pDisp->IsEmpty() && pDisp->IsWithTool()) { if ( ! pDisp->IsEmpty()) {
// Recupero l'utensile della disposizione corrente // Recupero l'utensile della disposizione corrente
string sTool ; string sHead ; int nExit ; string sTcPos ; string sTool ; string sHead ; int nExit ; string sTcPos ;
if ( ! pDisp->GetToolData( sTool, sHead, nExit, sTcPos)) if ( ! pDisp->GetToolData( sTool, sHead, nExit, sTcPos))
@@ -521,8 +515,8 @@ bool
Processor::UpdateAxes( void) Processor::UpdateAxes( void)
{ {
// Carico i nomi degli assi macchina attivi // Carico i nomi degli assi macchina attivi
return m_pMachine->GetAllCurrAxesNames( m_AxesName) && return m_pMachine->GetAllCurrAxesName( m_AxesName) &&
m_pMachine->GetAllCurrAxesTokens( m_AxesToken) ; m_pMachine->GetAllCurrAxesToken( m_AxesToken) ;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -609,7 +603,6 @@ Processor::ProcessToolData( void)
string sHead ; string sHead ;
int nExit ; int nExit ;
string sTcPos ; string sTcPos ;
int nType ;
int nComp ; int nComp ;
double dDiam ; double dDiam ;
double dTDiam ; double dTDiam ;
@@ -618,7 +611,7 @@ Processor::ProcessToolData( void)
double dDist ; double dDist ;
double dMaxSpeed ; double dMaxSpeed ;
MyToolData( void) MyToolData( void)
: sName(), sHead(), nExit( 0), sTcPos(), nType(0), nComp(0), dDiam( 0), dLen( 0), dDist( 0), dMaxSpeed( 0) {} : sName(), sHead(), nExit( 0), sTcPos(), nComp(0), dDiam( 0), dLen( 0), dDist( 0), dMaxSpeed( 0) {}
} ; } ;
typedef vector<MyToolData> TDATAVECTOR ; typedef vector<MyToolData> TDATAVECTOR ;
TDATAVECTOR vTdata ; TDATAVECTOR vTdata ;
@@ -643,7 +636,6 @@ Processor::ProcessToolData( void)
m_pMchMgr->TdbGetCurrToolParam( TPA_HEAD, Tdata.sHead) ; m_pMchMgr->TdbGetCurrToolParam( TPA_HEAD, Tdata.sHead) ;
m_pMchMgr->TdbGetCurrToolParam( TPA_EXIT, Tdata.nExit) ; m_pMchMgr->TdbGetCurrToolParam( TPA_EXIT, Tdata.nExit) ;
m_pMchMgr->TdbGetCurrToolParam( TPA_TCPOS, Tdata.sTcPos) ; m_pMchMgr->TdbGetCurrToolParam( TPA_TCPOS, Tdata.sTcPos) ;
m_pMchMgr->TdbGetCurrToolParam( TPA_TYPE, Tdata.nType) ;
m_pMchMgr->TdbGetCurrToolParam( TPA_CORR, Tdata.nComp) ; m_pMchMgr->TdbGetCurrToolParam( TPA_CORR, Tdata.nComp) ;
m_pMchMgr->TdbGetCurrToolParam( TPA_DIAM, Tdata.dDiam) ; m_pMchMgr->TdbGetCurrToolParam( TPA_DIAM, Tdata.dDiam) ;
m_pMchMgr->TdbGetCurrToolParam( TPA_TOTDIAM, Tdata.dTDiam) ; m_pMchMgr->TdbGetCurrToolParam( TPA_TOTDIAM, Tdata.dTDiam) ;
@@ -682,8 +674,7 @@ Processor::ProcessToolData( void)
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_EXIT, nExit) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_EXIT, nExit) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCPOS, sTcPos) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCPOS, sTcPos) ;
if ( m_pMchMgr->TdbSetCurrTool( sTool)) { if ( m_pMchMgr->TdbSetCurrTool( sTool)) {
int nType ; int nComp ; double dDiam ; double dTDiam ; double dLen ; double dTLen ; double dDist ; double dMaxSpeed ; int nComp ; double dDiam ; double dTDiam ; double dLen ; double dTLen ; double dDist ; double dMaxSpeed ;
m_pMchMgr->TdbGetCurrToolParam( TPA_TYPE, nType) ;
m_pMchMgr->TdbGetCurrToolParam( TPA_CORR, nComp) ; m_pMchMgr->TdbGetCurrToolParam( TPA_CORR, nComp) ;
m_pMchMgr->TdbGetCurrToolParam( TPA_DIAM, dDiam) ; m_pMchMgr->TdbGetCurrToolParam( TPA_DIAM, dDiam) ;
m_pMchMgr->TdbGetCurrToolParam( TPA_TOTDIAM, dTDiam) ; m_pMchMgr->TdbGetCurrToolParam( TPA_TOTDIAM, dTDiam) ;
@@ -691,7 +682,6 @@ Processor::ProcessToolData( void)
m_pMchMgr->TdbGetCurrToolParam( TPA_TOTLEN, dTLen) ; m_pMchMgr->TdbGetCurrToolParam( TPA_TOTLEN, dTLen) ;
m_pMchMgr->TdbGetCurrToolParam( TPA_DIST, dDist) ; m_pMchMgr->TdbGetCurrToolParam( TPA_DIST, dDist) ;
m_pMchMgr->TdbGetCurrToolParam( TPA_MAXSPEED, dMaxSpeed) ; m_pMchMgr->TdbGetCurrToolParam( TPA_MAXSPEED, dMaxSpeed) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TTYPE, nType) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCOMP, nComp) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCOMP, nComp) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TDIAM, dDiam) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TDIAM, dDiam) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TTOTDIAM, dTDiam) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TTOTDIAM, dTDiam) ;
@@ -731,7 +721,6 @@ Processor::ProcessToolData( void)
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_HEAD, vTdata[i].sHead) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_HEAD, vTdata[i].sHead) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_EXIT, vTdata[i].nExit) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_EXIT, vTdata[i].nExit) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCPOS, vTdata[i].sTcPos) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCPOS, vTdata[i].sTcPos) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TTYPE, vTdata[i].nType) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCOMP, vTdata[i].nComp) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCOMP, vTdata[i].nComp) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TDIAM, vTdata[i].dDiam) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TDIAM, vTdata[i].dDiam) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TTOTDIAM, vTdata[i].dTDiam) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TTOTDIAM, vTdata[i].dTDiam) ;
@@ -843,16 +832,15 @@ Processor::OnToolSelect( const string& sTool, const string& sHead, int nExit, co
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_EXIT, nExit) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_EXIT, nExit) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCPOS, sTcPos) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCPOS, sTcPos) ;
// assegno il token e il nome degli assi // assegno il token e il nome degli assi
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
int nNumAxes = int( m_AxesName.size()) ; int nNumAxes = int( m_AxesName.size()) ;
for ( int i = 1 ; i <= MAX_AXES ; ++ i) { for ( int i = 1 ; i <= MAX_AXES ; ++ i) {
if ( i <= nNumAxes) { if ( i <= nNumAxes) {
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisToken( i, bIsRobot), m_AxesToken[i-1]) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisToken(i), m_AxesToken[i-1]) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisName( i, bIsRobot), m_AxesName[i-1]) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisName(i), m_AxesName[i-1]) ;
} }
else { else {
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisToken( i, bIsRobot)) ; bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisToken(i)) ;
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisName( i, bIsRobot)) ; bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisName(i)) ;
} }
} }
// chiamo la funzione di selezione utensile // chiamo la funzione di selezione utensile
@@ -984,13 +972,12 @@ Processor::OnRapid( int nEntId, int nEntInd, int nMove, const DBLVECTOR& AxesEnd
// assegno il tipo di movimento // assegno il tipo di movimento
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MOVE, nMove) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MOVE, nMove) ;
// assegno il valore degli assi // assegno il valore degli assi
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
int nNumAxes = int( AxesEnd.size()) ; int nNumAxes = int( AxesEnd.size()) ;
for ( int i = 1 ; i <= MAX_AXES ; ++ i) { for ( int i = 1 ; i <= MAX_AXES ; ++ i) {
if ( i <= nNumAxes) if ( i <= nNumAxes)
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot), AxesEnd[i-1]) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue(i), AxesEnd[i-1]) ;
else else
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot)) ; bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue(i)) ;
} }
// assegno la mascheratura degli assi // assegno la mascheratura degli assi
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MASK, nAxesMask) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MASK, nAxesMask) ;
@@ -1025,13 +1012,12 @@ Processor::OnLinear( int nEntId, int nEntInd, int nMove, const DBLVECTOR& AxesEn
// assegno il tipo di movimento // assegno il tipo di movimento
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MOVE, nMove) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MOVE, nMove) ;
// assegno il valore degli assi // assegno il valore degli assi
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
int nNumAxes = int( AxesEnd.size()) ; int nNumAxes = int( AxesEnd.size()) ;
for ( int i = 1 ; i <= MAX_AXES ; ++ i) { for ( int i = 1 ; i <= MAX_AXES ; ++ i) {
if ( i <= nNumAxes) if ( i <= nNumAxes)
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot), AxesEnd[i-1]) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue(i), AxesEnd[i-1]) ;
else else
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot)) ; bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue(i)) ;
} }
// assegno il valore del versore utensile // assegno il valore del versore utensile
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TDIR, vtTool) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TDIR, vtTool) ;
@@ -1065,13 +1051,12 @@ Processor::OnArc( int nEntId, int nEntInd, int nMove, const DBLVECTOR& AxesEnd,
// assegno il tipo di movimento // assegno il tipo di movimento
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MOVE, nMove) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MOVE, nMove) ;
// assegno il valore degli assi // assegno il valore degli assi
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
int nNumAxes = int( AxesEnd.size()) ; int nNumAxes = int( AxesEnd.size()) ;
for ( int i = 1 ; i <= MAX_AXES ; ++ i) { for ( int i = 1 ; i <= MAX_AXES ; ++ i) {
if ( i <= nNumAxes) if ( i <= nNumAxes)
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot), AxesEnd[i-1]) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue(i), AxesEnd[i-1]) ;
else else
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot)) ; bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue(i)) ;
} }
// assegno le coordinate del centro // assegno le coordinate del centro
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_C1, ptCen.x) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_C1, ptCen.x) ;
+10 -47
View File
@@ -607,9 +607,6 @@ SawFinishing::Update( bool bPostApply)
return true ; return true ;
} }
// elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo)
RemoveClimbRiseHome() ;
// imposto eventuale asse bloccato da lavorazione // imposto eventuale asse bloccato da lavorazione
SetBlockedRotAxis( m_Params.m_sBlockedAxis) ; SetBlockedRotAxis( m_Params.m_sBlockedAxis) ;
@@ -798,31 +795,11 @@ SawFinishing::UpdateToolData( bool* pbChanged)
const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ; const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ;
if ( pTdata == nullptr) if ( pTdata == nullptr)
return false ; return false ;
// salvo posizione TC, testa e uscita originali // verifico se sono diversi (ad esclusione del nome)
string sOrigTcPos = m_TParams.m_sTcPos ; m_TParams.m_sName = pTdata->m_sName ;
string sOrigHead = m_TParams.m_sHead ; bool bChanged = ! SameTool( m_TParams, *pTdata) ;
int nOrigExit = m_TParams.m_nExit ;
// verifico se sono diversi (ad esclusione di nome, posizione TC, testa e uscita)
bool bChanged = ( ! SameTool( m_TParams, *pTdata, false)) ;
// aggiorno comunque i parametri // aggiorno comunque i parametri
m_TParams = *pTdata ; m_TParams = *pTdata ;
// se definito attrezzaggio, aggiorno i parametri che ne possono derivare
string sTcPos ; string sHead ; int nExit ;
if ( m_pMchMgr->GetCurrSetupMgr().GetToolData( m_TParams.m_sName, sTcPos, sHead, nExit)) {
if ( sOrigTcPos != sTcPos ||
sOrigHead != sHead ||
nOrigExit != nExit)
bChanged = true ;
m_TParams.m_sTcPos = sTcPos ;
m_TParams.m_sHead = sHead ;
m_TParams.m_nExit = nExit ;
}
else {
if ( sOrigTcPos != pTdata->m_sTcPos ||
sOrigHead != pTdata->m_sHead ||
nOrigExit != pTdata->m_nExit)
bChanged = true ;
}
// eventuali segnalazioni // eventuali segnalazioni
if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) { if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) {
string sInfo = "Warning in SawFinishing : tool name changed (" + string sInfo = "Warning in SawFinishing : tool name changed (" +
@@ -982,15 +959,15 @@ SawFinishing::AdjustGeometry( int nAuxId)
if ( ! pGuide->IsFlat( plPlane, false, 10 * EPS_SMALL) || ! AreSameOrOppositeVectorApprox( plPlane.GetVersN(), Z_AX)) if ( ! pGuide->IsFlat( plPlane, false, 10 * EPS_SMALL) || ! AreSameOrOppositeVectorApprox( plPlane.GetVersN(), Z_AX))
return false ; return false ;
// verifiche sulla curva (che trasformo in composita) // verifiche sulla curva (che trasformo in composita)
PtrOwner<ICurveComposite> pCompo ; PtrOwner<ICurveComposite> pCompo( CreateCurveComposite()) ;
if ( ! pCompo.Set( ConvertCurveToComposite( Release( pGuide)))) if ( IsNull( pCompo) || ! pCompo->AddCurve( Release( pGuide)))
return false ; return false ;
// converto in archi e rette // converto in archi e rette
pCompo->ArcsBezierCurvesToArcsPerpExtr( LIN_TOL_MID, ANG_TOL_STD_DEG) ; pCompo->ArcsBezierCurvesToArcsPerpExtr( LIN_TOL_MID, ANG_TOL_STD_DEG) ;
// verifiche sull'ampiezza dell'angolo al centro degli eventuali archi // verifiche sull'ampiezza dell'angolo al centro degli eventuali archi
VerifyArcs( pCompo) ; VerifyArcs( pCompo) ;
// reinserisco nella curva originale // reinserisco nella curva originale
pGuide.Set( pCompo) ; pGuide.Set( Release( pCompo)) ;
} }
// deve iniziare in comune con la prima sezione ed essere ivi perpendicolare // deve iniziare in comune con la prima sezione ed essere ivi perpendicolare
Vector3d vtGdDir ; Vector3d vtGdDir ;
@@ -1587,18 +1564,6 @@ SawFinishing::CalculateCurvedAcrossToolPath( int nAuxId, int nClId)
// La porto in globale // La porto in globale
PL.ToGlob( frSect) ; PL.ToGlob( frSect) ;
// Calcolo eventuale anticipo dell'inizio
double dAddStart = 0 ;
if ( m_Params.m_nLeadLinkType == SAWFIN_LL_OUT) {
BBox3d b3PL ;
PL.GetLocalBBox( b3PL) ;
double dMaxElev = min( dDepth, b3Raw.GetMax().z - b3PL.GetMin().z) ;
if ( dMaxElev > 0.0 && dMaxElev < 0.5 * m_TParams.m_dDiam)
dAddStart = sqrt( dMaxElev * m_TParams.m_dDiam - dMaxElev * dMaxElev) ;
else
dAddStart = 0.5 * m_TParams.m_dDiam ;
}
// Imposto versore fresa come Z+ // Imposto versore fresa come Z+
Vector3d vtTool = Z_AX ; Vector3d vtTool = Z_AX ;
@@ -1880,7 +1845,6 @@ SawFinishing::ClassifySection( ICurve* pCrv, INTVECTOR& vnClass)
{ {
const ICurveComposite* pCompo = GetCurveComposite( pCrv) ; const ICurveComposite* pCompo = GetCurveComposite( pCrv) ;
if ( pCompo != nullptr) { if ( pCompo != nullptr) {
int Ind = 0 ;
const ICurve* pSimpCrv = pCompo->GetFirstCurve() ; const ICurve* pSimpCrv = pCompo->GetFirstCurve() ;
while ( pSimpCrv != nullptr) { while ( pSimpCrv != nullptr) {
// analizzo la curva // analizzo la curva
@@ -1898,7 +1862,6 @@ SawFinishing::ClassifySection( ICurve* pCrv, INTVECTOR& vnClass)
else else
vnClass.push_back( CCL_FALL) ; vnClass.push_back( CCL_FALL) ;
// passo alla curva successiva // passo alla curva successiva
++ Ind ;
pSimpCrv = pCompo->GetNextCurve() ; pSimpCrv = pCompo->GetNextCurve() ;
} }
} }
@@ -2403,8 +2366,8 @@ SawFinishing::CalcCurvedAlongVerticalCuts( ICurve* pSect, int nUmin, int nUmax,
Vector3d vtMove = ( dY - m_TParams.m_dThick / 2) * Z_AX ; Vector3d vtMove = ( dY - m_TParams.m_dThick / 2) * Z_AX ;
OffsetCurve OffsCrv ; OffsetCurve OffsCrv ;
OffsCrv.Make( pGuide, dOffs, ICurve::OFF_FILLET) ; OffsCrv.Make( pGuide, dOffs, ICurve::OFF_FILLET) ;
PtrOwner<ICurveComposite> pCut ; PtrOwner<ICurveComposite> pCut( CreateCurveComposite()) ;
if ( ! pCut.Set( ConvertCurveToComposite( OffsCrv.GetLongerCurve()))) if ( IsNull( pCut) || ! pCut->AddCurve( OffsCrv.GetLongerCurve()))
return false ; return false ;
VerifyArcs( pCut) ; VerifyArcs( pCut) ;
pCut->SimpleOffset( SAWRF_OFFS, ICurve::OFF_FORCE_OPEN) ; pCut->SimpleOffset( SAWRF_OFFS, ICurve::OFF_FORCE_OPEN) ;
@@ -2478,8 +2441,8 @@ SawFinishing::CalcCurvedAlongStdCuts( ICurve* pSect, double dUmin, double dUmax,
Vector3d vtMove = ( ptP.y - m_TParams.m_dThick / 2) * Z_AX ; Vector3d vtMove = ( ptP.y - m_TParams.m_dThick / 2) * Z_AX ;
OffsetCurve OffsCrv ; OffsetCurve OffsCrv ;
OffsCrv.Make( pGuide, dOffs, ICurve::OFF_FILLET) ; OffsCrv.Make( pGuide, dOffs, ICurve::OFF_FILLET) ;
PtrOwner<ICurveComposite> pCut ; PtrOwner<ICurveComposite> pCut( CreateCurveComposite()) ;
if ( ! pCut.Set( ConvertCurveToComposite( OffsCrv.GetLongerCurve()))) if ( IsNull( pCut) || ! pCut->AddCurve( OffsCrv.GetLongerCurve()))
return false ; return false ;
VerifyArcs( pCut) ; VerifyArcs( pCut) ;
pCut->SimpleOffset( SAWRF_OFFS, ICurve::OFF_FORCE_OPEN) ; pCut->SimpleOffset( SAWRF_OFFS, ICurve::OFF_FORCE_OPEN) ;
+2 -6
View File
@@ -81,10 +81,6 @@ struct SawFinishingData : public MachiningData
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline const SawFinishingData* GetSawFinishingData( const MachiningData* pMdata) inline const SawFinishingData* GetSawFinishingData( const MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_SAWFINISHING) { return (dynamic_cast<const SawFinishingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<const SawFinishingData*>( pMdata)) ; }
inline SawFinishingData* GetSawFinishingData( MachiningData* pMdata) inline SawFinishingData* GetSawFinishingData( MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_SAWFINISHING) { return (dynamic_cast<SawFinishingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<SawFinishingData*>( pMdata)) ; }
+8 -31
View File
@@ -571,9 +571,6 @@ SawRoughing::Update( bool bPostApply)
return true ; return true ;
} }
// elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo)
RemoveClimbRiseHome() ;
// imposto eventuale asse bloccato da lavorazione // imposto eventuale asse bloccato da lavorazione
SetBlockedRotAxis( m_Params.m_sBlockedAxis) ; SetBlockedRotAxis( m_Params.m_sBlockedAxis) ;
@@ -756,31 +753,11 @@ SawRoughing::UpdateToolData( bool* pbChanged)
const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ; const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ;
if ( pTdata == nullptr) if ( pTdata == nullptr)
return false ; return false ;
// salvo posizione TC, testa e uscita originali // verifico se sono diversi (ad esclusione del nome)
string sOrigTcPos = m_TParams.m_sTcPos ; m_TParams.m_sName = pTdata->m_sName ;
string sOrigHead = m_TParams.m_sHead ; bool bChanged = ! SameTool( m_TParams, *pTdata) ;
int nOrigExit = m_TParams.m_nExit ;
// verifico se sono diversi (ad esclusione di nome, posizione TC, testa e uscita)
bool bChanged = ( ! SameTool( m_TParams, *pTdata, false)) ;
// aggiorno comunque i parametri // aggiorno comunque i parametri
m_TParams = *pTdata ; m_TParams = *pTdata ;
// se definito attrezzaggio, aggiorno i parametri che ne possono derivare
string sTcPos ; string sHead ; int nExit ;
if ( m_pMchMgr->GetCurrSetupMgr().GetToolData( m_TParams.m_sName, sTcPos, sHead, nExit)) {
if ( sOrigTcPos != sTcPos ||
sOrigHead != sHead ||
nOrigExit != nExit)
bChanged = true ;
m_TParams.m_sTcPos = sTcPos ;
m_TParams.m_sHead = sHead ;
m_TParams.m_nExit = nExit ;
}
else {
if ( sOrigTcPos != pTdata->m_sTcPos ||
sOrigHead != pTdata->m_sHead ||
nOrigExit != pTdata->m_nExit)
bChanged = true ;
}
// eventuali segnalazioni // eventuali segnalazioni
if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) { if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) {
string sInfo = "Warning in SawRoughing : tool name changed (" + string sInfo = "Warning in SawRoughing : tool name changed (" +
@@ -940,15 +917,15 @@ SawRoughing::AdjustGeometry( int nAuxId)
if ( ! pGuide->IsFlat( plPlane, false, 10 * EPS_SMALL) || ! AreSameOrOppositeVectorApprox( plPlane.GetVersN(), Z_AX)) if ( ! pGuide->IsFlat( plPlane, false, 10 * EPS_SMALL) || ! AreSameOrOppositeVectorApprox( plPlane.GetVersN(), Z_AX))
return false ; return false ;
// verifiche sulla curva (che trasformo in composita) // verifiche sulla curva (che trasformo in composita)
PtrOwner<ICurveComposite> pCompo ; PtrOwner<ICurveComposite> pCompo( CreateCurveComposite()) ;
if ( ! pCompo.Set( ConvertCurveToComposite( Release( pGuide)))) if ( IsNull( pCompo) || ! pCompo->AddCurve( Release( pGuide)))
return false ; return false ;
// converto in archi e rette // converto in archi e rette
pCompo->ArcsBezierCurvesToArcsPerpExtr( LIN_TOL_MID, ANG_TOL_STD_DEG) ; pCompo->ArcsBezierCurvesToArcsPerpExtr( LIN_TOL_MID, ANG_TOL_STD_DEG) ;
// verifiche sull'ampiezza dell'angolo al centro degli eventuali archi // verifiche sull'ampiezza dell'angolo al centro degli eventuali archi
VerifyArcs( pCompo) ; VerifyArcs( pCompo) ;
// reinserisco nella curva originale // reinserisco nella curva originale
pGuide.Set( pCompo) ; pGuide.Set( Release( pCompo)) ;
} }
// deve iniziare in comune con la prima sezione ed essere ivi perpendicolare // deve iniziare in comune con la prima sezione ed essere ivi perpendicolare
Vector3d vtGdDir ; Vector3d vtGdDir ;
@@ -1330,8 +1307,8 @@ SawRoughing::CalculateCurvedToolPath( int nAuxId, int nClId)
// creo la curva di taglio // creo la curva di taglio
OffsetCurve OffsCrv ; OffsetCurve OffsCrv ;
OffsCrv.Make( pGuide, dX, ICurve::OFF_FILLET) ; OffsCrv.Make( pGuide, dX, ICurve::OFF_FILLET) ;
PtrOwner<ICurveComposite> pCut ; PtrOwner<ICurveComposite> pCut( CreateCurveComposite()) ;
if ( ! pCut.Set( ConvertCurveToComposite( OffsCrv.GetLongerCurve()))) if ( IsNull( pCut) || ! pCut->AddCurve( OffsCrv.GetLongerCurve()))
return false ; return false ;
VerifyArcs( pCut) ; VerifyArcs( pCut) ;
Vector3d vtMove = ( dY - m_TParams.m_dThick / 2) * Z_AX ; Vector3d vtMove = ( dY - m_TParams.m_dThick / 2) * Z_AX ;
+2 -6
View File
@@ -78,10 +78,6 @@ struct SawRoughingData : public MachiningData
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline const SawRoughingData* GetSawRoughingData( const MachiningData* pMdata) inline const SawRoughingData* GetSawRoughingData( const MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_SAWROUGHING) { return (dynamic_cast<const SawRoughingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<const SawRoughingData*>( pMdata)) ; }
inline SawRoughingData* GetSawRoughingData( MachiningData* pMdata) inline SawRoughingData* GetSawRoughingData( MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_SAWROUGHING) { return (dynamic_cast<SawRoughingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<SawRoughingData*>( pMdata)) ; }
+68 -141
View File
@@ -4,7 +4,7 @@
// File : Sawing.cpp Data : 24.10.15 Versione : 1.6j3 // File : Sawing.cpp Data : 24.10.15 Versione : 1.6j3
// Contenuto : Implementazione gestione tagli con lama. // Contenuto : Implementazione gestione tagli con lama.
// //
// Note : Questa lavorazione è sempre espressa nel riferimento globale. // Note : Questa lavorazione è sempre espressa nel riferimento globale.
// //
// Modifiche : 07.06.15 DS Creazione modulo. // Modifiche : 07.06.15 DS Creazione modulo.
// //
@@ -532,15 +532,15 @@ Sawing::SetParam( int nType, const string& sVal)
bool bool
Sawing::SetGeometry( const SELVECTOR& vIds) Sawing::SetGeometry( const SELVECTOR& vIds)
{ {
// verifico validità gestore DB geometrico // verifico validità gestore DB geometrico
if ( m_pGeomDB == nullptr) if ( m_pGeomDB == nullptr)
return false ; return false ;
// reset della geometria corrente // reset della geometria corrente
m_vId.clear() ; m_vId.clear() ;
// verifico che gli identificativi rappresentino delle entità ammissibili // verifico che gli identificativi rappresentino delle entità ammissibili
int nType = GEO_NONE ; int nType = GEO_NONE ;
for ( const auto& Id : vIds) { for ( const auto& Id : vIds) {
// test sull'entità // test sull'entità
int nSubs ; int nSubs ;
if ( ! VerifyGeometry( Id, nSubs, nType)) { if ( ! VerifyGeometry( Id, nSubs, nType)) {
string sInfo = "Warning in Sawing : Skipped entity " + ToString( Id) ; string sInfo = "Warning in Sawing : Skipped entity " + ToString( Id) ;
@@ -563,14 +563,14 @@ Sawing::Preview( bool bRecalc)
// reset numero tagli nella lavorazione // reset numero tagli nella lavorazione
m_nCuts = 0 ; m_nCuts = 0 ;
// verifico validità gestore DB geometrico e Id del gruppo // verifico validità gestore DB geometrico e Id del gruppo
if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId))
return false ; return false ;
// recupero gruppo per geometria ausiliaria // recupero gruppo per geometria ausiliaria
int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ; int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ;
bool bChain = false ; bool bChain = false ;
// se non c'è, lo aggiungo // se non c'è, lo aggiungo
if ( nAuxId == GDB_ID_NULL) { if ( nAuxId == GDB_ID_NULL) {
nAuxId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ; nAuxId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ;
if ( nAuxId == GDB_ID_NULL) if ( nAuxId == GDB_ID_NULL)
@@ -603,7 +603,7 @@ Sawing::Preview( bool bRecalc)
// recupero gruppo per anteprima di lavorazione (PreView) // recupero gruppo per anteprima di lavorazione (PreView)
int nPvId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_PV) ; int nPvId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_PV) ;
// se non c'è, lo aggiungo // se non c'è, lo aggiungo
if ( nPvId == GDB_ID_NULL) { if ( nPvId == GDB_ID_NULL) {
nPvId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ; nPvId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ;
if ( nPvId == GDB_ID_NULL) if ( nPvId == GDB_ID_NULL)
@@ -633,7 +633,7 @@ Sawing::Apply( bool bRecalc, bool bPostApply)
int nCurrCuts = m_nCuts ; int nCurrCuts = m_nCuts ;
m_nCuts = 0 ; m_nCuts = 0 ;
// verifico validità gestore DB geometrico e Id del gruppo // verifico validità gestore DB geometrico e Id del gruppo
if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId))
return false ; return false ;
@@ -662,7 +662,7 @@ Sawing::Apply( bool bRecalc, bool bPostApply)
// recupero gruppo per geometria ausiliaria // recupero gruppo per geometria ausiliaria
int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ; int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ;
bool bChain = false ; bool bChain = false ;
// se non c'è, lo aggiungo // se non c'è, lo aggiungo
if ( nAuxId == GDB_ID_NULL) { if ( nAuxId == GDB_ID_NULL) {
nAuxId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ; nAuxId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ;
if ( nAuxId == GDB_ID_NULL) if ( nAuxId == GDB_ID_NULL)
@@ -689,7 +689,7 @@ Sawing::Apply( bool bRecalc, bool bPostApply)
// recupero gruppo per geometria di lavorazione (Cutter Location) // recupero gruppo per geometria di lavorazione (Cutter Location)
int nClId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_CL) ; int nClId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_CL) ;
// se non c'è, lo aggiungo // se non c'è, lo aggiungo
if ( nClId == GDB_ID_NULL) { if ( nClId == GDB_ID_NULL) {
nClId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ; nClId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ;
if ( nClId == GDB_ID_NULL) if ( nClId == GDB_ID_NULL)
@@ -732,7 +732,7 @@ Sawing::Apply( bool bRecalc, bool bPostApply)
bool bool
Sawing::Update( bool bPostApply) Sawing::Update( bool bPostApply)
{ {
// verifico validità gestore DB geometrico e Id del gruppo // verifico validità gestore DB geometrico e Id del gruppo
if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId))
return false ; return false ;
@@ -742,9 +742,6 @@ Sawing::Update( bool bPostApply)
return true ; return true ;
} }
// elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo)
RemoveClimbRiseHome() ;
// imposto eventuale asse bloccato da lavorazione // imposto eventuale asse bloccato da lavorazione
SetBlockedRotAxis( m_Params.m_sBlockedAxis) ; SetBlockedRotAxis( m_Params.m_sBlockedAxis) ;
@@ -794,7 +791,7 @@ Sawing::Update( bool bPostApply)
bool bool
Sawing::AdjustFeeds( void) Sawing::AdjustFeeds( void)
{ {
// controlli su GeomDB e simili non ripetuti perchè già fatti // controlli su GeomDB e simili non ripetuti perchè già fatti
// recupero gruppo della geometria di lavorazione (Cutter Location) // recupero gruppo della geometria di lavorazione (Cutter Location)
int nClId = m_pGeomDB->GetFirstNameInGroup( GetOwner(), MCH_CL) ; int nClId = m_pGeomDB->GetFirstNameInGroup( GetOwner(), MCH_CL) ;
@@ -804,11 +801,11 @@ Sawing::AdjustFeeds( void)
// ciclo sui gruppi CL // ciclo sui gruppi CL
int nClPathId = m_pGeomDB->GetFirstGroupInGroup( nClId) ; int nClPathId = m_pGeomDB->GetFirstGroupInGroup( nClId) ;
while ( nClPathId != GDB_ID_NULL) { while ( nClPathId != GDB_ID_NULL) {
// ciclo su tutte le entità del percorso CL // ciclo su tutte le entità del percorso CL
for ( int nEntId = m_pGeomDB->GetFirstInGroup( nClPathId) ; for ( int nEntId = m_pGeomDB->GetFirstInGroup( nClPathId) ;
nEntId != GDB_ID_NULL ; nEntId != GDB_ID_NULL ;
nEntId = m_pGeomDB->GetNext( nEntId)) { nEntId = m_pGeomDB->GetNext( nEntId)) {
// recupero i dati Cam dell'entità // recupero i dati Cam dell'entità
CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nEntId)) ; CamData* pCamData = GetCamData( m_pGeomDB->GetUserObj( nEntId)) ;
if ( pCamData == nullptr) if ( pCamData == nullptr)
continue ; continue ;
@@ -1028,31 +1025,11 @@ Sawing::UpdateToolData( bool* pbChanged)
const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ; const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ;
if ( pTdata == nullptr) if ( pTdata == nullptr)
return false ; return false ;
// salvo posizione TC, testa e uscita originali // verifico se sono diversi (ad esclusione del nome)
string sOrigTcPos = m_TParams.m_sTcPos ; m_TParams.m_sName = pTdata->m_sName ;
string sOrigHead = m_TParams.m_sHead ; bool bChanged = ! SameTool( m_TParams, *pTdata) ;
int nOrigExit = m_TParams.m_nExit ;
// verifico se sono diversi (ad esclusione di nome, posizione TC, testa e uscita)
bool bChanged = ( ! SameTool( m_TParams, *pTdata, false)) ;
// aggiorno comunque i parametri // aggiorno comunque i parametri
m_TParams = *pTdata ; m_TParams = *pTdata ;
// se definito attrezzaggio, aggiorno i parametri che ne possono derivare
string sTcPos ; string sHead ; int nExit ;
if ( m_pMchMgr->GetCurrSetupMgr().GetToolData( m_TParams.m_sName, sTcPos, sHead, nExit)) {
if ( sOrigTcPos != sTcPos ||
sOrigHead != sHead ||
nOrigExit != nExit)
bChanged = true ;
m_TParams.m_sTcPos = sTcPos ;
m_TParams.m_sHead = sHead ;
m_TParams.m_nExit = nExit ;
}
else {
if ( sOrigTcPos != pTdata->m_sTcPos ||
sOrigHead != pTdata->m_sHead ||
nOrigExit != pTdata->m_nExit)
bChanged = true ;
}
// eventuali segnalazioni // eventuali segnalazioni
if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) { if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) {
string sInfo = "Warning in Sawing : tool name changed (" + string sInfo = "Warning in Sawing : tool name changed (" +
@@ -1075,7 +1052,7 @@ Sawing::UpdateToolData( bool* pbChanged)
bool bool
Sawing::GetGeometry( SELVECTOR& vIds) const Sawing::GetGeometry( SELVECTOR& vIds) const
{ {
// restituisco l'elenco delle entità // restituisco l'elenco delle entità
vIds = m_vId ; vIds = m_vId ;
return true ; return true ;
} }
@@ -1098,7 +1075,7 @@ Sawing::VerifyGeometry( SelData Id, int& nSubs, int& nType)
const IGeoObj* pGObj = m_pGeomDB->GetGeoObj( Id.nId) ; const IGeoObj* pGObj = m_pGeomDB->GetGeoObj( Id.nId) ;
if ( pGObj == nullptr) if ( pGObj == nullptr)
return false ; return false ;
// se ammesse curve ed è tale // se ammesse curve ed è tale
if ( ( nType == GEO_NONE || nType == GEO_CURVE) && ( pGObj->GetType() & GEO_CURVE) != 0) { if ( ( nType == GEO_NONE || nType == GEO_CURVE) && ( pGObj->GetType() & GEO_CURVE) != 0) {
nType = GEO_CURVE ; nType = GEO_CURVE ;
const ICurve* pCurve = nullptr ; const ICurve* pCurve = nullptr ;
@@ -1122,7 +1099,7 @@ Sawing::VerifyGeometry( SelData Id, int& nSubs, int& nType)
} }
return ( pCurve != nullptr) ; return ( pCurve != nullptr) ;
} }
// se altrimenti ammesse superfici trimesh ed è tale // se altrimenti ammesse superfici trimesh ed è tale
else if ( ( nType == GEO_NONE || nType == GEO_SURF) && pGObj->GetType() == SRF_TRIMESH) { else if ( ( nType == GEO_NONE || nType == GEO_SURF) && pGObj->GetType() == SRF_TRIMESH) {
nType = GEO_SURF ; nType = GEO_SURF ;
const ISurfTriMesh* pSurf = ::GetSurfTriMesh( pGObj) ; const ISurfTriMesh* pSurf = ::GetSurfTriMesh( pGObj) ;
@@ -1142,7 +1119,7 @@ Sawing::VerifyGeometry( SelData Id, int& nSubs, int& nType)
} }
return true ; return true ;
} }
// se altrimenti ammesse regioni ed è tale // se altrimenti ammesse regioni ed è tale
else if ( ( nType == GEO_NONE || nType == GEO_SURF) && pGObj->GetType() == SRF_FLATRGN) { else if ( ( nType == GEO_NONE || nType == GEO_SURF) && pGObj->GetType() == SRF_FLATRGN) {
nType = GEO_SURF ; nType = GEO_SURF ;
const ISurfFlatRegion* pReg = ::GetSurfFlatRegion( pGObj) ; const ISurfFlatRegion* pReg = ::GetSurfFlatRegion( pGObj) ;
@@ -1279,8 +1256,8 @@ Sawing::GetCurve( SelData Id)
// recupero l'indice del chunk // recupero l'indice del chunk
int nChunk = ( ( Id.nSub == SEL_SUB_ALL) ? 0 : Id.nSub) ; int nChunk = ( ( Id.nSub == SEL_SUB_ALL) ? 0 : Id.nSub) ;
// recupero il contorno esterno del chunk // recupero il contorno esterno del chunk
PtrOwner<ICurveComposite> pCrvCompo ; PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
if ( ! pCrvCompo.Set( ConvertCurveToComposite( pReg->GetLoop( nChunk, 0)))) if ( IsNull( pCrvCompo) || ! pCrvCompo->AddCurve( pReg->GetLoop( nChunk, 0)))
return nullptr ; return nullptr ;
// recupero la normale della regione // recupero la normale della regione
Vector3d vtN = pReg->GetNormVersor() ; Vector3d vtN = pReg->GetNormVersor() ;
@@ -1335,7 +1312,7 @@ Sawing::Chain( int nGrpDestId)
for ( const auto& Id : m_vId) { for ( const auto& Id : m_vId) {
// prendo curva // prendo curva
vpCrvs.emplace_back( GetCurve( Id)) ; vpCrvs.emplace_back( GetCurve( Id)) ;
// ne verifico la validità // ne verifico la validità
if ( IsNull( vpCrvs.back())) { if ( IsNull( vpCrvs.back())) {
string sInfo = "Warning in Sawing : Skipped entity " + ToString( Id) ; string sInfo = "Warning in Sawing : Skipped entity " + ToString( Id) ;
m_pMchMgr->SetWarning( 2251, sInfo) ; m_pMchMgr->SetWarning( 2251, sInfo) ;
@@ -1477,7 +1454,7 @@ Sawing::ProcessPath( int nPathId, int nPvId, int nClId)
// recupero gruppo per geometria temporanea // recupero gruppo per geometria temporanea
const string GRP_TEMP = "Temp" ; const string GRP_TEMP = "Temp" ;
int nTempId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, GRP_TEMP) ; int nTempId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, GRP_TEMP) ;
// se non c'è, lo aggiungo // se non c'è, lo aggiungo
if ( nTempId == GDB_ID_NULL) { if ( nTempId == GDB_ID_NULL) {
nTempId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ; nTempId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nOwnerId, Frame3d()) ;
if ( nTempId == GDB_ID_NULL) if ( nTempId == GDB_ID_NULL)
@@ -1501,7 +1478,7 @@ Sawing::ProcessPath( int nPathId, int nPvId, int nClId)
ICurveComposite* pCompo = GetCurveComposite( m_pGeomDB->GetGeoObj( nCopyId)) ; ICurveComposite* pCompo = GetCurveComposite( m_pGeomDB->GetGeoObj( nCopyId)) ;
// unisco le parti allineate // unisco le parti allineate
if ( ! pCompo->MergeCurves( 100 * EPS_SMALL, 100 * EPS_ANG_SMALL)) if ( ! pCompo->MergeCurves( 10 * EPS_SMALL, 10 * EPS_ANG_SMALL))
return false ; return false ;
// eventuale inversione percorso // eventuale inversione percorso
@@ -1542,7 +1519,7 @@ Sawing::ProcessPath( int nPathId, int nPvId, int nClId)
// elaboro la curva composita e la esplodo nelle curve componenti // elaboro la curva composita e la esplodo nelle curve componenti
if ( m_Params.m_nCurveUse == SAW_CRV_APPROX || if ( m_Params.m_nCurveUse == SAW_CRV_APPROX ||
m_Params.m_nCurveUse == SAW_CRV_CONVEX) { m_Params.m_nCurveUse == SAW_CRV_CONVEX) {
// calcolo l'approssimazione lineare con eventuale convessità // calcolo l'approssimazione lineare con eventuale convessità
PolyLine PL ; PolyLine PL ;
int nType = ICurve::APL_STD ; int nType = ICurve::APL_STD ;
if ( m_Params.m_nWorkSide == SAW_WS_LEFT) if ( m_Params.m_nWorkSide == SAW_WS_LEFT)
@@ -1631,7 +1608,7 @@ Sawing::ProcessPath( int nPathId, int nPvId, int nClId)
// flag di curva chiusa // flag di curva chiusa
bool bClosed = pCompo->IsClosed() ; bool bClosed = pCompo->IsClosed() ;
// calcolo gli eventuali punti di perdita di tangenza e di cambio di concavità // calcolo gli eventuali punti di perdita di tangenza e di cambio di concavità
DBLVECTOR vU ; DBLVECTOR vU ;
const double ANG_PERD_TG = 1.0 ; const double ANG_PERD_TG = 1.0 ;
const ICurveArc* pArc = ( bClosed ? GetCurveArc( pCompo->GetLastCurve()) : nullptr) ; const ICurveArc* pArc = ( bClosed ? GetCurveArc( pCompo->GetLastCurve()) : nullptr) ;
@@ -1647,7 +1624,7 @@ Sawing::ProcessPath( int nPathId, int nPvId, int nClId)
nCurrConv = 0 ; nCurrConv = 0 ;
continue ; continue ;
} }
// verifico cambio di concavità e/o lavorazione interna // verifico cambio di concavità e/o lavorazione interna
const ICurve* pCrv = pCompo->GetCurve( i) ; const ICurve* pCrv = pCompo->GetCurve( i) ;
if ( pCrv->GetType() == CRV_ARC) { if ( pCrv->GetType() == CRV_ARC) {
if ( GetCurveArc( pCrv)->GetAngCenter() > 0) { if ( GetCurveArc( pCrv)->GetAngCenter() > 0) {
@@ -1729,7 +1706,7 @@ Sawing::ProcessEntity( const ICurve* pCrvP, const ICurve* pCrvC, const ICurve* p
// altrimenti // altrimenti
else { else {
if ( m_Params.m_nCurveUse == SAW_CRV_KEEP) { if ( m_Params.m_nCurveUse == SAW_CRV_KEEP) {
// determino la convessità // determino la convessità
int nConv = 0 ; int nConv = 0 ;
for ( int i = 0 ; i < pCompo->GetCurveCount() ; ++ i) { for ( int i = 0 ; i < pCompo->GetCurveCount() ; ++ i) {
const ICurveArc* pArc = GetCurveArc( pCompo->GetCurve( i)) ; const ICurveArc* pArc = GetCurveArc( pCompo->GetCurve( i)) ;
@@ -1830,7 +1807,7 @@ Sawing::ProcessLine( const ICurve* pCrvP, const ICurveLine* pLineC, const ICurve
( m_Params.m_nWorkSide == SAW_WS_RIGHT && dAngCN < - EPS_ANG_SMALL)) ( m_Params.m_nWorkSide == SAW_WS_RIGHT && dAngCN < - EPS_ANG_SMALL))
bExtAngCN = false ; bExtAngCN = false ;
} }
// verifico eventuale attacco speciale a step (se parametri validi e su entità linea singola) // verifico eventuale attacco speciale a step (se parametri validi e su entità linea singola)
double dLiStep = 0 ; double dLiStep = 0 ;
double dLiElev = 0 ; double dLiElev = 0 ;
if ( m_Params.m_dLiTang > 10 * EPS_SMALL && m_Params.m_dLiElev > 10 * EPS_SMALL && if ( m_Params.m_dLiTang > 10 * EPS_SMALL && m_Params.m_dLiElev > 10 * EPS_SMALL &&
@@ -1851,13 +1828,13 @@ Sawing::ProcessLine( const ICurve* pCrvP, const ICurveLine* pLineC, const ICurve
return true ; return true ;
} }
// Eventuale variazioni di velocità all'inizio e alla fine del percorso // Eventuale variazioni di velocità all'inizio e alla fine del percorso
FseVar FvVar ; FseVar FvVar ;
if ( pCrvP == nullptr) { if ( pCrvP == nullptr) {
string sFsta = ExtractInfo( m_Params.m_sUserNotes, "Fsta=") ; string sFsta = ExtractInfo( m_Params.m_sUserNotes, "Fsta:") ;
if ( ! sFsta.empty()) { if ( ! sFsta.empty()) {
string sLen, sPu ; string sLen, sPu ;
SplitFirst( sFsta, ",", sLen, sPu) ; SplitFirst( sFsta, "=", sLen, sPu) ;
FromString( sLen, FvVar.dLenStart) ; FromString( sLen, FvVar.dLenStart) ;
FvVar.dLenStart = max( FvVar.dLenStart, 0.) ; FvVar.dLenStart = max( FvVar.dLenStart, 0.) ;
FromString( sPu, FvVar.dPuStart) ; FromString( sPu, FvVar.dPuStart) ;
@@ -1865,10 +1842,10 @@ Sawing::ProcessLine( const ICurve* pCrvP, const ICurveLine* pLineC, const ICurve
} }
} }
if ( pCrvN == nullptr) { if ( pCrvN == nullptr) {
string sFend = ExtractInfo( m_Params.m_sUserNotes, "Fend=") ; string sFend = ExtractInfo( m_Params.m_sUserNotes, "Fend:") ;
if ( ! sFend.empty()) { if ( ! sFend.empty()) {
string sLen, sPu ; string sLen, sPu ;
SplitFirst( sFend, ",", sLen, sPu) ; SplitFirst( sFend, "=", sLen, sPu) ;
FromString( sLen, FvVar.dLenEnd) ; FromString( sLen, FvVar.dLenEnd) ;
FvVar.dLenEnd = max( FvVar.dLenEnd, 0.) ; FvVar.dLenEnd = max( FvVar.dLenEnd, 0.) ;
FromString( sPu, FvVar.dPuEnd) ; FromString( sPu, FvVar.dPuEnd) ;
@@ -1999,7 +1976,7 @@ Sawing::GenerateLinePv( const ICurveLine* pLine, const Vector3d& vtTool, const V
ptREnd + vtDir * ( dDtEnd + dExtraL) , RTY_LOC) ; ptREnd + vtDir * ( dDtEnd + dExtraL) , RTY_LOC) ;
m_pGeomDB->SetName( nReId, MCH_PV_RLOCUT) ; m_pGeomDB->SetName( nReId, MCH_PV_RLOCUT) ;
m_pGeomDB->SetMaterial( nReId, INVISIBLE) ; m_pGeomDB->SetMaterial( nReId, INVISIBLE) ;
// eventuali ripetizioni in basso per tagli inclinati // eventuali ripetizioni in basso per tagli inclinati
if ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL) { if ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL) {
// lunghezza movimento // lunghezza movimento
@@ -2057,23 +2034,6 @@ Sawing::GenerateLinePv( const ICurveLine* pLine, const Vector3d& vtTool, const V
} }
} }
// creo regioni di lavorazione che interessano le superfici superiore e inferiore del grezzo considerando anche gli
// allungamenti dei baffi
int nSurfUpId = ExeCreateSurfFrRectangle3P( nPxId, ptIni - vtDir * ( dStartWhiskExt + 5 * EPS_SMALL),
ptCross + vtDir * ( dEndWhiskExt + 5 * EPS_SMALL),
ptEnd + vtDir * ( dEndWhiskExt + 5 * EPS_SMALL), RTY_LOC) ;
m_pGeomDB->SetName( nSurfUpId, MCH_PV_UP_RAWCUT) ;
m_pGeomDB->SetMaterial( nSurfUpId, INVISIBLE) ;
// solo se la lavorazione interessa il fondo del grezzo creo la superficie down
if ( dRbHeight < EPS_SMALL) {
int nSurfDownId = m_pGeomDB->CopyGlob( nSurfUpId, GDB_ID_NULL, nPxId) ;
double dMove = dElev + dRbHeight / cos( m_Params.m_dSideAngle * DEGTORAD) ;
Vector3d vtMove = - dMove * vtCorr ; vtMove.z = 0 ;
ExeMove( {nSurfDownId}, vtMove, RTY_LOC) ;
m_pGeomDB->SetName( nSurfDownId, MCH_PV_DOWN_RAWCUT) ;
m_pGeomDB->SetMaterial( nSurfDownId, INVISIBLE) ;
}
// salvo in info gruppo : larghezza XY del taglio, distanza XY tra centro e bordo taglio, extra taglio e quota minima della lama // salvo in info gruppo : larghezza XY del taglio, distanza XY tra centro e bordo taglio, extra taglio e quota minima della lama
m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_WT, vtToolH.LenXY()) ; m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_WT, vtToolH.LenXY()) ;
if ( dLiElev > EPS_SMALL) if ( dLiElev > EPS_SMALL)
@@ -2296,7 +2256,7 @@ Sawing::GenerateLineCl( const ICurveLine* pLine, const Vector3d& vtTool, const V
Point3d ptP3 = pLine->GetEnd() + vtCorr * dDelta ; Point3d ptP3 = pLine->GetEnd() + vtCorr * dDelta ;
if ( AddLinearMove( ptP3) == GDB_ID_NULL) if ( AddLinearMove( ptP3) == GDB_ID_NULL)
return false ; return false ;
// se non è ultimo passo // se non è ultimo passo
if ( i != 0) { if ( i != 0) {
// movimento di risalita sopra il punto finale // movimento di risalita sopra il punto finale
SetFeed( GetEndFeed()) ; SetFeed( GetEndFeed()) ;
@@ -2492,7 +2452,7 @@ Sawing::GenerateExtCurvePv( const ICurveComposite* pCrv, double dOffs,
if ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL) if ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL)
colCut = FUCHSIA ; colCut = FUCHSIA ;
// dimensione da aggiungere alle regioni nelle parti in cui la lama è inclinata // dimensione da aggiungere alle regioni nelle parti in cui la lama è inclinata
double dExtraL = m_pMchMgr->GetCurrMachiningsMgr()->GetExtraLOnCutRegion() ; double dExtraL = m_pMchMgr->GetCurrMachiningsMgr()->GetExtraLOnCutRegion() ;
// lunghezza taglio parziale // lunghezza taglio parziale
@@ -2640,17 +2600,6 @@ Sawing::GenerateExtCurvePv( const ICurveComposite* pCrv, double dOffs,
return false ; return false ;
if ( ! ExeSurfFrAdd( nRId, nRsId) || ! ExeSurfFrAdd( nRId, nReId)) if ( ! ExeSurfFrAdd( nRId, nRsId) || ! ExeSurfFrAdd( nRId, nReId))
return false ; return false ;
// creo regioni di lavorazione che interessano le superfici superiore e inferiore del grezzo
int nSurfUpId = m_pGeomDB->CopyGlob( nRrId, GDB_ID_NULL, nPxId) ;
m_pGeomDB->SetName( nSurfUpId, MCH_PV_UP_RAWCUT) ;
m_pGeomDB->SetMaterial( nSurfUpId, INVISIBLE) ;
// solo se lavorazione interessa il fondo del grezzo creo la superficie down
if ( dRbHeight < EPS_SMALL) {
int nSurfDownId = m_pGeomDB->CopyGlob( nSurfUpId, GDB_ID_NULL, nPxId) ;
m_pGeomDB->SetName( nSurfDownId, MCH_PV_DOWN_RAWCUT) ;
m_pGeomDB->SetMaterial( nSurfDownId, INVISIBLE) ;
}
} }
// altrimenti errore // altrimenti errore
@@ -2896,7 +2845,7 @@ Sawing::GenerateExtCurveCl( const ICurveComposite* pCrv,
CalculateToolAndCorrVersors( vtCurrDir, m_Params.m_nHeadSide, m_Params.m_nWorkSide, m_Params.m_dSideAngle, vtCurrTool, vtCurrCorr) ; CalculateToolAndCorrVersors( vtCurrDir, m_Params.m_nHeadSide, m_Params.m_nWorkSide, m_Params.m_dSideAngle, vtCurrTool, vtCurrCorr) ;
SetToolDir( vtCurrTool) ; SetToolDir( vtCurrTool) ;
SetCorrAuxDir( vtCurrCorr) ; SetCorrAuxDir( vtCurrCorr) ;
if ( AddCurveMove( pSmpCrv) == GDB_ID_NULL) if ( AddCurveMove( pSmpCrv, true) == GDB_ID_NULL)
return false ; return false ;
} }
// 4 -> retrazione // 4 -> retrazione
@@ -2974,7 +2923,7 @@ Sawing::GenerateExtCurveCl( const ICurveComposite* pCrv,
pCopy->SimpleOffset( dOffs) ; pCopy->SimpleOffset( dOffs) ;
} }
// emissione // emissione
if ( AddCurveMove( pCopy) == GDB_ID_NULL) if ( AddCurveMove( pCopy, true) == GDB_ID_NULL)
return false ; return false ;
} }
} }
@@ -3007,7 +2956,7 @@ Sawing::GenerateExtCurveCl( const ICurveComposite* pCrv,
// inversione // inversione
pCopy->Invert() ; pCopy->Invert() ;
// emissione // emissione
if ( AddCurveMove( pCopy) == GDB_ID_NULL) if ( AddCurveMove( pCopy, true) == GDB_ID_NULL)
return false ; return false ;
} }
} }
@@ -3074,10 +3023,10 @@ Sawing::GenerateExtCurveCl( const ICurveComposite* pCrv,
pCopy->SimpleOffset( dOffs) ; pCopy->SimpleOffset( dOffs) ;
} }
// emissione // emissione
if ( AddCurveMove( pCopy) == GDB_ID_NULL) if ( AddCurveMove( pCopy, true) == GDB_ID_NULL)
return false ; return false ;
} }
// se non è ultimo passo // se non è ultimo passo
if ( i != 0) { if ( i != 0) {
// ricavo punto di risalita e punto iniziale // ricavo punto di risalita e punto iniziale
Point3d ptP4 ; Point3d ptP4 ;
@@ -3221,7 +3170,7 @@ Sawing::ProcessIntArc( const ICurve* pCrvP, const ICurveArc* pArcC, const ICurve
m_pMchMgr->SetWarning( 2257, "Warning in Sawing : skipped Entity too small") ; m_pMchMgr->SetWarning( 2257, "Warning in Sawing : skipped Entity too small") ;
return true ; return true ;
} }
// ricalcolo i versori fresa alle estremità (potrebbero essere cambiate) // ricalcolo i versori fresa alle estremità (potrebbero essere cambiate)
pArc->GetStartDir( vtStaDirC) ; pArc->GetStartDir( vtStaDirC) ;
pArc->GetMidDir( vtMidDirC) ; pArc->GetMidDir( vtMidDirC) ;
pArc->GetEndDir( vtEndDirC) ; pArc->GetEndDir( vtEndDirC) ;
@@ -3313,7 +3262,7 @@ Sawing::GenerateIntArcPv( const ICurveArc* pArc,
m_pGeomDB->SetName( nId3, MCH_PV_POST_CUT) ; m_pGeomDB->SetName( nId3, MCH_PV_POST_CUT) ;
m_pGeomDB->SetMaterial( nId3, BLUE) ; m_pGeomDB->SetMaterial( nId3, BLUE) ;
// dimensione da aggiungere alle regioni nelle parti in cui la lama è inclinata // dimensione da aggiungere alle regioni nelle parti in cui la lama è inclinata
double dExtraL = m_pMchMgr->GetCurrMachiningsMgr()->GetExtraLOnCutRegion() ; double dExtraL = m_pMchMgr->GetCurrMachiningsMgr()->GetExtraLOnCutRegion() ;
// regione ridotta di taglio per nesting (escluse parti iniziali e finali) // regione ridotta di taglio per nesting (escluse parti iniziali e finali)
@@ -3367,17 +3316,6 @@ Sawing::GenerateIntArcPv( const ICurveArc* pArc,
if ( ! ExeSurfFrAdd( nRId, nRsId) || ! ExeSurfFrAdd( nRId, nReId)) if ( ! ExeSurfFrAdd( nRId, nRsId) || ! ExeSurfFrAdd( nRId, nReId))
return false ; return false ;
// creo regioni di lavorazione che interessano le superfici superiore e inferiore del grezzo
int nSurfUpId = m_pGeomDB->CopyGlob( nRrId, GDB_ID_NULL, nPxId) ;
m_pGeomDB->SetName( nSurfUpId, MCH_PV_UP_RAWCUT) ;
m_pGeomDB->SetMaterial( nSurfUpId, INVISIBLE) ;
// solo se lavorazione interessa il fondo del grezzo creo la superficie down
if ( dRbHeight < EPS_SMALL) {
int nSurfDownId = m_pGeomDB->CopyGlob( nSurfUpId, GDB_ID_NULL, nPxId) ;
m_pGeomDB->SetName( nSurfDownId, MCH_PV_DOWN_RAWCUT) ;
m_pGeomDB->SetMaterial( nSurfDownId, INVISIBLE) ;
}
// salvo in info gruppo : larghezza XY del taglio, distanza XY tra centro e bordo taglio, extra taglio e quota minima della lama // salvo in info gruppo : larghezza XY del taglio, distanza XY tra centro e bordo taglio, extra taglio e quota minima della lama
m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_WT, dDeltaInt + dDeltaExt) ; m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_WT, dDeltaInt + dDeltaExt) ;
m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_DT, dDeltaT * dLenCoeff) ; m_pGeomDB->SetInfo( nPxId, MCH_PV_KEY_DT, dDeltaT * dLenCoeff) ;
@@ -3610,12 +3548,12 @@ Sawing::GenerateIntArcCl( const ICurveArc* pArc,
else { else {
Point3d ptMid ; Point3d ptMid ;
pArc->GetMidPoint( ptMid) ; pArc->GetMidPoint( ptMid) ;
// prima metà arco // prima metà arco
SetToolDir( vtMidTool) ; SetToolDir( vtMidTool) ;
SetCorrAuxDir( vtMidCorr) ; SetCorrAuxDir( vtMidCorr) ;
if ( AddArcMove( ptMid, ptCen, dAngCen / 2, vtN) == GDB_ID_NULL) if ( AddArcMove( ptMid, ptCen, dAngCen / 2, vtN) == GDB_ID_NULL)
return false ; return false ;
// seconda metà arco // seconda metà arco
SetToolDir( vtEndTool) ; SetToolDir( vtEndTool) ;
SetCorrAuxDir( vtEndCorr) ; SetCorrAuxDir( vtEndCorr) ;
if ( AddArcMove( ptP3, ptCen, dAngCen / 2, vtN) == GDB_ID_NULL) if ( AddArcMove( ptP3, ptCen, dAngCen / 2, vtN) == GDB_ID_NULL)
@@ -3696,12 +3634,12 @@ Sawing::GenerateIntArcCl( const ICurveArc* pArc,
pArc->GetMidPoint( ptMid) ; pArc->GetMidPoint( ptMid) ;
ptMid += Z_AX * dDelta ; ptMid += Z_AX * dDelta ;
double dCurrAngCen = dAngCen / 2 * ((( i % 2) == 0) ? -1 : 1) ; double dCurrAngCen = dAngCen / 2 * ((( i % 2) == 0) ? -1 : 1) ;
// prima metà arco // prima metà arco
SetToolDir( vtMidTool) ; SetToolDir( vtMidTool) ;
SetCorrAuxDir( vtMidCorr) ; SetCorrAuxDir( vtMidCorr) ;
if ( AddArcMove( ptMid, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL) if ( AddArcMove( ptMid, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
return false ; return false ;
// seconda metà arco // seconda metà arco
SetToolDir( ( ( i % 2) == 0) ? vtStaTool : vtEndTool) ; SetToolDir( ( ( i % 2) == 0) ? vtStaTool : vtEndTool) ;
SetCorrAuxDir( ( ( i % 2) == 0) ? vtStaCorr : vtEndCorr) ; SetCorrAuxDir( ( ( i % 2) == 0) ? vtStaCorr : vtEndCorr) ;
if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL) if ( AddArcMove( ptP3, ptCen, dCurrAngCen, vtN) == GDB_ID_NULL)
@@ -3785,18 +3723,18 @@ Sawing::GenerateIntArcCl( const ICurveArc* pArc,
Point3d ptMid ; Point3d ptMid ;
pArc->GetMidPoint( ptMid) ; pArc->GetMidPoint( ptMid) ;
ptMid += Z_AX * dDelta ; ptMid += Z_AX * dDelta ;
// prima metà arco // prima metà arco
SetToolDir( vtMidTool) ; SetToolDir( vtMidTool) ;
SetCorrAuxDir( vtMidCorr) ; SetCorrAuxDir( vtMidCorr) ;
if ( AddArcMove( ptMid, ptCen, dAngCen / 2, vtN) == GDB_ID_NULL) if ( AddArcMove( ptMid, ptCen, dAngCen / 2, vtN) == GDB_ID_NULL)
return false ; return false ;
// seconda metà arco // seconda metà arco
SetToolDir( vtEndTool) ; SetToolDir( vtEndTool) ;
SetCorrAuxDir( vtEndCorr) ; SetCorrAuxDir( vtEndCorr) ;
if ( AddArcMove( ptP3, ptCen, dAngCen / 2, vtN) == GDB_ID_NULL) if ( AddArcMove( ptP3, ptCen, dAngCen / 2, vtN) == GDB_ID_NULL)
return false ; return false ;
} }
// se non è ultimo passo // se non è ultimo passo
if ( i != 0) { if ( i != 0) {
// movimento di risalita sopra il punto finale // movimento di risalita sopra il punto finale
SetFeed( GetEndFeed()) ; SetFeed( GetEndFeed()) ;
@@ -3874,40 +3812,29 @@ bool
Sawing::CalculateToolAndCorrVersors( const Vector3d& vtTang, int nHeadSide, int nWorkSide, double dSideAng, Sawing::CalculateToolAndCorrVersors( const Vector3d& vtTang, int nHeadSide, int nWorkSide, double dSideAng,
Vector3d& vtTool, Vector3d& vtCorr) Vector3d& vtTool, Vector3d& vtCorr)
{ {
// Direzione tangente nel piano XY // Versore fresa : annullo la componente in Z e normalizzo
Vector3d vtXYTg = vtTang ; vtTool = vtTang ;
vtXYTg.z = 0 ; vtTool.z = 0 ;
double dLenXYTg = vtXYTg.Len() ; if ( ! vtTool.Normalize())
if ( dLenXYTg < EPS_SMALL)
return false ; return false ;
vtXYTg /= dLenXYTg ; // ruoto attorno a Zglob+ a seconda del lato mandrino
// se direzione tangente inclinata in Z e SideAng non nullo devo calcolare la vera tangente nel piano XY
if ( abs( vtTang.z) > EPS_SMALL && abs( dSideAng) > EPS_ANG_SMALL) {
double dSinDelta = vtTang.z * tan( dSideAng * DEGTORAD) / dLenXYTg ;
double dCosDelta = sqrt( 1 - dSinDelta * dSinDelta) ;
if ( nHeadSide == SAW_HS_LEFT)
vtXYTg.Rotate( Z_AX, dCosDelta, dSinDelta) ;
else
vtXYTg.Rotate( Z_AX, dCosDelta, -dSinDelta) ;
}
// Versore fresa : ruoto direzione nel piano XY attorno a Zglob+ a seconda del lato mandrino
vtTool = vtXYTg ;
if ( nHeadSide == SAW_HS_LEFT) if ( nHeadSide == SAW_HS_LEFT)
vtTool.Rotate( Z_AX, 0, 1) ; vtTool.Rotate( Z_AX, 0, 1) ;
else else
vtTool.Rotate( Z_AX, 0, -1) ; vtTool.Rotate( Z_AX, 0, -1) ;
// Versore correzione : se lama sbandata devo aggiustare // Versore correzione
vtCorr = Z_AX ; vtCorr = Z_AX ;
// Se lama sbandata
if ( abs( dSideAng) > EPS_ANG_SMALL) { if ( abs( dSideAng) > EPS_ANG_SMALL) {
if ( nWorkSide == SAW_WS_RIGHT) { if ( nWorkSide == SAW_WS_RIGHT) {
vtTool.Rotate( vtXYTg, - dSideAng) ; vtTool.Rotate( vtTang, - dSideAng) ;
vtCorr.Rotate( vtXYTg, - dSideAng) ; vtCorr.Rotate( vtTang, - dSideAng) ;
} }
else { else {
vtTool.Rotate( vtXYTg, dSideAng) ; vtTool.Rotate( vtTang, dSideAng) ;
vtCorr.Rotate( vtXYTg, dSideAng) ; vtCorr.Rotate( vtTang, dSideAng) ;
} }
} }
@@ -3918,7 +3845,7 @@ Sawing::CalculateToolAndCorrVersors( const Vector3d& vtTang, int nHeadSide, int
bool bool
Sawing::AdjustForSide( ICurve* pCurve) Sawing::AdjustForSide( ICurve* pCurve)
{ {
// se lato lavoro e lato mandrino coincidono, non devo fare alcunché // se lato lavoro e lato mandrino coincidono, non devo fare alcunché
if ( ( m_Params.m_nWorkSide == SAW_WS_LEFT && m_Params.m_nHeadSide == SAW_HS_LEFT) || if ( ( m_Params.m_nWorkSide == SAW_WS_LEFT && m_Params.m_nHeadSide == SAW_HS_LEFT) ||
( m_Params.m_nWorkSide == SAW_WS_RIGHT && m_Params.m_nHeadSide == SAW_HS_RIGHT)) ( m_Params.m_nWorkSide == SAW_WS_RIGHT && m_Params.m_nHeadSide == SAW_HS_RIGHT))
return true ; return true ;
@@ -4087,7 +4014,7 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC
dDeltaLoExt = dDeltaF ; dDeltaLoExt = dDeltaF ;
} }
} }
// controllo se lunghezza entità accettabile // controllo se lunghezza entità accettabile
const double MIN_LEN = 1 ; const double MIN_LEN = 1 ;
double dLenXY = DistXY( pLine->GetStart(), pLine->GetEnd()) ; double dLenXY = DistXY( pLine->GetStart(), pLine->GetEnd()) ;
if ( dDeltaI + dLenXY + dDeltaF < MIN_LEN) { if ( dDeltaI + dLenXY + dDeltaF < MIN_LEN) {
@@ -4158,7 +4085,7 @@ Sawing::AdjustCurveForEdges( ICurve* pCrv, double dElev, double dLenCoeff,
dDeltaF = dDeltaT ; dDeltaF = dDeltaT ;
} }
dDeltaF *= dLenCoeff ; dDeltaF *= dLenCoeff ;
// controllo se lunghezza entità accettabile // controllo se lunghezza entità accettabile
const double MIN_LEN = 1 ; const double MIN_LEN = 1 ;
double dLenXY ; double dLenXY ;
pCrv->GetLength( dLenXY) ; pCrv->GetLength( dLenXY) ;
+2 -6
View File
@@ -99,10 +99,6 @@ struct SawingData : public MachiningData
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline const SawingData* GetSawingData( const MachiningData* pMdata) inline const SawingData* GetSawingData( const MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_SAWING) { return (dynamic_cast<const SawingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<const SawingData*>( pMdata)) ; }
inline SawingData* GetSawingData( MachiningData* pMdata) inline SawingData* GetSawingData( MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_SAWING) { return (dynamic_cast<SawingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<SawingData*>( pMdata)) ; }
+5 -21
View File
@@ -271,20 +271,14 @@ SetupMgr::GetPosData( int nPos, string& sTcPos, string& sHead, int& nExit, strin
bool bool
SetupMgr::GetToolData( const string& sName, string& sTcPos, string& sHead, int& nExit, int* pnPos) const SetupMgr::GetToolData( const string& sName, string& sTcPos, string& sHead, int& nExit, int* pnPos) const
{ {
// reset valori di ritorno
sTcPos.clear() ;
sHead.clear() ;
nExit = 0 ;
if ( pnPos != nullptr)
*pnPos = 0 ;
// verifico validità utensile // verifico validità utensile
if ( IsEmptyOrSpaces( sName)) if ( IsEmptyOrSpaces( sName))
return false ; return false ;
// cerco l'utensile // cerco l'utensile
int nI = - 1 ; int nI = - 1 ;
for ( int i = 0 ; i < int( m_vStuData.size()) ; ++ i) { for ( size_t i = 0 ; i < m_vStuData.size() ; ++ i) {
if ( m_vStuData[i].m_nExit > 0 && EqualNoCase( sName, m_vStuData[i].m_sName)) { if ( m_vStuData[i].m_nExit > 0 && EqualNoCase( sName, m_vStuData[i].m_sName)) {
nI = i ; nI = int( i) ;
break ; break ;
} }
} }
@@ -318,21 +312,11 @@ SetupMgr::GetToolName( const string& sHead, int nExit, string& sName) const
bool bool
SetupMgr::GetToolsInSetupPos( const string& sTcPos, STRVECTOR& vsTools) const SetupMgr::GetToolsInSetupPos( const string& sTcPos, STRVECTOR& vsTools) const
{ {
// default vettore vuoto
vsTools.clear() ; vsTools.clear() ;
// verifico macchina // eseguo ricerca
if ( m_pMachine == nullptr)
return false ;
// eseguo ricerca (con inserimento nel vettore secondo indice dell'uscita)
for ( int i = 0 ; i < int( m_vStuData.size()) ; ++ i) { for ( int i = 0 ; i < int( m_vStuData.size()) ; ++ i) {
if ( ! IsEmptyOrSpaces( m_vStuData[i].m_sHead) && EqualNoCase( sTcPos, m_vStuData[i].m_sTcPos)) { if ( EqualNoCase( sTcPos, m_vStuData[i].m_sTcPos)) {
if ( vsTools.empty()) { vsTools.emplace_back( m_vStuData[i].m_sName) ;
int nExitCnt = m_pMachine->GetHeadExitCount( m_vStuData[i].m_sHead) ;
vsTools.resize( nExitCnt) ;
}
int nExit = m_vStuData[i].m_nExit ;
if ( nExit > 0 && nExit <= int( vsTools.size()))
vsTools[nExit - 1] = m_vStuData[i].m_sName ;
} }
} }
return true ; return true ;
+96 -245
View File
@@ -25,11 +25,9 @@
#include "/EgtDev/Include/EGkCDeCylClosedSurfTm.h" #include "/EgtDev/Include/EGkCDeCylClosedSurfTm.h"
#include "/EgtDev/Include/EGkCDeSpheClosedSurfTm.h" #include "/EgtDev/Include/EGkCDeSpheClosedSurfTm.h"
#include "/EgtDev/Include/EGkCDeConeFrustumClosedSurfTm.h" #include "/EgtDev/Include/EGkCDeConeFrustumClosedSurfTm.h"
#include "/EgtDev/Include/EGkCDeClosedSurfTmClosedSurfTm.h"
#include "/EgtDev/Include/EGkVolZmap.h" #include "/EgtDev/Include/EGkVolZmap.h"
#include "/EgtDev/Include/EGkGeoVector3d.h" #include "/EgtDev/Include/EGkGeoVector3d.h"
#include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EGkStringUtils3d.h"
#include "/EgtDev/Include/EGkSurfLocal.h"
#include "/EgtDev/Include/EXeCmdLogOff.h" #include "/EgtDev/Include/EXeCmdLogOff.h"
#include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EXeConst.h"
#include "/EgtDev/Include/EMkToolConst.h" #include "/EgtDev/Include/EMkToolConst.h"
@@ -47,12 +45,10 @@ static const double MIN_STEP = 1.0 ;
static const double MAX_STEP = 100.0 ; static const double MAX_STEP = 100.0 ;
static const double MID_STEP = 50.0 ; static const double MID_STEP = 50.0 ;
static const double COLL_STEP = 10. ; static const double COLL_STEP = 10. ;
static const double SQ_COEFF_ROT_MOVE = 100. ;
static const double COEFF_LIM = 0.999 ; static const double COEFF_LIM = 0.999 ;
static const double SAFEDIST_STD = 5.0 ; static const double SAFEDIST_STD = 5.0 ;
static const int ERR_OUTSTROKE = 1 ; static const int ERR_OUTSTROKE = 1 ;
static const int ERR_COLLISION = 11 ; static const int ERR_COLLISION = 11 ;
static const int ERR_TOOL_SEL = 21 ;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
Simulator::Simulator( void) Simulator::Simulator( void)
@@ -61,7 +57,6 @@ Simulator::Simulator( void)
m_pGeomDB = nullptr ; m_pGeomDB = nullptr ;
m_pMachine = nullptr ; m_pMachine = nullptr ;
m_pPerfCnt = nullptr ; m_pPerfCnt = nullptr ;
m_nStatus = SIS_CREATED ;
m_dStep = MID_STEP ; m_dStep = MID_STEP ;
m_nUiStatus = MCH_UISIM_NULL ; m_nUiStatus = MCH_UISIM_NULL ;
m_nOpId = GDB_ID_NULL ; m_nOpId = GDB_ID_NULL ;
@@ -77,7 +72,6 @@ Simulator::Simulator( void)
m_nAuxEInd = 0 ; m_nAuxEInd = 0 ;
m_nExit = 0 ; m_nExit = 0 ;
m_dTDiam = 0 ; m_dTDiam = 0 ;
m_bCutOnTip = false ;
m_dSafeDist = SAFEDIST_STD ; m_dSafeDist = SAFEDIST_STD ;
m_nAxesMask = 0 ; m_nAxesMask = 0 ;
m_bEnabAxes = true ; m_bEnabAxes = true ;
@@ -93,8 +87,6 @@ Simulator::~Simulator( void)
{ {
// porto la macchina in posizione home // porto la macchina in posizione home
GoHome() ; GoHome() ;
// gestione evento uscita dal simulatore
OnExit() ;
// rimuovo tavola variabili globali // rimuovo tavola variabili globali
m_pMachine->LuaResetGlobVar( GLOB_VAR) ; m_pMachine->LuaResetGlobVar( GLOB_VAR) ;
// rimuovo performance counter // rimuovo performance counter
@@ -116,7 +108,6 @@ Simulator::Init( MachMgr* pMchMgr)
m_pGeomDB = m_pMchMgr->GetGeomDB() ; m_pGeomDB = m_pMchMgr->GetGeomDB() ;
m_pMachine = m_pMchMgr->GetCurrMachine() ; m_pMachine = m_pMchMgr->GetCurrMachine() ;
m_pPerfCnt = new PerformanceCounter ; m_pPerfCnt = new PerformanceCounter ;
m_nStatus = SIS_INITIALIZED ;
return true ; return true ;
} }
@@ -131,28 +122,21 @@ Simulator::Start( bool bFirst)
m_pMchMgr->ResetLastError() ; m_pMchMgr->ResetLastError() ;
m_pMchMgr->ResetWarnings() ; m_pMchMgr->ResetWarnings() ;
bool bOk = true ; // Forzo aggiornamento attrezzaggio della macchinata
bool bOk = m_pMchMgr->UpdateCurrSetup() ;
// Se appena entrati in simulazione // Se avvio vero, verifico attrezzaggio
if ( m_nStatus == SIS_INITIALIZED) { if ( bFirst && ! VerifySetup())
// Forzo aggiornamento attrezzaggio della macchinata bOk = false ;
if ( ! m_pMchMgr->UpdateCurrSetup())
bOk = false ;
// Verifico attrezzaggio
if ( ! VerifySetup())
bOk = false ;
}
// Reset utensile, interpolazione e assi correnti // Reset utensile, interpolazione e assi correnti
m_sTool.clear() ; m_sTool.clear() ;
m_sHead.clear() ; m_sHead.clear() ;
m_nExit = 0 ; m_nExit = 0 ;
m_dTDiam = 0 ; m_dTDiam = 0 ;
m_bCutOnTip = false ;
ResetInterpolation() ; ResetInterpolation() ;
ResetAxes() ; ResetAxes() ;
ResetAuxAxes() ; ResetAuxAxes() ;
// porto la macchina in home // porto la macchina in home
if ( ! GoHome()) if ( ! GoHome())
bOk = false ; bOk = false ;
@@ -171,42 +155,19 @@ Simulator::Start( bool bFirst)
m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_VER, GetEMkVer()) ; m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_VER, GetEMkVer()) ;
m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MACHNAME, m_pMachine->GetMachineName()) ; m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_MACHNAME, m_pMachine->GetMachineName()) ;
// Se appena entrati in simulazione // Richiamo funzione su avvio simulazione
if ( m_nStatus == SIS_INITIALIZED) { if ( ! OnStart( bFirst))
if ( ! OnInit())
bOk = false ;
m_nStatus = SIS_READYTOSTART ;
}
// Richiamo funzione per evento avvio simulazione
if ( ! OnProgramStart( bFirst))
bOk = false ; bOk = false ;
// Arrivo alla preparazione per la prima lavorazione // Arrivo alla preparazione per la prima lavorazione
int nStatus ; int nStatus ;
if ( ! FindAndManageOperationStart( true, bFirst, nStatus) && nStatus != MCH_SIM_STOP) if ( ! FindAndManageOperationStart( true, bFirst, nStatus) && nStatus != MCH_SIM_STOP)
bOk = false ; bOk = false ;
// se sono ancora su disposizione
if ( m_pMchMgr->GetOperationType( m_nOpId) == OPER_DISP) {
// ricerca e gestione inizio percorso di lavoro
if ( ! FindAndManagePathStart( nStatus))
return false ;
// eventuali comandi ausiliari di inizio percorso
while ( m_nAuxSInd < m_nAuxSTot) {
if ( ! ManagePathStartAux( nStatus))
return false ;
}
// aggiornamento assi per eventuali teste caricate
UpdateAxes() ;
}
// Reset timer // Reset timer
if ( m_pPerfCnt != nullptr) if ( m_pPerfCnt != nullptr)
m_pPerfCnt->Start() ; m_pPerfCnt->Start() ;
// Imposto lo stato interno
m_nStatus = ( bOk ? SIS_READYTORUN : SIS_READYTOSTART) ;
return bOk ; return bOk ;
} }
@@ -262,7 +223,7 @@ bool
Simulator::Move( int& nStatus) Simulator::Move( int& nStatus)
{ {
// Verifiche // Verifiche
if ( m_pGeomDB == nullptr || m_pMchMgr == nullptr || m_pMachine == nullptr || m_nStatus != SIS_READYTORUN) { if ( m_pGeomDB == nullptr || m_pMchMgr == nullptr || m_pMachine == nullptr) {
nStatus = MCH_SIM_ERR ; nStatus = MCH_SIM_ERR ;
return false ; return false ;
} }
@@ -282,15 +243,15 @@ Simulator::Move( int& nStatus)
m_dCoeff = 0 ; m_dCoeff = 0 ;
} }
// Se appena arrivato alla fine di un percorso di lavoro (verifico anche completamento dei comandi aux di start per path vuote) // Se appena arrivato alla fine di un percorso di lavoro
if ( m_nEntId == GDB_ID_NULL && m_nAuxEInd == 0 && m_nCLPathInd > 0 && m_nAuxSInd >= m_nAuxSTot) { if ( m_nEntId == GDB_ID_NULL && m_nAuxEInd == 0 && m_nCLPathInd > 0) {
// gestione fine percorso di lavoro // gestione fine percorso di lavoro
if ( ! ManagePathEnd( nStatus)) if ( ! ManagePathEnd( nStatus))
return false ; return false ;
} }
// Se alla fine del percorso dopo esecuzione azioni ausiliarie (verifico anche completamento dei comandi aux di start per path vuote) // Se alla fine del percorso dopo esecuzione azioni ausiliarie
if ( m_nEntId == GDB_ID_NULL && m_nAuxEInd >= m_nAuxETot && m_nAuxSInd >= m_nAuxSTot) { if ( m_nEntId == GDB_ID_NULL && m_nAuxEInd >= m_nAuxETot) {
// ricerca e gestione inizio percorso di lavoro // ricerca e gestione inizio percorso di lavoro
if ( ! FindAndManagePathStart( nStatus)) if ( ! FindAndManagePathStart( nStatus))
return false ; return false ;
@@ -306,7 +267,7 @@ Simulator::Move( int& nStatus)
return false ; return false ;
// se non ce ne sono altre, sono alla fine // se non ce ne sono altre, sono alla fine
if ( m_nOpId == GDB_ID_NULL) { if ( m_nOpId == GDB_ID_NULL) {
OnProgramEnd() ; OnEnd() ;
nStatus = MCH_SIM_END ; nStatus = MCH_SIM_END ;
return false ; return false ;
} }
@@ -509,9 +470,6 @@ Simulator::UpdateTool( bool bFirst, int& nErr)
m_sHead = sHead ; m_sHead = sHead ;
m_nExit = nExit ; m_nExit = nExit ;
m_pMchMgr->TdbGetCurrToolParam( TPA_DIAM, m_dTDiam) ; m_pMchMgr->TdbGetCurrToolParam( TPA_DIAM, m_dTDiam) ;
double dTipFeed = 0 ;
m_pMchMgr->TdbGetCurrToolParam( TPA_TIPFEED, dTipFeed) ;
m_bCutOnTip = ( dTipFeed > EPS_MACH_LEN_PAR) ;
// ripristino la lavorazione corrente // ripristino la lavorazione corrente
m_pMchMgr->SetCurrMachining( nCurrMchId) ; m_pMchMgr->SetCurrMachining( nCurrMchId) ;
// aggiorno gli assi macchina // aggiorno gli assi macchina
@@ -551,9 +509,6 @@ Simulator::UpdateTool( bool bFirst, int& nErr)
m_sHead = sHead ; m_sHead = sHead ;
m_nExit = nExit ; m_nExit = nExit ;
m_pMchMgr->TdbGetCurrToolParam( TPA_DIAM, m_dTDiam) ; m_pMchMgr->TdbGetCurrToolParam( TPA_DIAM, m_dTDiam) ;
double dTipFeed = 0 ;
m_pMchMgr->TdbGetCurrToolParam( TPA_TIPFEED, dTipFeed) ;
m_bCutOnTip = ( dTipFeed > EPS_MACH_LEN_PAR) ;
// aggiorno gli assi macchina // aggiorno gli assi macchina
if ( ! UpdateAxes()) if ( ! UpdateAxes())
return false ; return false ;
@@ -579,10 +534,10 @@ Simulator::UpdateAxes( void)
if ( pMachine == nullptr) if ( pMachine == nullptr)
return false ; return false ;
// Carico i nomi e i token degli assi macchina attivi // Carico i nomi e i token degli assi macchina attivi
if ( ! pMachine->GetAllCurrAxesNames( m_AxesName) || if ( ! pMachine->GetAllCurrAxesName( m_AxesName) ||
! pMachine->GetAllCurrAxesTokens( m_AxesToken)) ! pMachine->GetAllCurrAxesToken( m_AxesToken))
return false ; return false ;
// Aggiorno flag di invertito, offset, tipo e posizione corrente degli assi macchina attivi // Aggiorno flag invertito, il tipo e la posizione corrente degli assi macchina attivi
for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) { for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) {
bool bInvert ; bool bInvert ;
m_pMachine->GetAxisInvert( m_AxesName[i], bInvert) ; m_pMachine->GetAxisInvert( m_AxesName[i], bInvert) ;
@@ -724,13 +679,11 @@ Simulator::FindAndManageOperationStart( bool bStart, bool bFirst, int& nStatus)
} }
// cambio fase // cambio fase
m_pMchMgr->SetCurrPhase( nPhase, ( nPhase == 1)) ; m_pMchMgr->SetCurrPhase( nPhase, ( nPhase == 1)) ;
// se previsto, aggiorno utensile e assi conseguenti // aggiorno utensile e assi conseguenti
if ( pDisp->IsWithTool()) { int nErr ;
int nErr ; if ( ! UpdateTool( bFirst, nErr)) {
if ( ! UpdateTool( bFirst, nErr)) { nStatus = CalcStatusOnError( nErr) ;
nStatus = CalcStatusOnError( nErr) ; return false ;
return false ;
}
} }
++ m_nOpInd ; ++ m_nOpInd ;
// richiamo gestione evento inizio disposizione // richiamo gestione evento inizio disposizione
@@ -860,9 +813,8 @@ Simulator::FindAndManagePathStart( int& nStatus)
} }
// se altrimenti trovato nuovo CL path vuoto // se altrimenti trovato nuovo CL path vuoto
else if ( m_nCLPathId != GDB_ID_NULL) { else if ( m_nCLPathId != GDB_ID_NULL) {
// recupero il numero di eventi ausiliari di inizio // non ci possono essere eventi ausiliari di inizio
if ( ! m_pGeomDB->GetInfo( m_nCLPathId, KEY_AS_TOT, m_nAuxSTot)) m_nAuxSTot = 0 ;
m_nAuxSTot = 0 ;
m_nAuxSInd = 0 ; m_nAuxSInd = 0 ;
// recupero il numero di eventi ausiliari di fine // recupero il numero di eventi ausiliari di fine
if ( ! m_pGeomDB->GetInfo( m_nCLPathId, KEY_AE_TOT, m_nAuxETot)) if ( ! m_pGeomDB->GetInfo( m_nCLPathId, KEY_AE_TOT, m_nAuxETot))
@@ -1026,22 +978,12 @@ Simulator::ManageSingleMove( int& nStatus, double& dMove)
// Calcolo distanza di movimento // Calcolo distanza di movimento
double dSqDist = 0 ; double dSqDist = 0 ;
for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) { for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) {
// coefficiente moltiplicativo per differenziare assi lineari e rotanti // coefficiente moltiplicativo per differenziare assi lineari (primi 3) e rotanti (altri)
double dSqCoeff = ( m_AxesLinear[i] ? 1 : SQ_COEFF_ROT_MOVE) ; double dSqCoeff = (( i < 3) ? 1 : 100) ;
dSqDist += dSqCoeff * ( AxesEnd[i] - m_AxesVal[i]) * ( AxesEnd[i] - m_AxesVal[i]) ; dSqDist += dSqCoeff * ( AxesEnd[i] - m_AxesVal[i]) * ( AxesEnd[i] - m_AxesVal[i]) ;
} }
// Calcolo distanza di movimento eventuali assi ausiliari
double dSqDistAux = 0 ;
for ( int i = 0 ; i < int( m_AuxAxesName.size()) ; ++ i) {
if ( m_AuxAxesLink[i] != 0)
continue ;
// coefficiente moltiplicativo per differenziare assi lineari e rotanti
double dSqCoeff = ( m_AuxAxesLinear[i] ? 1 : SQ_COEFF_ROT_MOVE) ;
dSqDistAux += dSqCoeff * ( m_AuxAxesEnd[i] - m_AuxAxesVal[i]) * ( m_AuxAxesEnd[i] - m_AuxAxesVal[i]) ;
}
// Considero il massimo delle due distanze
double dPrevCoeff = m_dCoeff ; double dPrevCoeff = m_dCoeff ;
double dDist = sqrt( max( dSqDist, dSqDistAux)) ; double dDist = sqrt( dSqDist) ;
if ( dDist > EPS_SMALL) { if ( dDist > EPS_SMALL) {
double dStep = min( ( nMoveType == 0 ? 2 : 1) * m_dStep, MAX_STEP) ; double dStep = min( ( nMoveType == 0 ? 2 : 1) * m_dStep, MAX_STEP) ;
int nStep = max( int( dDist / dStep), 1) ; int nStep = max( int( dDist / dStep), 1) ;
@@ -1064,12 +1006,6 @@ Simulator::ManageSingleMove( int& nStatus, double& dMove)
for ( int i = 0 ; i < int( m_VmId.size()) ; ++ i) for ( int i = 0 ; i < int( m_VmId.size()) ; ++ i)
bOkI = m_pGeomDB->GetGlobFrame( m_VmId[i], vFrVzmI[i]) && bOkI ; bOkI = m_pGeomDB->GetGlobFrame( m_VmId[i], vFrVzmI[i]) && bOkI ;
// Log per debug
if ( ExeGetDebugLevel() >= 10) {
string sOut = "MoveType=" + ToString( nMoveType) + " Coeff=" + ToString( m_dCoeff) ;
LOG_DBG_INFO( GetEMkLogger(), sOut.c_str())
}
// Eseguo movimento rapido o lineare // Eseguo movimento rapido o lineare
if ( nMoveType != 2 && nMoveType != 3) { if ( nMoveType != 2 && nMoveType != 3) {
// se attivo CollisionCheck approssimo movimento con più step // se attivo CollisionCheck approssimo movimento con più step
@@ -1102,29 +1038,22 @@ Simulator::ManageSingleMove( int& nStatus, double& dMove)
} }
m_pMachine->SetAxisPos( m_AuxAxesName[j], dVal) ; m_pMachine->SetAxisPos( m_AuxAxesName[j], dVal) ;
} }
// se non è rapido o non c'è verifica collisioni, eseguo eventuale Vmill
if ( nMoveType != 0 || ! NeedCollisionCheck()) {
for ( int j = 0 ; j < int( m_VmTool.size()) ; ++ j) {
Point3d ptNoseF ; Vector3d vtDirF ; Vector3d vtAuxF ;
bool bOkF = GetHeadCurrPosDirAux( m_VmTool[j].sHead, m_VmTool[j].nExit, ptNoseF, vtDirF, vtAuxF) ;
for ( int k = 0 ; k < int( m_VmId.size()) ; ++ k) {
Frame3d frVzmF ;
bOkF = m_pGeomDB->GetGlobFrame( m_VmId[k], frVzmF) && bOkF ;
ExecLineVmill( m_VmId[k], j, m_VmTool[j].dTdOffs, m_VmTool[j].dAdOffs,
vPtNoseI[j], vVtDirI[j], vVtAuxI[j], vFrVzmI[k], ptNoseF, vtDirF, vtAuxF, frVzmF) ;
// se ultimo utensile, salvo riferimento per prossimo inizio
if ( j == int( m_VmTool.size()) - 1)
vFrVzmI[k] = frVzmF ;
}
// aggiorno prossimo inizio
vPtNoseI[j] = ptNoseF ;
vVtDirI[j] = vtDirF ;
vVtAuxI[j] = vtAuxF ;
}
}
// eseguo eventuale collision check // eseguo eventuale collision check
bCollCheck = bCollCheck && ExecCollisionCheck( nCdInd, nObjInd, nMoveType) ; bCollCheck = bCollCheck && ExecCollisionCheck( nCdInd, nObjInd, nMoveType) ;
} }
// se non è rapido o non c'è verifica collisioni, eseguo eventuale Vmill
if ( nMoveType != 0 || ! NeedCollisionCheck()) {
for ( int i = 0 ; i < int( m_VmTool.size()) ; ++ i) {
Point3d ptNoseF ; Vector3d vtDirF ; Vector3d vtAuxF ;
bool bOkF = GetHeadCurrPosDirAux( m_VmTool[i].sHead, m_VmTool[i].nExit, ptNoseF, vtDirF, vtAuxF) ;
for ( int j = 0 ; j < int( m_VmId.size()) ; ++ j) {
Frame3d frVzmF ;
bOkF = m_pGeomDB->GetGlobFrame( m_VmId[j], frVzmF) && bOkF ;
ExecLineVmill( m_VmId[j], i, m_VmTool[i].dTdOffs, m_VmTool[i].dAdOffs,
vPtNoseI[i], vVtDirI[i], vVtAuxI[i], vFrVzmI[j], ptNoseF, vtDirF, vtAuxF, frVzmF) ;
}
}
}
} }
// Eseguo movimento su arco // Eseguo movimento su arco
else { else {
@@ -1218,7 +1147,7 @@ Simulator::ManageSingleMove( int& nStatus, double& dMove)
double dSqDist = 0 ; double dSqDist = 0 ;
for ( int i = 0 ; i < int( m_AuxAxesName.size()) ; ++ i) { for ( int i = 0 ; i < int( m_AuxAxesName.size()) ; ++ i) {
// coefficiente moltiplicativo per differenziare assi lineari e rotanti // coefficiente moltiplicativo per differenziare assi lineari e rotanti
double dSqCoeff = ( m_AuxAxesLinear[i] ? 1 : SQ_COEFF_ROT_MOVE) ; double dSqCoeff = ( m_AuxAxesLinear[i] ? 1 : 100) ;
dSqDist += dSqCoeff * ( m_AuxAxesEnd[i] - m_AuxAxesVal[i]) * ( m_AuxAxesEnd[i] - m_AuxAxesVal[i]) ; dSqDist += dSqCoeff * ( m_AuxAxesEnd[i] - m_AuxAxesVal[i]) * ( m_AuxAxesEnd[i] - m_AuxAxesVal[i]) ;
} }
double dPrevCoeff = m_dCoeff ; double dPrevCoeff = m_dCoeff ;
@@ -1336,11 +1265,8 @@ Simulator::ExecLineVmill( int nVmId, int nCurrTool, double dVmTdOffs, double dVm
{ {
// Recupero Zmap // Recupero Zmap
IVolZmap* pVZM = GetVolZmap( m_pGeomDB->GetGeoObj( nVmId)) ; IVolZmap* pVZM = GetVolZmap( m_pGeomDB->GetGeoObj( nVmId)) ;
if ( pVZM == nullptr) { if ( pVZM == nullptr)
string sOut = " --> GetVolZmap (" + ToString( nVmId) +") Error <--" ;
LOG_DBG_INFO( GetEMkLogger(), sOut.c_str())
return false ; return false ;
}
// Porto gli estremi nel riferimento opportuno dello Zmap // Porto gli estremi nel riferimento opportuno dello Zmap
Point3d ptHiL = ptHi ; ptHiL.ToLoc( frVzmI) ; Point3d ptHiL = ptHi ; ptHiL.ToLoc( frVzmI) ;
Vector3d vtHiL = vtHi ; vtHiL.ToLoc( frVzmI) ; Vector3d vtHiL = vtHi ; vtHiL.ToLoc( frVzmI) ;
@@ -1353,35 +1279,13 @@ Simulator::ExecLineVmill( int nVmId, int nCurrTool, double dVmTdOffs, double dVm
ptHfL += dVmTdOffs * vtHfL + dVmAdOffs * vtAfL ; ptHfL += dVmTdOffs * vtHfL + dVmAdOffs * vtAfL ;
// Log per debug // Log per debug
if ( ExeGetDebugLevel() >= 10) { if ( ExeGetDebugLevel() >= 10) {
string sOut = "Zmap=" + ToString( nVmId) + " Tool=" + ToString( nCurrTool) + string sOut = "Zmap=" + ToString( nVmId) + " CurrTool=" + ToString( nCurrTool) +
" Pi=(" + ToString( ptHiL) + ") Vi=(" + ToString( vtHiL) + ") Ai=(" + ToString( vtAiL) + "Pi=(" + ToString( ptHiL) + ") Vi=(" + ToString( vtHiL) + ") Ai=(" + ToString( vtAiL) +
") Pf=(" + ToString( ptHfL) + ") Vf=(" + ToString( vtHfL) + ") Af=(" + ToString( vtAfL) + ")" ; ") Pf=(" + ToString( ptHfL) + ") Vf=(" + ToString( vtHfL) + ") Af=(" + ToString( vtAfL) + ")" ;
LOG_DBG_INFO( GetEMkLogger(), sOut.c_str()) LOG_DBG_INFO( GetEMkLogger(), sOut.c_str())
} }
// Se utensile che non lavora di testa
if ( ! m_bCutOnTip) {
// se movimento di testa (angolo movimento verso la testa oltre 5.8deg), non eseguo asportazione
Vector3d vtDirM = Media( vtHiL, vtHfL) ;
vtDirM.Normalize() ;
double dAxMove = ( ptHfL - ptHiL) * vtDirM ;
if ( dAxMove < -EPS_SMALL) {
double dMove = ( ptHfL - ptHiL).Len() ;
if ( dAxMove < -0.1 * abs( dMove))
return true ;
}
}
// Eseguo // Eseguo
bool bOk = pVZM->MillingStep( nCurrTool, ptHiL, vtHiL, vtAiL, ptHfL, vtHfL, vtAfL) ; return pVZM->MillingStep( nCurrTool, ptHiL, vtHiL, vtAiL, ptHfL, vtHfL, vtAfL) ;
if ( ! bOk) {
if ( ExeGetDebugLevel() < 10) {
string sOut = "Zmap=" + ToString( nVmId) + " Tool=" + ToString( nCurrTool) +
" Pi=(" + ToString( ptHiL) + ") Vi=(" + ToString( vtHiL) + ") Ai=(" + ToString( vtAiL) +
") Pf=(" + ToString( ptHfL) + ") Vf=(" + ToString( vtHfL) + ") Af=(" + ToString( vtAfL) + ")" ;
LOG_DBG_INFO( GetEMkLogger(), sOut.c_str())
}
LOG_DBG_INFO( GetEMkLogger(), " --> MillingStep Error <--")
}
return bOk ;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -1420,62 +1324,44 @@ Simulator::ExecCollisionCheck( int& nCdInd, int& nObjInd, int nMoveType)
// se utensile attivo su grezzo in lavoro e non è rapido, salto // se utensile attivo su grezzo in lavoro e non è rapido, salto
if ( bIsTool && bIsRaw && nMoveType != 0) if ( bIsTool && bIsRaw && nMoveType != 0)
continue ; continue ;
// se riferimento non trovato, si salta
const IGeoFrame3d* pGeoFrame = GetGeoFrame3d( m_pGeomDB->GetGeoObj( m_CollObj[j].nFrameId)) ;
if ( pGeoFrame == nullptr)
continue ;
// esecuzione controlli di collisione // esecuzione controlli di collisione
bool bOk = true ; bool bOk = true ;
// oggetti che richiedono frame associato (Box, Cylinder, Sphere, Cone) Frame3d frObj = pGeoFrame->GetFrame() ;
if ( m_CollObj[j].nType != MCH_SIM_COB_POLY) { if ( ! m_CollObj[j].vtMove.IsSmall())
// se riferimento non trovato, si salta frObj.Translate( m_CollObj[j].vtMove.x * frObj.VersX() +
const IGeoFrame3d* pGeoFrame = GetGeoFrame3d( m_pGeomDB->GetGeoObj( m_CollObj[j].nFrameId)) ; m_CollObj[j].vtMove.y * frObj.VersY() +
if ( pGeoFrame == nullptr) m_CollObj[j].vtMove.z * frObj.VersZ()) ;
continue ; Frame3d frParent ; m_pGeomDB->GetGlobFrame( m_CollObj[j].nFrameId, frParent) ;
Frame3d frObj = pGeoFrame->GetFrame() ; frObj.LocToLoc( frParent, frCd) ;
if ( ! m_CollObj[j].vtMove.IsSmall()) if ( m_CollObj[j].nType == MCH_SIM_COB_BOX) {
frObj.Translate( m_CollObj[j].vtMove.x * frObj.VersX() + Vector3d vtDiag( m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_CollObj[j].dPar3) ;
m_CollObj[j].vtMove.y * frObj.VersY() + if ( pVZM != nullptr)
m_CollObj[j].vtMove.z * frObj.VersZ()) ; bOk = pVZM->AvoidBox( frObj, vtDiag, m_dSafeDist) ;
Frame3d frParent ; m_pGeomDB->GetGlobFrame( m_CollObj[j].nFrameId, frParent) ;
frObj.LocToLoc( frParent, frCd) ;
// controlli di collisione
if ( m_CollObj[j].nType == MCH_SIM_COB_BOX) {
Vector3d vtDiag( m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_CollObj[j].dPar3) ;
if ( pVZM != nullptr)
bOk = ! pVZM->CDeBox( frObj, vtDiag, m_dSafeDist) ;
else
bOk = ! CDeBoxClosedSurfTm( frObj, vtDiag, *pSTM, m_dSafeDist) ;
}
else if ( m_CollObj[j].nType == MCH_SIM_COB_CYL) {
if ( pVZM != nullptr)
bOk = ! pVZM->CDeCylinder( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_dSafeDist) ;
else
bOk = ! CDeCylClosedSurfTm( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, *pSTM, m_dSafeDist) ;
}
else if ( m_CollObj[j].nType == MCH_SIM_COB_SPHE) {
if ( pVZM != nullptr)
bOk = ! pVZM->CDeSphere( frObj.Orig(), m_CollObj[j].dPar1, m_dSafeDist) ;
else
bOk = ! CDeSpheClosedSurfTm( frObj.Orig(), m_CollObj[j].dPar1, *pSTM, m_dSafeDist) ;
}
else if ( m_CollObj[j].nType == MCH_SIM_COB_CONE) {
if ( pVZM != nullptr)
bOk = ! pVZM->CDeConeFrustum( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_CollObj[j].dPar3, m_dSafeDist) ;
else
bOk = ! CDeConeFrustumClosedSurfTm( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_CollObj[j].dPar3, *pSTM, m_dSafeDist) ;
}
}
// altrimenti poliedro
else {
SurfLocal SurfLoc( m_pGeomDB, m_CollObj[j].nFrameId, frCd) ;
const ISurfTriMesh* pStmLoc = GetSurfTriMesh( SurfLoc) ;
if ( pStmLoc != nullptr) {
if ( pVZM != nullptr)
bOk = ! pVZM->CDeSurfTm( *pStmLoc, m_dSafeDist) ;
else
bOk = ! CDeClosedSurfTmClosedSurfTm( *pStmLoc, *pSTM, m_dSafeDist) ;
}
else else
bOk = false ; bOk = ! CDeBoxClosedSurfTm( frObj, vtDiag, m_dSafeDist, *pSTM) ;
}
else if ( m_CollObj[j].nType == MCH_SIM_COB_CYL) {
if ( pVZM != nullptr)
bOk = pVZM->AvoidCylinder( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_dSafeDist) ;
else
bOk = ! CDeCylClosedSurfTm( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_dSafeDist, *pSTM) ;
}
else if ( m_CollObj[j].nType == MCH_SIM_COB_SPHE) {
if ( pVZM != nullptr)
bOk = pVZM->AvoidSphere( frObj.Orig(), m_CollObj[j].dPar1, m_dSafeDist) ;
else
bOk = ! CDeSpheClosedSurfTm( frObj.Orig(), m_CollObj[j].dPar1, m_dSafeDist, *pSTM) ;
}
else if ( m_CollObj[j].nType == MCH_SIM_COB_CONE) {
if ( pVZM != nullptr)
bOk = pVZM->AvoidConeFrustum( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_CollObj[j].dPar3, m_dSafeDist) ;
else
bOk = ! CDeConeFrustumClosedSurfTm( frObj, m_CollObj[j].dPar1, m_CollObj[j].dPar2, m_CollObj[j].dPar3, m_dSafeDist, *pSTM) ;
} }
// se trovata collisione
if ( ! bOk) { if ( ! bOk) {
nCdInd = i ; nCdInd = i ;
nObjInd = j ; nObjInd = j ;
@@ -1488,29 +1374,7 @@ Simulator::ExecCollisionCheck( int& nCdInd, int& nObjInd, int nMoveType)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Simulator::OnInit( void) Simulator::OnStart( bool bFirst)
{
// verifico esistenza funzione
if ( ! m_pMachine->LuaExistsFunction( ON_SIMUL_INIT))
return true ;
// chiamo la funzione di ingresso nella simulazione
return m_pMachine->LuaCallFunction( ON_SIMUL_INIT) ;
}
//----------------------------------------------------------------------------
bool
Simulator::OnExit( void)
{
// verifico esistenza funzione
if ( ! m_pMachine->LuaExistsFunction( ON_SIMUL_EXIT))
return true ;
// chiamo la funzione di uscita dalla simulazione
return m_pMachine->LuaCallFunction( ON_SIMUL_EXIT) ;
}
//----------------------------------------------------------------------------
bool
Simulator::OnProgramStart( bool bFirst)
{ {
// assegno flag inizio simulazione // assegno flag inizio simulazione
bool bOk = m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_SIM1ST, bFirst) ; bool bOk = m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_SIM1ST, bFirst) ;
@@ -1524,7 +1388,7 @@ Simulator::OnProgramStart( bool bFirst)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Simulator::OnProgramEnd( void) Simulator::OnEnd( void)
{ {
// verifico esistenza funzione // verifico esistenza funzione
if ( ! m_pMachine->LuaExistsFunction( ON_SIMUL_END)) if ( ! m_pMachine->LuaExistsFunction( ON_SIMUL_END))
@@ -1622,17 +1486,16 @@ Simulator::OnToolSelect( const string& sTool, const string& sHead, int nExit, co
! m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCPOS, sTcPos)) ! m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_TCPOS, sTcPos))
return false ; return false ;
// assegno il token e il nome degli assi // assegno il token e il nome degli assi
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
int nNumAxes = int( m_AxesName.size()) ; int nNumAxes = int( m_AxesName.size()) ;
for ( int i = 1 ; i <= MAX_AXES ; ++ i) { for ( int i = 1 ; i <= MAX_AXES ; ++ i) {
if ( i <= nNumAxes) { if ( i <= nNumAxes) {
if ( ! m_pMachine->LuaSetGlobVar( GetGlobVarAxisToken( i, bIsRobot), m_AxesToken[i-1]) || if ( ! m_pMachine->LuaSetGlobVar( GetGlobVarAxisToken(i), m_AxesToken[i-1]) ||
! m_pMachine->LuaSetGlobVar( GetGlobVarAxisName( i, bIsRobot), m_AxesName[i-1])) ! m_pMachine->LuaSetGlobVar( GetGlobVarAxisName(i), m_AxesName[i-1]))
return false ; return false ;
} }
else { else {
if ( ! m_pMachine->LuaResetGlobVar( GetGlobVarAxisToken( i, bIsRobot)) || if ( ! m_pMachine->LuaResetGlobVar( GetGlobVarAxisToken(i)) ||
! m_pMachine->LuaResetGlobVar( GetGlobVarAxisName( i, bIsRobot))) ! m_pMachine->LuaResetGlobVar( GetGlobVarAxisName(i)))
return false ; return false ;
} }
} }
@@ -1687,10 +1550,8 @@ Simulator::OnToolSelect( const string& sTool, const string& sHead, int nExit, co
m_AuxAxesLink.emplace_back( 0) ; m_AuxAxesLink.emplace_back( 0) ;
} }
} }
else { else
bOk = false ; bOk = false ;
nErr = ERR_TOOL_SEL ;
}
} }
return ( bOk && nErr == 0) ; return ( bOk && nErr == 0) ;
@@ -1875,17 +1736,16 @@ Simulator::OnMoveStart( const CamData* pCamData, int& nErr)
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_INDEX, pCamData->GetIndex()) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_INDEX, pCamData->GetIndex()) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_ERR, nErr) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_ERR, nErr) ;
// valore degli assi all'inizio e alla fine del movimento // valore degli assi all'inizio e alla fine del movimento
bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ;
int nNumAxes = int( m_AxesName.size()) ; int nNumAxes = int( m_AxesName.size()) ;
const DBLVECTOR& AxesEnd = pCamData->GetAxesVal() ; const DBLVECTOR& AxesEnd = pCamData->GetAxesVal() ;
for ( int i = 1 ; i <= MAX_AXES ; ++ i) { for ( int i = 1 ; i <= MAX_AXES ; ++ i) {
if ( i <= nNumAxes) { if ( i <= nNumAxes) {
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisPrev( i, GLOB_VAR, bIsRobot), m_AxesVal[i-1]) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisPrev( i), m_AxesVal[i-1]) ;
bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot), AxesEnd[i-1]) ; bOk = bOk && m_pMachine->LuaSetGlobVar( GetGlobVarAxisValue( i), AxesEnd[i-1]) ;
} }
else { else {
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisPrev( i, GLOB_VAR, bIsRobot)) ; bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisPrev( i)) ;
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue( i, GLOB_VAR, bIsRobot)) ; bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue( i)) ;
} }
} }
// versori utensile, correzione e ausiliario alla fine del movimento // versori utensile, correzione e ausiliario alla fine del movimento
@@ -2084,10 +1944,6 @@ Simulator::AddCollisionObj( int nInd, bool bToolOn, int nFrameId, int nType, con
if ( ( dPar1 < EPS_SMALL && dPar2 < EPS_SMALL) || dPar3 < EPS_SMALL) if ( ( dPar1 < EPS_SMALL && dPar2 < EPS_SMALL) || dPar3 < EPS_SMALL)
return false ; return false ;
break ; break ;
case MCH_SIM_COB_POLY :
if ( ! ExeSurfIsClosed( nFrameId))
return false ;
break ;
default : default :
return false ; return false ;
} }
@@ -2139,10 +1995,11 @@ Simulator::SetToolForVmill( const string& sTool, const string& sHead, int nExit,
ExeVolZmapSetSawTool( vVmill, sTool, dLen, dDiam, dThick, 0, dCornR, nFlag, bFirst) ; ExeVolZmapSetSawTool( vVmill, sTool, dLen, dDiam, dThick, 0, dCornR, nFlag, bFirst) ;
else if ( nType == TT_WATERJET) else if ( nType == TT_WATERJET)
ExeVolZmapSetStdTool( vVmill, sTool, dLen + 50, dDiam, dCornR, dMaxMat, nFlag, bFirst) ; ExeVolZmapSetStdTool( vVmill, sTool, dLen + 50, dDiam, dCornR, dMaxMat, nFlag, bFirst) ;
else if ( nType == TT_ADDITIVE)
ExeVolZmapSetAdditiveTool( vVmill, sTool, dLen, dDiam, dCornR, nFlag, bFirst) ;
else if ( abs( dSideAng) < EPS_ANG_SMALL || abs( dThick) < EPS_SMALL) { else if ( abs( dSideAng) < EPS_ANG_SMALL || abs( dThick) < EPS_SMALL) {
ExeVolZmapSetStdTool( vVmill, sTool, dLen, dDiam, dCornR, dMaxMat, nFlag, bFirst) ; if ( dDiam <= dMaxStemDiam)
ExeVolZmapSetStdTool( vVmill, sTool, dLen, dDiam, dCornR, dMaxMat, nFlag, bFirst) ;
else
ExeVolZmapSetSawTool( vVmill, sTool, dLen, dDiam, dMaxMat, 0, dCornR, nFlag, bFirst) ;
} }
else { else {
bool bExtra = ( dThick > 0) ; bool bExtra = ( dThick > 0) ;
@@ -2225,7 +2082,6 @@ Simulator::MoveAxes( int nMoveType, const SAMVECTOR& vAxNaEpSt)
static const int STEP_RAPID = -2 ; static const int STEP_RAPID = -2 ;
static const int STEP_RAPROT = -3 ; static const int STEP_RAPROT = -3 ;
static const int STEP_COLLROT = -4 ; static const int STEP_COLLROT = -4 ;
bool bViewAllFrames = true ;
int nStep = 1 ; int nStep = 1 ;
for ( int i = 0 ; i < nAxCount ; ++ i) { for ( int i = 0 ; i < nAxCount ; ++ i) {
double dMove = abs( vAxNaEpSt[i].dEndPos - vPrev[i]) ; double dMove = abs( vAxNaEpSt[i].dEndPos - vPrev[i]) ;
@@ -2235,14 +2091,10 @@ Simulator::MoveAxes( int nMoveType, const SAMVECTOR& vAxNaEpSt)
dStep = m_dStep ; dStep = m_dStep ;
else if ( abs( dStep - STEP_RAPID) < EPS_SMALL) else if ( abs( dStep - STEP_RAPID) < EPS_SMALL)
dStep = 4 * m_dStep ; dStep = 4 * m_dStep ;
else if ( abs( dStep - STEP_RAPROT) < EPS_SMALL) { else if ( abs( dStep - STEP_RAPROT) < EPS_SMALL)
dStep = 0.4 * m_dStep ; dStep = 0.4 * m_dStep ;
bViewAllFrames = false ; else // STEP_COLLROT
}
else { // STEP_COLLROT
dStep = min( 0.4 * m_dStep, 10.) ; dStep = min( 0.4 * m_dStep, 10.) ;
bViewAllFrames = false ;
}
} }
dStep = max( dStep, 1.) ; dStep = max( dStep, 1.) ;
int nAxStep = int( dMove / dStep) + 1 ; int nAxStep = int( dMove / dStep) + 1 ;
@@ -2277,8 +2129,7 @@ Simulator::MoveAxes( int nMoveType, const SAMVECTOR& vAxNaEpSt)
} }
} }
// Aggiorno visualizzazione // Aggiorno visualizzazione
if ( bViewAllFrames || ( i % 4) == 0 || i == nStep) ExeDraw() ;
ExeDraw() ;
// Verifico collisioni // Verifico collisioni
int nCdInd, nObjInd ; int nCdInd, nObjInd ;
bool bCollCheck = ExecCollisionCheck( nCdInd, nObjInd, nMoveType) ; bool bCollCheck = ExecCollisionCheck( nCdInd, nObjInd, nMoveType) ;
+2 -10
View File
@@ -86,10 +86,8 @@ class Simulator
{ return ( ! m_CollObj.empty() && ! m_CdId.empty()) ; } { return ( ! m_CollObj.empty() && ! m_CdId.empty()) ; }
bool Stopped( void) bool Stopped( void)
{ return ( m_nUiStatus == MCH_UISIM_STOP) ; } { return ( m_nUiStatus == MCH_UISIM_STOP) ; }
bool OnInit( void) ; bool OnStart( bool bFirst) ;
bool OnExit( void) ; bool OnEnd( void) ;
bool OnProgramStart( bool bFirst) ;
bool OnProgramEnd( void) ;
bool OnDispositionStarting( int nOpId, int nOpInd, int nPhase, bool OnDispositionStarting( int nOpId, int nOpInd, int nPhase,
const std::string& sTable, const Point3d& ptOri1, bool bEmpty, bool bSomeByHand) ; const std::string& sTable, const Point3d& ptOri1, bool bEmpty, bool bSomeByHand) ;
bool OnDispositionStart( int nOpId, int nOpInd, int nPhase, bool OnDispositionStart( int nOpId, int nOpInd, int nPhase,
@@ -137,17 +135,12 @@ class Simulator
: sName( sN), sHead( sH), nExit( nE), dTdOffs( dT), dAdOffs( dA) {} : sName( sN), sHead( sH), nExit( nE), dTdOffs( dT), dAdOffs( dA) {}
} ; } ;
typedef std::vector<VmTool> VMTVECTOR ; typedef std::vector<VmTool> VMTVECTOR ;
enum { SIS_CREATED = 0,
SIS_INITIALIZED = 1,
SIS_READYTOSTART = 2,
SIS_READYTORUN = 3} ;
private : private :
MachMgr* m_pMchMgr ; // puntatore al gestore di tutte le lavorazioni MachMgr* m_pMchMgr ; // puntatore al gestore di tutte le lavorazioni
IGeomDB* m_pGeomDB ; // puntatore al DB geometrico IGeomDB* m_pGeomDB ; // puntatore al DB geometrico
Machine* m_pMachine ; // puntatore alla macchina Machine* m_pMachine ; // puntatore alla macchina
PerformanceCounter* m_pPerfCnt ; // timer per calcolo FPS PerformanceCounter* m_pPerfCnt ; // timer per calcolo FPS
int m_nStatus ; // stato interno del simulatore (creato, inizializzato, pronto al movimento)
double m_dStep ; // lunghezza di riferimento per la velocità di simulazione double m_dStep ; // lunghezza di riferimento per la velocità di simulazione
int m_nUiStatus ; // stato simulazione a livello utente int m_nUiStatus ; // stato simulazione a livello utente
int m_nOpId ; // identificativo della operazione (lavoraz.) corrente int m_nOpId ; // identificativo della operazione (lavoraz.) corrente
@@ -165,7 +158,6 @@ class Simulator
std::string m_sHead ; // nome della testa corrente std::string m_sHead ; // nome della testa corrente
int m_nExit ; // indice dell'uscita corrente int m_nExit ; // indice dell'uscita corrente
double m_dTDiam ; // diametro dell'utensile corrente double m_dTDiam ; // diametro dell'utensile corrente
bool m_bCutOnTip ; // flag capacità di lavorare di testa dell'utensile corrente
INTVECTOR m_VmId ; // vettore identificativi Zmap per Virtual Milling INTVECTOR m_VmId ; // vettore identificativi Zmap per Virtual Milling
INTVECTOR m_CdId ; // vettore identificativi Zmap per Collision Detection INTVECTOR m_CdId ; // vettore identificativi Zmap per Collision Detection
VMTVECTOR m_VmTool ; // vettore utensili attivi per virtual milling VMTVECTOR m_VmTool ; // vettore utensili attivi per virtual milling
+10 -41
View File
@@ -606,9 +606,6 @@ SurfFinishing::Update( bool bPostApply)
return true ; return true ;
} }
// elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo)
RemoveClimbRiseHome() ;
// imposto eventuale asse bloccato da lavorazione // imposto eventuale asse bloccato da lavorazione
SetBlockedRotAxis( m_Params.m_sBlockedAxis) ; SetBlockedRotAxis( m_Params.m_sBlockedAxis) ;
@@ -803,31 +800,11 @@ SurfFinishing::UpdateToolData( bool* pbChanged)
const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ; const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ;
if ( pTdata == nullptr) if ( pTdata == nullptr)
return false ; return false ;
// salvo posizione TC, testa e uscita originali // verifico se sono diversi (ad esclusione del nome)
string sOrigTcPos = m_TParams.m_sTcPos ; m_TParams.m_sName = pTdata->m_sName ;
string sOrigHead = m_TParams.m_sHead ; bool bChanged = ! SameTool( m_TParams, *pTdata) ;
int nOrigExit = m_TParams.m_nExit ;
// verifico se sono diversi (ad esclusione di nome, posizione TC, testa e uscita)
bool bChanged = ( ! SameTool( m_TParams, *pTdata, false)) ;
// aggiorno comunque i parametri // aggiorno comunque i parametri
m_TParams = *pTdata ; m_TParams = *pTdata ;
// se definito attrezzaggio, aggiorno i parametri che ne possono derivare
string sTcPos ; string sHead ; int nExit ;
if ( m_pMchMgr->GetCurrSetupMgr().GetToolData( m_TParams.m_sName, sTcPos, sHead, nExit)) {
if ( sOrigTcPos != sTcPos ||
sOrigHead != sHead ||
nOrigExit != nExit)
bChanged = true ;
m_TParams.m_sTcPos = sTcPos ;
m_TParams.m_sHead = sHead ;
m_TParams.m_nExit = nExit ;
}
else {
if ( sOrigTcPos != pTdata->m_sTcPos ||
sOrigHead != pTdata->m_sHead ||
nOrigExit != pTdata->m_nExit)
bChanged = true ;
}
// eventuali segnalazioni // eventuali segnalazioni
if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) { if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) {
string sInfo = "Warning in SurfFinishing : tool name changed (" + string sInfo = "Warning in SurfFinishing : tool name changed (" +
@@ -1331,8 +1308,8 @@ SurfFinishing::AddZigZag( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf,
bool bStart = true ; bool bStart = true ;
while ( OffsCrv.GetCurveCount() > 0) { while ( OffsCrv.GetCurveCount() > 0) {
// recupero la prima curva di offset // recupero la prima curva di offset
PtrOwner<ICurveComposite> pOffs ; PtrOwner<ICurveComposite> pOffs( CreateCurveComposite()) ;
if ( ! pOffs.Set( ConvertCurveToComposite( OffsCrv.GetLongerCurve()))) { if ( IsNull( pOffs) || ! pOffs->AddCurve( OffsCrv.GetLongerCurve())) {
m_pMchMgr->SetLastError( 3110, "Error in SurfFinishing : Toolpath not computable") ; m_pMchMgr->SetLastError( 3110, "Error in SurfFinishing : Toolpath not computable") ;
return false ; return false ;
} }
@@ -1382,7 +1359,7 @@ SurfFinishing::AddZigZag( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf,
if ( IsNull( pCompo) || ! pCompo->FromPolyLine( PL)) if ( IsNull( pCompo) || ! pCompo->FromPolyLine( PL))
return false ; return false ;
// sostituisco la vecchia curva con la nuova // sostituisco la vecchia curva con la nuova
vpCrvs[k].Set( pCompo) ; vpCrvs[k].Set( Release( pCompo )) ;
} }
// ciclo sulle curve elementari // ciclo sulle curve elementari
int nMaxInd = vpCrvs[k]->GetCurveCount() - 1 ; int nMaxInd = vpCrvs[k]->GetCurveCount() - 1 ;
@@ -1672,13 +1649,6 @@ SurfFinishing::CalcZigZag( const ICurveComposite* pOffs,
nJ = -1 ; nJ = -1 ;
} }
} }
// se richiesta percorrenza invertita
if ( m_Params.m_bInvert) {
for ( auto& pCompo : vpCrvs)
pCompo->Invert() ;
}
return true ; return true ;
} }
@@ -1750,7 +1720,7 @@ SurfFinishing::AddSpiral( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf,
if ( IsNull( pCompo) || ! pCompo->FromPolyLine( PL)) if ( IsNull( pCompo) || ! pCompo->FromPolyLine( PL))
return false ; return false ;
// sostituisco la vecchia curva con la nuova // sostituisco la vecchia curva con la nuova
pMCrv.Set( pCompo) ; pMCrv.Set( Release( pCompo )) ;
} }
// ciclo sulle curve elementari // ciclo sulle curve elementari
int nMaxInd = pMCrv->GetCurveCount() - 1 ; int nMaxInd = pMCrv->GetCurveCount() - 1 ;
@@ -1913,7 +1883,7 @@ SurfFinishing::CalcSpiral( const ICurveComposite* pCompo, bool bSplitArcs,
if ( bNextOk) { if ( bNextOk) {
// sistemo per prossimo step // sistemo per prossimo step
dCurrRad = dRad ; dCurrRad = dRad ;
pOffs.Set( pNextOffs) ; pOffs.Set( Release( pNextOffs)) ;
pCurr = Get( pOffs) ; pCurr = Get( pOffs) ;
// nuovo valore pari allo step // nuovo valore pari allo step
dOffs = GetSideStep() ; dOffs = GetSideStep() ;
@@ -2113,7 +2083,6 @@ SurfFinishing::GetRightFeed( const Vector3d& vtMove, const Vector3d& vtTool) con
double double
SurfFinishing::GetRadiusForStartEndElevation( void) const SurfFinishing::GetRadiusForStartEndElevation( void) const
{ {
const double DELTA_ELEV_RAD = 4.0 ; const double DELTA_ELEV_RAD = 20.0 ;
double dDeltaRad = min( DELTA_ELEV_RAD, 0.5 * m_TParams.m_dTDiam) ; return ( 0.5 * m_TParams.m_dTDiam + DELTA_ELEV_RAD) ;
return ( 0.5 * m_TParams.m_dTDiam + dDeltaRad) ;
} }
+2 -6
View File
@@ -83,10 +83,6 @@ struct SurfFinishingData : public MachiningData
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline const SurfFinishingData* GetSurfFinishingData( const MachiningData* pMdata) inline const SurfFinishingData* GetSurfFinishingData( const MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_SURFFINISHING) { return (dynamic_cast<const SurfFinishingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<const SurfFinishingData*>( pMdata)) ; }
inline SurfFinishingData* GetSurfFinishingData( MachiningData* pMdata) inline SurfFinishingData* GetSurfFinishingData( MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_SURFFINISHING) { return (dynamic_cast<SurfFinishingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<SurfFinishingData*>( pMdata)) ; }
+4 -9
View File
@@ -1,7 +1,7 @@
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// EgalTech 2015-2024 // EgalTech 2015-2015
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// File : Table.cpp Data : 19.03.24 Versione : 2.6c2 // File : Table.cpp Data : 25.05.15 Versione : 1.6e7
// Contenuto : Oggetto tavola per gruppo tavola di macchina. // Contenuto : Oggetto tavola per gruppo tavola di macchina.
// //
// //
@@ -45,7 +45,6 @@ Table::Clone( void) const
pTab->m_sName = m_sName ; pTab->m_sName = m_sName ;
pTab->m_nType = m_nType ; pTab->m_nType = m_nType ;
pTab->m_ptRef1 = m_ptRef1 ; pTab->m_ptRef1 = m_ptRef1 ;
pTab->m_vsColl = m_vsColl ;
} }
catch( ...) { catch( ...) {
delete pTab ; delete pTab ;
@@ -64,10 +63,7 @@ Table::Dump( string& sOut, bool bMM, const char* szNewLine) const
sOut += "Id=" + ToString( m_nOwnerId) + szNewLine ; sOut += "Id=" + ToString( m_nOwnerId) + szNewLine ;
sOut += "Name=" + m_sName + szNewLine ; sOut += "Name=" + m_sName + szNewLine ;
sOut += "Type=" + ToString( m_nType) + szNewLine ; sOut += "Type=" + ToString( m_nType) + szNewLine ;
sOut += "Ref1=(" + ToString( GetInUiUnits( m_ptRef1, bMM), 4) + ")" + szNewLine ; sOut += "Ref1=(" + ToString( GetInUiUnits(m_ptRef1, bMM), 4) + ")" + szNewLine ;
sOut += "Area1=(" + ToString( GetInUiUnits( m_b3Area1.GetMin(), bMM), 4) + ";" +
ToString( GetInUiUnits( m_b3Area1.GetMax(), bMM), 4) + szNewLine ;
sOut += "Coll=" + ToString( m_vsColl) + szNewLine ;
return true ; return true ;
} }
@@ -103,12 +99,11 @@ Table::Table( void)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
Table::Set( const string& sName, int nType, const Point3d& ptRef1, const BBox3d& b3Area1, const STRVECTOR& vsColl) Table::Set( const string& sName, int nType, const Point3d& ptRef1, const BBox3d& b3Area1)
{ {
m_sName = sName ; m_sName = sName ;
m_nType = nType ; m_nType = nType ;
m_ptRef1 = ptRef1 ; m_ptRef1 = ptRef1 ;
m_b3Area1 = b3Area1 ; m_b3Area1 = b3Area1 ;
m_vsColl = vsColl ;
return true ; return true ;
} }
+1 -4
View File
@@ -30,7 +30,7 @@ class Table : public IUserObj
public : public :
Table( void) ; Table( void) ;
bool Set( const std::string& sName, int nType, const Point3d& ptRef1, const BBox3d& b3Area1, const STRVECTOR& vsColl) ; bool Set( const std::string& sName, int nType, const Point3d& ptRef1, const BBox3d& b3Area1) ;
const std::string& GetName( void) const std::string& GetName( void)
{ return m_sName ; } { return m_sName ; }
int GetType( void) int GetType( void)
@@ -39,8 +39,6 @@ class Table : public IUserObj
{ return m_ptRef1 ; } { return m_ptRef1 ; }
const BBox3d& GetArea1( void) const BBox3d& GetArea1( void)
{ return m_b3Area1 ; } { return m_b3Area1 ; }
const STRVECTOR& GetCollGroups( void) const
{ return m_vsColl ; }
private : private :
int m_nOwnerId ; int m_nOwnerId ;
@@ -49,5 +47,4 @@ class Table : public IUserObj
int m_nType ; int m_nType ;
Point3d m_ptRef1 ; Point3d m_ptRef1 ;
BBox3d m_b3Area1 ; BBox3d m_b3Area1 ;
STRVECTOR m_vsColl ;
} ; } ;
+5 -5
View File
@@ -72,7 +72,7 @@ struct ToolData
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline bool inline bool
SameTool( const ToolData& Td1, const ToolData& Td2, bool bAlsoNameTcPosHeadExit = true) SameTool( const ToolData& Td1, const ToolData& Td2)
{ {
const double EPS_TOOL_LEN = 10 * EPS_SMALL ; const double EPS_TOOL_LEN = 10 * EPS_SMALL ;
const double EPS_TOOL_ANG = 10 * EPS_ANG_SMALL ; const double EPS_TOOL_ANG = 10 * EPS_ANG_SMALL ;
@@ -80,11 +80,11 @@ SameTool( const ToolData& Td1, const ToolData& Td2, bool bAlsoNameTcPosHeadExit
const double EPS_FEED = 0.5 ; const double EPS_FEED = 0.5 ;
const double EPS_ABSORP = 0.5 ; const double EPS_ABSORP = 0.5 ;
return ( Td1.m_Uuid == Td2.m_Uuid && return ( Td1.m_Uuid == Td2.m_Uuid &&
( Td1.m_sName == Td2.m_sName || ! bAlsoNameTcPosHeadExit) && Td1.m_sName == Td2.m_sName &&
Td1.m_sDraw == Td2.m_sDraw && Td1.m_sDraw == Td2.m_sDraw &&
( Td1.m_sTcPos == Td2.m_sTcPos || ! bAlsoNameTcPosHeadExit) && Td1.m_sTcPos == Td2.m_sTcPos &&
( Td1.m_sHead == Td2.m_sHead || ! bAlsoNameTcPosHeadExit) && Td1.m_sHead == Td2.m_sHead &&
( Td1.m_nExit == Td2.m_nExit || ! bAlsoNameTcPosHeadExit) && Td1.m_nExit == Td2.m_nExit &&
Td1.m_nCorr == Td2.m_nCorr && Td1.m_nCorr == Td2.m_nCorr &&
Td1.m_nType == Td2.m_nType && Td1.m_nType == Td2.m_nType &&
abs( Td1.m_dMaxSpeed - Td2.m_dMaxSpeed) < EPS_SPEED && abs( Td1.m_dMaxSpeed - Td2.m_dMaxSpeed) < EPS_SPEED &&
+12 -16
View File
@@ -694,16 +694,12 @@ ToolsMgr::GetCurrToolMaxDepth( double dSafe, double& dMaxDepth) const
GetValInNotes( m_tdCurrTool.m_sSysNotes, TSI_THLEN, dTHoldLen) ; GetValInNotes( m_tdCurrTool.m_sSysNotes, TSI_THLEN, dTHoldLen) ;
GetValInNotes( m_tdCurrTool.m_sSysNotes, TSI_THDIAM, dTHoldDiam) ; GetValInNotes( m_tdCurrTool.m_sSysNotes, TSI_THDIAM, dTHoldDiam) ;
} }
// calcolo il massimo affondamento per le limitazioni dal portautensili // calcolo il massimo affondamento
dMaxDepth = m_tdCurrTool.m_dLen - dSafe ; dMaxDepth = m_tdCurrTool.m_dLen - dSafe ;
if ( dTHoldDiam > m_tdCurrTool.m_dDiam + EPS_SMALL) if ( m_tdCurrTool.m_dDiam > dTHoldDiam)
dMaxDepth -= dTHoldLen ;
else
dMaxDepth -= dTHoldBase ; dMaxDepth -= dTHoldBase ;
// recupero l'eventuale diametro gambo utensile (definito se non nullo) else
double dStemDiam ; m_tdCurrTool.GetParam( TPA_STEMDIAM, dStemDiam) ; dMaxDepth -= dTHoldLen ;
if ( dStemDiam > m_tdCurrTool.m_dDiam + EPS_SMALL)
dMaxDepth = min( dMaxDepth, m_tdCurrTool.m_dMaxMat) ;
return true ; return true ;
} }
// se mortasatrice o sega a catena // se mortasatrice o sega a catena
@@ -738,11 +734,10 @@ ToolsMgr::GetCurrToolThDiam( double& dThDiam) const
if ( ! m_bCurrTool) if ( ! m_bCurrTool)
return false ; return false ;
// se punta a forare, lama, fresa, mortasatrice/sega a catena o scalpello // se punta a forare, lama, fresa o scalpello
if ( ( m_tdCurrTool.m_nType & TF_DRILLBIT) != 0 || if ( ( m_tdCurrTool.m_nType & TF_DRILLBIT) != 0 ||
( m_tdCurrTool.m_nType & TF_SAWBLADE) != 0 || ( m_tdCurrTool.m_nType & TF_SAWBLADE) != 0 ||
( m_tdCurrTool.m_nType & TF_MILL) != 0 || ( m_tdCurrTool.m_nType & TF_MILL) != 0 ||
( m_tdCurrTool.m_nType & TF_MORTISE) != 0 ||
( m_tdCurrTool.m_nType & TF_CHISEL) != 0) { ( m_tdCurrTool.m_nType & TF_CHISEL) != 0) {
// recupero le dimensioni del porta utensili // recupero le dimensioni del porta utensili
double dTHoldBase = 0 ; double dTHoldBase = 0 ;
@@ -762,8 +757,9 @@ ToolsMgr::GetCurrToolThDiam( double& dThDiam) const
dThDiam = dTHoldDiam ; dThDiam = dTHoldDiam ;
return true ; return true ;
} }
// se waterjet // se mortasatrice/sega a catena o waterjet
else if ( ( m_tdCurrTool.m_nType & TF_WATERJET) != 0) { else if ( ( m_tdCurrTool.m_nType & TF_MORTISE) != 0 ||
( m_tdCurrTool.m_nType & TF_WATERJET) != 0) {
dThDiam = 0 ; dThDiam = 0 ;
return true ; return true ;
} }
@@ -779,11 +775,10 @@ ToolsMgr::GetCurrToolThLength( double& dThLen) const
if ( ! m_bCurrTool) if ( ! m_bCurrTool)
return false ; return false ;
// se punta a forare, lama, fresa, mortasatrice/sega a catena o scalpello // se punta a forare, lama, fresa o scalpello
if ( ( m_tdCurrTool.m_nType & TF_DRILLBIT) != 0 || if ( ( m_tdCurrTool.m_nType & TF_DRILLBIT) != 0 ||
( m_tdCurrTool.m_nType & TF_SAWBLADE) != 0 || ( m_tdCurrTool.m_nType & TF_SAWBLADE) != 0 ||
( m_tdCurrTool.m_nType & TF_MILL) != 0 || ( m_tdCurrTool.m_nType & TF_MILL) != 0 ||
( m_tdCurrTool.m_nType & TF_MORTISE) != 0 ||
( m_tdCurrTool.m_nType & TF_CHISEL) != 0) { ( m_tdCurrTool.m_nType & TF_CHISEL) != 0) {
// recupero le dimensioni del porta utensili // recupero le dimensioni del porta utensili
double dTHoldBase = 0 ; double dTHoldBase = 0 ;
@@ -803,8 +798,9 @@ ToolsMgr::GetCurrToolThLength( double& dThLen) const
dThLen = dTHoldLen ; dThLen = dTHoldLen ;
return true ; return true ;
} }
// se waterjet // se mortasatrice/sega a catena o waterjet
else if ( ( m_tdCurrTool.m_nType & TF_WATERJET) != 0) { else if ( ( m_tdCurrTool.m_nType & TF_MORTISE) != 0 ||
( m_tdCurrTool.m_nType & TF_WATERJET) != 0) {
dThLen = 0 ; dThLen = 0 ;
return true ; return true ;
} }
+157 -194
View File
@@ -740,9 +740,6 @@ WaterJetting::Update( bool bPostApply)
return true ; return true ;
} }
// elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo)
RemoveClimbRiseHome() ;
// imposto eventuale asse bloccato da lavorazione // imposto eventuale asse bloccato da lavorazione
SetBlockedRotAxis( m_Params.m_sBlockedAxis) ; SetBlockedRotAxis( m_Params.m_sBlockedAxis) ;
@@ -967,31 +964,11 @@ WaterJetting::UpdateToolData( bool* pbChanged)
const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ; const ToolData* pTdata = pTMgr->GetTool( m_Params.m_ToolUuid) ;
if ( pTdata == nullptr) if ( pTdata == nullptr)
return false ; return false ;
// salvo posizione TC, testa e uscita originali // verifico se sono diversi (ad esclusione del nome)
string sOrigTcPos = m_TParams.m_sTcPos ; m_TParams.m_sName = pTdata->m_sName ;
string sOrigHead = m_TParams.m_sHead ; bool bChanged = ! SameTool( m_TParams, *pTdata) ;
int nOrigExit = m_TParams.m_nExit ;
// verifico se sono diversi (ad esclusione di nome, posizione TC, testa e uscita)
bool bChanged = ( ! SameTool( m_TParams, *pTdata, false)) ;
// aggiorno comunque i parametri // aggiorno comunque i parametri
m_TParams = *pTdata ; m_TParams = *pTdata ;
// se definito attrezzaggio, aggiorno i parametri che ne possono derivare
string sTcPos ; string sHead ; int nExit ;
if ( m_pMchMgr->GetCurrSetupMgr().GetToolData( m_TParams.m_sName, sTcPos, sHead, nExit)) {
if ( sOrigTcPos != sTcPos ||
sOrigHead != sHead ||
nOrigExit != nExit)
bChanged = true ;
m_TParams.m_sTcPos = sTcPos ;
m_TParams.m_sHead = sHead ;
m_TParams.m_nExit = nExit ;
}
else {
if ( sOrigTcPos != pTdata->m_sTcPos ||
sOrigHead != pTdata->m_sHead ||
nOrigExit != pTdata->m_nExit)
bChanged = true ;
}
// eventuali segnalazioni // eventuali segnalazioni
if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) { if ( ! EqualNoCase( m_Params.m_sToolName, m_TParams.m_sName)) {
string sInfo = "Warning in WaterJetting : tool name changed (" + string sInfo = "Warning in WaterJetting : tool name changed (" +
@@ -1676,12 +1653,18 @@ WaterJetting::ProcessPath( int nPathId, int nPvId, int nClId)
m_pGeomDB->GetName( nPathId, sPathName) ; m_pGeomDB->GetName( nPathId, sPathName) ;
// eventuale approssimazione con segmenti di retta // eventuale approssimazione con segmenti di retta
bool bSplitArcs = GetSplitArcs( vtTool) ; int nSplitArcs = m_pMchMgr->GetCurrMachiningsMgr()->GetSplitArcs() ;
if ( ! bSplitArcs) { bool bSplitArcs = ( nSplitArcs == SPLAR_ALWAYS ||
// verifiche sull'ampiezza dell'angolo al centro degli eventuali archi ( nSplitArcs == SPLAR_NO_XY_PLANE && ! vtTool.IsZplus()) ||
VerifyArcs( pCompo) ; ( nSplitArcs == SPLAR_GEN_PLANE && vtTool.IsGeneric())) ;
if ( bSplitArcs && ! ApproxWithLines( pCompo)) {
m_pMchMgr->SetLastError( 3211, "Error in WaterJetting : Linear Approx not computable") ;
return false ;
} }
// verifiche sull'ampiezza dell'angolo al centro degli eventuali archi
VerifyArcs( pCompo) ;
// se abilitato probing, verifico lunghezza entità ed eventualmente le divido // se abilitato probing, verifico lunghezza entità ed eventualmente le divido
if ( m_Params.m_bProbing) if ( m_Params.m_bProbing)
VerifyMaxLenCurves( pCompo, m_Params.m_dProbingMaxDist) ; VerifyMaxLenCurves( pCompo, m_Params.m_dProbingMaxDist) ;
@@ -1774,8 +1757,8 @@ WaterJetting::GeneratePreView( int nPathId, const ICurveComposite* pCompo, doubl
// calcolo la regione // calcolo la regione
PtrOwner<ISurfFlatRegion> pSfr ; PtrOwner<ISurfFlatRegion> pSfr ;
double dSideCoeff = ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL ? 1. / cos( m_Params.m_dSideAngle * DEGTORAD) : 1) ; double dSideCoeff = ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL ? 1. / cos( m_Params.m_dSideAngle * DEGTORAD) : 1) ;
double dRad = 0.5 * m_TParams.m_dDiam * dSideCoeff ; double Rad = 0.5 * m_TParams.m_dDiam * dSideCoeff ;
pSfr.Set( GetSurfFlatRegionFromFatCurve( Release( pCrv), dRad, false, false)) ; pSfr.Set( GetSurfFlatRegionFromFatCurve( Release( pCrv), Rad, false, false)) ;
if ( IsNull( pSfr)) if ( IsNull( pSfr))
return false ; return false ;
// aggiungo eventuale attacco // aggiungo eventuale attacco
@@ -1787,18 +1770,32 @@ WaterJetting::GeneratePreView( int nPathId, const ICurveComposite* pCompo, doubl
// aggiungo eventuali anelli su angoli esterni // aggiungo eventuali anelli su angoli esterni
if ( ! AddLoopsPreview( pCompo, pSfr)) if ( ! AddLoopsPreview( pCompo, pSfr))
return false ; return false ;
// ne recupero i contorni // ne recupero il contorno
for ( int i = 0 ; i < pSfr->GetLoopCount( 0) ; ++i) { PtrOwner< ICurve> pCrv2 ;
PtrOwner<ICurve> pCrv2( pSfr->GetLoop( 0, i)) ; pCrv2.Set( pSfr->GetLoop( 0, 0)) ;
if ( IsNull( pCrv2)) if ( IsNull( pCrv2))
return false ; return false ;
// inserisco la curva nel DB
int nC2Id = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pCrv2)) ;
if ( nC2Id == GDB_ID_NULL)
return false ;
// assegno nome e colore
m_pGeomDB->SetName( nC2Id, MCH_PV_CUT) ;
m_pGeomDB->SetMaterial( nC2Id, colCut) ;
// eventuali altri contorni ( interni di contornatura chiusa)
const int MAX_INT_LOOP = 1000 ;
for ( int i = 1 ; i <= MAX_INT_LOOP ; ++i) {
PtrOwner< ICurve> pCrv3 ;
pCrv3.Set( pSfr->GetLoop( 0, i)) ;
if ( IsNull( pCrv3))
break ;
// inserisco la curva nel DB // inserisco la curva nel DB
int nC2Id = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pCrv2)) ; int nC3Id = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pCrv3)) ;
if ( nC2Id == GDB_ID_NULL) if ( nC3Id == GDB_ID_NULL)
return false ; return false ;
// assegno nome e colore // assegno nome e colore
m_pGeomDB->SetName( nC2Id, MCH_PV_CUT) ; m_pGeomDB->SetName( nC3Id, MCH_PV_CUT) ;
m_pGeomDB->SetMaterial( nC2Id, colCut) ; m_pGeomDB->SetMaterial( nC3Id, colCut) ;
} }
// inserisco la regione nel DB // inserisco la regione nel DB
int nRId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pSfr)) ; int nRId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pSfr)) ;
@@ -1812,11 +1809,10 @@ WaterJetting::GeneratePreView( int nPathId, const ICurveComposite* pCompo, doubl
return false ; return false ;
m_pGeomDB->SetName( nRrId, MCH_PV_RRCUT) ; m_pGeomDB->SetName( nRrId, MCH_PV_RRCUT) ;
m_pGeomDB->SetMaterial( nRrId, INVISIBLE) ; m_pGeomDB->SetMaterial( nRrId, INVISIBLE) ;
// eventuali ripetizioni in basso per tagli inclinati // eventuali ripetizioni in basso per tagli inclinati
if ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL) { if ( abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL) {
// creo copia della curva composita // creo copia della curva composita
PtrOwner<ICurveComposite> pCrv( pCompo->Clone()) ; PtrOwner< ICurve> pCrv( pCompo->Clone()) ;
if ( IsNull( pCrv)) if ( IsNull( pCrv))
return false ; return false ;
// rimuovo eventuale overlap // rimuovo eventuale overlap
@@ -1825,114 +1821,98 @@ WaterJetting::GeneratePreView( int nPathId, const ICurveComposite* pCompo, doubl
pCrv->TrimStartAtLen( dAddedOverlap) ; pCrv->TrimStartAtLen( dAddedOverlap) ;
pCrv->Invert() ; pCrv->Invert() ;
} }
ICURVEPOVECTOR vpCrvs ;
if ( m_Params.m_dSideAngle < 0) {
// se inclinazione negativa devo considerare separatamente ogni sottocurva della composita
vpCrvs.reserve( pCrv->GetCurveCount()) ;
for ( int i = 0 ; i < pCrv->GetCurveCount() ; i++)
vpCrvs.emplace_back( pCrv->GetCurve( i)->Clone()) ;
}
else {
// se inclinazione positiva posso considerare la curva completa
vpCrvs.emplace_back( pCrv->Clone()) ;
}
// offset per raggio utensile // offset per raggio utensile
double dSignOffs1 = dRad ; double dRad = 0.5 * m_TParams.m_dDiam / cos( m_Params.m_dSideAngle * DEGTORAD) ;
double dSignOffs1 = dRad ;
if ( ( m_Params.m_nWorkSide == WJET_WS_RIGHT && m_Params.m_dSideAngle > 0) || if ( ( m_Params.m_nWorkSide == WJET_WS_RIGHT && m_Params.m_dSideAngle > 0) ||
( m_Params.m_nWorkSide == WJET_WS_LEFT && m_Params.m_dSideAngle < 0)) ( m_Params.m_nWorkSide == WJET_WS_LEFT && m_Params.m_dSideAngle < 0))
dSignOffs1 = - dSignOffs1 ; dSignOffs1 = - dSignOffs1 ;
OffsetCurve OffsCrv1 ;
OffsCrv1.Make( pCrv, dSignOffs1, ICurve::OFF_FILLET) ;
PtrOwner< ICurve> pOffs1( OffsCrv1.GetLongerCurve()) ;
if ( IsNull( pOffs1))
return false ;
// offset per inclinazione // offset per inclinazione
double dSignOffs2 = dRad + m_dElev * abs( sin( m_Params.m_dSideAngle * DEGTORAD)) ; double dSignOffs2 = dRad + m_dElev * abs( sin( m_Params.m_dSideAngle * DEGTORAD)) ;
if ( ( m_Params.m_nWorkSide == WJET_WS_RIGHT && m_Params.m_dSideAngle < 0) || if ( ( m_Params.m_nWorkSide == WJET_WS_RIGHT && m_Params.m_dSideAngle < 0) ||
( m_Params.m_nWorkSide == WJET_WS_LEFT && m_Params.m_dSideAngle > 0)) ( m_Params.m_nWorkSide == WJET_WS_LEFT && m_Params.m_dSideAngle > 0))
dSignOffs2 = - dSignOffs2 ; dSignOffs2 = - dSignOffs2 ;
OffsetCurve OffsCrv2 ;
OffsCrv2.Make( pCrv, dSignOffs2, ICurve::OFF_EXTEND) ;
PtrOwner< ICurve> pOffs2( OffsCrv2.GetLongerCurve()) ;
if ( IsNull( pOffs2))
return false ;
// calcolo la regione // calcolo la regione
PtrOwner<ISurfFlatRegion> pSfr( CreateSurfFlatRegion()) ; PtrOwner<ISurfFlatRegion> pSfr ;
// se i due offset sono aperti
if ( ! pOffs1->IsClosed() && ! pOffs2->IsClosed()) {
// li unisco
PtrOwner<ICurveComposite> pBound( CreateCurveComposite()) ;
if ( IsNull( pBound))
return false ;
pBound->AddCurve( Release( pOffs1)) ;
pOffs2->Invert() ;
Point3d ptStart ; pOffs2->GetStartPoint( ptStart) ;
pBound->AddLine( ptStart) ;
pBound->AddCurve( Release( pOffs2)) ;
pBound->Close() ;
// creo la regione
SurfFlatRegionByContours SfrCntr( false, false) ;
SfrCntr.AddCurve( Release( pBound)) ;
pSfr.Set( SfrCntr.GetSurf()) ;
}
// altrimenti sono chiusi
else {
// creo la regione
SurfFlatRegionByContours SfrCntr( false, false) ;
SfrCntr.AddCurve( Release( pOffs1)) ;
SfrCntr.AddCurve( Release( pOffs2)) ;
pSfr.Set( SfrCntr.GetSurf()) ;
}
if ( IsNull( pSfr)) if ( IsNull( pSfr))
return false ; return false ;
for ( int i = 0 ; i < int( vpCrvs.size()) ; i++) {
OffsetCurve OffsCrv1 ;
OffsCrv1.Make( vpCrvs[i], dSignOffs1, ICurve::OFF_FILLET) ;
PtrOwner< ICurve> pOffs1( OffsCrv1.GetLongerCurve()) ;
if ( IsNull( pOffs1))
return false ;
OffsetCurve OffsCrv2 ;
OffsCrv2.Make( vpCrvs[i], dSignOffs2, ICurve::OFF_EXTEND) ;
PtrOwner< ICurve> pOffs2( OffsCrv2.GetLongerCurve()) ;
if ( IsNull( pOffs2))
return false ;
// calcolo la regione corrente
PtrOwner<ISurfFlatRegion> pSfrCurr ;
// se i due offset sono aperti
if ( ! pOffs1->IsClosed() && ! pOffs2->IsClosed()) {
// li unisco
PtrOwner<ICurveComposite> pBound( CreateCurveComposite()) ;
if ( IsNull( pBound))
return false ;
pBound->AddCurve( Release( pOffs1)) ;
pOffs2->Invert() ;
Point3d ptStart ; pOffs2->GetStartPoint( ptStart) ;
pBound->AddLine( ptStart) ;
pBound->AddCurve( Release( pOffs2)) ;
pBound->Close() ;
// creo la regione
SurfFlatRegionByContours SfrCntr( false, false) ;
SfrCntr.AddCurve( Release( pBound)) ;
pSfrCurr.Set( SfrCntr.GetSurf()) ;
}
// altrimenti sono chiusi
else {
// creo la regione
SurfFlatRegionByContours SfrCntr( false, false) ;
SfrCntr.AddCurve( Release( pOffs1)) ;
SfrCntr.AddCurve( Release( pOffs2)) ;
pSfrCurr.Set( SfrCntr.GetSurf()) ;
}
if ( IsNull( pSfrCurr))
return false ;
// aggiungo alla superficie complessiva
if ( pSfr->IsValid())
pSfr->Add( *pSfrCurr) ;
else
pSfr.Set( Release( pSfrCurr)) ;
}
// la regione deve essere rivolta verso Z+ // la regione deve essere rivolta verso Z+
if ( pSfr->GetNormVersor().z < 0) if ( pSfr->GetNormVersor().z < 0)
pSfr->Invert() ; pSfr->Invert() ;
// ne recupero il contorno
// aggiungo eventuali loops PtrOwner< ICurve> pCrv2 ;
AddLoopsPreview( pCrv, pSfr) ; pCrv2.Set( pSfr->GetLoop( 0, 0)) ;
if ( IsNull( pCrv2))
// ne recupero i contorni return false ;
for ( int i = 0 ; i < pSfr->GetLoopCount( 0) ; ++i) { // inserisco la curva nel DB
PtrOwner<ICurve> pCrv2( pSfr->GetLoop( 0, i)) ; int nC2Id = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pCrv2)) ;
if ( IsNull( pCrv2)) if ( nC2Id == GDB_ID_NULL)
return false ;
// assegno nome e colore
m_pGeomDB->SetName( nC2Id, MCH_PV_DOWN_CUT) ;
m_pGeomDB->SetMaterial( nC2Id, colCut) ;
// eventuali altri contorni ( interni di contornatura chiusa)
const int MAX_INT_LOOP = 1000 ;
for ( int i = 1 ; i <= MAX_INT_LOOP ; ++i) {
PtrOwner< ICurve> pCrv3 ;
pCrv3.Set( pSfr->GetLoop( 0, i)) ;
if ( IsNull( pCrv3))
break ;
// inserisco la curva nel DB
int nC3Id = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pCrv3)) ;
if ( nC3Id == GDB_ID_NULL)
return false ; return false ;
// inserisco la curva nel DB // assegno nome e colore
int nC2Id = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pCrv2)) ; m_pGeomDB->SetName( nC3Id, MCH_PV_DOWN_CUT) ;
if ( nC2Id == GDB_ID_NULL) m_pGeomDB->SetMaterial( nC3Id, colCut) ;
return false ;
// assegno nome e colore
m_pGeomDB->SetName( nC2Id, MCH_PV_DOWN_CUT) ;
m_pGeomDB->SetMaterial( nC2Id, colCut) ;
} }
// inserisco la regione nel DB
// inserisco la regione nel DB
int nRId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pSfr)) ; int nRId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nPathId, Release( pSfr)) ;
if ( nRId == GDB_ID_NULL) if ( nRId == GDB_ID_NULL)
return false ; return false ;
m_pGeomDB->SetName( nRId, MCH_PV_DOWN_RCUT) ; m_pGeomDB->SetName( nRId, MCH_PV_DOWN_RCUT) ;
m_pGeomDB->SetMaterial( nRId, INVISIBLE) ; m_pGeomDB->SetMaterial( nRId, INVISIBLE) ;
// la copio anche come regione ridotta // la copio anche come regione ridotta
int nRrId = m_pGeomDB->Copy( nRId, GDB_ID_NULL, nPathId) ; int nRrId = m_pGeomDB->Copy( nRId, GDB_ID_NULL, nPathId) ;
if ( nRrId == GDB_ID_NULL) if ( nRrId == GDB_ID_NULL)
return false ; return false ;
m_pGeomDB->SetName( nRrId, MCH_PV_DOWN_RRCUT) ; m_pGeomDB->SetName( nRrId, MCH_PV_DOWN_RRCUT) ;
m_pGeomDB->SetMaterial( nRrId, INVISIBLE) ; m_pGeomDB->SetMaterial( nRrId, INVISIBLE) ;
} }
return true ; return true ;
} }
@@ -1961,7 +1941,7 @@ WaterJetting::AddLeadInPreview( const ICurveComposite* pCompo, ISurfFlatRegion*
{ PtrOwner<ICurveLine> pLine( CreateCurveLine()) ; { PtrOwner<ICurveLine> pLine( CreateCurveLine()) ;
if ( IsNull( pLine) || ! pLine->Set( ptP1, ptStart)) if ( IsNull( pLine) || ! pLine->Set( ptP1, ptStart))
return false ; return false ;
pCrv.Set( pLine) ; pCrv.Set( Release( pLine)) ;
} break ; } break ;
case WJET_LI_TANGENT : case WJET_LI_TANGENT :
pCrv.Set( GetArc2PVN( ptStart, ptP1, - vtStart, vtN)) ; pCrv.Set( GetArc2PVN( ptStart, ptP1, - vtStart, vtN)) ;
@@ -2030,7 +2010,7 @@ WaterJetting::AddLeadOutPreview( const ICurveComposite* pCompo, ISurfFlatRegion*
Point3d ptP1 = ptEnd + vtEnd * dTang + vtPerp * dPerp ; Point3d ptP1 = ptEnd + vtEnd * dTang + vtPerp * dPerp ;
if ( IsNull( pLine) || ! pLine->Set( ptEnd, ptP1)) if ( IsNull( pLine) || ! pLine->Set( ptEnd, ptP1))
return false ; return false ;
pCrv.Set( pLine) ; pCrv.Set( Release( pLine)) ;
} break ; } break ;
case WJET_LO_TANGENT : case WJET_LO_TANGENT :
{ // calcolo punto finale dell'uscita { // calcolo punto finale dell'uscita
@@ -2080,11 +2060,6 @@ WaterJetting::AddLoopsPreview( const ICurveComposite* pCompo, ISurfFlatRegion* p
return false ; return false ;
// lunghezza tratti lineari e loro punti estremi // lunghezza tratti lineari e loro punti estremi
double dTgLen = 0.5 * m_TParams.m_dDiam * tan( 0.5 * dAng * DEGTORAD) ; double dTgLen = 0.5 * m_TParams.m_dDiam * tan( 0.5 * dAng * DEGTORAD) ;
if ( m_Params.m_dSideAngle > EPS_ANG_SMALL) {
double dW = m_dElev * sin( m_Params.m_dSideAngle * DEGTORAD) ;
double dExtraLen = dW / tan( ( 180 - abs( dAng)) / 2 * DEGTORAD) ;
dTgLen += dExtraLen ;
}
Point3d ptP ; pCrvC->GetStartPoint( ptP) ; Point3d ptP ; pCrvC->GetStartPoint( ptP) ;
Point3d ptPe = ptP + vtEnd * dTgLen ; Point3d ptPe = ptP + vtEnd * dTgLen ;
Point3d ptPs = ptP - vtStart * dTgLen ; Point3d ptPs = ptP - vtStart * dTgLen ;
@@ -2117,6 +2092,7 @@ WaterJetting::AddLoopsPreview( const ICurveComposite* pCompo, ISurfFlatRegion* p
if ( IsNull( pSfr) || ! pSPV->Add( *pSfr)) if ( IsNull( pSfr) || ! pSPV->Add( *pSfr))
return false ; return false ;
} }
} }
return true ; return true ;
} }
@@ -2248,7 +2224,7 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
// imposto versore correzione e ausiliario sul punto di partenza // imposto versore correzione e ausiliario sul punto di partenza
CalcAndSetToolCorrAuxDir( pCompo, i) ; CalcAndSetToolCorrAuxDir( pCompo, i) ;
// aggiungo approccio al punto iniziale // aggiungo approccio al punto iniziale
if ( ! AddApproach( ptP1, vtTool, dSafeZ, bSplitArcs)) { if ( ! AddApproach( ptP1, vtTool, dSafeZ)) {
m_pMchMgr->SetLastError( 3207, "Error in WaterJetting : Approach not computable") ; m_pMchMgr->SetLastError( 3207, "Error in WaterJetting : Approach not computable") ;
return false ; return false ;
} }
@@ -2274,57 +2250,27 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
vtEnd.GetAngleXY( vtStart, dAng) ; vtEnd.GetAngleXY( vtStart, dAng) ;
// Se angolo esterno e richiesto anello esterno // Se angolo esterno e richiesto anello esterno
if ( IsExternalAngle( dAng) && m_Params.m_nExtCornerType == WJET_EC_LOOP) { if ( IsExternalAngle( dAng) && m_Params.m_nExtCornerType == WJET_EC_LOOP) {
// lunghezza tratti lineari // lunghezza tratti lineari e loro punti estremi
double dTgLen = 0.5 * m_TParams.m_dDiam * tan( 0.5 * dAng * DEGTORAD) ; double dTgLen = 0.5 * m_TParams.m_dDiam * tan( 0.5 * dAng * DEGTORAD) ;
if ( m_Params.m_dSideAngle > EPS_ANG_SMALL) {
// se inclinazione positiva calcolo di quanto deve uscire per non rovinare lo spigolo
double dW = m_dElev * sin( m_Params.m_dSideAngle * DEGTORAD) ;
double dExtraLen = dW / tan( ( 180 - abs( dAng)) / 2 * DEGTORAD) ;
dTgLen += dExtraLen ;
}
// calcolo punti estremi
Point3d ptP ; pCrvC->GetStartPoint( ptP) ; Point3d ptP ; pCrvC->GetStartPoint( ptP) ;
Point3d ptPe = ptP + vtEnd * dTgLen ; Point3d ptPe = ptP + vtEnd * dTgLen ;
Point3d ptPs = ptP - vtStart * dTgLen ; Point3d ptPs = ptP - vtStart * dTgLen ;
// tratto prima dell'anello // tratto prima dell'anello
SetFeed( GetActualFeed()) ; SetFeed( GetActualFeed()) ;
if ( AddLinearMove( ptPe, bSplitArcs) == GDB_ID_NULL) if ( AddLinearMove( ptPe) == GDB_ID_NULL)
return false ; return false ;
// anello // anello
PtrOwner<ICurve> pCrvA( GetArc2PVN( ptPe, ptPs, vtEnd, vtN)) ; PtrOwner<ICurve> pCrvA( GetArc2PVN( ptPe, ptPs, vtEnd, vtN)) ;
if ( ! IsNull( pCrvA) && pCrvA->GetType() == CRV_ARC) { if ( ! IsNull( pCrvA) && pCrvA->GetType() == CRV_ARC) {
// suddivido l'anello in due parti per forzare il passaggio dalla posizione vtTool = Z_AX if ( AddCurveMove( pCrvA) == GDB_ID_NULL)
PtrOwner<ICurveComposite> pCompoArc( ConvertCurveToComposite( Release( ( pCrvA)))) ;
if ( IsNull( pCompoArc))
return false ; return false ;
if ( pCompoArc->AddJoint( 0.5)) {
// aggiungo il primo tratto
Vector3d vtCorr = CalcCorrDir( pCompoArc, 1) ;
SetToolCorrAuxDir( Z_AX, vtCorr) ;
if ( AddCurveMove( pCompoArc->GetCurve(0), bSplitArcs) == GDB_ID_NULL)
return false ;
// aggiungo secondo tratto
CalcAndSetToolCorrAuxDir( pCompo, i + 0.5) ;
if ( AddCurveMove( pCompoArc->GetCurve(1), bSplitArcs) == GDB_ID_NULL)
return false ;
}
else {
// se non è possibile suddividere anello
CalcAndSetToolCorrAuxDir( pCompo, i + 0.5) ;
if ( AddCurveMove( pCompoArc, bSplitArcs) == GDB_ID_NULL)
return false ;
}
} }
else { else {
CalcAndSetToolCorrAuxDir( pCompo, i + 0.5) ; if ( AddLinearMove( ptPs) == GDB_ID_NULL)
if ( AddLinearMove( ptPs, bSplitArcs) == GDB_ID_NULL)
return false ; return false ;
} }
// tratto dopo l'anello // tratto dopo l'anello
if ( AddLinearMove( ptP, bSplitArcs) == GDB_ID_NULL) if ( AddLinearMove( ptP) == GDB_ID_NULL)
return false ; return false ;
} }
// se angolo esterno e richiesto rallentamento esterno, eseguo accelerazione // se angolo esterno e richiesto rallentamento esterno, eseguo accelerazione
@@ -2344,7 +2290,7 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
return false ; return false ;
CalcAndSetToolCorrAuxDir( pCompo, i + dU) ; CalcAndSetToolCorrAuxDir( pCompo, i + dU) ;
SetFeed( ( 1 - dCoeff) * dMinFeed + dCoeff * GetActualFeed()) ; SetFeed( ( 1 - dCoeff) * dMinFeed + dCoeff * GetActualFeed()) ;
if ( AddCurveMove( pCrvT, bSplitArcs) == GDB_ID_NULL) if ( AddCurveMove( pCrvT) == GDB_ID_NULL)
return false ; return false ;
dUprev = dU ; dUprev = dU ;
} }
@@ -2386,7 +2332,7 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
Vector3d vtCorr = CalcCorrDir( pCompo, i + dU) ; Vector3d vtCorr = CalcCorrDir( pCompo, i + dU) ;
SetToolCorrAuxDir( vtTool, vtCorr) ; SetToolCorrAuxDir( vtTool, vtCorr) ;
SetFeed( ( 1 - dCoeff) * dMinFeed + dCoeff * GetActualFeed()) ; SetFeed( ( 1 - dCoeff) * dMinFeed + dCoeff * GetActualFeed()) ;
if ( AddCurveMove( pCrvT, bSplitArcs) == GDB_ID_NULL) if ( AddCurveMove( pCrvT) == GDB_ID_NULL)
return false ; return false ;
dUprev = dU ; dUprev = dU ;
} }
@@ -2423,7 +2369,7 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
return false ; return false ;
CalcAndSetToolCorrAuxDir( pCompo, i + dU) ; CalcAndSetToolCorrAuxDir( pCompo, i + dU) ;
SetFeed( ( 1 - dCoeff) * GetActualFeed() + dCoeff * dMinFeed) ; SetFeed( ( 1 - dCoeff) * GetActualFeed() + dCoeff * dMinFeed) ;
if ( AddCurveMove( pCrvT, bSplitArcs) == GDB_ID_NULL) if ( AddCurveMove( pCrvT) == GDB_ID_NULL)
return false ; return false ;
dUprev = dU ; dUprev = dU ;
} }
@@ -2466,22 +2412,15 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
Vector3d vtCorr = CalcCorrDir( pCompo, i + dU) ; Vector3d vtCorr = CalcCorrDir( pCompo, i + dU) ;
SetToolCorrAuxDir( vtTool, vtCorr) ; SetToolCorrAuxDir( vtTool, vtCorr) ;
SetFeed( ( 1 - dCoeff) * GetActualFeed() + dCoeff * dMinFeed) ; SetFeed( ( 1 - dCoeff) * GetActualFeed() + dCoeff * dMinFeed) ;
if ( AddCurveMove( pCrvT, bSplitArcs) == GDB_ID_NULL) if ( AddCurveMove( pCrvT) == GDB_ID_NULL)
return false ; return false ;
dUprev = dU ; dUprev = dU ;
} }
dNextFeed = dMinFeed ; dNextFeed = dMinFeed ;
} }
// se successivo non è angolo esterno ad anello imposto versore correzione e ausiliario del punto di arrivo
if ( ! IsExternalAngle( dAng) || m_Params.m_nExtCornerType != WJET_EC_LOOP)
CalcAndSetToolCorrAuxDir( pCompo, i + 1) ;
} }
else { // imposto versore correzione e ausiliario del punto di arrivo
// se ultima entità imposto versore correzione e ausiliario del punto finale CalcAndSetToolCorrAuxDir( pCompo, i + 1) ;
CalcAndSetToolCorrAuxDir( pCompo, i + 1) ;
}
// elaborazioni sulla curva corrente // elaborazioni sulla curva corrente
if ( pCurve->GetType() == CRV_LINE) { if ( pCurve->GetType() == CRV_LINE) {
ICurveLine* pLine = GetCurveLine( pCurve) ; ICurveLine* pLine = GetCurveLine( pCurve) ;
@@ -2494,20 +2433,25 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
} }
else else
++ nIdxSkip ; ++ nIdxSkip ;
if ( AddLinearMove( ptP3, bSplitArcs) == GDB_ID_NULL) if ( AddLinearMove( ptP3) == GDB_ID_NULL)
return false ; return false ;
} }
else if ( pCurve->GetType() == CRV_ARC) { else if ( pCurve->GetType() == CRV_ARC) {
ICurveArc* pArc = GetCurveArc( pCurve) ;
Point3d ptCen = pArc->GetCenter() ;
double dAngCen = pArc->GetAngCenter() ;
Point3d ptP3 ; pArc->GetEndPoint( ptP3) ;
Point3d ptCurr ; GetCurrPos( ptCurr) ;
double dDeltaAng ; pArc->CalcPointAngle( ptCurr, dDeltaAng) ;
SetFeed( dNextFeed) ; SetFeed( dNextFeed) ;
// controlli per indice del punto di arrivo // controlli per indice del punto di arrivo
Point3d ptP3 ; pCurve->GetEndPoint( ptP3) ;
if ( SqDistXY( ptP3, m_ptLastProbe) >= m_Params.m_dProbingMinDist * m_Params.m_dProbingMinDist) { if ( SqDistXY( ptP3, m_ptLastProbe) >= m_Params.m_dProbingMinDist * m_Params.m_dProbingMinDist) {
SetIndex( i + 1 - nIdxSkip) ; SetIndex( i + 1 - nIdxSkip) ;
m_ptLastProbe = ptP3 ; m_ptLastProbe = ptP3 ;
} }
else else
++ nIdxSkip ; ++ nIdxSkip ;
if ( AddCurveMove( pCurve, bSplitArcs) == GDB_ID_NULL) if ( AddArcMove( ptP3, ptCen, dAngCen - dDeltaAng, vtN) == GDB_ID_NULL)
return false ; return false ;
} }
// se ultima entità, uscita e retrazione // se ultima entità, uscita e retrazione
@@ -2524,7 +2468,7 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
} }
// aggiungo retrazione // aggiungo retrazione
SetFlag( 203) ; SetFlag( 203) ;
if ( ! AddRetract( ptP1, vtTool, dSafeZ, bSplitArcs)) { if ( ! AddRetract( ptP1, vtTool, dSafeZ)) {
m_pMchMgr->SetLastError( 3210, "Error in WaterJetting : Retract not computable") ; m_pMchMgr->SetLastError( 3210, "Error in WaterJetting : Retract not computable") ;
return false ; return false ;
} }
@@ -2558,7 +2502,7 @@ class LeadIOStatus
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
WaterJetting::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, bool bSplit) WaterJetting::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ)
{ {
SetFlag( 1) ; SetFlag( 1) ;
// 1 -> punto sopra inizio // 1 -> punto sopra inizio
@@ -2567,18 +2511,18 @@ WaterJetting::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dS
return false ; return false ;
// affondo al punto iniziale // affondo al punto iniziale
SetFlag( ( m_Params.m_bLiHole ? 201 : 202)) ; SetFlag( ( m_Params.m_bLiHole ? 201 : 202)) ;
if ( AddRapidMove( ptP, bSplit) == GDB_ID_NULL) if ( AddRapidMove( ptP) == GDB_ID_NULL)
return false ; return false ;
return true ; return true ;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
WaterJetting::AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, bool bSplit) WaterJetting::AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ)
{ {
// Risalgo in rapido alla quota di sicurezza // Risalgo in rapido alla quota di sicurezza
Point3d ptP4 = ptP + vtTool * dSafeZ ; Point3d ptP4 = ptP + vtTool * dSafeZ ;
if ( AddRapidMove( ptP4, bSplit) == GDB_ID_NULL) if ( AddRapidMove( ptP4) == GDB_ID_NULL)
return false ; return false ;
return true ; return true ;
} }
@@ -2628,19 +2572,29 @@ WaterJetting::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vect
{ {
// Assegno il tipo // Assegno il tipo
int nType = GetLeadInType() ; int nType = GetLeadInType() ;
double dTang = m_Params.m_dLiTang ;
// Eseguo a seconda del tipo // Eseguo a seconda del tipo
switch ( nType) { switch ( nType) {
case WJET_LI_NONE : case WJET_LI_NONE :
return true ; return true ;
case WJET_LI_LINEAR : case WJET_LI_LINEAR :
return ( AddLinearMove( ptStart, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; return ( AddLinearMove( ptStart, MCH_CL_LEADIN) != GDB_ID_NULL) ;
case WJET_LI_TANGENT : case WJET_LI_TANGENT :
{ {
PtrOwner<ICurve> pCrv( GetArc2PVN( ptStart, ptP1, - vtStart, vtN)) ; PtrOwner<ICurve> pCrv( GetArc2PVN( ptStart, ptP1, - vtStart, vtN)) ;
if ( IsNull( pCrv)) if ( IsNull( pCrv))
return false ; return false ;
pCrv->Invert() ; pCrv->Invert() ;
return ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADIN) != GDB_ID_NULL) ; // eventuale spezzatura
if ( bSplitArcs) {
PtrOwner<ICurveComposite> pCompo( CreateCurveComposite()) ;
if ( IsNull( pCompo) || ! pCompo->AddCurve( Release( pCrv)) || ! ApproxWithLines( pCompo))
return false ;
return ( AddCurveMove( pCompo, MCH_CL_LEADIN) != GDB_ID_NULL) ;
}
else {
return ( AddCurveMove( pCrv, MCH_CL_LEADIN) != GDB_ID_NULL) ;
}
} }
default : default :
return false ; return false ;
@@ -2690,7 +2644,7 @@ WaterJetting::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vec
Vector3d vtPerp = vtEnd ; Vector3d vtPerp = vtEnd ;
vtPerp.Rotate( vtN, 0, ( bCcwRot ? 1 : - 1)) ; vtPerp.Rotate( vtN, 0, ( bCcwRot ? 1 : - 1)) ;
ptP1 = ptEnd + vtEnd * dTang + vtPerp * dPerp ; ptP1 = ptEnd + vtEnd * dTang + vtPerp * dPerp ;
return ( AddLinearMove( ptP1, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; return ( AddLinearMove( ptP1, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
} }
case WJET_LO_TANGENT : case WJET_LO_TANGENT :
{ {
@@ -2702,7 +2656,16 @@ WaterJetting::AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vec
PtrOwner<ICurve> pCrv( GetArc2PVN( ptEnd, ptP1, vtEnd, vtN)) ; PtrOwner<ICurve> pCrv( GetArc2PVN( ptEnd, ptP1, vtEnd, vtN)) ;
if ( IsNull( pCrv)) if ( IsNull( pCrv))
return false ; return false ;
return ( AddCurveMove( pCrv, bSplitArcs, MCH_CL_LEADOUT) != GDB_ID_NULL) ; // eventuale spezzatura
if ( bSplitArcs) {
PtrOwner<ICurveComposite> pCompo( CreateCurveComposite()) ;
if ( IsNull( pCompo) || ! pCompo->AddCurve( Release( pCrv)) || ! ApproxWithLines( pCompo))
return false ;
return ( AddCurveMove( pCompo, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
}
else {
return ( AddCurveMove( pCrv, MCH_CL_LEADOUT) != GDB_ID_NULL) ;
}
} }
default : default :
return false ; return false ;
@@ -2966,7 +2929,7 @@ WaterJetting::CalcOffset( ICurveComposite* pCompo, double dSignOffs)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Valore limite angolo per corner // Valore limite angolo per corner
const double ANG_CORNER = 10 ; const double ANG_CORNER = 10 ;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
+2 -2
View File
@@ -81,8 +81,8 @@ class WaterJetting : public Machining
bool AddLeadOutPreview( const ICurveComposite* pCompo, ISurfFlatRegion* pSPV) ; bool AddLeadOutPreview( const ICurveComposite* pCompo, ISurfFlatRegion* pSPV) ;
bool AddLoopsPreview( const ICurveComposite* pCompo, ISurfFlatRegion* pSPV) ; bool AddLoopsPreview( const ICurveComposite* pCompo, ISurfFlatRegion* pSPV) ;
bool AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTool, bool bSplitArcs) ; bool AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTool, bool bSplitArcs) ;
bool AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, bool bSplit) ; bool AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ) ;
bool AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, bool bSplit) ; bool AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ) ;
bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN, bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN,
const ICurveComposite* pCompo, Point3d& ptP1) const ; const ICurveComposite* pCompo, Point3d& ptP1) const ;
bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart,
+2 -6
View File
@@ -102,10 +102,6 @@ struct WaterJettingData : public MachiningData
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
inline const WaterJettingData* GetWaterJettingData( const MachiningData* pMdata) inline const WaterJettingData* GetWaterJettingData( const MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_WATERJETTING) { return (dynamic_cast<const WaterJettingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<const WaterJettingData*>( pMdata)) ; }
inline WaterJettingData* GetWaterJettingData( MachiningData* pMdata) inline WaterJettingData* GetWaterJettingData( MachiningData* pMdata)
{ if ( pMdata == nullptr || pMdata->GetType() != MT_WATERJETTING) { return (dynamic_cast<WaterJettingData*>( pMdata)) ; }
return nullptr ;
return ( static_cast<WaterJettingData*>( pMdata)) ; }