From aaaf951990acb0cda20bce3607a5445211e2414e Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 22 Apr 2024 10:49:34 +0200 Subject: [PATCH 1/2] =?UTF-8?q?EgtGeomKernel=20:=20-=20aggiunti=20alcuni?= =?UTF-8?q?=20controlli=20sulla=20validit=C3=A0=20dei=20parametri=20in=20C?= =?UTF-8?q?ollision=20Avoid.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CAvToolSurfTm.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CAvToolSurfTm.cpp b/CAvToolSurfTm.cpp index 878ea15..baea710 100644 --- a/CAvToolSurfTm.cpp +++ b/CAvToolSurfTm.cpp @@ -104,6 +104,9 @@ CAvToolSurfTm::TestPosition( const Point3d& ptT, const Vector3d& vtDir, const Ve // Se utensile non definito, errore if ( m_Tool.GetType() == Tool::UNDEF) return false ; + // Se direzioni non definite, errore + if ( vtDir.IsSmall() || vtMove.IsSmall()) + return false ; // Imposto il riferimento di movimento if ( ! AreSameOrOppositeVectorApprox( vtDir, vtMove)) m_frMove.Set( ORIG, vtMove, vtDir) ; @@ -122,6 +125,9 @@ CAvToolSurfTm::TestPath( PNTULIST& lPntM, const Vector3d& vtDir, const Vector3d& // Se utensile non definito, errore if ( m_Tool.GetType() == Tool::UNDEF) return false ; + // Se direzioni non definite, errore + if ( vtDir.IsSmall() || vtMove.IsSmall()) + return false ; // Se lista vuota, non devo fare alcunché if ( lPntM.empty()) return true ; From c0f7eb6727287b012402c0c52c5b50195257df83 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Wed, 24 Apr 2024 09:26:51 +0200 Subject: [PATCH 2/2] EgtGeomKernel : - piccola correzione booleane TriMesh. --- SurfTriMeshBooleans.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index a1310ba..d4e027a 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -76,10 +76,9 @@ SurfTriMesh::DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMA ( nLastOpenLoopPoint == 0 && ( Loop1.size() == 2 || Loop2.size() == 2))) continue ; // la catena aperta non è interna al loop chiuso attuale - // il loop 1 segue sempre la direzione della catena, il loop 2 ha dentro la catena invertita - // Ho sempre che il loop 1 è sempre interno ( la direzione della catena è determinata - // dalla normale dei triangoli che la formano; avendo chimatao la chian senza ammettere inversioni, sono - // curve tutte concordi ) e il loop 2 che è esterno + // il loop 2 segue sempre la direzione della catena, il loop 1 ha dentro la catena invertita + // ( la direzione della catena è determinata dalla normale dei triangoli che la formano; + // avendo chiamato la chain senza ammettere inversioni, sono curve tutte concordi ) bLoopSplitted = true ; // ricostrusico i due loop mediante concatenazione Chain cvCounterChain ; @@ -584,6 +583,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT POLYLINEVECTOR vplPolyVec ; vplPolyVec.resize( cvBoundClosedLoopVec.size()) ; for ( int nLoop = 0 ; nLoop < int( vplPolyVec.size()) ; ++ nLoop) { + for ( int nLine = 0 ; nLine < int( cvBoundClosedLoopVec[nLoop].size()) ; ++ nLine) vplPolyVec[nLoop].AddUPoint( 0., cvBoundClosedLoopVec[nLoop][nLine]) ; @@ -591,7 +591,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT // Assegno ai loop trovati i rispettivi interni // Assumo che i loop interni a uno dei loop creati fino ad'ora siano tutti sullo stesso livello. - // Il caso generale si risolve con una struttura ad albero in cui il nodi corrispondente a un + // Il caso generale si risolve con una struttura ad albero in cui il nodo corrispondente a un // loop è figlio del nodo corrispondente al loop che lo contiene. INTVECTOR vInnerLoop ; for ( int nCLI = 0 ; nCLI < int( cvClosedChain.size()) ; ++ nCLI) { @@ -742,6 +742,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT // se ho più loop, essi descrivono un poligono di n-lati POLYLINEVECTOR vPolygons ; vPolygons.emplace_back( vplPolyVec[nLoop]) ; + for ( int nL = 0 ; nL < int( vInnerLoop.size()) ; ++ nL) { // per ognuno di essi, ricavo la PolyLine dai punti PolyLine CurLoop ; @@ -955,11 +956,22 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT vPolygons.erase( vPolygons.begin() + i) ; else ++ i ; + + } + + bool bCordirectedNormals_intLoop = bCodirectedNormals ; + if ( ! vPolygons.empty()) { + Polygon3d pgPol ; + pgPol.FromPolyLine( vPolygons[0]) ; + // controllo direzioni delle normali + bCordirectedNormals_intLoop = trTria.GetN() * pgPol.GetVersN() > 0. ; + if ( ! bCordirectedNormals_intLoop) + vPolygons[0].Invert() ; } if ( Triangulate().MakeAdvanced( vPolygons, vPt, vTr)) { // Inserisco i nuovi triangoli - for (int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { + for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2]} ; int nNewId[3] = { Surf.AddVertex( vPt[nNewTriaVertId[0]]), Surf.AddVertex( vPt[nNewTriaVertId[1]]), @@ -969,7 +981,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT Surf.m_vTria[nNewTriaNum].nETempFlag[0] = 0 ; Surf.m_vTria[nNewTriaNum].nETempFlag[1] = 0 ; Surf.m_vTria[nNewTriaNum].nETempFlag[2] = 0 ; - if ( bCodirectedNormals) + if ( bCordirectedNormals_intLoop) Surf.m_vTria[nNewTriaNum].nTempPart = 1 ; else Surf.m_vTria[nNewTriaNum].nTempPart = -1 ; @@ -1767,6 +1779,7 @@ SurfTriMesh::Subtract( const ISurfTriMesh& Other) SurfB.Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ; IntersectTriMeshTriangle( SurfB) ; + IdentifyParts() ; SurfB.IdentifyParts() ;