diff --git a/Pocketing.cpp b/Pocketing.cpp index 902378c..dce1466 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -9815,10 +9815,10 @@ Pocketing::GetAdaptedSfrByTrimesh( const ISurfFlatRegion* pSrfExtended, const IS if ( IsNull( pStmExtended) || ! pStmExtended->IsValid()) return false ; - //int A = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmExtended->Clone()) ; - //m_pGeomDB->SetMaterial( A, ORANGE) ; - //int p = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmORIG->Clone()) ; - //m_pGeomDB->SetMaterial( p, PURPLE) ; + int A = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmExtended->Clone()) ; + m_pGeomDB->SetMaterial( A, ORANGE) ; + int p = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmORIG->Clone()) ; + m_pGeomDB->SetMaterial( p, PURPLE) ; // 2) Creazione della FlatRegion di proiezione complessiva delle facce dela TriMesh sopra al piano di svuotatura attuale PtrOwner pSfrProjUP( CreateSurfFlatRegion()) ; @@ -9842,6 +9842,10 @@ Pocketing::GetAdaptedSfrByTrimesh( const ISurfFlatRegion* pSrfExtended, const IS //int b = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmExtended->Clone()) ; //m_pGeomDB->SetMaterial( b, BLACK) ; + // NB. Se pStmExtended è vuota, allora la TriMesh non arriva fino al bordo del grezzo, quindi non cambio + // la geometria di intersezione + if ( ! IsNull( pStmExtended) && pStmExtended->GetTriangleCount() == 0) + pStmExtended.Set( CloneSurfTriMesh( pSfrORIG->GetAuxSurf())) ; // 5) taglio la TriMesh originale togliendo tutto ciò che sta sotto al piano di proiezione PtrOwner pStmORIG_forCut( CloneSurfTriMesh( pStmORIG)) ; @@ -13883,15 +13887,26 @@ Pocketing::GetSfrByStm( const ISurfTriMesh* pStm, ISurfFlatRegion* pSfr, const P if ( IsNull( pCrv_c) || ! pCrv_c->IsValid()) return false ; - //m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrv_c->Clone()) ; - PtrOwner pCrv_proj( ProjectCurveOnPlane( *pCrv_c, plPock)) ; + double dAreaCheck = EPS_SMALL ; Plane3d plCheck ; + if ( ! IsNull( pCrv_proj) && + pCrv_proj->IsClosed() && + pCrv_proj->GetArea( plCheck, dAreaCheck) && + dAreaCheck <= EPS_SMALL) { + m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrv_c->Clone()) ; + m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStm->Clone()) ; + continue ; + + } + SrfChunkDef.AddCurve( Release( pCrv_proj)) ; // aggiungo le curve proiettate } + // recupero la FlatRegion PtrOwner pSrfByCurves( SrfChunkDef.GetSurf()) ; if ( IsNull( pSrfByCurves) || pSrfByCurves->GetChunkCount() == 0) // controllo validità della FlatRegion - return false ; + return true ; // non ho ricavato nulla, la TriMesh è troppo sottile o piccola + // restituisco la FlatRegion pSfr->Clear() ; pSfr->CopyFrom( pSrfByCurves) ;