EgtMachKernel :
- merge file mancanti.
This commit is contained in:
+8
-293
@@ -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<ISurfTriMesh> 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<ICurveComposite> 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 ;
|
||||
|
||||
Reference in New Issue
Block a user