Salome HOME
Fix smesh/imps_09/K0
authoreap <eap@opencascade.com>
Fri, 11 Oct 2019 16:13:54 +0000 (19:13 +0300)
committereap <eap@opencascade.com>
Fri, 11 Oct 2019 16:13:54 +0000 (19:13 +0300)
  Fix for zero-width slot

src/SMESHUtils/SMESH_Slot.cxx
src/SMESHUtils/SMESH_Triangulate.cxx

index feba809a8aec6cbd353cfb45b6046de108222022..b17225edc7a83dac24011fee79b042f2826fdecc 100644 (file)
@@ -153,7 +153,12 @@ namespace
                 if ( myCuts[ iC1 ][ iP1 ].SquareDistance( myCuts[ iC2 ][ iP2 ]) < tol * tol )
                 {
                   nbShared += 2;
-                  isSharedPnt[ i1 ] = isSharedPnt[ i2 ] = true;
+                  if ( myCuts[ iC1 ][ 0 ].SquareDistance( myCuts[ iC1 ][ 1 ]) < tol * tol )
+                    isSharedPnt[ iC1 * 2 ] = isSharedPnt[ iC1 * 2 + 1 ] = true;
+                  else if ( myCuts[ iC2 ][ 0 ].SquareDistance( myCuts[ iC2 ][ 1 ]) < tol * tol )
+                    isSharedPnt[ iC2 * 2 ] = isSharedPnt[ iC2 * 2 + 1 ] = true;
+                  else
+                    isSharedPnt[ i1 ] = isSharedPnt[ i2 ] = true;
                 }
               }
           }
@@ -565,6 +570,7 @@ SMESH_MeshAlgos::MakeSlot( SMDS_ElemIteratorPtr             theSegmentIt,
   // ---------------------------------
 
   const double tol = Precision::Confusion();
+  const double angularTol = 1e-5;
   std::vector< gp_XYZ > faceNormals;
   SMESH_MeshAlgos::Intersector meshIntersector( theMesh, tol, faceNormals );
   std::unique_ptr< SMESH_ElementSearcher> faceSearcher;
@@ -725,7 +731,7 @@ SMESH_MeshAlgos::MakeSlot( SMDS_ElemIteratorPtr             theSegmentIt,
           if ( intPoints.size() == 2 )
             toCut = true;
           else if ( isCylinderOnFace )
-            toCut = cylAxis.Direction().IsParallel( edegDir, tol );
+            toCut = cylAxis.Direction().IsParallel( edegDir, angularTol );
           else
           {
             SMESH_NodeXYZ nBetween;
index 6a60211c66a7edf6b812334a7e6455d9721c25c0..20a716823924b7f48232fbd585db648d3591e036 100644 (file)
@@ -350,7 +350,7 @@ bool Triangulate::triangulate( std::vector< const SMDS_MeshNode*>& nodes,
   // connect nodes into a ring
   _pv.resize( nbNodes );
   for ( size_t i = 1; i < nbNodes; ++i )
-    _pv[i-1].SetNodeAndNext( nodes[i-1], _pv[i], i-1 );
+    _pv[i-1].SetNodeAndNext( nodes[i-1], _pv[i], /*index=*/i-1 );
   _pv[ nbNodes-1 ].SetNodeAndNext( nodes[ nbNodes-1 ], _pv[0], nbNodes-1 );
 
   // assure correctness of PolyVertex::_index as a node can encounter more than once
@@ -383,17 +383,23 @@ bool Triangulate::triangulate( std::vector< const SMDS_MeshNode*>& nodes,
   catch ( Standard_Failure ) {
     return false;
   }
+  double factor = 1.0, modulus = normal.Modulus();
+  if ( modulus < 1e-2 )
+    factor = 1. / sqrt( modulus );
   for ( size_t i = 0; i < nbNodes; ++i )
   {
     gp_XYZ p = _pv[i]._nxyz - p0;
-    _pv[i]._xy.SetX( axes.XDirection().XYZ() * p );
-    _pv[i]._xy.SetY( axes.YDirection().XYZ() * p );
+    _pv[i]._xy.SetX( axes.XDirection().XYZ() * p * factor);
+    _pv[i]._xy.SetY( axes.YDirection().XYZ() * p * factor );
   }
 
   // compute minimal triangle area
   double sumArea = 0;
-  for ( size_t i = 0; i < nbNodes; ++i )
-    sumArea += _pv[i].TriaArea();
+  if ( factor == 1.0 )
+    sumArea = modulus;
+  else
+    for ( size_t i = 0; i < nbNodes; ++i )
+      sumArea += _pv[i].TriaArea();
   const double minArea = 1e-6 * sumArea / ( nbNodes - 2 );
 
   // in a loop, find triangles with positive area and having no vertices inside