EgtMachKernel :

- codice senza considerare il volume di svuotatura.
This commit is contained in:
Riccardo Elitropi
2023-11-13 08:15:21 +01:00
parent c8cd417dac
commit c13dba8c9f
2 changed files with 22 additions and 60 deletions
+21 -60
View File
@@ -9016,6 +9016,7 @@ Pocketing::AdjustContourWithOpenEdges( ICurveComposite* pCompo, ICRVCOMPOPOVECTO
}
int nCrv_offs = OffsCrv.GetCurveCount() ;
if ( nCrv_offs == 0) {
// GESTIONE SPECIALE DEGLI APERTI CHE OFFSETTATI NON GENERANO CURVE -----------------------------------
// se un lato aperto è formato da più curve e l'offset di tale composita sparisce, la superficie può
// estendersi fino all'intersezione delle due curva ad amo che determinano l'immagine del tool nello svuotare
// i lati chiusi adiacenti
@@ -9048,9 +9049,6 @@ Pocketing::AdjustContourWithOpenEdges( ICurveComposite* pCompo, ICRVCOMPOPOVECTO
pJCrv1->AddPoint( ptLine) ;
pJCrv1->AddLine( ptArc) ;
pJCrv1->AddArcTg( ptStart) ;
//int PURp = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pJCrv1->Clone()) ;
//m_pGeomDB->SetMaterial( PURp, PURPLE) ;
// intersezione
pJCrv->ToLoc( frPocket) ;
pJCrv1->ToLoc( frPocket) ;
@@ -9076,6 +9074,8 @@ Pocketing::AdjustContourWithOpenEdges( ICurveComposite* pCompo, ICRVCOMPOPOVECTO
else
continue ;
}
// -----------------------------------------------------------------------------------------
// GESTIONE SPECIALE DEGLI APERTI CHE GENERANO ISOLE APERTE --------------------------------
// dall'offset di un lato aperto posso generare più curva composite...
PtrOwner<ICurve> pCrvlonger( OffsCrv.GetLongerCurve()) ;
while ( ! IsNull( pCrvlonger)) {
@@ -9099,10 +9099,13 @@ Pocketing::AdjustContourWithOpenEdges( ICurveComposite* pCompo, ICRVCOMPOPOVECTO
vpCrvs[i].Set( pCrvRange) ;
vpCrvs[i]->SetTempProp( 1) ;
}
// -----------------------------------------------------------------------------------------
}
// clono la pCompo
PtrOwner<ICurveComposite> pCompo_clone( CloneCurveComposite( pCompo)) ;
if ( IsNull( pCompo_clone))
return false ;
// reinserisco le curve, chiudendo eventuali gap
pCompo->Clear() ;
@@ -9438,7 +9441,7 @@ Pocketing::AdustTmpPropLinesForProjection( ICurveComposite* pCompo)
//---------------------------------------------------------------------------
bool
Pocketing::AdjustPathOutsideRawForOpenEdges( const ICurveComposite* pCompo, const ICRVCOMPOPOVECTOR& vCrvIsland,
ICurveComposite* pCrvOpenOffs, const Point3d& ptCrvOpenS,
ICurveComposite* pCrvOpenOffs, const Point3d& ptCrvOpenS,
const Point3d& ptCrvOpenE, const double dRad,
const double dDiam, ICurveComposite* pNewCrv, const Vector3d& vtTrasl,
ISurfTriMesh* pStmRaw, bool bInVsOut)
@@ -9468,7 +9471,6 @@ Pocketing::AdjustPathOutsideRawForOpenEdges( const ICurveComposite* pCompo, cons
if ( ! pCrvOpen->TrimStartEndAtParam( dUTrimS, dUTrimE))
pCrvOpen->Clear() ;
}
else {
// se l'inizio coincide con la fine, allora la curva è tutta aperta
@@ -9480,7 +9482,6 @@ Pocketing::AdjustPathOutsideRawForOpenEdges( const ICurveComposite* pCompo, cons
PtrOwner<ICurveComposite> pCompo_noOpenCrv( CloneCurveComposite( pCompo_Succ)) ;
pCompo_noOpenCrv->AddCurve( pCompo_Prec->Clone()) ;
// recupero i punti e i vettori tangenti iniziali e finali del lato aperto
Point3d ptSTART ; pCrvOpenOffs->GetStartPoint( ptSTART) ;
Point3d ptEND ; pCrvOpenOffs->GetEndPoint( ptEND) ;
@@ -9926,7 +9927,7 @@ Pocketing::GetParamsAtEachStep( ISURFFRPOVECTOR& vSrfSliced, vector<ICRVCOMPOPOV
// ================================ RECUPERO DELLA TRIMESH (se selezionata) ==============================
// recupero il bordo della superficie
PtrOwner<ICurveComposite> pCrvBorder( GetCurveComposite( pSrfChunk_c->GetLoop( 0, 0))) ;
PtrOwner<ICurveComposite> pCrvBorder( CloneCurveComposite( pSrfChunk_c->GetLoop( 0, 0))) ;
if ( IsNull( pCrvBorder) || ! pCrvBorder->IsValid())
return false ;
@@ -9952,10 +9953,11 @@ Pocketing::GetParamsAtEachStep( ISURFFRPOVECTOR& vSrfSliced, vector<ICRVCOMPOPOV
// 2) controllo se ci sono degli step extra ( aggiornando il vettore degli step)
if ( ! CalcExtraSteps( pSrfChunk_c, pStmORIG, vtTool, dElev, dDepth, nStep, dStep, vVtTrasl))
return false ;
vSrfSliced.resize(( int)vVtTrasl.size()) ;
vCrvOEWithFlags.resize(( int)vVtTrasl.size()) ;
vbChangedPrec.resize(( int)vVtTrasl.size()) ;
nStep = ( int)vVtTrasl.size() ;
vSrfSliced.resize( int( vVtTrasl.size())) ;
vCrvOEWithFlags.resize( int(vVtTrasl.size())) ;
vbChangedPrec.resize( int( vVtTrasl.size())) ;
nStep = int( vVtTrasl.size()) ;
}
// ======================================================================================
@@ -10218,7 +10220,7 @@ Pocketing::ProjectEdgesOfSelectedStm( const ISurfFlatRegion* pSrfToPock, const I
if ( IsNull( pCrvBorder) || ! pCrvBorder->IsValid() || pCrvBorder->GetCurveCount() == 0)
return false ;
// 2) Recupero la faccia selezionata ( è la TmpProp 1)
// 2) recupero la faccia selezionata ( è la TmpProp 1)
int nFacet = pCrvBorder->GetTempProp( 1) ;
if ( nFacet < 0)
return false ;
@@ -10249,7 +10251,7 @@ Pocketing::ProjectEdgesOfSelectedStm( const ISurfFlatRegion* pSrfToPock, const I
return false ;
if ( IsNull( pStmORIG_noSelFace) ||
! pStmORIG_noSelFace->IsValid() ||
pStmORIG_noSelFace->GetTriangleCount() == 0)
pStmORIG_noSelFace->GetTriangleCount() == 0) // se non ho altre facce ho già finito...
return true ; // <--- tutti i lati sono aperti !
// d) proietto tutto sul piano di svuotatura e aggiungo la faccia selezionata
@@ -10296,8 +10298,6 @@ Pocketing::GetAdaptedSfrByTrimesh( const ISurfFlatRegion* pSrfExtended, const IS
PtrOwner<ISurfTriMesh> pStmExtended( CloneSurfTriMesh( pSrfExtended_cl->GetAuxSurf())) ;
if ( IsNull( pStmExtended) || ! pStmExtended->IsValid())
return false ;
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmExtended->Clone()) ;
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmORIG->Clone()) ;
// 2) Creazione della FlatRegion di proiezione complessiva delle facce della TriMesh sopra al piano di svuotatura
// attuale
@@ -10324,7 +10324,6 @@ Pocketing::GetAdaptedSfrByTrimesh( const ISurfFlatRegion* pSrfExtended, const IS
if ( ! ProjectStmOnPlane( pStmORIG_forCut, plProj, pSfrProjUP))
return false ;
}
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrProjUP->Clone()) ;
// 7) verifico se la superificie è problematica per il taglio
PtrOwner<ISurfFlatRegion> pSfrORIGNoSelFaceProj( CreateSurfFlatRegion()) ;
@@ -10333,7 +10332,7 @@ Pocketing::GetAdaptedSfrByTrimesh( const ISurfFlatRegion* pSrfExtended, const IS
return false ;
PtrOwner<ISurfTriMesh> pStmORIGNoSelFace( CloneSurfTriMesh( pStmORIG)) ;
if ( ! pStmORIGNoSelFace->RemoveFacet( nTmpProp1) ||
! ProjectStmOnPlane( pStmORIGNoSelFace, plProj, pSfrORIGNoSelFaceProj))
! ProjectStmOnPlane( pStmORIGNoSelFace, plProj, pSfrORIGNoSelFaceProj))
return false ;
if ( AreOppositeVectorApprox( vtN, pSfrORIGNoSelFaceProj->GetNormVersor()))
pSfrORIGNoSelFaceProj->Invert() ;
@@ -10393,17 +10392,15 @@ Pocketing::GetAdaptedSfrByTrimesh( const ISurfFlatRegion* pSrfExtended, const IS
bS = true ;
if ( pCrvLoopH->IsPointOn( ptE, 50 * EPS_SMALL))
bE = true ;
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvCompo->Clone()) ;
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrExtended->Clone()) ;
}
}
bExtraSub = ! ( bS && bE) ;
if ( bExtraSub) {
// 9.2) conservo le parti in comuune tra quest'ultima FlatRegion e la superificie originale
// 7.1) conservo le parti in comune tra quest'ultima FlatRegion e la superificie originale
if ( ! pSfrORIGNoSelFaceProj->Intersect( *pSfrORIG))
return false ;
// 7.3) Sottraggo
// 7.2) Sottraggo
if ( pSfrORIGNoSelFaceProj->IsValid() &&
pSfrExtended->Subtract( *pSfrORIGNoSelFaceProj)) {
@@ -10421,13 +10418,10 @@ Pocketing::GetAdaptedSfrByTrimesh( const ISurfFlatRegion* pSrfExtended, const IS
}
// 8) Verifico se riesco a fare il taglio
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmExtended->Clone()) ;
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmORIG->Clone()) ;
if ( ! pStmExtended->CutWithOtherSurf( *pStmORIG, false, true))
return false ;
if ( ! IsNull( pStmExtended) && pStmExtended->GetTriangleCount() == 0)
pStmExtended.Set( CloneSurfTriMesh( pSfrORIG->GetAuxSurf())) ;
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmExtended->Clone()) ;
// 8) Riconverto in FlatRegion
if ( ! GetSfrByStm( pStmExtended, pSfrExtended, plProj, vtExtr, dThick))
@@ -10442,10 +10436,6 @@ Pocketing::GetAdaptedSfrByTrimesh( const ISurfFlatRegion* pSrfExtended, const IS
! pSfrExtended->Subtract( *pSfrProjUP))
return false ;
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrExtended->Clone()) ;
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrProjUP->Clone()) ;
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrExtended_Sub->Clone()) ;
}
// 9) Ricalcolo lati aperti e lati chiusi
@@ -10491,8 +10481,6 @@ Pocketing::GetAdaptedSfrByTrimesh( const ISurfFlatRegion* pSrfExtended, const IS
pCrv_u->GetEndPoint( ptE) ;
pCrv_u->GetMidPoint( ptM) ;
PtrOwner<ISurfTriMesh> pStmNoSelFace( CloneSurfTriMesh( pStmORIG)) ;
//if ( ! pStmNoSelFace->RemoveFacet( nTmpProp1))
// return false ;
DistPointSurfTm dPStm1( ptS, *pStmNoSelFace) ;
DistPointSurfTm dPStm2( ptM, *pStmNoSelFace) ;
@@ -10597,9 +10585,6 @@ Pocketing::ProjectStmOnPlane( const ISurfTriMesh* pStmAbove, const Plane3d plPoc
if ( IsNull( pStmRef) || ! pStmRef->IsValid())
return false ;
//int b = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmRef->Clone()) ;
//m_pGeomDB->SetMaterial( b, BLUE) ;
// 2.1) Per semplicità rimuovo dalla superficie tutti i triangoli che sono perpendicolari al piano di svuotatura
StmFromTriangleSoup TriaSoupEasy ; TriaSoupEasy.Start() ;
for ( int t = 0 ; t < pStmRef->GetTriangleCount() ; ++ t) {
@@ -10622,9 +10607,6 @@ Pocketing::ProjectStmOnPlane( const ISurfTriMesh* pStmAbove, const Plane3d plPoc
return false ;
pStmRef->ToGlob( frPlane) ;
//int P = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmRef->Clone()) ;
//m_pGeomDB->SetMaterial( P, PURPLE) ;
// 4) controllo la validità della superficie ottenuta
if ( IsNull( pStmRef) || ! pStmRef->IsValid() || pStmRef->GetTriangleCount() == 0)
return true ; // la proeizione sparisce
@@ -10650,12 +10632,6 @@ Pocketing::ProjectStmOnPlane( const ISurfTriMesh* pStmAbove, const Plane3d plPoc
return true ;
pStmUp->Repair() ; pStmDown->Repair() ;
//int r = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmUp->Clone()) ;
//int o = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmDown->Clone()) ;
//m_pGeomDB->SetMaterial( r, RED) ;
//m_pGeomDB->SetMaterial( o, ORANGE) ;
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrProj->Clone()) ;
// 6) Essendo due Trimesh piane e sullo stesso piano, converto in FlatRegion prima di unirle
PtrOwner<ISurfFlatRegion> pSfrUp( CreateSurfFlatRegion()) ;
PtrOwner<ISurfFlatRegion> pSfrUp1( CreateSurfFlatRegion()) ;
@@ -10897,8 +10873,6 @@ Pocketing::SubtractFinalShape( ISurfFlatRegion* pSfrCurr, const Vector3d& vtTras
if ( IsNull( pSfrCurr_c) || ! pSfrCurr_c->IsValid())
return false ;
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrCurr_c->Clone()) ;
//m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrShape_c->Clone()) ;
if ( pSfrCurr_c ->IsValid() && pSfrShape_c->IsValid()) {
if ( AreOppositeVectorApprox( pSfrCurr_c->GetNormVersor(), pSfrShape_c->GetNormVersor()))
pSfrShape_c->Invert() ;
@@ -11323,7 +11297,6 @@ Pocketing::ModifySurfByOpenEdge( ISurfFlatRegion* pSrf, ICRVCOMPOPOVECTOR& vCrvO
PtrOwner<ICurveComposite> pCrvEL( ConvertCurveToComposite( pSrf->GetLoop( c, 0))) ;
if ( IsNull( pCrvEL))
return false ;
//vCrvOrig_tmp.emplace_back( Release( pCrvEL)) ;
vCrvOEFlags.emplace_back( Release( pCrvEL)) ;
// 2) creo un vettore con le isole del Chunk ( e uno con le isole ammissibili)
@@ -12339,7 +12312,7 @@ Pocketing::GetProjStmOnSfr( const ISurfFlatRegion* pSfr, const ISurfTriMesh* pSt
// nelle posizioni successive inserisco le curve esterne dei chunk creati ( aperti per definizione)
ICRVCOMPOPOVECTOR vCrvExtProj ; // <---- questo vettore contiene il bordo della superificie ricavata dall'interzione
// quindi in posizione 0 ho una curva con i lati aperti/chiusi già settati
vCrvExtProj.emplace_back( GetCurveComposite( pSfr->GetLoop( 0, 0))) ;
vCrvExtProj.emplace_back( ConvertCurveToComposite( pSfr->GetLoop( 0, 0))) ;
// Clono la superificie di partenza ( per sicurezza lascio invariata quella passata alla funzione)
PtrOwner<ISurfFlatRegion> pSrf_Clone( CloneSurfFlatRegion( pSfr)) ;
@@ -12404,7 +12377,7 @@ Pocketing::GetProjStmOnSfr( const ISurfFlatRegion* pSfr, const ISurfTriMesh* pSt
// ( semplice AdjustContourWithOpenEdges, senza grezzo e senza isole, verrà tutto fatto in seguito)
if ( AdjustContourWithOpenEdges( pCrvExt, vCrvNull, m_dMaxLenRawProj, 0.0, 0.0, V_NULL, nullptr, true)) {
// la curva restitutita presenta i lati aperti/chiusi impostati ( all'originale si lasciano invariati i chiusi,
// gli aperrti vengono Offsettati e i raccordi sono lineari mediante rette chiuse
// gli aperti vengono Offsettati e i raccordi sono lineari mediante rette chiuse
// ( NB. Se le rette di raccordo fossero settate aperte, rischierei di rovinare parti di grezzo al
// di fuori di lati chiusi ( tutto dipende dell'angolo di inclinazione della superificie originale rispetto
// ad ogni singola faccia del grezzo ).
@@ -12641,6 +12614,7 @@ Pocketing::ProjectRaw( ISurfFlatRegion* pSrf, const Vector3d& vtTrasl,
PtrOwner<ISurfFlatRegion> pSfr_Act( CreateSurfFlatRegion()) ;
if ( IsNull( pSfr_Act))
return false ;
// NON UTILIZZATA !
if ( ! CloseOpenSidesInsideRawForProjection( pSrf_clone_ChunkC, pStmRaw, pSfr_Act))
return false ;
pSrf_clone_ChunkC.Set( Release( pSfr_Act)) ;
@@ -14419,8 +14393,6 @@ Pocketing::GetNewSrfByAnotherPocketing( ISurfFlatRegion* pSrf, ISurfFlatRegion*
PtrOwner<ISurfFlatRegion> pSrf_Sub( CloneSurfFlatRegion( pSrf)) ;
if ( IsNull( pSrf_Sub) || ! pSrf_Sub->IsValid())
return false ;
//int Y = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSrf_Sub->Clone()) ;
//m_pGeomDB->SetMaterial( Y, YELLOW) ;
// effettuo un Offset verso l'interno ( curve esterne che percorre il centro del Tool)
if ( pSrf_Sub->Offset( - m_dDiam_Prec / 2 - m_dOffsetR_Prec - 5 * EPS_SMALL, ICurve::OFF_FILLET)) {
// se la superificie sparisce o trovo un chunk non valido, la risvuoto tutta per sicurezza...
@@ -14429,17 +14401,9 @@ Pocketing::GetNewSrfByAnotherPocketing( ISurfFlatRegion* pSrf, ISurfFlatRegion*
// effettuo un Offset del raggio del tool precedente per ricavare la regione svuotata in precedenza
PtrOwner<ISurfFlatRegion> pSrfHelp( CloneSurfFlatRegion( pSrf_Sub)) ;
if ( ! pSrf_Sub->Offset( m_dDiam_Prec / 2 + 20 * EPS_SMALL, ICurve::OFF_FILLET)) {
//int nbadOffs = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSrfHelp->Clone()) ;
//m_pGeomDB->Save( nbadOffs, "C:\\Users\\riccardo.elitropi\\Desktop\\Err_offs" + ToString( nbadOffs) + "__m" + ToString( m_dDiam_Prec / 2 + 20 * EPS_SMALL) + ".nge") ;
return false ;
}
//int r = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSrf_Sub->Clone()) ;
//m_pGeomDB->SetMaterial( r, RED) ;
//int v = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSrf_noOpenEdge->Clone()) ;
//m_pGeomDB->SetMaterial( v, GREEN) ;
PtrOwner<ISurfFlatRegion> pSrf_clone( CloneSurfFlatRegion( pSrf_noOpenEdge)) ;
if ( pSrf_clone->Subtract( *pSrf_Sub)) {
@@ -14448,9 +14412,6 @@ Pocketing::GetNewSrfByAnotherPocketing( ISurfFlatRegion* pSrf, ISurfFlatRegion*
return true ;
}
//int l = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSrf_clone->Clone()) ;
//m_pGeomDB->SetMaterial( l, LIME) ;
// ricavo la curva esterna originale
PtrOwner<ICurveComposite> pCrvExt_orig( GetCurveComposite( pSrf->GetLoop( 0, 0))) ;
// superificie finale da restituire ...
+1
View File
@@ -369,6 +369,7 @@ class Pocketing : public Machining
AggrBottom m_AggrBottom ; // dati eventuale aggregato da sotto
bool m_bOpenOutRaw ; // flag forzatura lati aperti sempre fuori dal grezzo
double m_dOpenMinSafe ; // minima distanza di sicurezza di attacco su lato aperto
bool m_bIntersRaw = true ; // flag per intersezione con grezzo
bool m_bProjectRaw = true ; // flag di proiezione del grezzo
bool m_bHasShape = true ; // flag per presenza di geometria voluta