From 5ffbaab0e46c2f75608b868bf8bcc74fb2a3fcdf Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Thu, 26 Jan 2017 09:36:38 +0000 Subject: [PATCH] EgtMachKernel : - modifiche per gestione aggregato da sotto in foratura e fresatura - modifiche per nuovi tipi di uscite lame allungate. --- Drilling.cpp | 94 ++++++++++++++++++++++++++++++--- Drilling.h | 2 + Machine.cpp | 2 + Milling.cpp | 136 +++++++++++++++++++++++++++++++++++++++++++++--- Milling.h | 2 + Operation.cpp | 33 +++--------- Operation.h | 4 +- OperationCL.cpp | 20 +++++++ Sawing.cpp | 44 ++++++++-------- SawingData.cpp | 3 +- 10 files changed, 279 insertions(+), 61 deletions(-) diff --git a/Drilling.cpp b/Drilling.cpp index c87e516..ccd0da7 100644 --- a/Drilling.cpp +++ b/Drilling.cpp @@ -170,6 +170,8 @@ Drilling::Drilling( void) m_TParams.m_sName = "*" ; m_TParams.m_sHead = "*" ; m_nDrillings = 0 ; + m_bAggrBottom = false ; + m_dDistBottom = 0 ; } //---------------------------------------------------------------------------- @@ -848,6 +850,7 @@ Drilling::GenerateHoleCl( int nInd, const SelData& nCircId, const string& sPName LOG_INFO( GetEMkLogger(), sOut.c_str()) ; } // verifiche per foro verso il basso + m_bAggrBottom = false ; if ( ! VerifyHoleFromBottom( hole, nCircId)) { return false ; } @@ -1214,8 +1217,10 @@ Drilling::VerifyHoleFromBottom( const Hole& hole, SelData Id) LOG_INFO( GetEMkLogger(), sOut.c_str()) ; return false ; } - // assegno direzione di accesso + // assegno direzione di accesso e segnalazione di utilizzo aggregato da sotto SetAuxDir( vtDir) ; + m_bAggrBottom = true ; + m_dDistBottom = dDist ; return true ; } @@ -1240,15 +1245,40 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId) bool bEndSlow = ( dEndSlowLen > EPS_SMALL) ; // determino alcune caratteristiche dell'utensile double dTExtrLen = max( 0.0, m_TParams.m_dTLen - m_TParams.m_dLen) ; + // se con aggregato da sotto, ne recupero alcuni dati + double dAgbEncH = 0 ; + double dAgbEncV = 0 ; + if ( m_bAggrBottom) { + m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCH", dAgbEncH) ; + m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCV", dAgbEncV) ; + } // imposto dati comuni SetPathId( nPathId) ; SetToolDir( hole.vtDir) ; - // 1 -> punto approccio + // 1 -> punto approccio (se con aggregato da sotto ่ una sequenza di approccio) SetFlag( 1) ; double dAppr = m_pMchMgr->GetCurrMachiningsMgr()->GetSafeZ() ; Point3d ptP1 = hole.ptIni + hole.vtDir * ( dAppr + dTExtrLen) ; - if ( AddRapidStart( ptP1) == GDB_ID_NULL) - return false ; + if ( m_bAggrBottom) { + Point3d ptP0 = ptP1 + m_vtAux * ( m_dDistBottom + dAgbEncH + dAppr) ; + Point3d ptP00 = ptP0 + Z_AX * ( dAgbEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ; + Vector3d vtAux = m_vtAux ; + vtAux.Rotate( Z_AX, 90) ; + SetAuxDir( vtAux) ; + if ( AddRapidStart( ptP00, MCH_CL_AGB_DWN) == GDB_ID_NULL) + return false ; + vtAux.Rotate( Z_AX, - 90) ; + SetAuxDir( vtAux) ; + SetFlag( 0) ; + if ( AddRapidMove( ptP0, MCH_CL_AGB_IN) == GDB_ID_NULL) + return false ; + if ( AddRapidMove( ptP1) == GDB_ID_NULL) + return false ; + } + else { + if ( AddRapidStart( ptP1) == GDB_ID_NULL) + return false ; + } SetFlag( 0) ; // 2 -> punto fuori (se diverso dal precedente) if ( m_Params.m_dStartPos < dAppr) { @@ -1291,6 +1321,19 @@ Drilling::DoStandardDrilling( const Hole& hole, SelData Id, int nPathId) SetFlag( 104) ; // risalita sopra il foro if ( AddLinearMove( ptP1) == GDB_ID_NULL) return false ; + // 7 -> punto fuori (se uso aggregato da sotto) + if ( m_bAggrBottom) { + SetFlag( 0) ; + Point3d ptP0 = ptP1 + m_vtAux * ( m_dDistBottom + dAgbEncH + dAppr) ; + Point3d ptP00 = ptP0 + Z_AX * ( dAgbEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ; + if ( AddRapidMove( ptP0, MCH_CL_AGB_OUT) == GDB_ID_NULL) + return false ; + Vector3d vtAux = m_vtAux ; + vtAux.Rotate( Z_AX, 90) ; + SetAuxDir( vtAux) ; + if ( AddRapidMove( ptP00, MCH_CL_AGB_UP) == GDB_ID_NULL) + return false ; + } // reset dati di movimento ResetMoveData() ; @@ -1321,6 +1364,13 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId) bool bEndSlow = ( dEndSlowLen > EPS_SMALL) ; // determino alcune caratteristiche dell'utensile double dTExtrLen = max( 0.0, m_TParams.m_dTLen - m_TParams.m_dLen) ; + // se con aggregato da sotto, ne recupero alcuni dati + double dAgbEncH = 0 ; + double dAgbEncV = 0 ; + if ( m_bAggrBottom) { + m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCH", dAgbEncH) ; + m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCV", dAgbEncV) ; + } // imposto dati comuni SetPathId( nPathId) ; SetToolDir( hole.vtDir) ; @@ -1328,8 +1378,26 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId) SetFlag( 1) ; double dAppr = m_pMchMgr->GetCurrMachiningsMgr()->GetSafeZ() ; Point3d ptP1 = hole.ptIni + hole.vtDir * ( dAppr + dTExtrLen) ; - if ( AddRapidStart( ptP1) == GDB_ID_NULL) - return false ; + if ( m_bAggrBottom) { + Point3d ptP0 = ptP1 + m_vtAux * ( m_dDistBottom + dAgbEncH + dAppr) ; + Point3d ptP00 = ptP0 + Z_AX * ( dAgbEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ; + Vector3d vtAux = m_vtAux ; + vtAux.Rotate( Z_AX, 90) ; + SetAuxDir( vtAux) ; + vtAux.Rotate( Z_AX, - 90) ; + if ( AddRapidStart( ptP00, MCH_CL_AGB_DWN) == GDB_ID_NULL) + return false ; + SetFlag( 0) ; + SetAuxDir( vtAux) ; + if ( AddRapidMove( ptP0, MCH_CL_AGB_IN) == GDB_ID_NULL) + return false ; + if ( AddRapidMove( ptP1) == GDB_ID_NULL) + return false ; + } + else { + if ( AddRapidStart( ptP1) == GDB_ID_NULL) + return false ; + } SetFlag( 0) ; // 2 -> punto fuori (se diverso dal precedente) if ( m_Params.m_dStartPos < dAppr) { @@ -1445,6 +1513,20 @@ Drilling::DoPeckDrilling( const Hole& hole, SelData Id, int nPathId) if ( AddLinearMove( ptP1) == GDB_ID_NULL) return false ; + // 7 -> punto fuori (se uso aggregato da sotto) + if ( m_bAggrBottom) { + SetFlag( 0) ; + Point3d ptP0 = ptP1 + m_vtAux * ( m_dDistBottom + dAgbEncH + dAppr) ; + Point3d ptP00 = ptP0 + Z_AX * ( dAgbEncV + m_TParams.m_dLen + dAppr + dTExtrLen) ; + if ( AddRapidMove( ptP0, MCH_CL_AGB_OUT) == GDB_ID_NULL) + return false ; + Vector3d vtAux = m_vtAux ; + vtAux.Rotate( Z_AX, 90) ; + SetAuxDir( vtAux) ; + if ( AddRapidMove( ptP00, MCH_CL_AGB_UP) == GDB_ID_NULL) + return false ; + } + // reset dati di movimento ResetMoveData() ; diff --git a/Drilling.h b/Drilling.h index 84ba156..35ca46c 100644 --- a/Drilling.h +++ b/Drilling.h @@ -94,4 +94,6 @@ class Drilling : public Machining DrillingData m_Params ; // parametri lavorazione ToolData m_TParams ; // parametri utensile int m_nDrillings ; // numero di fori generati + bool m_bAggrBottom ; // flag di utilizzo dell'aggregato da sotto + double m_dDistBottom ; // distanza del foro dal bordo del grezzo } ; diff --git a/Machine.cpp b/Machine.cpp index 0ab28e1..cdbefa1 100644 --- a/Machine.cpp +++ b/Machine.cpp @@ -793,6 +793,8 @@ Machine::CreateExitGroups( int nLay, const MUEXITVECTOR& vMuExit) m_pGeomDB->SetStatus( nT, GDB_ST_OFF) ; // assegno nome al gruppo m_pGeomDB->SetName( nGT, sName) ; + // assegno info per eventuale movimento + m_pGeomDB->SetInfo( nGT, "Val", 0) ; // installo e inizializzo il gestore dell'uscita Exit* pExit = new(nothrow) Exit ; if ( pExit == nullptr) diff --git a/Milling.cpp b/Milling.cpp index 4d20ba1..589c175 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -1263,6 +1263,12 @@ Milling::ProcessPath( int nPathId, int nPvId, int nClId) } } + // verifiche per fresatura dal basso + m_bAggrBottom = false ; + if ( ! VerifyPathFromBottom( pCompo, vtTool)) { + return false ; + } + // se richiesta anteprima if ( nPvId != GDB_ID_NULL) { // creo gruppo per geometria di lavorazione del percorso @@ -1398,6 +1404,72 @@ Milling::CalcPathElevation( const ICurveComposite* pCompo, const Vector3d& vtToo return true ; } +//---------------------------------------------------------------------------- +bool +Milling::VerifyPathFromBottom( const ICurveComposite* pCompo, const Vector3d& vtTool) +{ + // se non ่ fresatura dal basso in alto, esco + if ( vtTool.z > - 0.5) + return true ; + // se c'่ tavola basculante, esco + bool bTabTilting = false ; + if ( m_pMchMgr->GetCurrMachine()->GetCurrTableIsTilting( bTabTilting) && bTabTilting) + return true ; + // verifico se c'่ rinvio da sotto + int nHeadId = m_pMchMgr->GetHeadId( m_TParams.m_sHead) ; + int nAgbType ; + if ( ! m_pGeomDB->GetInfo( nHeadId, "AGB_TYPE", nAgbType) || nAgbType == 0) { + string sOut = "Milling error : missing aggregate from bottom" ; + LOG_INFO( GetEMkLogger(), sOut.c_str()) ; + return false ; + } + // recupero la massima distanza consentita dal rinvio + double dAgbDmax = 0 ; + m_pGeomDB->GetInfo( nHeadId, "AGB_DMAX", dAgbDmax) ; + // calcolo la massima distanza minima del percorso dal contorno del grezzo + double dDist = 0 ; + Vector3d vtDir ; + int nMaxInd = pCompo->GetCurveCount() - 1 ; + for ( int i = 0 ; i <= nMaxInd ; ++ i) { + // curva corrente + const ICurve* pCrvC = pCompo->GetCurve( i) ; + // considero inizio della prima curva, punto medio e fine di tutte + Point3d ptP ; + double dCurrDist = 0 ; + Vector3d vtCurrDir ; + if ( i == 0) { + pCrvC->GetStartPoint( ptP) ; + GetMinDistanceFromRawSide( m_nPhase, ptP, dCurrDist, vtCurrDir) ; + if ( dCurrDist > dDist) { + dDist = dCurrDist ; + vtDir = vtCurrDir ; + } + } + pCrvC->GetMidPoint( ptP) ; + GetMinDistanceFromRawSide( m_nPhase, ptP, dCurrDist, vtCurrDir) ; + if ( dCurrDist > dDist) { + dDist = dCurrDist ; + vtDir = vtCurrDir ; + } + pCrvC->GetEndPoint( ptP) ; + GetMinDistanceFromRawSide( m_nPhase, ptP, dCurrDist, vtCurrDir) ; + if ( dCurrDist > dDist) { + dDist = dCurrDist ; + vtDir = vtCurrDir ; + } + } + // se supera il limite, errore + if ( dDist > dAgbDmax) { + string sOut = "Milling error : path too far from part sides" ; + LOG_INFO( GetEMkLogger(), sOut.c_str()) ; + return false ; + } + // assegno direzione di accesso e segnalo utilizzo aggregato da sotto + SetAuxDir( vtDir) ; + m_bAggrBottom = true ; + return true ; +} + //---------------------------------------------------------------------------- bool Milling::GenerateMillingPv( int nPathId, const ICurveComposite* pCompo) @@ -2048,23 +2120,50 @@ Milling::AddSpiralMilling( const ICurveComposite* pCompo, const Vector3d& vtTool bool Milling::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dElev, double dAppr) { + SetFlag( 1) ; + // se con aggregato da sotto + if ( m_bAggrBottom) { + // ne recupero alcuni dati + double dAgbEncH = 0 ; + double dAgbEncV = 0 ; + m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCH", dAgbEncH) ; + m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCV", dAgbEncV) ; + // aggiuntivo in Z + double dAggZ = max( dElev + max( dSafeZ, dAppr), 0.) ; + // distanza dal bordo del pezzo + double dDistBottom ; + if ( ! GetDistanceFromRawSide( m_nPhase, ptP, m_vtAux, dDistBottom)) + dDistBottom = 0 ; + // pre-approccio + Point3d ptP0 = ptP - Z_AX * dAggZ + m_vtAux * ( dDistBottom + dAgbEncH + dAppr) ; + Point3d ptP00 = ptP0 + Z_AX * ( dAgbEncV + m_TParams.m_dLen + dAggZ) ; + Vector3d vtAux = m_vtAux ; + vtAux.Rotate( Z_AX, 90) ; + SetAuxDir( vtAux) ; + if ( AddRapidStart( ptP00, MCH_CL_AGB_DWN) == GDB_ID_NULL) + return false ; + vtAux.Rotate( Z_AX, - 90) ; + SetAuxDir( vtAux) ; + SetFlag( 0) ; + if ( AddRapidMove( ptP0, MCH_CL_AGB_IN) == GDB_ID_NULL) + return false ; + } // se sopra attacco c'่ spazio per sicurezza o approccio if ( dElev + max( dSafeZ, dAppr) > 10 * EPS_SMALL) { // se distanza di sicurezza minore di distanza di inizio if ( dSafeZ < dAppr + 10 * EPS_SMALL) { // 1 -> punto sopra inizio - SetFlag( 1) ; Point3d ptP1 = ptP + vtTool * ( dElev + dAppr) ; - if ( AddRapidStart( ptP1) == GDB_ID_NULL) + if ( ( ! m_bAggrBottom && AddRapidStart( ptP1) == GDB_ID_NULL) || + ( m_bAggrBottom && AddRapidMove( ptP1) == GDB_ID_NULL)) return false ; } else { // 1a -> punto sopra inizio - SetFlag( 1) ; Point3d ptP1b = ptP + vtTool * ( dElev + dAppr) ; Point3d ptP1a = ptP1b + vtTool * ( dSafeZ - dAppr) ; - if ( AddRapidStart( ptP1a) == GDB_ID_NULL) - return false ; + if ( ( ! m_bAggrBottom && AddRapidStart( ptP1a) == GDB_ID_NULL) || + ( m_bAggrBottom && AddRapidMove( ptP1a) == GDB_ID_NULL)) // 1b -> punto appena sopra inizio if ( ( dElev + dAppr) > EPS_SMALL) { SetFlag( 0) ; @@ -2081,7 +2180,8 @@ Milling::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, else { // affondo diretto al punto iniziale SetFlag( 0) ; - if ( AddRapidStart( ptP) == GDB_ID_NULL) + if ( ( ! m_bAggrBottom && AddRapidStart( ptP) == GDB_ID_NULL) || + ( m_bAggrBottom && AddRapidMove( ptP) == GDB_ID_NULL)) return false ; } return true ; @@ -2114,6 +2214,30 @@ Milling::AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, return false ; } } + // se con aggregato da sotto + if ( m_bAggrBottom) { + // ne recupero alcuni dati + double dAgbEncH = 0 ; + double dAgbEncV = 0 ; + m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCH", dAgbEncH) ; + m_pGeomDB->GetInfo( m_pMchMgr->GetHeadId( m_TParams.m_sHead), "AGB_ENCV", dAgbEncV) ; + // aggiuntivo in Z + double dAggZ = max( dElev + max( dSafeZ, dAppr), 0.) ; + // distanza dal bordo del pezzo + double dDistBottom ; + if ( ! GetDistanceFromRawSide( m_nPhase, ptP, m_vtAux, dDistBottom)) + dDistBottom = 0 ; + // post-retract + Point3d ptP0 = ptP - Z_AX * dAggZ + m_vtAux * ( dDistBottom + dAgbEncH + dAppr) ; + Point3d ptP00 = ptP0 + Z_AX * ( dAgbEncV + m_TParams.m_dLen + dAggZ) ; + if ( AddRapidMove( ptP0, MCH_CL_AGB_OUT) == GDB_ID_NULL) + return false ; + Vector3d vtAux = m_vtAux ; + vtAux.Rotate( Z_AX, 90) ; + SetAuxDir( vtAux) ; + if ( AddRapidMove( ptP00, MCH_CL_AGB_UP) == GDB_ID_NULL) + return false ; + } return true ; } diff --git a/Milling.h b/Milling.h index 1da9131..7fe0b87 100644 --- a/Milling.h +++ b/Milling.h @@ -68,6 +68,7 @@ class Milling : public Machining bool Chain( int nGrpDestId) ; bool ProcessPath( int nPathId, int nPvId, int nClId) ; bool CalcPathElevation( const ICurveComposite* pCompo, const Vector3d& vtTool, double dDepth, double dRad, double& dElev) ; + bool VerifyPathFromBottom( const ICurveComposite* pCompo, const Vector3d& vtTool) ; bool GenerateMillingPv( int nPathId, const ICurveComposite* pCompo) ; bool AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr, double dDepth, double dElev, bool bSplitArcs) ; @@ -108,4 +109,5 @@ class Milling : public Machining MillingData m_Params ; // parametri lavorazione ToolData m_TParams ; // parametri utensile int m_nMills ; // numero di percorsi di lavoro generati + bool m_bAggrBottom ; // flag di utilizzo dell'aggregato da sotto } ; \ No newline at end of file diff --git a/Operation.cpp b/Operation.cpp index 26c5a99..3be65a7 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -919,7 +919,7 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, //---------------------------------------------------------------------------- bool -Operation::AdjustStartEndMovements( bool bOnlyStart) +Operation::AdjustStartEndMovements( void) { if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) return false ; @@ -1018,9 +1018,6 @@ Operation::AdjustStartEndMovements( bool bOnlyStart) if ( ! AdjustOneStartMovement( nClPathId, vAxVal, bHomeZ)) bOk = false ; bHomeZ = false ; - //// se solo inizio, ho finito - // if ( bOnlyStart) - // return bOk ; // recupero nuovi finali if ( ! GetClPathFinalAxesValues( nClPathId, vAxVal)) bOk = false ; @@ -1031,27 +1028,8 @@ Operation::AdjustStartEndMovements( bool bOnlyStart) // aggiungo risalita finale bOk = bOk && AddRise( vAxVal) ; - //// recupero la lavorazione successiva non vuota - // int nNextOpId = m_pMchMgr->GetNextActiveOperation( m_nOwnerId) ; - // Operation* pNextOp = GetOperation( m_pGeomDB->GetUserObj( nNextOpId)) ; - // while ( pNextOp != nullptr) { - // if ( ! pNextOp->IsEmpty()) - // break ; - // else { - // nNextOpId = m_pMchMgr->GetNextActiveOperation( nNextOpId) ; - // pNextOp = GetOperation( m_pGeomDB->GetUserObj( nNextOpId)) ; - // } - // } - // verifico se disposizione - - - //// se non esiste lavorazione successiva, vado in home - // if ( pNextOp == nullptr) - bOk = bOk && AddHome() ; - - //// altrimenti aggiusto l'inizio della lavorazione successiva con il finale di questa - // else - // bOk = bOk && pNextOp->AdjustStartEndMovements( true) ; + // vado in home + bOk = bOk && AddHome() ; return bOk ; } @@ -1077,6 +1055,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL) return false ; // modifico quella originale (่ la prima del percorso) + m_pGeomDB->RemoveName( nEntId) ; DBLVECTOR vAxNew = vAxCurr ; vAxNew[2] = vAxPrev[2] ; // eventuale aggiustamenti speciali dipendenti dalla macchina @@ -1115,6 +1094,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool if ( pNew1CamData == nullptr) return false ; // modifico questa entitเ + m_pGeomDB->RemoveName( nNew1Id) ; DBLVECTOR vAxNew1 = vAxPrev ; vAxNew1[2] = dHomeZ ; int nMask = CamData::MSK_L3 ; @@ -1151,6 +1131,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool if ( pNew2CamData == nullptr) return false ; // modifico quella originale (่ la prima del percorso) + m_pGeomDB->RemoveName( nNew2Id) ; DBLVECTOR vAxNew2 = vAxCurr ; vAxNew2[2] = dHomeZ ; pNew2CamData->SetAxes( CamData::AS_OK, vAxNew2) ; @@ -1168,6 +1149,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL) return false ; // modifico quella originale (่ la prima del percorso) + m_pGeomDB->RemoveName( nEntId) ; DBLVECTOR vAxNew = vAxPrev ; vAxNew[2] = vAxCurr[2] ; pCamData->SetAxes( CamData::AS_OK, vAxNew) ; @@ -1180,6 +1162,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL) return false ; // modifico quella originale (่ la prima del percorso) + m_pGeomDB->RemoveName( nEntId) ; DBLVECTOR vAxNew = vAxCurr ; vAxNew[2] = vAxPrev[2] ; // eventuali aggiustamenti speciali dipendenti dalla macchina diff --git a/Operation.h b/Operation.h index 314aa82..a10da9e 100644 --- a/Operation.h +++ b/Operation.h @@ -75,7 +75,7 @@ class Operation : public IUserObj bool CalculateAxesValues( const std::string& sHint) ; bool CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, double dRot1W, DBLVECTOR& vAxRotPrec, int& nOutStrC) ; - bool AdjustStartEndMovements( bool bOnlyStart = false) ; + bool AdjustStartEndMovements( void) ; bool AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool bHomeZ) ; bool ToolChangeNeeded( const Operation& Op1, const Operation& Op2) ; bool AddRise( DBLVECTOR& vAxVal, double dDelta = - 1) ; @@ -102,7 +102,9 @@ class Operation : public IUserObj bool GetCurrPos( Point3d& ptCurr) const { if ( ! m_bCurr) return false ; ptCurr = m_ptCurr ; return true ; } int AddRapidStart( const Point3d& ptP) ; + int AddRapidStart( const Point3d& ptP, const std::string& sName) ; int AddRapidMove( const Point3d& ptP) ; + int AddRapidMove( const Point3d& ptP, const std::string& sName) ; int AddLinearMove( const Point3d& ptP) ; int AddLinearMove( const Point3d& ptP, const std::string& sName) ; int AddArcMove( const Point3d& ptP, const Point3d& ptCen, double dAngCen, const Vector3d& vtN) ; diff --git a/OperationCL.cpp b/OperationCL.cpp index f261297..124c4d7 100644 --- a/OperationCL.cpp +++ b/OperationCL.cpp @@ -120,6 +120,16 @@ Operation::AddRapidStart( const Point3d& ptP) return nId ; } +//---------------------------------------------------------------------------- +int +Operation::AddRapidStart( const Point3d& ptP, const string& sName) +{ + int nId = AddRapidStart( ptP) ; + if ( nId != GDB_ID_NULL) + m_pGeomDB->SetName( nId, sName) ; + return nId ; +} + //---------------------------------------------------------------------------- int Operation::AddRapidMove( const Point3d& ptP) @@ -159,6 +169,16 @@ Operation::AddRapidMove( const Point3d& ptP) return nId ; } +//---------------------------------------------------------------------------- +int +Operation::AddRapidMove( const Point3d& ptP, const string& sName) +{ + int nId = AddRapidMove( ptP) ; + if ( nId != GDB_ID_NULL) + m_pGeomDB->SetName( nId, sName) ; + return nId ; +} + //---------------------------------------------------------------------------- int Operation::AddLinearMove( const Point3d& ptP) diff --git a/Sawing.cpp b/Sawing.cpp index b0de965..d127728 100644 --- a/Sawing.cpp +++ b/Sawing.cpp @@ -2968,26 +2968,9 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC else if ( m_Params.m_nLeadInType == SAW_LI_OUT) // all'esterno dDeltaI = dDeltaT ; - else if ( m_Params.m_nLeadInType == SAW_LI_EXT_CENT) { - // porto il centro lama sul bordo del grezzo - // calcolo punto di inizio e direzione (sono in globale) - Point3d ptP ; - pLine->GetStartPoint( ptP) ; - Vector3d vtDir ; - pLine->GetStartDir( vtDir) ; - // determino la distanza dal bordo del grezzo - double dDist[4] = {0, 0, 0, 0} ; - if ( ! GetDistanceFromRawSide( m_nPhase, ptP, - vtDir, dDist[0]) || - ! GetDistanceFromRawSide( m_nPhase, ptP + vtThick, - vtDir, dDist[1]) || - ! GetDistanceFromRawSide( m_nPhase, ptP + vtCorr * dElev, - vtDir, dDist[2]) || - ! GetDistanceFromRawSide( m_nPhase, ptP + vtCorr * dElev + vtThick, - vtDir, dDist[3])) - return false ; - dDeltaI = 0 ; - for ( int i = 0 ; i < 4 ; ++i) - dDeltaI = max( dDeltaI, dDist[i]) ; - } - else if ( m_Params.m_nLeadInType == SAW_LI_EXT_OUT) { - // estendo all'esterno del bordo del grezzo + else if ( m_Params.m_nLeadInType == SAW_LI_EXT_CENT || + m_Params.m_nLeadInType == SAW_LI_EXT_OUT) { + // porto il centro lama sul bordo del grezzo o all'esterno // calcolo punto di inizio e direzione (sono in globale) Point3d ptP ; pLine->GetStartPoint( ptP) ; @@ -3003,6 +2986,8 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC dDeltaI = 0 ; for ( int i = 0 ; i < 4 ; ++i) dDeltaI = max( dDeltaI, dDist[i]) ; + if ( m_Params.m_nLeadInType == SAW_LI_EXT_OUT) + dDeltaI += dDeltaT ; } } else { @@ -3035,9 +3020,14 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC dDeltaF = - dDeltaT ; else if ( bIsLast) { if ( m_Params.m_nLeadOutType == SAW_LO_STRICT) + // all'interno dDeltaF = - dDeltaT ; - else if ( m_Params.m_nLeadOutType == SAW_LO_EXT) { - // estendo al bordo del grezzo + else if ( m_Params.m_nLeadOutType == SAW_LO_OUT) + // all'esterno + dDeltaF = dDeltaT ; + else if ( m_Params.m_nLeadOutType == SAW_LO_EXT_CENT || + m_Params.m_nLeadOutType == SAW_LO_EXT_OUT) { + // estendo al bordo del grezzo o al suo esterno // calcolo punto di fine e direzione (sono in globale) Point3d ptP ; pLine->GetEndPoint( ptP) ; @@ -3053,6 +3043,8 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC dDeltaF = 0 ; for ( int i = 0 ; i < 4 ; ++i) dDeltaF = max( dDeltaF, dDist[i]) ; + if ( m_Params.m_nLeadOutType == SAW_LO_EXT_OUT) + dDeltaF += dDeltaT ; } } else { @@ -3074,6 +3066,9 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC dDeltaF = 0 ; for ( int i = 0 ; i < 4 ; ++i) dDeltaF = max( dDeltaF, dDist[i]) ; + // se LeadOut EXT_OUT vado all'esterno + if ( m_Params.m_nLeadOutType == SAW_LO_EXT_OUT) + dDeltaF += dDeltaT ; } } // controllo se lunghezza entitเ accettabile @@ -3125,7 +3120,12 @@ Sawing::AdjustArcForEdges( ICurveArc* pArc, double dElev, double dLenCoeff, dDeltaF = - dDeltaT ; else if ( bIsLast) { if ( m_Params.m_nLeadOutType == SAW_LO_STRICT) + // all'interno dDeltaF = - dDeltaT ; + else if ( m_Params.m_nLeadOutType == SAW_LO_OUT || + m_Params.m_nLeadOutType == SAW_LO_EXT_OUT) + // all'esterno + dDeltaF = dDeltaT ; } dDeltaF *= dLenCoeff ; // controllo se lunghezza entitเ accettabile diff --git a/SawingData.cpp b/SawingData.cpp index 40d297f..bcdefb6 100644 --- a/SawingData.cpp +++ b/SawingData.cpp @@ -447,7 +447,8 @@ SawingData::VerifyExtLinkType( int nVal) const bool SawingData::VerifyLeadOutType( int nVal) const { - return ( nVal == SAW_LO_STRICT || nVal == SAW_LO_CENT || nVal == SAW_LO_EXT) ; + return ( nVal == SAW_LO_STRICT || nVal == SAW_LO_CENT || nVal == SAW_LO_OUT || + nVal == SAW_LO_EXT_CENT || nVal == SAW_LO_EXT_OUT) ; } //----------------------------------------------------------------------------