EgtMachKernel :
- migliorie varie alla lavorazione di finitura superfici.
This commit is contained in:
+142
-73
@@ -27,6 +27,7 @@
|
||||
#include "/EgtDev/Include/EgkOffsetCurve.h"
|
||||
#include "/EgtDev/Include/EgkOffsetCurveOnX.h"
|
||||
#include "/EgtDev/Include/EGkSfrCreate.h"
|
||||
#include "/EgtDev/Include/EGkSurfLocal.h"
|
||||
#include "/EgtDev/Include/EGkCAvToolSurfTm.h"
|
||||
#include "/EgtDev/Include/EGkIntervals.h"
|
||||
#include "/EgtDev/Include/EGkUserObjFactory.h"
|
||||
@@ -347,6 +348,11 @@ SurfFinishing::SetParam( int nType, double dVal)
|
||||
m_nStatus |= MCH_ST_PARAM_MODIF ;
|
||||
m_Params.m_dStartPos = dVal ;
|
||||
return true ;
|
||||
case MPA_OVERL :
|
||||
if ( ! AreSameLenValue( dVal, m_Params.m_dOverlap))
|
||||
m_nStatus |= MCH_ST_PARAM_MODIF ;
|
||||
m_Params.m_dOverlap = dVal ;
|
||||
return true ;
|
||||
case MPA_SIDESTEP :
|
||||
if ( ! AreSameLenValue( dVal, m_Params.m_dSideStep))
|
||||
m_nStatus |= MCH_ST_PARAM_MODIF ;
|
||||
@@ -378,7 +384,7 @@ SurfFinishing::SetParam( int nType, double dVal)
|
||||
m_Params.m_dLoPerp = dVal ;
|
||||
return true ;
|
||||
case MPA_APPROX :
|
||||
if ( ! AreSameLenValue( dVal, m_Params.m_dApprox))
|
||||
if ( abs( dVal - m_Params.m_dApprox) > EPS_SMALL)
|
||||
m_nStatus |= MCH_ST_PARAM_MODIF ;
|
||||
m_Params.m_dApprox = dVal ;
|
||||
return true ;
|
||||
@@ -691,6 +697,9 @@ SurfFinishing::GetParam( int nType, double& dVal) const
|
||||
case MPA_STARTPOS :
|
||||
dVal = m_Params.m_dStartPos ;
|
||||
return true ;
|
||||
case MPA_OVERL :
|
||||
dVal = m_Params.m_dOverlap ;
|
||||
return true ;
|
||||
case MPA_SIDESTEP :
|
||||
dVal = m_Params.m_dSideStep ;
|
||||
return true ;
|
||||
@@ -1111,6 +1120,56 @@ SurfFinishing::ProcessPath( int nPathId, int nPvId, int nClId)
|
||||
( nSplitArcs == SPLAR_NO_XY_PLANE && ! vtExtr.IsZplus()) ||
|
||||
( nSplitArcs == SPLAR_GEN_PLANE && vtExtr.IsGeneric())) ;
|
||||
|
||||
// predispongo l'ambiente di correzione dei percorsi utensili con le superfici attive dei pezzi
|
||||
PtrOwner<ICAvToolSurfTm> pCAvTlStm( CreateCAvToolSurfTm()) ;
|
||||
if ( IsNull( pCAvTlStm))
|
||||
return false ;
|
||||
if ( abs( m_TParams.m_dSideAng) < EPS_ANG_SMALL) {
|
||||
pCAvTlStm->SetStdTool( m_TParams.m_dLen + GetOffsR(),
|
||||
m_TParams.m_dDiam / 2 + GetOffsR(),
|
||||
m_TParams.m_dCornRad + GetOffsR()) ;
|
||||
}
|
||||
else {
|
||||
double dDelta ;
|
||||
double dSideAngRad = m_TParams.m_dSideAng * DEGTORAD ;
|
||||
if ( m_TParams.m_dSideAng > 0) {
|
||||
if ( m_TParams.m_dCornRad < EPS_SMALL)
|
||||
dDelta = 2 * m_TParams.m_dMaxMat * tan( dSideAngRad) ;
|
||||
else
|
||||
dDelta = 2 * ( m_TParams.m_dCornRad * cos( dSideAngRad) +
|
||||
( m_TParams.m_dMaxMat + m_TParams.m_dCornRad * ( sin( dSideAngRad) - 1)) * tan( dSideAngRad)) ;
|
||||
}
|
||||
else {
|
||||
dDelta = 2 * tan( dSideAngRad) * m_TParams.m_dMaxMat ;
|
||||
}
|
||||
double dStemRad = m_TParams.m_dDiam / 2 + dDelta ;
|
||||
double dTipRad = m_TParams.m_dDiam / 2 ;
|
||||
pCAvTlStm->SetAdvTool( m_TParams.m_dLen + GetOffsR(),
|
||||
dStemRad + GetOffsR(),
|
||||
m_TParams.m_dMaxMat,
|
||||
dTipRad + GetOffsR(),
|
||||
m_TParams.m_dCornRad + GetOffsR()) ;
|
||||
}
|
||||
Frame3d frSurf ;
|
||||
const ISurfTriMesh* pStm = nullptr ;
|
||||
SURFLOCALVECTOR vSrfLoc ;
|
||||
INTVECTOR vSurfId ;
|
||||
GetActiveSurfaces( vSurfId) ;
|
||||
for ( auto nSurfId : vSurfId) {
|
||||
if ( pStm == nullptr) {
|
||||
pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nSurfId)) ;
|
||||
if ( ! m_pGeomDB->GetGlobFrame( nSurfId, frSurf))
|
||||
return false ;
|
||||
pCAvTlStm->SetSurfTm( *pStm) ;
|
||||
}
|
||||
else {
|
||||
vSrfLoc.emplace_back( m_pGeomDB, nSurfId, frSurf) ;
|
||||
pCAvTlStm->AddSurfTm( *GetSurfTriMesh( vSrfLoc.back().Get())) ;
|
||||
}
|
||||
}
|
||||
if ( pStm == nullptr)
|
||||
pCAvTlStm.Reset() ;
|
||||
|
||||
// assegno il vettore estrazione al gruppo del percorso
|
||||
m_pGeomDB->SetInfo( nPxId, KEY_EXTR, vtTool) ;
|
||||
|
||||
@@ -1120,7 +1179,7 @@ SurfFinishing::ProcessPath( int nPathId, int nPvId, int nClId)
|
||||
|
||||
// Eseguo la lavorazione a seconda del tipo
|
||||
double dElev = dDepth ;
|
||||
if ( ! AddZigZag( pCompo, vtTool, vtExtr, dDepth, dElev, bSplitArcs))
|
||||
if ( ! AddZigZag( pCAvTlStm, frSurf, pCompo, vtTool, vtExtr, dDepth, dElev, bSplitArcs))
|
||||
return false ;
|
||||
}
|
||||
|
||||
@@ -1132,7 +1191,8 @@ SurfFinishing::ProcessPath( int nPathId, int nPvId, int nClId)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfFinishing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr,
|
||||
SurfFinishing::AddZigZag( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf,
|
||||
const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr,
|
||||
double dDepth, double dElev, bool bSplitArcs)
|
||||
{
|
||||
// recupero distanze di sicurezza
|
||||
@@ -1141,12 +1201,10 @@ SurfFinishing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool,
|
||||
// lunghezza di approccio/retrazione
|
||||
double dAppr = m_Params.m_dStartPos ;
|
||||
|
||||
// calcolo curva offsettata del raggio utensile + extra
|
||||
double dTRad = 0.5 * m_TParams.m_dDiam ;
|
||||
double dOffs = dTRad ;
|
||||
double dExtra = min( 0.1 * m_TParams.m_dDiam, 2.0) ;
|
||||
// calcolo curva offsettata del raggio utensile
|
||||
double dOffs = m_Params.m_dOverlap - 0.5 * m_TParams.m_dDiam ;
|
||||
OffsetCurve OffsCrv ;
|
||||
if ( ! OffsCrv.Make( pCompo, - ( dOffs + dExtra), ICurve::OFF_FILLET)) {
|
||||
if ( ! OffsCrv.Make( pCompo, dOffs, ICurve::OFF_FILLET)) {
|
||||
m_pMchMgr->SetLastError( 3109, "Error in SurfFinishing : Offset not computable") ;
|
||||
return false ;
|
||||
}
|
||||
@@ -1154,89 +1212,60 @@ SurfFinishing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool,
|
||||
// ciclo sulle curve risultanti
|
||||
bool bStart = true ;
|
||||
while ( OffsCrv.GetCurveCount() > 0) {
|
||||
|
||||
// recupero la prima curva di offset
|
||||
PtrOwner<ICurveComposite> pOffs( CreateCurveComposite()) ;
|
||||
if ( IsNull( pOffs) || ! pOffs->AddCurve( OffsCrv.GetLongerCurve())) {
|
||||
m_pMchMgr->SetLastError( 3110, "Error in SurfFinishing : Toolpath not computable") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// determino il riferimento di base e il box della svuotatura
|
||||
Frame3d frPocket ;
|
||||
Point3d ptCen ; pCompo->GetCentroid( ptCen) ;
|
||||
frPocket.Set( ptCen, vtExtr) ;
|
||||
frPocket.Rotate( ptCen, vtExtr, m_Params.m_dSideAngle) ;
|
||||
pOffs->ToLoc( frPocket) ;
|
||||
|
||||
// calcolo i percorsi di svuotatura
|
||||
ICRVCOMPOPOVECTOR vpCrvs ;
|
||||
if ( ! CalcZigZag( pOffs, vpCrvs))
|
||||
return false ;
|
||||
|
||||
// li correggo per non interferire con le superfici
|
||||
PtrOwner<ICAvToolSurfTm> pCAvTlStm( CreateCAvToolSurfTm()) ;
|
||||
if ( IsNull( pCAvTlStm))
|
||||
return false ;
|
||||
pCAvTlStm->SetStdTool( m_TParams.m_dLen + GetOffsR(),
|
||||
m_TParams.m_dDiam / 2 + GetOffsR(),
|
||||
m_TParams.m_dCornRad + GetOffsR()) ;
|
||||
// recupero le superfici TriMesh dei pezzi in lavorazione
|
||||
int nRawId = m_pMchMgr->GetFirstRawPart() ;
|
||||
int nPartId = m_pMchMgr->GetFirstPartInRawPart( nRawId) ;
|
||||
int nLayId = m_pGeomDB->GetFirstGroupInGroup( nPartId) ;
|
||||
int nEntId = m_pGeomDB->GetFirstInGroup( nLayId) ;
|
||||
while ( nEntId != GDB_ID_NULL) {
|
||||
if ( m_pGeomDB->GetGeoType( nEntId) == SRF_TRIMESH)
|
||||
break ;
|
||||
nEntId = m_pGeomDB->GetNext( nEntId) ;
|
||||
}
|
||||
if ( nEntId != GDB_ID_NULL) {
|
||||
const ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nEntId)) ;
|
||||
if ( pStm == nullptr)
|
||||
return false ;
|
||||
// recupero il riferimento della superficie
|
||||
Frame3d frSurf ;
|
||||
if ( ! m_pGeomDB->GetGlobFrame( nEntId, frSurf))
|
||||
return false ;
|
||||
// approssimo la curva con una polilinea
|
||||
PolyLine PL ;
|
||||
if ( ! vpCrvs[0]->ApproxWithLines( LIN_TOL_STD, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL))
|
||||
return false ;
|
||||
// eventuale aggiunta di punti per garantire max distanza
|
||||
const double MIN_DIST = 1. ;
|
||||
const double MAX_DIST = 50. ;
|
||||
double dDist = Clamp( m_TParams.m_dDiam / 2, MIN_DIST, MAX_DIST) ;
|
||||
if ( ! PL.AdjustForMaxSegmentLen( dDist))
|
||||
return false ;
|
||||
// porto nel riferimento della superficie
|
||||
PL.LocToLoc( frPocket, frSurf) ;
|
||||
// porto i dati geometrici in locale alla superficie
|
||||
Vector3d vtAxL = vtTool ;
|
||||
vtAxL.ToLoc( frSurf) ;
|
||||
Vector3d vtMoveL = vtAxL ;
|
||||
// traslo della lunghezza utensile diminuita dell'affondamento
|
||||
PL.Translate( vtAxL * ( m_TParams.m_dLen - dDepth)) ;
|
||||
// imposto dati
|
||||
pCAvTlStm->SetSurfTm( *pStm) ;
|
||||
// eseguo CAv
|
||||
if ( ! pCAvTlStm->TestPath( PL.GetUPointList(), vtAxL, vtMoveL, m_Params.m_dApprox))
|
||||
return false ;
|
||||
// contro-traslo della lunghezza utensile
|
||||
PL.Translate( - vtAxL * m_TParams.m_dLen) ;
|
||||
// riporto la polilinea nel riferimento della curva
|
||||
PL.LocToLoc( frSurf, frPocket) ;
|
||||
// elimino i punti allineati
|
||||
PL.RemoveAlignedPoints( 0.8 * m_Params.m_dApprox) ;
|
||||
// creo una curva composita a partire dalla polilinea
|
||||
PtrOwner< ICurveComposite> pCompo( CreateCurveComposite()) ;
|
||||
if ( IsNull( pCompo) || ! pCompo->FromPolyLine( PL))
|
||||
return false ;
|
||||
// sostituisco la vecchia curva con la nuova
|
||||
vpCrvs[0].Set( Release( pCompo )) ;
|
||||
}
|
||||
// ciclo sui percorsi
|
||||
for ( int k = 0 ; k < int( vpCrvs.size()) ; ++ k) {
|
||||
// li correggo per non interferire con le superfici
|
||||
if ( pCAvTlStm != nullptr) {
|
||||
// approssimo la curva con una polilinea
|
||||
PolyLine PL ;
|
||||
if ( ! vpCrvs[k]->ApproxWithLines( LIN_TOL_STD, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL))
|
||||
return false ;
|
||||
// eventuale aggiunta di punti per garantire max distanza
|
||||
const double MIN_DIST = 1. ;
|
||||
const double MAX_DIST = 50. ;
|
||||
double dDist = Clamp( m_TParams.m_dDiam / 2, MIN_DIST, MAX_DIST) ;
|
||||
if ( ! PL.AdjustForMaxSegmentLen( dDist))
|
||||
return false ;
|
||||
// porto nel riferimento delle superfici
|
||||
PL.LocToLoc( frPocket, frSurf) ;
|
||||
// porto i dati geometrici in locale alle superfici
|
||||
Vector3d vtAxL = vtTool ;
|
||||
vtAxL.ToLoc( frSurf) ;
|
||||
Vector3d vtMoveL = vtAxL ;
|
||||
// traslo della lunghezza utensile diminuita dell'affondamento
|
||||
PL.Translate( vtAxL * ( m_TParams.m_dLen - dDepth)) ;
|
||||
// eseguo CAv
|
||||
if ( ! pCAvTlStm->TestPath( PL.GetUPointList(), vtAxL, vtMoveL, m_Params.m_dApprox))
|
||||
return false ;
|
||||
// contro-traslo della lunghezza utensile
|
||||
PL.Translate( - vtAxL * m_TParams.m_dLen) ;
|
||||
// riporto la polilinea nel riferimento della curva
|
||||
PL.LocToLoc( frSurf, frPocket) ;
|
||||
// elimino i punti allineati
|
||||
PL.RemoveAlignedPoints( 0.8 * m_Params.m_dApprox) ;
|
||||
// creo una curva composita a partire dalla polilinea
|
||||
PtrOwner< ICurveComposite> pCompo( CreateCurveComposite()) ;
|
||||
if ( IsNull( pCompo) || ! pCompo->FromPolyLine( PL))
|
||||
return false ;
|
||||
// sostituisco la vecchia curva con la nuova
|
||||
vpCrvs[k].Set( Release( pCompo )) ;
|
||||
}
|
||||
// ciclo sulle curve elementari
|
||||
int nMaxInd = vpCrvs[k]->GetCurveCount() - 1 ;
|
||||
for ( int i = 0 ; i <= nMaxInd ; ++ i) {
|
||||
@@ -1339,6 +1368,46 @@ SurfFinishing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool,
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfFinishing::GetActiveSurfaces( INTVECTOR& vSurfId)
|
||||
{
|
||||
// pulisco vettore superfici
|
||||
vSurfId.clear() ;
|
||||
// verifiche
|
||||
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
|
||||
return false ;
|
||||
// ciclo sui grezzi attivi nella fase
|
||||
int nRawId = m_pMchMgr->GetFirstRawPart() ;
|
||||
while ( nRawId != GDB_ID_NULL) {
|
||||
if ( m_pMchMgr->VerifyRawPartPhase(nRawId, m_nPhase)) {
|
||||
// ciclo sui pezzi del grezzo
|
||||
int nPartId = m_pMchMgr->GetFirstPartInRawPart( nRawId) ;
|
||||
while ( nPartId != GDB_ID_NULL) {
|
||||
// ciclo sui layer dei pezzi
|
||||
int nLayId = m_pGeomDB->GetFirstGroupInGroup( nPartId) ;
|
||||
while ( nLayId != GDB_ID_NULL) {
|
||||
// ciclo sulle entità del layer
|
||||
int nEntId = m_pGeomDB->GetFirstInGroup( nLayId) ;
|
||||
while ( nEntId != GDB_ID_NULL) {
|
||||
// se entità superficie e visibile, la aggiungo
|
||||
int nStat ;
|
||||
if ( m_pGeomDB->GetGeoType( nEntId) == SRF_TRIMESH &&
|
||||
m_pGeomDB->GetCalcStatus( nEntId, nStat) && nStat != GDB_ST_OFF)
|
||||
vSurfId.emplace_back( nEntId) ;
|
||||
// passo alla entità successiva
|
||||
nEntId = m_pGeomDB->GetNext( nEntId) ;
|
||||
}
|
||||
nLayId =m_pGeomDB->GetNextGroup( nLayId) ;
|
||||
}
|
||||
nPartId = m_pMchMgr->GetNextPartInRawPart( nPartId) ;
|
||||
}
|
||||
}
|
||||
nRawId = m_pMchMgr->GetNextRawPart( nRawId) ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfFinishing::CalcZigZag( const ICurveComposite* pOffs,
|
||||
|
||||
Reference in New Issue
Block a user