diff --git a/StmFromCurves.cpp b/StmFromCurves.cpp index ff13106..6634134 100644 --- a/StmFromCurves.cpp +++ b/StmFromCurves.cpp @@ -856,6 +856,11 @@ CalcRegionPolyLines( const CICURVEPVECTOR& vpCurve, double dLinTol, // successive i loop interni INTMATRIX vnPLIndMat ; + // vettore di indici per ordinare le PolyLine + INTVECTOR vPL_IndOrder ; vPL_IndOrder.resize( int( vPL.size())) ; + for ( int i = 0 ; i < int( m_vArea.size()) ; ++ i) + vPL_IndOrder[i] = m_vArea[i].first ; + // aggiungo le diverse curve bool bExtLoop = false ; bool bFirstCrv ; @@ -915,5 +920,11 @@ CalcRegionPolyLines( const CICURVEPVECTOR& vpCurve, double dLinTol, } } while ( ! bFirstCrv) ; + // ordino le PolyLine per area + POLYLINEVECTOR vPL_tmp ; + for ( int i = 0 ; i < int( vPL_IndOrder.size()) ; ++ i) + vPL_tmp.push_back( vPL[ vPL_IndOrder[i]]) ; + swap( vPL, vPL_tmp) ; + return true ; } diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index 0a4fd8c..3d3d48b 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -1302,9 +1302,6 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) RetriangulationForBooleanOperation( LineMapA, AmbiguosA, *this, bModif) ; RetriangulationForBooleanOperation( LineMapB, AmbiguosB, SurfB, bModif) ; - SaveGeoObj( this->Clone(), "C:\\Users\\riccardo.elitropi\\Desktop\\SurfA.nge") ; - SaveGeoObj( SurfB.Clone(), "C:\\Users\\riccardo.elitropi\\Desktop\\SurfB.nge") ; - // Se i triangoli delle superfici non si intersecano, una delle due è totalmente interna o esterna all'altra. // non mi basta fare un controllo sulle bbox perché non so come sono orientate le superfici e che potrebbero anche non essere chiuse bool bRetriangulated = true ; @@ -1445,21 +1442,21 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) // e ricalcolo l'informazione che mi dà la sua normale if ( ! bSame) { Point3d ptBar_tot ; - for (int nTriaNum : vnTriaNum) { + for ( int nTriaNum : vnTriaNum) { GetTriangle( nTriaNum, trTriaA) ; ptBar_tot += trTriaA.GetCentroid(); } - ptBar_tot /= (int)vnTriaNum.size() ; + ptBar_tot /= int( vnTriaNum.size()) ; for ( int nTriaNum : vnTriaNum) { GetTriangle( nTriaNum, trTriaA) ; Point3d ptInters1, ptInters2 ; int nInters = IntersLineTria( ptFirstV, ptBar_tot, trTriaA, ptInters1, ptInters2, true) ; - if (nInters == ILTT_NO) + if ( nInters == ILTT_NO) continue ; - else if ( nInters == ILTT_IN ) { - if ( ( ptFirstV - trTriaA.GetP(0)) * trTriaA.GetN() < - EPS_SMALL) + else if ( nInters == ILTT_IN) { + if ( ( ptFirstV - trTriaA.GetP( 0)) * trTriaA.GetN() < - EPS_SMALL) nInOutNum = 1 ; - else if ( ( ptFirstV - trTriaA.GetP(0)) * trTriaA.GetN() > EPS_SMALL) + else if ( ( ptFirstV - trTriaA.GetP( 0)) * trTriaA.GetN() > EPS_SMALL) nInOutNum = -1 ; break ; } @@ -1488,6 +1485,10 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) // Se avvenuta modifica, aggiorno tutto if ( bModif) bContinue = ( AdjustVertices() && DoCompacting() && SurfB.AdjustVertices() && SurfB.DoCompacting()) ; + + SaveGeoObj( this, "C:\\Users\\riccardo.elitropi\\Desktop\\SurfA.nge") ; + SaveGeoObj( SurfB.Clone(), "C:\\Users\\riccardo.elitropi\\Desktop\\SurfB.nge") ; + // Triangoli sovrapposti if ( bContinue) { int nTriaNum2A = GetTriangleSize() ; @@ -1525,8 +1526,6 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) } return true ; } - SaveGeoObj( this, "C:\\Users\\riccardo.elitropi\\Desktop\\SurfA.nge") ; - SaveGeoObj( SurfB.Clone(), "C:\\Users\\riccardo.elitropi\\Desktop\\SurfB.nge") ; return true ; } @@ -1656,49 +1655,83 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other) return true ; } + // Surf A è la superficie attuale ( this), SurfB è l'altra SurfTriMesh SurfB ; SurfB.CopyFrom( &Other) ; + // scalo la superficie Frame3d frScalingRef ; frScalingRef.Set( m_vVert[0].ptP, X_AX, Y_AX, Z_AX) ; Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ; SurfB.Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ; + // ritriangolo le due superfici mediante ogni intersezione Triangolo-Triangolo IntersectTriMeshTriangle( SurfB) ; + + // assegno un medesimo indice ai triangoli che non interferiscono con altri IdentifyParts() ; SurfB.IdentifyParts() ; + // rimozione dei triangoli di A con proprietà -1 e -2 int nTriaNumA = GetTriangleSize() ; for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) { if ( m_vTria[nTA].nTempPart == - 1 || m_vTria[nTA].nTempPart == - 2) RemoveTriangle( nTA) ; } + // aggiunta dei triangoli di B con proprietà +1 int nPrevMaxTFlag = m_nMaxTFlag ; int nTriaNumB = SurfB.GetTriangleSize() ; for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) { if ( SurfB.m_vTria[nTB].nTempPart == 1) { int nNewVert[3] ; - for ( int nV = 0 ; nV < 3 ; ++ nV) { + for ( int nV = 0 ; nV < 3 ; ++ nV) nNewVert[nV] = AddVertex( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[nV]].ptP) ; - } + if ( nPrevMaxTFlag == m_nMaxTFlag) ++ m_nMaxTFlag ; AddTriangle( nNewVert, m_nMaxTFlag) ; } } + // sistemazioni varie bool bOk = ( AdjustVertices() && DoCompacting()) ; - bool bModified = false ; bOk = bOk && RemoveDoubleTriangles( bModified) ; if ( bModified) bOk = bOk && ( AdjustVertices() && DoCompacting()) ; - bOk = bOk && RemoveTJunctions( bModified) ; if ( bModified) bOk = bOk && ( AdjustVertices() && DoCompacting()) ; + // rimuovo tutte le parti esterne all'intersezione + int nParts = GetPartCount() ; + if ( nParts > 1) { + for ( int i = 0 ; i < nParts ; ++ i) { + // recupero i triangoli della stessa Part + INTVECTOR vTriaPart ; + for ( int j = 0 ; j < int( m_vTria.size()) ; ++ j) + if ( m_vTria[j].nPart == i) + vTriaPart.push_back( j) ; + // controllo se il loro box interferisce con il box della superficie B + bool bErasePart = true ; + for ( int j = 0 ; j < int( vTriaPart.size()) && bErasePart ; ++ j) { + // Se il triangolo A non è valido, continuo + Triangle3d Tria ; + if ( ! GetTriangle( j, Tria) || ! Tria.Validate( true)) + continue ; + // Box del triangolo A + BBox3d b3dTriaA ; Tria.GetLocalBBox( b3dTriaA) ; + // Recupero i triangoli di B che interferiscono col box del triangolo di A + INTVECTOR vNearTria ; SurfB.GetAllTriaOverlapBox( b3dTriaA, vNearTria) ; + bErasePart = int( vNearTria.size() == 0) ; + } + if ( bErasePart) + RemovePart( i) ; + } + } + + // scalo alle dimensioni originali Scale( frScalingRef, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE) ; if ( ! SimplifyFacets())