EgtMachKernel 3.1a6 :

- correzioni a PocketingNT.
This commit is contained in:
Riccardo Elitropi
2026-02-12 15:49:02 +01:00
parent 66f763a772
commit cda17543fe
2 changed files with 39 additions and 7 deletions
BIN
View File
Binary file not shown.
+39 -7
View File
@@ -2624,6 +2624,13 @@ PocketingNT::ExtendOpenEdges( ISurfFlatRegion* pSfr, const ISurfTriMesh* pStm)
if ( ! pSfr->IsValid())
return true ;
// Se non richiesto controllo con il Grezzo, non estendo alcun lato
// ( NB. potrebbe essere scelto un unteriore parametro dalle note utenti)
int nOpenOutRaw ;
m_bOpenOutRaw = ( GetValInNotes( m_Params.m_sUserNotes, UN_OPENOUTRAW, nOpenOutRaw) && nOpenOutRaw != 0) ;
if ( m_bOpenOutRaw)
return true ;
// se la superficie non ha lati aperti, allora non devo fare nulla
bool bAllClosed = true ;
for ( int nC = 0 ; nC < pSfr->GetChunkCount() && bAllClosed ; ++ nC) {
@@ -2890,6 +2897,7 @@ PocketingNT::CalcLimitRegion( const ISurfFlatRegion* pSfrPock, const ISurfFlatRe
// se richiesto non controllo dei lati aperti
if ( m_bOpenOutRaw && pSfrLimit->IsValid()) {
double dExtension = 4. * m_TParams.m_dDiam + max( 0., m_dOpenMinSafe) + EPS_SMALL ;
for ( int nC = 0 ; nC < pSfrPock->GetChunkCount() ; ++ nC) {
for ( int nL = 0 ; nL < pSfrPock->GetLoopCount( nC) ; ++ nL) {
// recupero la curva di bordo
@@ -2902,22 +2910,25 @@ PocketingNT::CalcLimitRegion( const ISurfFlatRegion* pSfrPock, const ISurfFlatRe
return false ;
// scorro i tratti omogenei aperti
for ( int i = 0 ; i < int( vpCrvs.size()) ; ++ i) {
if ( vpCrvs[i]->GetTempProp( 0) == TEMP_PROP_OPEN_EDGE) {
if ( ! IsNull( vpCrvs[i]) && vpCrvs[i]->IsValid() && vpCrvs[i]->GetTempProp( 0) == TEMP_PROP_OPEN_EDGE) {
// regione da sottrarre
PtrOwner<ISurfFlatRegion> pSfrSubtract( CreateSurfFlatRegion()) ;
if ( IsNull( pSfrSubtract))
return false ;
if ( vpCrvs[i]->IsClosed()) {
pSfrSubtract.Set( GetSurfFlatRegionFromFatCurve( vpCrvs[i]->Clone(), 4 * m_TParams.m_dDiam + EPS_SMALL, false, false)) ;
pSfrSubtract.Set( GetSurfFlatRegionFromFatCurve( vpCrvs[i]->Clone(), dExtension, false, false)) ;
if ( IsNull( pSfrSubtract) || ! pSfrSubtract->IsValid())
return false ;
if ( AreOppositeVectorApprox( pSfrSubtract->GetNormVersor(), pSfrPock->GetNormVersor()))
pSfrSubtract->Invert() ;
}
else {
// creo la curva di Offset esterna ( deve esistere ed essere valida)
vpCrvs[i]->SetExtrusion( pSfrPock->GetNormVersor()) ;
OffsetCurve OffsCrv ;
PtrOwner<ICurve> pOffsExt( CreateCurveComposite()) ;
if ( IsNull( pOffsExt) ||
! OffsCrv.Make( vpCrvs[i], 4 * m_TParams.m_dDiam, ICurve::OFF_FILLET) ||
! OffsCrv.Make( vpCrvs[i], dExtension, ICurve::OFF_FILLET) ||
! pOffsExt.Set( OffsCrv.GetLongerCurve()) ||
IsNull( pOffsExt))
return false ;
@@ -2925,7 +2936,7 @@ PocketingNT::CalcLimitRegion( const ISurfFlatRegion* pSfrPock, const ISurfFlatRe
PtrOwner<ICurve> pOffsInt( CreateCurveComposite()) ;
if ( IsNull( pOffsInt))
return false ;
if ( OffsCrv.Make( vpCrvs[i], - 4 * m_TParams.m_dDiam, ICurve::OFF_FILLET)) {
if ( OffsCrv.Make( vpCrvs[i], - dExtension, ICurve::OFF_FILLET)) {
PtrOwner<ICurve> pMyCrv( OffsCrv.GetLongerCurve()) ;
if ( ! IsNull( pMyCrv) && pMyCrv->IsValid())
pOffsInt.Set( pMyCrv) ;
@@ -3059,6 +3070,10 @@ PocketingNT::ManageOpenEdges( ISurfFlatRegion* pSfr, const ISurfTriMesh* pStm)
if ( ! pStm->IsValid())
return true ;
// Recupero dalle Note utenti il parametro OpenOutRaw
int nOpenOutRaw ;
m_bOpenOutRaw = ( GetValInNotes( m_Params.m_sUserNotes, UN_OPENOUTRAW, nOpenOutRaw) && nOpenOutRaw != 0) ;
// recupero i Chunk della superficie
ISURFFRPOVECTOR vChunks( pSfr->GetChunkCount()) ;
for ( int nC = 0 ; nC < int( vChunks.size()) ; ++ nC)
@@ -3075,6 +3090,23 @@ PocketingNT::ManageOpenEdges( ISurfFlatRegion* pSfr, const ISurfTriMesh* pStm)
double dOpenExtension = 0. ;
if ( GetValInNotes( m_Params.m_sUserNotes, UN_OPEN, dOpenExtension) && dOpenExtension > EPS_SMALL)
m_dOpenInRawExtension = dOpenExtension ;
// se la superficie ha flag di OpenOutRaw e non è stata impostata alcuna estensione massima,
// non modifico la geometria, lascio l'aperto esattamente dove si trova
// se invece ho flat di OpenOutRaw, dato che il lato aperto viene lasciato tale, devo ridurre la
// sua estensione del raggio utensile
if ( m_bOpenOutRaw) {
if ( dOpenExtension < 10. * EPS_SMALL)
return true ;
else {
m_dOpenInRawExtension -= m_TParams.m_dDiam / 2. ;
if ( m_dOpenInRawExtension < EPS_SMALL) {
m_dOpenInRawExtension = 0. ;
return true ;
}
}
}
const double LEN_EXTENSION = 1000. ;
const double TOL_PT_INSIDE_STM = 3. ;
#if DEBUG_OPEN_EDGE_IN_RAW
@@ -3159,7 +3191,7 @@ PocketingNT::ManageOpenEdges( ISurfFlatRegion* pSfr, const ISurfTriMesh* pStm)
return false ;
// considero il bordo come tutto chiuso ( evito entrate da fuori dal pezzo)
for ( int i = 0 ; i < pCrvNewBorder->GetCurveCount() ; ++ i)
pCrvNewBorder->SetCurveTempProp( i, TEMP_PROP_CLOSE_EDGE, 0) ;
pCrvNewBorder->SetCurveTempProp( i, m_bOpenOutRaw ? TEMP_PROP_OPEN_EDGE : TEMP_PROP_CLOSE_EDGE, 0) ;
}
// se invece presenta solo alcuni tratti Open interni al pezzo
else {
@@ -3278,9 +3310,9 @@ PocketingNT::ManageOpenEdges( ISurfFlatRegion* pSfr, const ISurfTriMesh* pStm)
pLineAfter->SetTempProp( vpCrvs[nIndAfter]->GetTempProp( 0), 0) ;
vpCrvs[nIndAfter]->AddCurve( Release( pLineAfter), false) ;
vpCrvs[i].Set( Release( pCrvOffsOpenInPart)) ;
// considero questo tratto come chiuso
// assegno proprietà di lato aperto/chiuso
for ( int j = 0 ; j < vpCrvs[i]->GetCurveCount() ; ++ j)
vpCrvs[i]->SetCurveTempProp( j, TEMP_PROP_CLOSE_EDGE, 0) ;
vpCrvs[i]->SetCurveTempProp( j, m_bOpenOutRaw ? TEMP_PROP_OPEN_EDGE : TEMP_PROP_CLOSE_EDGE, 0) ;
}
}
// ricostrusico il nuovo bordo