Merge commit 'fef634f7e873d5a176696b5635dde34fe10ba048'

This commit is contained in:
Dario Sassi
2025-03-06 18:01:04 +01:00
4 changed files with 52 additions and 54 deletions
+1 -1
View File
@@ -2545,7 +2545,7 @@ PocketingNT::CalcPaths( STEPINFOPOVECTOR& vStepInfo)
ICRVCOMPOPOVECTOR vCrvPaths ;
if ( ! CalcPocketing( vStepInfo[i].pSfrPock, m_TParams.m_dDiam / 2, 0., m_Params.m_dSideStep,
m_Params.m_dSideAngle, m_Params.m_nSubType, true, m_Params.m_bInvert,
false, true, ptEndLastPath, vStepInfo[i].pSfrLimit, false, vCrvPaths)) {
false, true, true, ptEndLastPath, vStepInfo[i].pSfrLimit, false, vCrvPaths)) {
m_pMchMgr->SetLastError( 3028, "Error in PocketingNT : Error in CalcPocketing") ;
return false ;
}
+49 -51
View File
@@ -94,6 +94,7 @@ const double SILH_SAMPLING = 1. ;
#if ENABLE_ZCONST_DEBUG || ENABLE_OPTIMAL_DEBUG || ENABLE_OPTIMAL_SOFT_DEBUG
#include "EgtDev/Include/EGkGeoPoint3d.h"
#include "EgtDev/Include/EGkGeoVector3d.h"
#include "chrono"
#endif
//----------------------------------------------------------------------------
@@ -1796,7 +1797,7 @@ SurfFinishing::AddZigZag( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf, cons
double dPockRadOffs = m_TParams.m_dDiam / 2 - m_Params.m_dSideStep - m_Params.m_dOverlap ;
ICRVCOMPOPOVECTOR vpCrvs ;
if ( ! CalcPocketing( pSfrPock, dPockRad, dPockRadOffs, m_Params.m_dSideStep, m_Params.m_dSideAngle,
POCKET_ZIGZAG, false, false, true, false, P_INVALID, nullptr, true, vpCrvs)) {
POCKET_ZIGZAG, false, false, true, false, false, P_INVALID, nullptr, true, vpCrvs)) {
m_pMchMgr->SetLastError( 3125, "Error in SurfFinishing : CalcPocketing failed") ;
return false ;
}
@@ -1997,7 +1998,7 @@ SurfFinishing::AddOneWay( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf, cons
double dPockRadOffs = m_TParams.m_dDiam / 2 - m_Params.m_dSideStep - m_Params.m_dOverlap ;
ICRVCOMPOPOVECTOR vpCrvs ;
if ( ! CalcPocketing( pSfrPock, dPockRad, dPockRadOffs, m_Params.m_dSideStep, m_Params.m_dSideAngle,
POCKET_ONEWAY, false, false, true, false, P_INVALID, nullptr, true, vpCrvs)) {
POCKET_ONEWAY, false, false, true, false, false, P_INVALID, nullptr, true, vpCrvs)) {
m_pMchMgr->SetLastError( 3125, "Error in SurfFinishing : CalcPocketing failed") ;
return false ;
}
@@ -2199,7 +2200,7 @@ SurfFinishing::AddSpiral( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf, cons
int nType = ( bInVsOut ? POCKET_SPIRALIN : POCKET_SPIRALOUT) ;
ICRVCOMPOPOVECTOR vpCrvs ;
if ( ! CalcPocketing( pSfrPock, dPockRad, dPockRadOffs, m_Params.m_dSideStep, m_Params.m_dSideAngle,
nType, false, false, true, false, P_INVALID, nullptr, true, vpCrvs)) {
nType, false, false, true, false, false, P_INVALID, nullptr, true, vpCrvs)) {
m_pMchMgr->SetLastError( 3125, "Error in SurfFinishing : CalcPocketing failed") ;
return false ;
}
@@ -2880,9 +2881,11 @@ SurfFinishing::CreateZConstPaths( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSu
}
}
}
// se il link trovato non è valido, errore
if ( ! pCompoLink->IsValid())
return false ;
// se il link trovato non è valido, ricomincio la ricerca
if ( ! pCompoLink->IsValid()) {
nCurrRow = 0 ; // azzero il contatore delle righe
break ; // interrompo ciclo sulle righe successive di ricerca
}
// porto il link sulla curva attuale di silhouette e lo proietto sulla pStm (sono in locale)
double dSfrDistNext = vCrvCompo[nNextRow][nNextCol_path]->GetTempParam( 0) ;
@@ -3941,7 +3944,7 @@ AdvancedProcessSquare( int nFlag, const INTVECTOR& vInds, const DBLVECTOR& vdU,
//----------------------------------------------------------------------------
bool
SurfFinishing::MarchingSquares( const VECTORCOLLISIONSFR& vPntM, bool bSpiral, int nStepX, int nStepY, double dClippingAngle,
SurfFinishing::MarchingSquares( const VECTORCOLLISIONSFR& vPntM, bool bSpiral, double dOffsTol, int nStepX, int nStepY, double dClippingAngle,
const Vector3d& vtAxL, const Vector3d& vtMoveL, ICAvToolSurfTm* pCAvTlStm,
ICRVCOMPOPOVECTOR& vCrvCompo) const
{
@@ -4049,6 +4052,12 @@ SurfFinishing::MarchingSquares( const VECTORCOLLISIONSFR& vPntM, bool bSpiral, i
vCrvCompo.back()->AddLine( vBiPnt[vnId[i]-1].second) ;
if ( ! vCrvCompo.back()->IsClosed())
vCrvCompo.pop_back() ;
else {
// controllo se sufficientemente estesa
double dMaxOffs ;
if ( CalcCurveLimitOffset( *vCrvCompo.back(), dMaxOffs) && dMaxOffs < dOffsTol)
vCrvCompo.pop_back() ;
}
}
// abbellisco le curve trovate
const double SILH_ARC_TOL = 0.1 ;
@@ -4089,11 +4098,13 @@ SurfFinishing::GetOptimalSfr( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR&
// versore utensile e di movimento longitudinali in frame locale
Vector3d vtAxL = GetToLoc( vtTool, frSurf) ;
Vector3d vtMoveL = vtAxL ;
// angolo di scelta per divisione dei triangoli
double dSplitAngle = 45. ;
GetValInNotes( m_Params.m_sUserNotes, "SplitAngle", dSplitAngle) ;
// costanti
const double CLIPPING_ANGLE = 45. ; // Angolo di clipping tra Spiral e ZConst
const double TOL_SAMPLE = 1. ; // Tolleranza di campionamento per collisioni
const double EXTRA_XY = 2.5 * TOL_SAMPLE ; // Espansione del Box in X e Y per griglia di campionamento
const double TOL_SAMPLE = 2. ; // Tolleranza di campionamento per collisioni
const double EXTRA_XY = 2.5 * TOL_SAMPLE ; // Espansione del Box in X e Y per griglia di campionamento
// frame pianoXY
Frame3d frXY ;
@@ -4153,7 +4164,7 @@ SurfFinishing::GetOptimalSfr( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR&
// per la superficie Spiral e il secondo per la superficie ZConst
VECTORCOLLISIONSFR vCollision( ( nStepX + 1) * ( nStepY + 1)) ;
int nInd = 0 ;
double dCosClipping = cos( CLIPPING_ANGLE * DEGTORAD) ;
double dCosClipping = cos( dSplitAngle * DEGTORAD) ;
for ( auto it = lPntM.begin() ; it != lPntM.end() ; ++ it) {
// inserisco il punto di Test
get<0>( vCollision[nInd].CollisionInfo) = get<0>( *it) ;
@@ -4167,10 +4178,10 @@ SurfFinishing::GetOptimalSfr( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR&
for ( int nV = 0 ; nV < int( get<2>( *it).size()) ; ++ nV) {
if ( ! bOnBorder) {
double dAbsCos = abs( get<2>( *it)[nV] * vtAxL) ;
if ( ! vCollision[nInd].bInSpiral)
vCollision[nInd].bInSpiral = ( dAbsCos > dCosClipping + EPS_ANG_ZERO) ; // theta > ClippingAng
if ( ! vCollision[nInd].bInZConst)
vCollision[nInd].bInZConst = ( dAbsCos < dCosClipping + EPS_ANG_ZERO) ; // theta <= ClippingAng
if ( ! vCollision[nInd].bInSpiral)
vCollision[nInd].bInSpiral = ( dAbsCos > dCosClipping + EPS_ANG_ZERO) ; // theta > ClippingAng
}
get<2>( vCollision[nInd].CollisionInfo).push_back( get<2>( *it)[nV]) ;
}
@@ -4198,16 +4209,16 @@ SurfFinishing::GetOptimalSfr( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR&
int nThreadMax = thread::hardware_concurrency() ;
if ( nThreadMax <= 1) {
// recupero le curve di contorno per la superficie Spiral
if ( ! MarchingSquares( vCollision, true, nStepX, nStepY, CLIPPING_ANGLE, vtAxL, vtMoveL, pCAvTlStm, vCrvSpiral))
if ( ! MarchingSquares( vCollision, true, TOL_SAMPLE / 2., nStepX, nStepY, dSplitAngle, vtAxL, vtMoveL, pCAvTlStm, vCrvSpiral))
return false ;
// recupero le curve di contorno per la superficie ZConst
if ( ! MarchingSquares( vCollision, false, nStepX, nStepY, CLIPPING_ANGLE, vtAxL, vtMoveL, pCAvTlStm, vCrvZConst))
if ( ! MarchingSquares( vCollision, false, TOL_SAMPLE / 2., nStepX, nStepY, dSplitAngle, vtAxL, vtMoveL, pCAvTlStm, vCrvZConst))
return false ;
}
else {
future<bool> vRes[2] ;
vRes[0] = async( launch::async, &SurfFinishing::MarchingSquares, this, cref( vCollision), true, nStepX, nStepY, CLIPPING_ANGLE, cref( vtAxL), cref( vtMoveL), ref( pCAvTlStm), ref( vCrvSpiral)) ;
vRes[1] = async( launch::async, &SurfFinishing::MarchingSquares, this, cref( vCollision), false, nStepX, nStepY, CLIPPING_ANGLE, cref( vtAxL), cref( vtMoveL), ref( pCAvTlStm), ref( vCrvZConst)) ;
vRes[0] = async( launch::async, &SurfFinishing::MarchingSquares, this, cref( vCollision), true, TOL_SAMPLE / 2., nStepX, nStepY, dSplitAngle, cref( vtAxL), cref( vtMoveL), ref( pCAvTlStm), ref( vCrvSpiral)) ;
vRes[1] = async( launch::async, &SurfFinishing::MarchingSquares, this, cref( vCollision), false, TOL_SAMPLE / 2., nStepX, nStepY, dSplitAngle, cref( vtAxL), cref( vtMoveL), ref( pCAvTlStm), ref( vCrvZConst)) ;
int nFin = 0 ;
bool bOk = true ;
while ( nFin < 2) {
@@ -4254,7 +4265,7 @@ SurfFinishing::GetOptimalSfr( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR&
if ( AreOppositeVectorApprox( pSfrSpiral->GetNormVersor(), pSfrLoc->GetNormVersor()))
pSfrSpiral->Invert() ;
// Offset di correzione per le regioni Spiral
pSfrSpiral->Offset( - TOL_SAMPLE - EPS_SMALL, ICurve::OFF_FILLET) ;
pSfrSpiral->Offset( - TOL_SAMPLE / 10., ICurve::OFF_FILLET) ;
#if ENABLE_OPTIMAL_SOFT_DEBUG
int _pSS = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrSpiral->Clone()) ;
m_pGeomDB->SetMaterial( _pSS, Color( 1., 0., 0., .65)) ;
@@ -4338,23 +4349,18 @@ SurfFinishing::AddOptimal( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& vSr
}
else
pSfrSpiral->Clear() ;
// lavoro ogni singolo Chunk singolarmente ( non estendo lati aperti per eveitare merge con gli stessi Chunks)
for ( int nC = 0 ; nC < pSfrSpiral->GetChunkCount() ; ++ nC) {
// recupero il Chunk come regione piana
PtrOwner<ISurfFlatRegion> pSfrToWork( pSfrSpiral->CloneChunk( nC)) ;
if ( IsNull( pSfrToWork) || ! pSfrToWork->IsValid())
return false ;
if ( ! IsNull( pSfrSpiral) && pSfrSpiral->IsValid()) {
// imposto i lati chiusi
for ( int nCC = 0 ; nCC < pSfrToWork->GetChunkCount() ; ++ nCC) {
for ( int nL = 0 ; nL < pSfrToWork->GetLoopCount( nCC) ; ++ nL) {
for ( int nU = 0 ; nU < pSfrToWork->GetLoopCurveCount( nCC, nL) ; ++ nU)
pSfrToWork->SetCurveTempProp( nCC, nL, nU, 0, TEMP_PROP_CLOSE_EDGE) ;
for ( int nCC = 0 ; nCC < pSfrSpiral->GetChunkCount() ; ++ nCC) {
for ( int nL = 0 ; nL < pSfrSpiral->GetLoopCount( nCC) ; ++ nL) {
for ( int nU = 0 ; nU < pSfrSpiral->GetLoopCurveCount( nCC, nL) ; ++ nU)
pSfrSpiral->SetCurveTempProp( nCC, nL, nU, 0, TEMP_PROP_CLOSE_EDGE) ;
}
}
// lavorazione Spiral
ICRVCOMPOPOVECTOR vpCrvs ;
if ( ! CalcPocketing( pSfrToWork, m_Params.m_dSideStep, 0., m_Params.m_dSideStep, m_Params.m_dSideAngle,
POCKET_SPIRALIN, false, false, true, false, P_INVALID, nullptr, true, vpCrvs)) {
if ( ! CalcPocketing( pSfrSpiral, m_Params.m_dSideStep, 0., m_Params.m_dSideStep, m_Params.m_dSideAngle,
POCKET_SPIRALIN, false, false, true, false, false, P_INVALID, nullptr, true, vpCrvs)) {
m_pMchMgr->SetLastError( 3125, "Error in SurfFinishing : CalcPocketing failed") ;
return false ;
}
@@ -4364,7 +4370,6 @@ SurfFinishing::AddOptimal( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& vSr
// definisco un nuovo percorso (in locale)
vPaths.resize( vPaths.size() + 1) ;
vPaths.back().pCrvPath.Set( Release( vpCrvs[k])) ;
vPaths.back().nType = SURFFIN_SUB_SPIRALIN ;
// li correggo per non interferire con le superfici
if ( pCAvTlStm != nullptr) {
@@ -4411,7 +4416,7 @@ SurfFinishing::AddOptimal( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& vSr
}
// aggiorno la ProgressBar al 60%
ExeProcessEvents( 5, 0) ;
ExeProcessEvents( 60, 0) ;
#if ENABLE_OPTIMAL_SOFT_DEBUG
// disegno i percorsi per controllo
int ___a = int( vPaths.size()) ;
@@ -4424,27 +4429,20 @@ SurfFinishing::AddOptimal( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& vSr
// ----------------------- Lavorazione Zconst -------------------------------
if ( ! IsNull( pSfrZConst) && pSfrZConst->IsValid()) {
// lavoro ogni singolo Chunk singolarmente ( non estendo lati aperti per evitare merge con gli stessi Chunks)
for ( int nC = 0 ; nC < pSfrZConst->GetChunkCount() ; ++ nC) {
// recupero il Chunk come regione piana
PtrOwner<ISurfFlatRegion> pSfrToWork( pSfrZConst->CloneChunk( nC)) ;
if ( IsNull( pSfrToWork) || ! pSfrToWork->IsValid())
return false ;
// mi assicuro di non uscire dalla superficie originale
PtrOwner<ISurfFlatRegion> pSfrOverlap( pSfr->CreateOffsetSurf( m_Params.m_dOverlap, ICurve::OFF_FILLET)) ;
if ( IsNull( pSfrOverlap) || ! pSfrOverlap->IsValid())
continue ;
if ( ! pSfrOverlap->ToLoc( frSurf) || ! pSfrToWork->Intersect( *pSfrOverlap))
// mi assicuro di non uscire dalla superficie originale
PtrOwner<ISurfFlatRegion> pSfrOverlap( pSfr->CreateOffsetSurf( m_Params.m_dOverlap, ICurve::OFF_FILLET)) ;
if ( ! IsNull( pSfrOverlap) && pSfrOverlap->IsValid()) {
if ( ! pSfrOverlap->ToLoc( frSurf) || ! pSfrZConst->Intersect( *pSfrOverlap))
return false ;
// imposto i lati chiusi
for ( int nCC = 0 ; nCC < pSfrToWork->GetChunkCount() ; ++ nCC) {
for ( int nL = 0 ; nL < pSfrToWork->GetLoopCount( nCC) ; ++ nL) {
for ( int nU = 0 ; nU < pSfrToWork->GetLoopCurveCount( nCC, nL) ; ++ nU)
pSfrToWork->SetCurveTempProp( nC, nL, nU, 0, TEMP_PROP_CLOSE_EDGE) ;
for ( int nC = 0 ; nC < pSfrZConst->GetChunkCount() ; ++ nC) {
for ( int nL = 0 ; nL < pSfrZConst->GetLoopCount( nC) ; ++ nL) {
for ( int nU = 0 ; nU < pSfrZConst->GetLoopCurveCount( nC, nL) ; ++ nU)
pSfrZConst->SetCurveTempProp( nC, nL, nU, 0, TEMP_PROP_CLOSE_EDGE) ;
}
}
// inizializzo la classe di calcolo delle silhouette
CISURFTMPVECTOR vpStm ; vpStm.reserve( vSrfLoc.size()) ;
CISURFTMPVECTOR vpStm ; vpStm.reserve( vSrfLoc.size()) ;
// scorro le superfici
for ( int i = 0 ; i < int( vSrfLoc.size()) ; ++ i) {
// recupero la superficie TriMesh e se valida la memorizzo
@@ -4454,12 +4452,12 @@ SurfFinishing::AddOptimal( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& vSr
}
PtrOwner<ICAvParSilhouettesSurfTm> pCavParSilh( CreateCAvParSilhouettesSurfTm()) ;
if ( IsNull( pCavParSilh) ||
! pCavParSilh->SetDataForRegion( vpStm, pSfrToWork, m_TParams.m_dSideAng, m_TParams.m_dDiam,
! pCavParSilh->SetDataForRegion( vpStm, pSfrZConst, m_TParams.m_dSideAng, m_TParams.m_dDiam,
m_TParams.m_dCornRad, m_TParams.m_dMaxMat, GetOffsR(), SILH_SAMPLING, ANG_TOL_STD_DEG))
return false ;
// recupero le curve singole definite dal bordo della Silhouette
vector<ICRVCOMPOPOVECTOR> vCrvCompo ;
if ( ! CalcZConstSilCrv( pCavParSilh, vSrfLoc, frSurf, pSfrToWork, vtTool, dDepth, vCrvCompo)) {
if ( ! CalcZConstSilCrv( pCavParSilh, vSrfLoc, frSurf, pSfrZConst, vtTool, dDepth, vCrvCompo)) {
m_pMchMgr->SetLastError( 3126, "Error in SurfFinishing : Computing ZConst Curves failed") ;
return false ;
}
@@ -4467,7 +4465,7 @@ SurfFinishing::AddOptimal( ICAvToolSurfTm* pCAvTlStm, const SURFLOCALVECTOR& vSr
if ( ! vCrvCompo.empty()) {
// collego tra loro le curve trovate
ICRVCOMPOPOVECTOR vCrv ;
if ( ! CreateZConstPaths( pCAvTlStm, frSurf, vCrvCompo, vtTool, pSfrToWork, dDepth, vCrv)) {
if ( ! CreateZConstPaths( pCAvTlStm, frSurf, vCrvCompo, vtTool, pSfrZConst, dDepth, vCrv)) {
m_pMchMgr->SetLastError( 3127, "Error in SurfFinishing : Computing ZConst Paths failed") ;
return false ;
}
+1 -1
View File
@@ -154,7 +154,7 @@ class SurfFinishing : public Machining
bool GetSurfaceNormalAtPoint( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf,
const Point3d& ptTool, const Vector3d& vtTool, Vector3d& vtNorm) const ;
bool GetActiveSurfaces( INTVECTOR& vSurfId) const ;
bool MarchingSquares( const VECTORCOLLISIONSFR& vPntM, bool bSpiral, int nStepX, int nStepY, double dClippingAngle,
bool MarchingSquares( const VECTORCOLLISIONSFR& vPntM, bool bSpiral, double dOffsTol, int nStepX, int nStepY, double dClippingAngle,
const Vector3d& vtAxL, const Vector3d& vtMoveL, ICAvToolSurfTm* pCAvTlStm,
ICRVCOMPOPOVECTOR& vCrvCompo) const ;
bool CalcShapedPoint( const PNTUVVECT& myInfoStart, const PNTUVVECT& myInfoEnd, bool bSpiral, const Vector3d& vtAxL,
+1 -1
View File
@@ -2309,7 +2309,7 @@ SurfRoughing::CalcPaths( const INTINTVECTOR& vPocket, STEPINFOSRVECTOR& vStepInf
ICRVCOMPOPOVECTOR vCrvPaths ;
if ( ! CalcPocketing( vStepInfo[nInd].pSfrPock, m_TParams.m_dDiam / 2, 0., m_Params.m_dSideStep,
m_Params.m_dSideAngle, vStepInfo[nInd].nSubType, true, vStepInfo[nInd].bInverted,
false, true, ptEndLastPath, vStepInfo[nInd].pSfrLimit, false, vCrvPaths)) {
false, true, true, ptEndLastPath, vStepInfo[nInd].pSfrLimit, false, vCrvPaths)) {
if ( vStepInfo[nInd].bIsExtraStep) {
string sWarn = "Warning in SurfRoughing : CalcPocketing failed with substep (" + ToString( vStepInfo[nInd].dDepth, 1) + ")" ;
m_pMchMgr->SetWarning( 3055, sWarn) ;