-// Copyright (C) 2018-2019 OPEN CASCADE
+// Copyright (C) 2018-2022 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
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;
}
}
}
*/
//================================================================================
- 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 )
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 )
//================================================================================
/*!
* \brief Create a slot of given width around given 1D elements lying on a triangle mesh.
- * The slot is consrtucted by cutting faces by cylindrical surfaces made around each segment.
+ * The slot is constructed by cutting faces by cylindrical surfaces made around each segment.
* \return Edges located at the slot boundary
*/
//================================================================================
// ---------------------------------
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;
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);
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;
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 )
// 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,