-// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// SMESH SMESH : implementaion of SMESH idl descriptions
#include <TopoDS_Compound.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Vertex.hxx>
+#include <Precision.hxx>
#include <numeric>
subShapeIDs.insert( shapeID );
// get nodes on vertices
- list < SMESH_MeshEditor::TNodeXYZ > vertexNodes;
- list < SMESH_MeshEditor::TNodeXYZ >::iterator vNIt;
+ list < SMESH_TNodeXYZ > vertexNodes;
+ list < SMESH_TNodeXYZ >::iterator vNIt;
TopExp_Explorer exp( theShape, TopAbs_VERTEX );
for ( ; exp.More(); exp.Next() )
{
n = SMESH_Algo::VertexNode( v, tgtMesh );
if ( !n ) return false; // very strange
}
- vertexNodes.push_back( SMESH_MeshEditor::TNodeXYZ( n ));
+ vertexNodes.push_back( SMESH_TNodeXYZ( n ));
}
// to count now many times a link between nodes encounters
map<TLink, int> linkCount;
map<TLink, int>::iterator link2Nb;
+ double minLinkLen2 = Precision::Infinite();
// =========================
// Import faces from groups
SMDS_ElemIteratorPtr srcElems = srcGroup->GetElements();
SMDS_MeshNode *tmpNode = helper.AddNode(0,0,0);
- gp_XY uv;
+ gp_XY uv( Precision::Infinite(), Precision::Infinite() );
while ( srcElems->more() ) // loop on group contents
{
const SMDS_MeshElement* face = srcElems->next();
SMDS_MeshElement::iterator node = face->begin_nodes();
for ( unsigned i = 0; i < newNodes.size(); ++i, ++node )
{
- TNodeNodeMap::iterator n2nIt = n2n->insert( make_pair( *node, (SMDS_MeshNode*)0 )).first;
+ StdMeshers_Import_1D::TNodeNodeMap::iterator n2nIt = n2n->insert( make_pair( *node, (SMDS_MeshNode*)0 )).first;
if ( n2nIt->second )
{
if ( !subShapeIDs.count( n2nIt->second->getshapeId() ))
int iNext = helper.WrapIndex( iNode+1, face->NbCornerNodes() );
int iPrev = helper.WrapIndex( iNode-1, face->NbCornerNodes() );
- SMESH_MeshEditor::TNodeXYZ prevNode( newNodes[iPrev] );
- SMESH_MeshEditor::TNodeXYZ curNode ( newNodes[iNode] );
- SMESH_MeshEditor::TNodeXYZ nextNode( newNodes[iNext] );
+ SMESH_TNodeXYZ prevNode( newNodes[iPrev] );
+ SMESH_TNodeXYZ curNode ( newNodes[iNode] );
+ SMESH_TNodeXYZ nextNode( newNodes[iNext] );
gp_Vec n1n0( prevNode - curNode);
gp_Vec n1n2( nextNode - curNode );
gp_Vec meshNorm = n1n2 ^ n1n0;
medium = newNodes[i+nbNodes];
link2Nb = linkCount.insert( make_pair( TLink( n1, n2, medium ), 0)).first;
++link2Nb->second;
+ if ( link2Nb->second == 1 )
+ {
+ // measure link length
+ double len2 = SMESH_TNodeXYZ( n1 ).SquareDistance( n2 );
+ if ( len2 < minLinkLen2 )
+ minLinkLen2 = len2;
+ }
}
}
helper.GetMeshDS()->RemoveNode(tmpNode);
if ( subShapeIDs.insert( tgtMesh->ShapeToIndex( exp.Current() )).second )
edges.push_back( TopoDS::Edge( exp.Current() ));
+ // use large tolerance for projection of nodes to edges because of
+ // BLSURF mesher specifics (issue 0020918, Study2.hdf)
+ const double projTol = 1e-3 * sqrt( minLinkLen2 );
+
bool isFaceMeshed = false;
if ( SMESHDS_SubMesh* tgtSM = tgtMesh->MeshElements( theShape ))
{
if ( !subShapeIDs.count( n->getshapeId() ))
{
for ( unsigned iE = 0; iE < edges.size(); ++iE )
- if ( helper.CheckNodeU( edges[iE], n, u, 10 * faceTol, /*force=*/true ))
+ if ( helper.CheckNodeU( edges[iE], n, u=0, projTol, /*force=*/true ))
{
BRep_Tool::Range(edges[iE],f,l);
if ( Abs(u-f) < 2 * faceTol || Abs(u-l) < 2 * faceTol )
else
{
// std-like iterator used to get coordinates of nodes of mesh element
- typedef SMDS_StdIterator< SMESH_MeshEditor::TNodeXYZ, SMDS_ElemIteratorPtr > TXyzIterator;
+ typedef SMDS_StdIterator< SMESH_TNodeXYZ, SMDS_ElemIteratorPtr > TXyzIterator;
SMESH_MesherHelper helper(theMesh);
helper.SetSubShape(theShape);