EgtMachKernel 1.6n5 :

- in simulazione aggiunta breve pausa al cambio fase
- aggiunta gestione fase per recupero info grezzi in lavorazione (elevazione, rawbotto,...).
This commit is contained in:
Dario Sassi
2016-02-15 10:54:11 +00:00
parent bbb25a4fec
commit dbb19c7bd6
6 changed files with 143 additions and 124 deletions
+119 -105
View File
@@ -74,7 +74,7 @@ Machining::Machining( void)
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
bool
Machining::GetElevation( const Point3d& ptP, const Vector3d& vtDir, double& dElev)
Machining::GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtDir, double& dElev)
{
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
return false ;
@@ -84,111 +84,40 @@ Machining::GetElevation( const Point3d& ptP, const Vector3d& vtDir, double& dEle
bool bFound = false ;
int nRawId = m_pMchMgr->GetFirstRawPart() ;
while ( nRawId != GDB_ID_NULL) {
// intersezione del raggio dal punto alla trimesh del grezzo
const double RAY_LEN = 10000 ;
int nStmId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nStmId)) ;
if ( pStm != nullptr) {
bFound = true ;
// recupero il riferimento della trimesh
Frame3d frStm ;
m_pGeomDB->GetGlobFrame( nStmId, frStm) ;
// porto il raggio in questo riferimento
Point3d ptPL = ptP ;
ptPL.ToLoc( frStm) ;
Vector3d vtDirL = vtDir ;
vtDirL.ToLoc( frStm) ;
ILSIVECTOR vInfo ;
if ( IntersLineSurfTm( ptPL, vtDirL, RAY_LEN, *pStm, vInfo)) {
for ( const auto& Info : vInfo) {
// se tratto di intersezione coincidente, considero la posizione più lontana, ovvero 2
if ( Info.nILTT == ILTT_SEGM || Info.nILTT == ILTT_SEGM_ON_EDGE) {
// se prosegue un tratto precedente, non devo controllare sia minimo
if ( fabs( dElev - Info.dU) < EPS_SMALL)
dElev = Info.dU2 ;
else
dElev = min( dElev, Info.dU2) ;
}
// altrimenti intersezione puntuale, verifico che esca (coseno >= 0)
else if ( Info.dCosDN > - COS_ORTO_ANG_ZERO) {
dElev = min( dElev, Info.dU) ;
}
}
}
}
// passo al grezzo successivo
nRawId = m_pMchMgr->GetNextRawPart( nRawId) ;
}
// se non trovate intersezioni, elevazione nulla
if ( dElev > INFINITO - 1)
dElev = 0 ;
return bFound ;
}
//----------------------------------------------------------------------------
bool
Machining::GetElevation( const Point3d& ptP1, const Point3d& ptP2, const Vector3d& vtDir, double& dElev)
{
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
return false ;
// inizializzo elevazione
dElev = INFINITO ;
// ciclo sui grezzi
bool bFound = false ;
int nRawId = m_pMchMgr->GetFirstRawPart() ;
while ( nRawId != GDB_ID_NULL) {
// intersezione del raggio dal punto alla trimesh del grezzo
const double RAY_LEN = 10000 ;
int nStmId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nStmId)) ;
if ( pStm != nullptr) {
bFound = true ;
// recupero il riferimento della trimesh
Frame3d frStm ;
m_pGeomDB->GetGlobFrame( nStmId, frStm) ;
// porto il segmento e la direzione in questo riferimento
Point3d ptP1L = ptP1 ;
ptP1L.ToLoc( frStm) ;
Point3d ptP2L = ptP2 ;
ptP2L.ToLoc( frStm) ;
Vector3d vtDirL = vtDir ;
vtDirL.ToLoc( frStm) ;
ILSIVECTOR vInfo ;
// inizializzo elevazione della superficie
double dElevS = 0 ;
// faccio test con un insieme di punti ( !!! sostituire con intersezione tra rettangolo e trimesh !!!)
const double STEP = 50 ;
int nStep = max( (int) ceil( ApproxDist( ptP1L, ptP2L) / STEP), 3) ;
for ( int i = 0 ; i <= nStep ; ++ i) {
// calcolo punto di test
double dFraz = i / (double) nStep ;
Point3d ptPL = Media( ptP1L, ptP2L, dFraz) ;
// inizializzo elevazione del punto
double dElevP = INFINITO ;
// calcolo elevazione sul punto
// verifico che il grezzo compaia nella fase
if ( m_pMchMgr->VerifyRawPartPhase( nRawId, nPhase)) {
// intersezione del raggio dal punto alla trimesh del grezzo
const double RAY_LEN = 10000 ;
int nStmId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nStmId)) ;
if ( pStm != nullptr) {
bFound = true ;
// recupero il riferimento della trimesh
Frame3d frStm ;
m_pGeomDB->GetGlobFrame( nStmId, frStm) ;
// porto il raggio in questo riferimento
Point3d ptPL = ptP ;
ptPL.ToLoc( frStm) ;
Vector3d vtDirL = vtDir ;
vtDirL.ToLoc( frStm) ;
ILSIVECTOR vInfo ;
if ( IntersLineSurfTm( ptPL, vtDirL, RAY_LEN, *pStm, vInfo)) {
for ( const auto& Info : vInfo) {
// se tratto di intersezione coincidente, considero la posizione più lontana, ovvero 2
if ( Info.nILTT == ILTT_SEGM || Info.nILTT == ILTT_SEGM_ON_EDGE) {
// se prosegue un tratto precedente, non devo controllare sia minimo
if ( fabs( dElevP - Info.dU) < EPS_SMALL)
dElevP = Info.dU2 ;
if ( fabs( dElev - Info.dU) < EPS_SMALL)
dElev = Info.dU2 ;
else
dElevP = min( dElevP, Info.dU2) ;
dElev = min( dElev, Info.dU2) ;
}
// altrimenti intersezione puntuale, verifico che esca (coseno >= 0)
else if ( Info.dCosDN > - COS_ORTO_ANG_ZERO) {
dElevP = min( dElevP, Info.dU) ;
dElev = min( dElev, Info.dU) ;
}
}
}
// se elevazione calcolata, aggiorno quella della superficie
if ( dElevP < INFINITO - 1)
dElevS = max( dElevS, dElevP) ;
}
// aggiorno elevazione complessiva
if ( dElevS > 0)
dElev = min( dElev, dElevS) ;
}
// passo al grezzo successivo
nRawId = m_pMchMgr->GetNextRawPart( nRawId) ;
@@ -201,7 +130,84 @@ Machining::GetElevation( const Point3d& ptP1, const Point3d& ptP2, const Vector3
//----------------------------------------------------------------------------
bool
Machining::GetDistanceFromRawSide( const Point3d& ptP, const Vector3d& vtDir, double& dDist)
Machining::GetElevation( int nPhase, const Point3d& ptP1, const Point3d& ptP2, const Vector3d& vtDir, double& dElev)
{
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
return false ;
// inizializzo elevazione
dElev = INFINITO ;
// ciclo sui grezzi
bool bFound = false ;
int nRawId = m_pMchMgr->GetFirstRawPart() ;
while ( nRawId != GDB_ID_NULL) {
// verifico che il grezzo compaia nella fase
if ( m_pMchMgr->VerifyRawPartPhase( nRawId, nPhase)) {
// intersezione del raggio dal punto alla trimesh del grezzo
const double RAY_LEN = 10000 ;
int nStmId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nStmId)) ;
if ( pStm != nullptr) {
bFound = true ;
// recupero il riferimento della trimesh
Frame3d frStm ;
m_pGeomDB->GetGlobFrame( nStmId, frStm) ;
// porto il segmento e la direzione in questo riferimento
Point3d ptP1L = ptP1 ;
ptP1L.ToLoc( frStm) ;
Point3d ptP2L = ptP2 ;
ptP2L.ToLoc( frStm) ;
Vector3d vtDirL = vtDir ;
vtDirL.ToLoc( frStm) ;
ILSIVECTOR vInfo ;
// inizializzo elevazione della superficie
double dElevS = 0 ;
// faccio test con un insieme di punti ( !!! sostituire con intersezione tra rettangolo e trimesh !!!)
const double STEP = 50 ;
int nStep = max( (int) ceil( ApproxDist( ptP1L, ptP2L) / STEP), 3) ;
for ( int i = 0 ; i <= nStep ; ++ i) {
// calcolo punto di test
double dFraz = i / (double) nStep ;
Point3d ptPL = Media( ptP1L, ptP2L, dFraz) ;
// inizializzo elevazione del punto
double dElevP = INFINITO ;
// calcolo elevazione sul punto
if ( IntersLineSurfTm( ptPL, vtDirL, RAY_LEN, *pStm, vInfo)) {
for ( const auto& Info : vInfo) {
// se tratto di intersezione coincidente, considero la posizione più lontana, ovvero 2
if ( Info.nILTT == ILTT_SEGM || Info.nILTT == ILTT_SEGM_ON_EDGE) {
// se prosegue un tratto precedente, non devo controllare sia minimo
if ( fabs( dElevP - Info.dU) < EPS_SMALL)
dElevP = Info.dU2 ;
else
dElevP = min( dElevP, Info.dU2) ;
}
// altrimenti intersezione puntuale, verifico che esca (coseno >= 0)
else if ( Info.dCosDN > - COS_ORTO_ANG_ZERO) {
dElevP = min( dElevP, Info.dU) ;
}
}
}
// se elevazione calcolata, aggiorno quella della superficie
if ( dElevP < INFINITO - 1)
dElevS = max( dElevS, dElevP) ;
}
// aggiorno elevazione complessiva
if ( dElevS > 0)
dElev = min( dElev, dElevS) ;
}
}
// passo al grezzo successivo
nRawId = m_pMchMgr->GetNextRawPart( nRawId) ;
}
// se non trovate intersezioni, elevazione nulla
if ( dElev > INFINITO - 1)
dElev = 0 ;
return bFound ;
}
//----------------------------------------------------------------------------
bool
Machining::GetDistanceFromRawSide( int nPhase, const Point3d& ptP, const Vector3d& vtDir, double& dDist)
{
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
return false ;
@@ -210,11 +216,15 @@ Machining::GetDistanceFromRawSide( const Point3d& ptP, const Vector3d& vtDir, do
b3Pnt.Expand( 10, 10, 0) ;
int nRawId = m_pMchMgr->GetFirstRawPart() ;
while ( nRawId != GDB_ID_NULL) {
BBox3d b3Raw ;
int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
if ( m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw) && b3Pnt.OverlapsXY( b3Raw)) {
break ;
// verifico che il grezzo compaia nella fase
if ( m_pMchMgr->VerifyRawPartPhase( nRawId, nPhase)) {
BBox3d b3Raw ;
int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
if ( m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw) && b3Pnt.OverlapsXY( b3Raw)) {
break ;
}
}
// passo al grezzo successivo
nRawId = m_pMchMgr->GetNextRawPart( nRawId) ;
}
// se il punto non è interno ad alcun grezzo, distanza nulla
@@ -249,7 +259,7 @@ Machining::GetDistanceFromRawSide( const Point3d& ptP, const Vector3d& vtDir, do
//----------------------------------------------------------------------------
bool
Machining::GetDistanceFromRawBottom( int nPathId, double dToler, double& dRbDist)
Machining::GetDistanceFromRawBottom( int nPhase, int nPathId, double dToler, double& dRbDist)
{
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
return false ;
@@ -261,13 +271,17 @@ Machining::GetDistanceFromRawBottom( int nPathId, double dToler, double& dRbDist
b3Compo.Expand( dToler, dToler, 0) ;
int nRawId = m_pMchMgr->GetFirstRawPart() ;
while ( nRawId != GDB_ID_NULL) {
BBox3d b3Raw ;
int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
if ( m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw) && b3Compo.OverlapsXY( b3Raw)) {
double dDist = b3Compo.GetMax().z - b3Raw.GetMin().z ;
if ( dDist > dRbDist)
dRbDist = dDist ;
// verifico che il grezzo compaia nella fase
if ( m_pMchMgr->VerifyRawPartPhase( nRawId, nPhase)) {
BBox3d b3Raw ;
int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
if ( m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw) && b3Compo.OverlapsXY( b3Raw)) {
double dDist = b3Compo.GetMax().z - b3Raw.GetMin().z ;
if ( dDist > dRbDist)
dRbDist = dDist ;
}
}
// passo al grezzo successivo
nRawId = m_pMchMgr->GetNextRawPart( nRawId) ;
}
return true ;