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 ; }