diff --git a/Milling.cpp b/Milling.cpp index a03406a..41e7ef7 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -45,6 +45,7 @@ using namespace std ; const double OSC_MIN_LEN = 0.1 ; const double ELEV_MAX_OFFS = 25.0 ; const double MIN_SAFEDIST = 5.0 ; +const double LIM_DOWN_APPRZ = - 0.5 ; //------------------------------ Errors -------------------------------------- // 2301 = "Error in Milling : UpdateToolData failed" @@ -2376,8 +2377,12 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo Point3d ptTest = ptP1 - MIN_SAFEDIST * ( m_bAboveHead ? Z_AX : -Z_AX) ; Vector3d vtAppr1 = FromNearestHorizontalOrtho( vtTool, ptP1 - ptStart) ; Vector3d vtAppr2 = ptP1 - ptStart ; - if ( ! vtAppr2.Normalize()) - vtAppr2 = CalcCorrDir( pCompo, i) ; + if ( ! vtAppr2.Normalize()) { + if ( ( m_TParams.m_nType & TF_MILL) != 0) + vtAppr2 = -vtStart ; + else + vtAppr2 = CalcCorrDir( pCompo, i) ; + } double dThick = ( m_TParams.m_nType == TT_MILL_NOTIP ? m_TParams.m_dMaxMat : m_TParams.m_dThick) ; double dSawStartElev1 = -1, dSawStartElev2 = -1 ; GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick, vtAppr1, dSawStartElev1) ; @@ -2404,7 +2409,7 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo bOk = false ; } // aggiungo opportuno approccio - if ( ! AddSawBladeSideApproach( ptP1, vtAppr, dSafeZ, dSawStartElev, dAppr)) { + if ( ! AddSawBladeSideApproach( ptP1, vtAppr, vtTool, dSafeZ, dSawStartElev, dStElev, dAppr)) { m_pMchMgr->SetLastError( 2309, "Error in Milling : Approach not computable") ; return false ; } @@ -2541,8 +2546,12 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo Point3d ptTest = ptP1 - MIN_SAFEDIST * ( m_bAboveHead ? Z_AX : -Z_AX) ; Vector3d vtRetr1 = FromNearestHorizontalOrtho( vtTool, ptP1 - ptEnd) ; Vector3d vtRetr2 = ptP1 - ptEnd ; - if ( ! vtRetr2.Normalize()) - vtRetr2 = CalcCorrDir( pCompo, i + 1) ; + if ( ! vtRetr2.Normalize()) { + if ( ( m_TParams.m_nType & TF_MILL) != 0) + vtRetr2 = vtEnd ; + else + vtRetr2 = CalcCorrDir( pCompo, i + 1) ; + } double dThick = ( m_TParams.m_nType == TT_MILL_NOTIP ? m_TParams.m_dMaxMat : m_TParams.m_dThick) ; double dSawEndElev1, dSawEndElev2 ; GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick, vtRetr1, dSawEndElev1) ; @@ -2569,7 +2578,7 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo bOk = false ; } // aggiungo opportuna retrazione - if ( ! AddSawBladeSideRetract( ptP1, vtRetr, vtTool, dSafeZ, dSawEndElev, dAppr)) { + if ( ! AddSawBladeSideRetract( ptP1, vtRetr, vtTool, dSafeZ, dSawEndElev, dEndElev, dAppr)) { m_pMchMgr->SetLastError( 2312, "Error in Milling : Retract not computable") ; return false ; } @@ -2750,7 +2759,7 @@ Milling::AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool bOk = false ; } // aggiungo opportuno approccio - if ( ! AddSawBladeSideApproach( ptP1, vtAppr, dSafeZ, dSawStartElev, dAppr)) { + if ( ! AddSawBladeSideApproach( ptP1, vtAppr, vtTool, dSafeZ, dSawStartElev, dStElev, dAppr)) { m_pMchMgr->SetLastError( 2309, "Error in Milling : Approach not computable") ; return false ; } @@ -2915,7 +2924,7 @@ Milling::AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool bOk = false ; } // aggiungo opportuna retrazione - if ( ! AddSawBladeSideRetract( ptP1, vtRetr, vtTool, dSafeZ, dSawEndElev, dAppr)) { + if ( ! AddSawBladeSideRetract( ptP1, vtRetr, vtTool, dSafeZ, dSawEndElev, dEndElev, dAppr)) { m_pMchMgr->SetLastError( 2312, "Error in Milling : Retract not computable") ; return false ; } @@ -3211,7 +3220,7 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool bOk = false ; } // aggiungo opportuno approccio - if ( ! AddSawBladeSideApproach( ptP1, vtAppr, dSafeZ, dSawStartElev, dAppr)) { + if ( ! AddSawBladeSideApproach( ptP1, vtAppr, vtTool, dSafeZ, dSawStartElev, dStElev, dAppr)) { m_pMchMgr->SetLastError( 2309, "Error in Milling : Approach not computable") ; return false ; } @@ -3377,7 +3386,7 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool bOk = false ; } // aggiungo opportuna retrazione - if ( ! AddSawBladeSideRetract( ptP1, vtRetr, vtTool, dSafeZ, dSawEndElev, dAppr)) { + if ( ! AddSawBladeSideRetract( ptP1, vtRetr, vtTool, dSafeZ, dSawEndElev, dEndElev, dAppr)) { m_pMchMgr->SetLastError( 2312, "Error in Milling : Retract not computable") ; return false ; } @@ -4075,16 +4084,42 @@ Milling::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, //---------------------------------------------------------------------------- bool -Milling::AddSawBladeSideApproach( const Point3d& ptP, const Vector3d& vtAppr, double dSafeZ, double dStElev, double dAppr) +Milling::AddSawBladeSideApproach( const Point3d& ptP, const Vector3d& vtAppr, const Vector3d& vtTool, + double dSafeZ, double dSawStElev, double dStElev, double dAppr) { - SetFlag( 1) ; // per approccio orizzontale vtAppr deve essere già stato sistemato dal chiamante - // 1 -> punto fuori inizio - Point3d ptP1 = ptP + vtAppr * ( dStElev + max( dAppr, dSafeZ)) ; - if ( AddRapidStart( ptP1) == GDB_ID_NULL) - return false ; - // affondo al punto iniziale in feed + SetFlag( 1) ; + // 1a -> punto fuori inizio + Point3d ptP1a = ptP + vtAppr * ( dSawStElev + max( dAppr, dSafeZ)) ; + // se necessario ulteriore approccio + if ( ! m_bTiltingTab && vtAppr.z < LIM_DOWN_APPRZ) { + Vector3d vtMove = Vector3d( vtTool.x, vtTool.y, 0) ; + if ( vtMove.Normalize()) { + Point3d ptP1e = ptP1a + vtMove * ( dStElev + dSafeZ) ; + if ( AddRapidStart( ptP1e) == GDB_ID_NULL) + return false ; + SetFlag( 0) ; + if ( AddRapidMove( ptP1a) == GDB_ID_NULL) + return false ; + } + else { + if ( AddRapidStart( ptP1a) == GDB_ID_NULL) + return false ; + } + } + // caso standard + else { + if ( AddRapidStart( ptP1a) == GDB_ID_NULL) + return false ; + } SetFlag( 0) ; + // 1b -> punto appena sopra inizio (se necessario) + if ( dSafeZ > dAppr + 10 * EPS_SMALL && dSawStElev + dAppr > 10 * EPS_SMALL) { + Point3d ptP1b = ptP + vtAppr * ( dSawStElev + dAppr) ; + if ( AddRapidMove( ptP1b) == GDB_ID_NULL) + return false ; + } + // affondo al punto iniziale in feed SetFeed( GetStartFeed()) ; if ( AddLinearMove( ptP) == GDB_ID_NULL) return false ; @@ -4197,37 +4232,29 @@ Milling::AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, //---------------------------------------------------------------------------- bool Milling::AddSawBladeSideRetract( const Point3d& ptP, const Vector3d& vtRetr, const Vector3d& vtTool, - double dSafeZ, double dEndElev, double dAppr) + double dSafeZ, double dSawEndElev, double dEndElev, double dAppr) { // per retrazione orizzontale vtAppr deve essere già stato sistemato dal chiamante - // se sopra uscita c'è spazio per sicurezza o approccio - if ( dEndElev + max( dSafeZ, dAppr) > 10 * EPS_SMALL) { - if ( dSafeZ < dAppr + 10 * EPS_SMALL) { - // 4 -> movimento di risalita sopra il punto finale - SetFeed( GetEndFeed()) ; - Point3d ptP4 = ptP + vtRetr * ( dEndElev + dAppr) ; - if ( AddLinearMove( ptP4) == GDB_ID_NULL) - return false ; - } - else { - // 4a -> movimento di risalita appena sopra il punto finale - Point3d ptP4a = ptP + vtRetr * ( dEndElev + dAppr) ; - if ( dEndElev + dAppr > EPS_SMALL) { - SetFeed( GetEndFeed()) ; - if ( AddLinearMove( ptP4a) == GDB_ID_NULL) - return false ; - } - // 4b -> movimento di risalita sopra il punto finale - Vector3d vtMove = vtRetr ; - double dMove = dSafeZ - dAppr ; - if ( ! m_bTiltingTab && vtRetr.z < sin( -ANG_RIGHT / 2)) { - vtMove = Vector3d( vtTool.x, vtTool.y, 0) ; - if ( vtMove.Normalize()) - dMove = dSafeZ ; - else - vtMove = vtRetr ; - } - Point3d ptP4b = ptP4a + vtMove * dMove ; + Point3d ptP4 = ptP ; + // se sopra uscita c'è spazio per approccio + if ( dSawEndElev + dAppr > 10 * EPS_SMALL) { + SetFeed( GetEndFeed()) ; + ptP4 = ptP + vtRetr * ( dSawEndElev + dAppr) ; + if ( AddLinearMove( ptP4) == GDB_ID_NULL) + return false ; + } + // se sopra uscita c'è spazio per sicurezza + if ( dSafeZ - dAppr > 10 * EPS_SMALL) { + ptP4 += vtRetr * ( dSafeZ - dAppr) ; + if ( AddRapidMove( ptP4) == GDB_ID_NULL) + return false ; + } + + // se necessaria ulteriore uscita + if ( ! m_bTiltingTab && vtRetr.z < LIM_DOWN_APPRZ) { + Vector3d vtMove = Vector3d( vtTool.x, vtTool.y, 0) ; + if ( vtMove.Normalize()) { + Point3d ptP4b = ptP4 + vtMove * ( dEndElev + dSafeZ) ; if ( AddRapidMove( ptP4b) == GDB_ID_NULL) return false ; } diff --git a/Milling.h b/Milling.h index 686c233..86b36a3 100644 --- a/Milling.h +++ b/Milling.h @@ -98,12 +98,13 @@ class Milling : public Machining double dDepth, double dElev, double dOkStep, bool bSplitArcs) ; bool AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ, double dElev, double dAppr, bool bOutStart, bool bAboveStart) ; - bool AddSawBladeSideApproach( const Point3d& ptP, const Vector3d& vtAppr, double dSafeZ, double dStElev, double dAppr) ; + bool AddSawBladeSideApproach( const Point3d& ptP, const Vector3d& vtAppr, const Vector3d& vtTool, + double dSafeZ, double dSawStElev, double dStElev, double dAppr) ; bool AddDirectApproach( const Point3d& ptP) ; bool AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dSafeAggrBottZ, double dElev, double dAppr, bool bAboveEnd) ; bool AddSawBladeSideRetract( const Point3d& ptP, const Vector3d& vtRetr, const Vector3d& vtTool, - double dSafeZ, double dEndElev, double dAppr) ; + double dSafeZ, double dSawEndElev, double dEndElev, double dAppr) ; bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtTool, double dStElev, bool bInvert, const ICurveComposite* pCompo, Point3d& ptP1) const ; bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, diff --git a/Operation.cpp b/Operation.cpp index bad0fc1..d0b6027 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -22,7 +22,6 @@ #include "/EgtDev/Include/EGkAngle.h" #include "/EgtDev/Include/EGkBBox1d.h" #include "/EgtDev/Include/EGkGeoPoint3d.h" -#include "/EgtDev/Include/EGkGeoVector3d.h" #include "/EgtDev/Include/EGkCurveLine.h" #include "/EgtDev/Include/EGkCurveArc.h" #include "/EgtDev/Include/EGkArcSpecial.h" @@ -37,7 +36,6 @@ #include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EgtNumUtils.h" #include "/EgtDev/Include/EgtPointerOwner.h" -#include "/EgtDev/Include/EGkDistPointSurfTm.h" using namespace std ; @@ -519,269 +517,6 @@ Operation::GetAhPointUnderRaw( const Point3d& ptP, const Vector3d& vtTool, doubl return false ; } -bool IsPointOnBox( BBox3d BBox, Point3d pt) { - - if( BBox.IsEmpty()) - return false ; - - int nCheck = 0 ; - if(( pt.x - BBox.GetMin().x) < EPS_SMALL) - ++nCheck ; - if(( pt.y - BBox.GetMin().y) < EPS_SMALL) - ++nCheck ; - if(( pt.z - BBox.GetMin().z) < EPS_SMALL) - ++nCheck ; - if(( pt.x - BBox.GetMax().x) < EPS_SMALL) - ++nCheck ; - if(( pt.y - BBox.GetMax().y) < EPS_SMALL) - ++nCheck ; - if(( pt.z - BBox.GetMax().z) < EPS_SMALL) - ++nCheck ; - - if( nCheck >= 2) - return true ; - - return false ; - -} - - -//---------------------------------------------------------------------------- -bool -Operation::GetSignedDistFromStmRaw( int nPhase, const Point3d ptP, const Vector3d vtDir, - double& dDist, Vector3d& vtNorm) const -{ - - // controllo MachManager e database geometrico - if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) - return false ; - - // la distanza è negativa se il punto è interno, positiva se esterno, 0 se sulla suprificie - const double RAY_LEN = 100000 ; - bool bIsInside = false ; // se punto interno ad un RawPart - bool bIsPointOn = false ; // se il punto è stato trovato su una faccia - bool bIsOnLoop = false ; // se il punto è su un loop - bool bIsOnBox = false ; // se il punto è su un Box3D - bool bSkip = false ; // se salto controlli sui bordi - - // vettore dei grezzi - ISURFTMPOVECTOR vSrfRawPart ; - - int nRawId = m_pMchMgr->GetFirstRawPart() ; - while( nRawId != GDB_ID_NULL) { - - // verifico che il grezzo compaia nella fase - if ( m_pMchMgr->VerifyRawPartPhase( nRawId, nPhase)) { - - // recupero l'oggetto dal database con tale Id - int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; - const IGeoObj* pGObj = m_pGeomDB->GetGeoObj( nRawSolidId) ; - - // recupero il frame in cui si trova - Frame3d frRaw ; - m_pGeomDB->GetGlobFrame( nRawSolidId, frRaw) ; - if ( pGObj == nullptr) - return false ; - - // controllo che sia una Trimesh - if ( pGObj->GetType() == SRF_TRIMESH) { - - // Trimesh della parte p-esima - PtrOwner pStmRawPart( CloneSurfTriMesh( GetSurfTriMesh( pGObj))) ; - if( IsNull( pStmRawPart)) - return false ; - - // porto la trimesh in globale - pStmRawPart->ToGlob( frRaw) ; - - // salvo la superificie - vSrfRawPart.emplace_back( pStmRawPart->Clone()) ; - - // distanza dalla parte p-esima - double dCurrDist = 0 ; - - // recupero la distanza tra il punto e la parte p-esima - DistPointSurfTm distPtStm( ptP, *pStmRawPart) ; - if ( ! distPtStm.GetDist( dCurrDist)) - return false ; - - // controllo se il punto è dentro al grezzo - if ( distPtStm.IsPointInside()) { - bIsInside = true ; - bSkip = true ; - } - - if ( dCurrDist < EPS_SMALL && !bSkip) { - // controllo se sono su un Loop - POLYLINEVECTOR vP ; - bool bIsCurrOnLoop = false ; - for ( int i = 0 ; i < pStmRawPart->GetFacetCount() ; ++ i) { - pStmRawPart->GetFacetLoops( i, vP) ; - for ( int j = 0 ; j < ( int)vP.size() && !bIsCurrOnLoop ; ++ j) { - PtrOwner pCrvEdge( CreateCurveComposite()) ; - if ( IsNull( pCrvEdge)) - return false ; - pCrvEdge->FromPolyLine( vP[j]) ; - if ( !pCrvEdge->IsValid() || pCrvEdge->GetCurveCount() == 0) - return false ; - if( pCrvEdge->IsPointOn( ptP)) - bIsCurrOnLoop = true ; - } - } - - // se il punto sta sulla curva... - if ( bIsCurrOnLoop) { - if ( bIsOnLoop) { // se ho già trovato una curva che contiene il punto ... - BBox3d bCurrBox ; - if ( ! pStmRawPart->GetBBox( GLOB_FRM, bCurrBox)) - return false ; - - if ( IsPointOnBox( bCurrBox, ptP)) { // se il punto sta sul Box - if ( bIsOnBox) { // se il punto stava già su un altro Box - bIsInside = false ; - bSkip = true ; - } - else // se il punto non stava già su un box - bIsInside = true ; - - bSkip = true ; - } - else // se il punto non sta sul box - bIsInside = true ; - - } - else { // se è la prima curva a contenere il punto - bIsPointOn = true ; - // controllo se il punto sta sulla faccia del box del grezzo corrente - BBox3d bCurrBox ; - if ( ! pStmRawPart->GetBBox( GLOB_FRM, bCurrBox)) - return false ; - // controllo se il punto sta su una faccia del box - if ( IsPointOnBox( bCurrBox, ptP)) - bIsOnBox = true ; - } - } - // se il punto non sta sulla curva ... - else { - if ( bIsPointOn) { - bIsInside = true ; - bSkip = true ; - } - else - bIsPointOn = true ; - } - - } - } - } - - // passo al grezzo successivo - nRawId = m_pMchMgr->GetNextRawPart( nRawId) ; - } - - if ( bSkip) { - bIsPointOn = false ; - bIsOnLoop = false ; - bIsOnBox = false ; - } - - double dCurrDist = bIsInside ? -INFINITO : INFINITO ; // distanza attuale - dDist = dCurrDist ; - double dTmpCurrDist = 0 ; - - for ( int i = 0 ; i < ( int)vSrfRawPart.size() ; ++ i) { - - ILSIVECTOR vInfo ; // info - Triangle3d Tria ; // triangolo della trimesh intersecato - - // recupero la distanza tra il punto e la parte p-esima - if ( IntersLineSurfTm( ptP, vtDir, RAY_LEN, *vSrfRawPart[i], vInfo)) { - - if (( int)vInfo.size() == 0) - continue ; - - DistPointSurfTm distPtStm( ptP, *vSrfRawPart[i]) ; - if( ! distPtStm.GetDist( dTmpCurrDist)) - return false ; - - if (( bIsPointOn && !bIsInside)) { // punto sulla superificie totale dei grezzi - // se è il grezzo è quello giusto ... - if ( dTmpCurrDist < EPS_SMALL) { - dDist = 0 ; - vSrfRawPart[i]->GetTriangle( vInfo[0].nT, Tria) ; - vtNorm = Tria.GetN() ; - return true ; - } - else { // se sono su un altro ... ( prima o poi ritorno al controllo sopra ...) - } - } - else if (( int)vInfo.size() == 1 && bIsInside) { - if ( distPtStm.IsPointInside() || dTmpCurrDist < EPS_SMALL) { - // se punto interno alla grezzo corrente - double dUCurr = vInfo[0].dU ; - // se direzione || ad una faccia faccia, ma punto non interno al grezzo corrente - if ( vInfo[0].nILTT == ILTT_SEGM || vInfo[0].nILTT == ILTT_EDGE) - double dUCurr = - vInfo[0].dU2 ; - if ( dUCurr > dCurrDist) { - dCurrDist = dUCurr ; - vSrfRawPart[i]->GetTriangle( vInfo[0].nT, Tria) ; - vtNorm = Tria.GetN() ; - } - } - else { // se interno ma non al grezzo corrente ( prima o poi ritono al controllo sopra ) - } - } - else if (( int)vInfo.size() > 1) { // se la linea trapassa il grezzo corrente (entra ed esce)... - if ( bIsInside) { // e il punto è interno ( quindi non al grezzo corrente ) - double dUCurr = 0 ; - int nT ; - for ( int j = 0 ; j < ( int)vInfo.size() ; ++ j) { - IntLinStmInfo Info = vInfo[j] ; - if ( Info.nILTT == ILTT_SEGM || Info.nILTT == ILTT_SEGM_ON_EDGE) { - // se prosegue un tratto precedente, non devo controllare sia minimo - dUCurr = Info.dU2 ; - nT = Info.nT ; - //break ; ??????? - } - // se altrimenti intersezione puntuale, verifico che esca (coseno >= 0) - else if ( Info.dCosDN > - COS_ORTO_ANG_ZERO) { - dUCurr = Info.dU ; - nT = Info.nT ; - break ; - } - // se altrimenti è la prima ed entra ( non la considero ...) - else { - } - - } - if ( dUCurr > dCurrDist) { // tengo la distanza più grande - dCurrDist = dUCurr ; - vSrfRawPart[i]->GetTriangle( nT, Tria) ; - vtNorm = Tria.GetN() ; - } - } - else { // se invece è un punto esterno a tutto - if ( vInfo[0].dU < dCurrDist) { // tengo la distanza ( positiva) più grande - dCurrDist = vInfo[0].dU ; - vSrfRawPart[i]->GetTriangle( vInfo[0].nT, Tria) ; - vtNorm = Tria.GetN() ; - } - } - } - } - } - - - if ( dCurrDist > INFINITO - 1 && ! bIsInside) // non ho intersecato mai nessun grezzo - dDist = INFINITO ; - if ( dCurrDist < -INFINITO + 1 && bIsInside) // sono interno ma non interseco un grezzo ... errore - return false ; - dDist = bIsInside ? - dCurrDist : dCurrDist ; - - return true ; -} - - //---------------------------------------------------------------------------- bool Operation::GetUhPointAboveRaw( const Point3d& ptP, const Vector3d& vtTool, double dToolRad, double dToolRadForElev, @@ -1038,25 +773,13 @@ Operation::GetDistanceFromRawBottom( int nPhase, int nPathId, double dToler, dou { if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) return false ; - - // ricerco grezzi interessati dal percorso - BBox3d b3Compo ; - if ( ! m_pGeomDB->GetGlobalBBox( nPathId, b3Compo)) - return false ; - return GetDistanceFromRawBottom( nPhase, b3Compo, dToler, dRbDist, dAllRbDist) ; - -} - -//---------------------------------------------------------------------------- -bool -Operation::GetDistanceFromRawBottom( int nPhase, BBox3d& b3Test, double dToler, double& dRbDist, double& dAllRbDist) const -{ - if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) - return false ; // recupero distanza da fondo dei grezzi interessati o no dal percorso dRbDist = 0 ; dAllRbDist = 0 ; - b3Test.Expand( dToler, dToler, 0) ; + BBox3d b3Compo ; + if ( ! m_pGeomDB->GetGlobalBBox( nPathId, b3Compo)) + return false ; + b3Compo.Expand( dToler, dToler, 0) ; int nRawId = m_pMchMgr->GetFirstRawPart() ; while ( nRawId != GDB_ID_NULL) { // verifico che il grezzo compaia nella fase @@ -1064,8 +787,8 @@ Operation::GetDistanceFromRawBottom( int nPhase, BBox3d& b3Test, double dToler, BBox3d b3Raw ; int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; if ( m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw)) { - double dDist = b3Test.GetMax().z - b3Raw.GetMin().z ; - if ( b3Test.OverlapsXY( b3Raw) && dDist > dRbDist) + double dDist = b3Compo.GetMax().z - b3Raw.GetMin().z ; + if ( b3Compo.OverlapsXY( b3Raw) && dDist > dRbDist) dRbDist = dDist ; if ( dDist > dAllRbDist) dAllRbDist = dDist ; @@ -1345,9 +1068,6 @@ Operation::ApproxWithArcsIfUseful( ICurveComposite* pCompo, bool bCareTempProp) pCompo->GetExtrusion( vtExtr) ; double dThick = 0 ; pCompo->GetThickness( dThick) ; - // recupero le tmp prop della composita - int nProp0 = pCompo->GetTempProp( 0) ; - int nProp1 = pCompo->GetTempProp( 1) ; // verifico se ci sono tante linee corte int nSmallLineCnt = 0 ; const ICurve* pCrv = pCompo->GetFirstCurve() ; @@ -1443,11 +1163,6 @@ Operation::ApproxWithArcsIfUseful( ICurveComposite* pCompo, bool bCareTempProp) pCompo->SetExtrusion( vtExtr) ; pCompo->SetThickness( dThick) ; - // riassegno temp prop alla composita - pCompo->SetTempProp( nProp0, 0) ; - pCompo->SetTempProp( nProp1, 1) ; - - return true ; } @@ -1837,7 +1552,7 @@ Operation::SetBlockedRotAxis( const string& sBlockedAxis) const for ( int i = 0 ; i < nRotAxes && ! bFound ; ++ i) { string sAxToken ; if ( m_pMchMgr->GetCurrMachine()->GetCurrAxisToken( i + nLinAxes, sAxToken) && - sKey == Trim( sAxToken)) { + sKey == Trim( sAxToken, " \t\r\n=")) { string sAxis ; m_pMchMgr->GetCurrMachine()->GetCurrAxisName( i + nLinAxes, sAxis) ; m_pMchMgr->SetRotAxisBlock( sAxis, dVal) ; @@ -1915,7 +1630,7 @@ Operation::CalculateAxesValues( const string& sHint, bool bRotContOnNext, bool b for ( int i = 0 ; i < nRotAxes ; ++ i) { string sAxToken ; if ( m_pMchMgr->GetCurrMachine()->GetCurrAxisToken( nLinAxes + i, sAxToken) && - szKey == Trim( sAxToken)) { + szKey == Trim( sAxToken, " \t\r\n=")) { double dVal ; if ( FromString( szVal, dVal)) { double dOffset = 0 ; diff --git a/Simulator.cpp b/Simulator.cpp index dc8c7f8..63ced76 100644 --- a/Simulator.cpp +++ b/Simulator.cpp @@ -25,9 +25,11 @@ #include "/EgtDev/Include/EGkCDeCylClosedSurfTm.h" #include "/EgtDev/Include/EGkCDeSpheClosedSurfTm.h" #include "/EgtDev/Include/EGkCDeConeFrustumClosedSurfTm.h" +#include "/EgtDev/Include/EGkCDeClosedSurfTmClosedSurfTm.h" #include "/EgtDev/Include/EGkVolZmap.h" #include "/EgtDev/Include/EGkGeoVector3d.h" #include "/EgtDev/Include/EGkStringUtils3d.h" +#include "/EgtDev/Include/EGkSurfLocal.h" #include "/EgtDev/Include/EXeCmdLogOff.h" #include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EMkToolConst.h" @@ -1353,44 +1355,62 @@ Simulator::ExecCollisionCheck( int& nCdInd, int& nObjInd, int nMoveType) // se utensile attivo su grezzo in lavoro e non è rapido, salto if ( bIsTool && bIsRaw && nMoveType != 0) 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 bool bOk = true ; - Frame3d frObj = pGeoFrame->GetFrame() ; - if ( ! m_CollObj[j].vtMove.IsSmall()) - frObj.Translate( m_CollObj[j].vtMove.x * frObj.VersX() + - m_CollObj[j].vtMove.y * frObj.VersY() + - m_CollObj[j].vtMove.z * frObj.VersZ()) ; - Frame3d frParent ; m_pGeomDB->GetGlobFrame( m_CollObj[j].nFrameId, frParent) ; - frObj.LocToLoc( frParent, frCd) ; - 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->AvoidBox( frObj, vtDiag, m_dSafeDist) ; - else - bOk = ! CDeBoxClosedSurfTm( frObj, vtDiag, m_dSafeDist, *pSTM) ; + // oggetti che richiedono frame associato (Box, Cylinder, Sphere, Cone) + if ( m_CollObj[j].nType != MCH_SIM_COB_POLY) { + // se riferimento non trovato, si salta + const IGeoFrame3d* pGeoFrame = GetGeoFrame3d( m_pGeomDB->GetGeoObj( m_CollObj[j].nFrameId)) ; + if ( pGeoFrame == nullptr) + continue ; + Frame3d frObj = pGeoFrame->GetFrame() ; + if ( ! m_CollObj[j].vtMove.IsSmall()) + frObj.Translate( m_CollObj[j].vtMove.x * frObj.VersX() + + m_CollObj[j].vtMove.y * frObj.VersY() + + m_CollObj[j].vtMove.z * frObj.VersZ()) ; + 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->AvoidBox( frObj, vtDiag, m_dSafeDist) ; + else + 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) ; + } } - 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) ; + // 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->AvoidSurfTm( *pStmLoc, m_dSafeDist) ; + else + bOk = ! CDeClosedSurfTmClosedSurfTm( *pStmLoc, *pSTM, 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) ; + bOk = false ; } + // se trovata collisione if ( ! bOk) { nCdInd = i ; nObjInd = j ; @@ -1973,6 +1993,10 @@ Simulator::AddCollisionObj( int nInd, bool bToolOn, int nFrameId, int nType, con if ( ( dPar1 < EPS_SMALL && dPar2 < EPS_SMALL) || dPar3 < EPS_SMALL) return false ; break ; + case MCH_SIM_COB_POLY : + if ( ! ExeSurfIsClosed( nFrameId)) + return false ; + break ; default : return false ; }