Salome HOME
bos #20256: [CEA 18523] Porting SMESH to int 64 bits
[modules/smesh.git] / src / SMESHUtils / SMESH_Slot.cxx
index feba809a8aec6cbd353cfb45b6046de108222022..222cf293592aa8c4fcc6e996febeeb4cb028e13b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2018-2019  OPEN CASCADE
+// Copyright (C) 2018-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -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;
                 }
               }
           }
@@ -375,10 +380,10 @@ namespace
    */
   //================================================================================
 
-  void findGroups( const SMDS_MeshElement *                theFace,
-                   TGroupVec &                             theGroupsToUpdate,
-                   NCollection_DataMap< int, TGroupVec > & theFaceID2Groups,
-                   TGroupVec &                             theWorkGroups )
+  void findGroups( const SMDS_MeshElement *                                 theFace,
+                   TGroupVec &                                              theGroupsToUpdate,
+                   NCollection_DataMap< smIdType, TGroupVec, smIdHasher > & theFaceID2Groups,
+                   TGroupVec &                                              theWorkGroups )
   {
     theWorkGroups.clear();
     for ( size_t i = 0; i < theGroupsToUpdate.size(); ++i )
@@ -478,7 +483,7 @@ namespace
 
   const Segment* findTooCloseSegment( const IntPoint&        p,
                                       const double           minDist,
-                                      const double           tol,
+                                      const double           /*tol*/,
                                       const Segment*         curSegment,
                                       const SMDS_MeshNode*   curNode,
                                       const TSegmentsOfNode& segmentsOfNode )
@@ -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;
@@ -577,7 +583,7 @@ SMESH_MeshAlgos::MakeSlot( SMDS_ElemIteratorPtr             theSegmentIt,
   std::vector< SMESH_NodeXYZ > facePoints(4);
   std::vector< Intersector::TFace > cutFacePoints;
 
-  NCollection_DataMap< int, TGroupVec > faceID2Groups;
+  NCollection_DataMap< smIdType, TGroupVec, smIdHasher > faceID2Groups;
   TGroupVec groupVec;
 
   std::vector< gp_Ax1 > planeNormalVec(2);
@@ -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;
@@ -800,10 +806,10 @@ SMESH_MeshAlgos::MakeSlot( SMDS_ElemIteratorPtr             theSegmentIt,
           isOut( intPnt[1].myNode, planeNormal, intPnt[1].myIsOutPln, 1 );
           const Segment * closeSeg[2] = { 0, 0 };
           if ( intPnt[0].myIsOutPln[0] )
-            closeSeg[0] = findTooCloseSegment( intPnt[0], 0.5 * theWidth - tol, tol,
+            closeSeg[0] = findTooCloseSegment( intPnt[0], 0.5 * theWidth - 1e-3*tol, tol,
                                                segment, n1, segmentsOfNode );
           if ( intPnt[1].myIsOutPln[0] )
-            closeSeg[1] = findTooCloseSegment( intPnt[1], 0.5 * theWidth - tol, tol,
+            closeSeg[1] = findTooCloseSegment( intPnt[1], 0.5 * theWidth - 1e-3*tol, tol,
                                                segment, n1, segmentsOfNode );
           int nbCut = bool( closeSeg[0] ) + bool( closeSeg[1] );
           if ( nbCut == 0 )
@@ -830,20 +836,22 @@ SMESH_MeshAlgos::MakeSlot( SMDS_ElemIteratorPtr             theSegmentIt,
             // 2)
             double minCutDist = theWidth;
             gp_XYZ projection, closestProj;
-            int    iCut;
-            for ( size_t iC = 0; iC < closeSeg[iP]->myCuts.size(); ++iC )
+            int    iCut = -1;
+            for ( size_t iC2 = 0; iC2 < closeSeg[iP]->myCuts.size(); ++iC2 )
             {
-              double cutDist = closeSeg[iP]->myCuts[iC].SquareDistance( intPnt[iP].myNode,
+              double cutDist = closeSeg[iP]->myCuts[iC2].SquareDistance( intPnt[iP].myNode,
                                                                         projection );
               if ( cutDist < minCutDist )
               {
                 closestProj = projection;
                 minCutDist  = cutDist;
-                iCut        = iC;
+                iCut        = iC2;
+                if ( minCutDist < tol * tol )
+                  break;
               }
-              if ( minCutDist < tol * tol )
-                break;
             }
+            if ( iCut < 0 )
+              continue; // ???
             double d1 = SMESH_MeshAlgos::GetDistance( neighborSeg->myEdge,
                                                       closeSeg[iP]->myCuts[iCut][0].myNode );
             double d2 = SMESH_MeshAlgos::GetDistance( neighborSeg->myEdge,