diff --git a/Pocketing.cpp b/Pocketing.cpp index eb458a0..4eeec6a 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -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 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 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 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 pCrvBorder( GetCurveComposite( pSrfChunk_c->GetLoop( 0, 0))) ; + PtrOwner pCrvBorder( CloneCurveComposite( pSrfChunk_c->GetLoop( 0, 0))) ; if ( IsNull( pCrvBorder) || ! pCrvBorder->IsValid()) return false ; @@ -9952,10 +9953,11 @@ Pocketing::GetParamsAtEachStep( ISURFFRPOVECTOR& vSrfSliced, vectorIsValid() || 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 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 pSfrORIGNoSelFaceProj( CreateSurfFlatRegion()) ; @@ -10333,7 +10332,7 @@ Pocketing::GetAdaptedSfrByTrimesh( const ISurfFlatRegion* pSrfExtended, const IS return false ; PtrOwner 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 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 pSfrUp( CreateSurfFlatRegion()) ; PtrOwner 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 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 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 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 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 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 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 pCrvExt_orig( GetCurveComposite( pSrf->GetLoop( 0, 0))) ; // superificie finale da restituire ... diff --git a/Pocketing.h b/Pocketing.h index 17b538e..97b4ef6 100644 --- a/Pocketing.h +++ b/Pocketing.h @@ -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