diff --git a/Disposition.cpp b/Disposition.cpp index 7a99e8c..dd519c6 100644 --- a/Disposition.cpp +++ b/Disposition.cpp @@ -27,16 +27,17 @@ using namespace std ; //------------------------------ Errors -------------------------------------- -// 2001 = "Error adding fixture xx" -// 2002 = "Error placing fixture xx" -// 2003 = "Error in MoveToCornerRawPart xx" -// 2004 = "Error in MoveToCenterRawPart xx" -// 2005 = "Error in ApplyRotationToRawPart xx" -// 2006 = "Error in OnSpecialApplyDisposition (xxx)" -// 2007 = "Error in Disposition : axes values not calculable" -// 2008 = "Error in Disposition : outstroke xxx" -// 2009 = "Error in Disposition : link movements not calculable" -// 2010 = "Error in Disposition : link outstroke xxx" +// 2001 = "Error moving axis xx" +// 2002 = "Error adding fixture xx" +// 2003 = "Error placing fixture xx" +// 2004 = "Error in MoveToCornerRawPart xx" +// 2005 = "Error in MoveToCenterRawPart xx" +// 2006 = "Error in ApplyRotationToRawPart xx" +// 2007 = "Error in OnSpecialApplyDisposition (xxx)" +// 2008 = "Error in Disposition : axes values not calculable" +// 2009 = "Error in Disposition : outstroke xxx" +// 2010 = "Error in Disposition : link movements not calculable" +// 2011 = "Error in Disposition : link outstroke xxx" // 2051 = "Table Ref1 changed : (xyz) -> (XYZ)" // 2052 = "Warning in Disposition : No shifts" // 2053 = "Warning in OnSpecialApplyDisposition (xxx)" @@ -46,6 +47,9 @@ static string DIS_TABLE = "Tab" ; static string DIS_PHASE = "Ph" ; static string DIS_REF1 = "Ref1" ; static string DIS_AREA1 = "Area1" ; +static string DIS_AXD_TOT = "AxT" ; +static string DIS_AXD_NAME = "AxN" ; +static string DIS_AXD_POS = "AxP" ; static string DIS_FXD_TOT = "FxT" ; static string DIS_FXD_NAME = "FxN" ; static string DIS_FXD_POS = "FxP" ; @@ -92,6 +96,7 @@ Disposition::Clone( void) const pDisp->m_b3Area1 = m_b3Area1 ; pDisp->m_dAreaOffset = m_dAreaOffset ; pDisp->m_bTabOk = m_bTabOk ; + pDisp->m_vAxData = m_vAxData ; pDisp->m_vFixData = m_vFixData ; pDisp->m_vMvrData = m_vMvrData ; pDisp->m_sHead = m_sHead ; @@ -120,6 +125,10 @@ Disposition::Dump( string& sOut, bool bMM, const char* szNewLine) const sOut += DIS_REF1 + EQUAL + "(" + ToString( m_ptRef1, 3) + ")" + szNewLine ; sOut += DIS_AREA1 + EQUAL + "(" + ToString( m_b3Area1, 3) + ")" + szNewLine ; sOut += DIS_AREA1_OFFS + EQUAL + "(" + ToString( m_dAreaOffset) + ")" + szNewLine ; + for ( const auto& AxData : m_vAxData) { + sOut += "AxD=" + AxData.sName + "," + + ToString( AxData.dPos) + szNewLine ; + } for ( const auto& FixData : m_vFixData) { sOut += "FxD=" + FixData.sName + "," + ToString( FixData.nId) + ",(" + @@ -159,12 +168,14 @@ Disposition::Save( int nBaseId, STRVECTOR& vString) const { try { int k = - 1 ; + int nAxdTot = int( m_vAxData.size()) ; + int nAxdLines = ( nAxdTot == 0 ? 0 : 1 + 2 * nAxdTot) ; int nFxdTot = int( m_vFixData.size()) ; int nFxdLines = 1 + 4 * nFxdTot ; int nMvdTot = int( m_vMvrData.size()) ; int nMvdLines = 1 + 4 * nMvdTot ; int nOther = 7 ; - vString.insert( vString.begin(), 4 + nFxdLines + nMvdLines + nOther, "") ; + vString.insert( vString.begin(), 4 + nAxdLines + nFxdLines + nMvdLines + nOther, "") ; // Nome if ( ! SetVal( DIS_TABLE, m_sTabName, vString[++k])) return false ; @@ -177,6 +188,16 @@ Disposition::Save( int nBaseId, STRVECTOR& vString) const // Prima area if ( ! SetVal( DIS_AREA1, m_b3Area1, vString[++k])) return false ; + // Dati assi (se presenti) + if ( nAxdTot > 0) { + if ( ! SetVal( DIS_AXD_TOT, nAxdTot, vString[++k])) + return false ; + for ( const auto& AxData : m_vAxData) { + if ( ! SetVal( DIS_AXD_NAME, AxData.sName, vString[++k]) || + ! SetVal( DIS_AXD_POS, AxData.dPos, vString[++k])) + return false ; + } + } // Dati sottopezzi if ( ! SetVal( DIS_FXD_TOT, nFxdTot, vString[++k])) return false ; @@ -237,12 +258,27 @@ Disposition::Load( const STRVECTOR& vString, int nBaseGdbId) // prima area if ( ! GetVal( vString[++k], DIS_AREA1, m_b3Area1)) return false ; + // dati assi opzionali + int nAxdTot = 0 ; + if ( ! GetVal( vString[++k], DIS_AXD_TOT, nAxdTot)) + -- k ; + int nAxdLines = ( nAxdTot == 0 ? 0 : 1 + 2 * nAxdTot) ; + if ( nAxdTot > 0) { + if ( int( vString.size()) < 3 + nAxdLines + 1) + return false ; + m_vAxData.insert( m_vAxData.begin(), nAxdTot, AxisData()) ; + for ( auto& AxData : m_vAxData) { + if ( ! GetVal( vString[++k], DIS_AXD_NAME, AxData.sName) || + ! GetVal( vString[++k], DIS_AXD_POS, AxData.dPos)) + return false ; + } + } // dati sottopezzi int nFxdTot ; if ( ! GetVal( vString[++k], DIS_FXD_TOT, nFxdTot)) return false ; int nFxdLines = 1 + 3 * nFxdTot ; - if ( int( vString.size()) < 3 + nFxdLines + 1) + if ( int( vString.size()) < 3 + nAxdLines + nFxdLines + 1) return false ; m_vFixData.insert( m_vFixData.begin(), nFxdTot, FixtureData()) ; for ( auto& FixData : m_vFixData) { @@ -262,7 +298,7 @@ Disposition::Load( const STRVECTOR& vString, int nBaseGdbId) if ( ! GetVal( vString[++k], DIS_MVD_TOT, nMvdTot)) return false ; int nMvdLines = 1 + 4 * nMvdTot ; - if ( int( vString.size()) < 3 + nFxdLines + nMvdLines) + if ( int( vString.size()) < 3 + nAxdLines + nFxdLines + nMvdLines) return false ; m_vMvrData.insert( m_vMvrData.begin(), nMvdTot, MoveRawData()) ; for ( auto& MvrData : m_vMvrData) { @@ -435,6 +471,14 @@ Disposition::Apply( bool bVerifyTab) if ( ( ! m_bTabOk || bVerifyTab) && ! SetTable( m_sTabName)) return false ; bool bOk = true ; + // aggiornamento movimenti assi + for ( auto& AxData : m_vAxData) { + if ( ! m_pMchMgr->SetAxisPos( AxData.sName, AxData.dPos)) { + string sOut = "Error moving axis " + AxData.sName ; + m_pMchMgr->SetLastError( 2001, sOut) ; + bOk = false ; + } + } // aggiornamento sottopezzi for ( auto& FixData : m_vFixData) { // se sottopezzo da caricare @@ -442,7 +486,7 @@ Disposition::Apply( bool bVerifyTab) int nId = AddFixture( FixData.sName, GDB_ID_NULL, FixData.ptPos, FixData.dAng, FixData.dMov, false) ; if ( nId == GDB_ID_NULL) { string sOut = "Error adding fixture " + FixData.sName ; - m_pMchMgr->SetLastError( 2001, sOut) ; + m_pMchMgr->SetLastError( 2002, sOut) ; bOk = false ; } else @@ -452,7 +496,7 @@ Disposition::Apply( bool bVerifyTab) else { if ( ! PlaceFixture( FixData.nId, FixData.ptPos, FixData.dAng, FixData.dMov)) { string sOut = "Error placing fixture " + ToString( FixData.nId) ; - m_pMchMgr->SetLastError( 2002, sOut) ; + m_pMchMgr->SetLastError( 2003, sOut) ; bOk = false ; } } @@ -474,21 +518,21 @@ Disposition::Apply( bool bVerifyTab) case MoveRawData::COR : if ( ! MoveToCornerRawPart( vMvrData.nRawId, vMvrData.ptP, vMvrData.nFlag, false, false)) { string sOut = "Error in MoveToCornerRawPart " + ToString( vMvrData.nRawId) ; - m_pMchMgr->SetLastError( 2003, sOut) ; + m_pMchMgr->SetLastError( 2004, sOut) ; bOk = false ; } break ; case MoveRawData::CEN : if ( ! MoveToCenterRawPart( vMvrData.nRawId, vMvrData.ptP, vMvrData.nFlag, false, false)) { string sOut = "Error in MoveToCenterRawPart " + ToString( vMvrData.nRawId) ; - m_pMchMgr->SetLastError( 2004, sOut) ; + m_pMchMgr->SetLastError( 2005, sOut) ; bOk = false ; } break ; case MoveRawData::ROT : if ( ! ApplyRotationToRawPart( vMvrData.nRawId, vMvrData.ptP.x, vMvrData.ptP.y, vMvrData.ptP.z, false)) { string sOut = "Error in ApplyRotationToRawPart " + ToString( vMvrData.nRawId) ; - m_pMchMgr->SetLastError( 2005, sOut) ; + m_pMchMgr->SetLastError( 2006, sOut) ; bOk = false ; } break ; @@ -520,6 +564,69 @@ Disposition::IsInTable( const BBox3d& b3B) return b3AllArea.EnclosesXY( b3B) ; } +//---------------------------------------------------------------------------- +bool +Disposition::MoveAxis( const string& sName, double dPos) +{ + // verifico MachMgr e GeomDB + if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) + return false ; + // verifico tavola + if ( ! m_bTabOk && ! SetTable( m_sTabName)) + return false ; + // verifico esistenza asse + if ( m_pMchMgr->GetAxisId( sName) == GDB_ID_NULL) + return false ; + // cerco eventuale movimento dello stesso asse già inserito + int nInd = -1 ; + for ( int i = 0 ; i < int( m_vAxData.size()) ; ++ i) { + if ( m_vAxData[i].sName == sName) { + nInd = i ; + break ; + } + } + // eseguo movimento + if ( ! m_pMchMgr->SetAxisPos( sName, dPos)) + return false ; + // salvo movimento + if ( nInd < 0) + m_vAxData.emplace_back( sName, dPos) ; + else + m_vAxData[nInd].dPos = dPos ; + m_nStatus |= MCH_ST_GEO_MODIF ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +Disposition::RemoveAxis( const string& sName) +{ + // verifico MachMgr e GeomDB + if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) + return false ; + // verifico tavola + if ( ! m_bTabOk && ! SetTable( m_sTabName)) + return false ; + // verifico esistenza asse + if ( m_pMchMgr->GetAxisId( sName) == GDB_ID_NULL) + return false ; + // cerco eventuale movimento dello stesso asse già inserito + int nInd = -1 ; + for ( int i = 0 ; i < int( m_vAxData.size()) ; ++ i) { + if ( m_vAxData[i].sName == sName) { + nInd = i ; + break ; + } + } + // se non trovato, non devo fare alcunché + if ( nInd < 0) + return true ; + // rimetto asse in home e rimuovo movimento dalla lista + m_pMchMgr->ResetAxisPos( sName) ; + m_vAxData.erase( m_vAxData.begin() + nInd) ; + return true ; +} + //---------------------------------------------------------------------------- int Disposition::AddFixture( const string& sName, int nId, const Point3d& ptPos, double dAngDeg, @@ -1246,6 +1353,22 @@ Disposition::RemoveRawPart( int nRawId) return true ; } +//---------------------------------------------------------------------------- +bool +Disposition::GetMoveAxisData( int nInd, string& sName, double& dPos) const +{ + // verifico MachMgr e GeomDB + if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) + return false ; + // verifico l'indice + if ( nInd < 0 || nInd >= int( m_vAxData.size())) + return false ; + // recupero i dati + sName = m_vAxData[nInd].sName ; + dPos = m_vAxData[nInd].dPos ; + return true ; +} + //---------------------------------------------------------------------------- bool Disposition::GetFixtureData( int nInd, string& sName, int& nId, Point3d& ptPos, @@ -1377,7 +1500,7 @@ Disposition::SpecialApply( bool bRecalc) string sOut = sMsg ; if ( IsEmptyOrSpaces( sOut)) sOut = " Error in " + ON_SPECIAL_APPLY + " (" + ToString( nErr) + ")" ; - m_pMchMgr->SetLastError( 2006, sOut) ; + m_pMchMgr->SetLastError( 2007, sOut) ; return false ; } // recupero eventuale warning @@ -1421,18 +1544,18 @@ Disposition::SpecialUpdate( void) if ( ! CalculateAxesValues( "", false)) { string sInfo = m_pMchMgr->GetOutstrokeInfo() ; if ( sInfo.empty()) - m_pMchMgr->SetLastError( 2007, "Error in Disposition : axes values not calculable") ; + m_pMchMgr->SetLastError( 2008, "Error in Disposition : axes values not calculable") ; else - m_pMchMgr->SetLastError( 2008, "Error in Disposition : outstroke ") ; + m_pMchMgr->SetLastError( 2009, "Error in Disposition : outstroke ") ; return false ; } // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine di tutti if ( ! AdjustStartEndMovements()) { string sInfo = m_pMchMgr->GetOutstrokeInfo() ; if ( sInfo.empty()) - m_pMchMgr->SetLastError( 2009, "Error in Disposition : link movements not calculable") ; + m_pMchMgr->SetLastError( 2010, "Error in Disposition : link movements not calculable") ; else - m_pMchMgr->SetLastError( 2010, "Error in Disposition : link outstroke ") ; + m_pMchMgr->SetLastError( 2011, "Error in Disposition : link outstroke ") ; return false ; } // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso diff --git a/Disposition.h b/Disposition.h index 1accd12..6b7ca6d 100644 --- a/Disposition.h +++ b/Disposition.h @@ -15,6 +15,18 @@ #include "Operation.h" +//---------------------------------------------------------------------------- +struct AxisData +{ + std::string sName ; // nome dell'asse ausiliario da muovere + double dPos ; // posizione dell'asse + AxisData( void) + : sName(), dPos( 0) {} + AxisData( const std::string& sN, double dP) + : sName( sN), dPos( dP) {} +} ; +typedef std::vector AXDATAVECTOR ; + //---------------------------------------------------------------------------- struct FixtureData { @@ -88,6 +100,8 @@ class Disposition : public Operation bool GetTableRef1( Point3d& ptRef1) const ; bool GetTableArea1( BBox3d& b3Area1) const ; bool GetTableAreaOffset1( BBox3d& b3AreaOffs1) const ; + bool MoveAxis( const std::string& sName, double dPos) ; + bool RemoveAxis( const std::string& sName) ; int AddFixture( const std::string& sName, int nId, const Point3d& ptPos, double dAngDeg = 0, double dMov = 0, bool bAddToList = true) ; int GetFirstFixture( void) ; @@ -104,6 +118,7 @@ class Disposition : public Operation bool ApplyRotationToRawPart( int nRawId, double dAngCDeg, double dAngADeg, double dAngC1Deg, bool bAddToList = true) ; bool UpdateRawPartId( int nRawId, int nNewRawId) ; bool RemoveRawPart( int nRawId) ; + bool GetMoveAxisData( int nInd, std::string& sName, double& dPos) const ; bool GetFixtureData( int nInd, std::string& sName, int& nId, Point3d& ptPos, double& dAngDeg, double& dMov) const ; bool GetMoveRawData( int nInd, int& nRawId, int& nType, Point3d& ptPos, int& nFlag) const ; @@ -126,6 +141,7 @@ class Disposition : public Operation Point3d m_ptRef1 ; // origine 1 della tavola BBox3d m_b3Area1 ; // area utile 1 della tavola std::array m_dAreaOffset ; // eventuali allargamenti dell'area sui 4 lati (0=XP, 1=YP, 2=XM, 3=YM) + AXDATAVECTOR m_vAxData ; // elenco movimenti assi ausiliari FIXDATAVECTOR m_vFixData ; // elenco posizionamento bloccaggi MVRDATAVECTOR m_vMvrData ; // elenco movimenti grezzi std::string m_sHead ; // eventuale testa usata per muovere i pezzi diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index f9f561e..fb12294 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/MachMgr.h b/MachMgr.h index 8960fb0..e185394 100644 --- a/MachMgr.h +++ b/MachMgr.h @@ -156,6 +156,8 @@ class MachMgr : public IMachMgr bool GetTableAreaOffset( int nInd, BBox3d& b3AreaOffs) const override ; bool ChangeTable( const std::string& sTable, bool bUpdateDisp) override ; bool ShowOnlyTable( bool bVal) override ; + bool MoveDispAxis( const std::string& sName, double dPos) override ; + bool RemoveDispAxis( const std::string& sName) override ; int AddFixture( const std::string& sName, const Point3d& ptPos, double dAngRotDeg, double dMov) override ; bool KeepFixture( int nFxtId, int nSouPhase) override ; bool RemoveFixture( int nFxtId) override ; @@ -279,6 +281,7 @@ class MachMgr : public IMachMgr int GetPhaseDisposition( int nPhase) const override ; bool DispositionSpecialApply( int nId, bool bRecalc) override ; bool DispositionSpecialUpdate( int nId) override ; + bool GetDispositionToolData( int nId, std::string& sName, std::string& sHead, int& nExit, std::string& sTcPos) override ; // Operations : machinings int AddMachining( const std::string& sName, const std::string& sMachining) override ; int AddMachining( const std::string& sName, int nMchType, const std::string& sTool) override ; diff --git a/MachMgrFixtures.cpp b/MachMgrFixtures.cpp index 1dee2c6..51c943c 100644 --- a/MachMgrFixtures.cpp +++ b/MachMgrFixtures.cpp @@ -135,6 +135,30 @@ MachMgr::ShowOnlyTable( bool bVal) return pMch->SetLook( bVal ? MCH_LOOK_TAB : MCH_LOOK_ALL) ; } +//---------------------------------------------------------------------------- +bool +MachMgr::MoveDispAxis( const string& sName, double dPos) +{ + // recupero l'oggetto disposizione corrente + Disposition* pDisp = ::GetDisposition( m_pGeomDB->GetUserObj( m_nCurrDispId)) ; + if ( pDisp == nullptr) + return GDB_ID_NULL ; + // eseguo l'operazione + return pDisp->MoveAxis( sName, dPos) ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::RemoveDispAxis( const string& sName) +{ + // recupero l'oggetto disposizione corrente + Disposition* pDisp = ::GetDisposition( m_pGeomDB->GetUserObj( m_nCurrDispId)) ; + if ( pDisp == nullptr) + return GDB_ID_NULL ; + // eseguo l'operazione + return pDisp->RemoveAxis( sName) ; +} + //---------------------------------------------------------------------------- int MachMgr::AddFixture( const string& sName, const Point3d& ptPos, double dAngRotDeg, double dMov) diff --git a/MachMgrOperations.cpp b/MachMgrOperations.cpp index 46043d3..a5d262f 100644 --- a/MachMgrOperations.cpp +++ b/MachMgrOperations.cpp @@ -672,6 +672,18 @@ MachMgr::DispositionSpecialUpdate( int nId) return pDisp->SpecialUpdate() ; } +//---------------------------------------------------------------------------- +bool +MachMgr::GetDispositionToolData( int nId, string& sName, string& sHead, int& nExit, string& sTcPos) +{ + // recupero la disposizione + Disposition* pDisp = ::GetDisposition( m_pGeomDB->GetUserObj( nId)) ; + if ( pDisp == nullptr) + return false ; + // recupero i dati utensile + return pDisp->GetToolData( sName, sHead, nExit, sTcPos) ; +} + //---------------------------------------------------------------------------- // Machinings //---------------------------------------------------------------------------- diff --git a/Operation.cpp b/Operation.cpp index 401c3f6..4dbcbef 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -2310,6 +2310,10 @@ Operation::VerifyLineMidPoint( const Point3d& ptPrec, const Vector3d& vtDirPrec, bAxError = false ; Machine* pMachine = m_pMchMgr->GetCurrMachine() ; + // se disposizione non vanno fatti controlli + if ( GetType() == OPER_DISP) + return true ; + // se superato il limite di ricursioni, non devo fare alcunché const int MAX_RECURSION = 6 ; if ( nCnt > MAX_RECURSION) @@ -2352,14 +2356,27 @@ Operation::VerifyLineMidPoint( const Point3d& ptPrec, const Vector3d& vtDirPrec, // Va inserito il punto medio Point3d ptMid = Media( ptPrec, ptP) ; Vector3d vtDirMid = Media( vtDirPrec, vtDir) ; - if ( ! vtDirMid.Normalize()) - return ( nMoveType == 0) ; + if ( ! vtDirMid.Normalize()) { + if ( ! pMachine->GetBackToolDirFromAngles( vAxRotMid, vtDirMid)) + return ( nMoveType == 0) ; + } Vector3d vtAuxMid = Media( vtAuxPrec, vtAux) ; - if ( ! vtAuxPrec.IsSmall() && ! vtAux.IsSmall() && ! vtAuxMid.Normalize()) - return ( nMoveType == 0) ; + if ( ! vtAuxPrec.IsSmall() && ! vtAux.IsSmall() && ! vtAuxMid.Normalize()) { + if ( ! pMachine->GetBackAuxDirFromAngles( vAxRotMid, vtAuxMid)) + return ( nMoveType == 0) ; + } Vector3d vtCorrMid = Media( vtCorrPrec, vtCorr) ; - if ( ! vtCorrPrec.IsSmall() && ! vtCorr.IsSmall() && ! vtCorrMid.Normalize()) - return ( nMoveType == 0) ; + if ( ! vtCorrPrec.IsSmall() && ! vtCorr.IsSmall() && ! vtCorrMid.Normalize()) { + // riferimenti precedente e sul medio da direzioni fresa (Z) e ausiliaria (X) + Frame3d refPrec, refMid ; + if ( ! refPrec.Set( ORIG, vtDirPrec, vtAuxPrec) || + ! refMid.Set( ORIG, vtDirMid, vtAuxMid)) + return ( nMoveType == 0) ; + // versore correzione in locale al precente coincide con quello in locale al corrente + vtCorrMid = vtCorrPrec ; + vtCorrMid.ToLoc( refPrec) ; + vtCorrMid.ToGlob( refMid) ; + } // inserisco nuova entità e modifico vecchia int nMidEntId = m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_BEFORE) ; if ( nMidEntId == GDB_ID_NULL) @@ -2376,6 +2393,7 @@ Operation::VerifyLineMidPoint( const Point3d& ptPrec, const Vector3d& vtDirPrec, pMidCamData->SetEndPoint( ptMid) ; pMidCamData->SetToolDir( vtDirMid) ; pMidCamData->SetAuxDir( vtAuxMid) ; + pMidCamData->SetCorrDir( vtCorrMid) ; pMidCamData->SetFlag2( -1) ; // calcolo gli assi rotanti per il punto medio DBLVECTOR vAxRotHome( int( vAxVal.size() - 3)) ;