X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FStdMeshers%2FStdMeshers_Import_1D2D.cxx;h=6aff7c2078072f33b097a32f716a5e43b500b2fe;hb=b0a908c0d20341651771d0249fb10882f54b2aad;hp=f76bb996e9824711b957ae2e2120329cffa39c48;hpb=8df43f2a70500bf1538af878518a9d9dcd456c58;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_Import_1D2D.cxx b/src/StdMeshers/StdMeshers_Import_1D2D.cxx index f76bb996e..6aff7c207 100644 --- a/src/StdMeshers/StdMeshers_Import_1D2D.cxx +++ b/src/StdMeshers/StdMeshers_Import_1D2D.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 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 @@ -6,7 +6,7 @@ // 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. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -38,6 +38,7 @@ #include "SMESH_Group.hxx" #include "SMESH_Mesh.hxx" #include "SMESH_MesherHelper.hxx" +#include "SMESH_OctreeNode.hxx" #include "SMESH_subMesh.hxx" #include "Utils_SALOME_Exception.hxx" @@ -191,9 +192,10 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & set subShapeIDs; subShapeIDs.insert( shapeID ); - // get nodes on vertices - list < SMESH_TNodeXYZ > vertexNodes; - list < SMESH_TNodeXYZ >::iterator vNIt; + // nodes already existing on sub-shapes of the FACE + TIDSortedNodeSet existingNodes; + + // get/make nodes on vertices and add them to existingNodes TopExp_Explorer exp( theShape, TopAbs_VERTEX ); for ( ; exp.More(); exp.Next() ) { @@ -207,14 +209,28 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & n = SMESH_Algo::VertexNode( v, tgtMesh ); if ( !n ) return false; // very strange } - vertexNodes.push_back( SMESH_TNodeXYZ( n )); + existingNodes.insert( n ); } - // get EDGESs and their ids + // get EDGESs and their ids and get existing nodes on EDGEs vector< TopoDS_Edge > edges; for ( exp.Init( theShape, TopAbs_EDGE ); exp.More(); exp.Next() ) - if ( subShapeIDs.insert( tgtMesh->ShapeToIndex( exp.Current() )).second ) - edges.push_back( TopoDS::Edge( exp.Current() )); + { + const TopoDS_Edge & edge = TopoDS::Edge( exp.Current() ); + if ( !SMESH_Algo::isDegenerated( edge )) + if ( subShapeIDs.insert( tgtMesh->ShapeToIndex( edge )).second ) + { + edges.push_back( edge ); + if ( SMESHDS_SubMesh* eSM = tgtMesh->MeshElements( edge )) + { + typedef SMDS_StdIterator< const SMDS_MeshNode*, SMDS_NodeIteratorPtr > iterator; + existingNodes.insert( iterator( eSM->GetNodes() ), iterator() ); + } + } + } + // octree to find existing nodes + SMESH_OctreeNode existingNodeOcTr( existingNodes ); + std::map dist2foundNodes; // to count now many times a link between nodes encounters map linkCount; @@ -262,14 +278,10 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & } else { - // find an existing vertex node - for ( vNIt = vertexNodes.begin(); vNIt != vertexNodes.end(); ++vNIt) - if ( vNIt->SquareDistance( *node ) < groupTol * groupTol) - { - (*n2nIt).second = vNIt->_node; - vertexNodes.erase( vNIt ); - break; - } + // find a pre-existing node + dist2foundNodes.clear(); + if ( existingNodeOcTr.NodesAround( SMESH_TNodeXYZ( *node ), dist2foundNodes, groupTol )) + (*n2nIt).second = dist2foundNodes.begin()->second; } if ( !n2nIt->second ) { @@ -412,7 +424,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & // duplicated node on vertex return error("Source elements overlap one another"); tgtFaceSM->RemoveNode( n, /*isNodeDeleted=*/false ); - tgtMesh->SetNodeOnEdge( (SMDS_MeshNode*)n, edges[iE], u ); + tgtMesh->SetNodeOnEdge( n, edges[iE], u ); break; } nodesOnBoundary = subShapeIDs.count( n->getshapeId()); @@ -501,7 +513,7 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & int sId = editor.FindShape( edge ); nbEdges += subShapeIDs.count( sId ); } - if ( nbEdges < 2 ) + if ( nbEdges < 2 && !helper.IsRealSeam( s )) return false; // weird if ( nbEdges > 2 ) return error( COMPERR_BAD_INPUT_MESH, "Source elements overlap one another"); @@ -589,8 +601,8 @@ bool StdMeshers_Import_1D2D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & for ( size_t iE = 0; iE < edges.size(); ++iE ) { SMESH_subMesh * sm = theMesh.GetSubMesh( edges[iE] ); - if ( BRep_Tool::Degenerated( edges[iE] )) - sm->SetIsAlwaysComputed( true ); + // if ( SMESH_Algo::isDegenerated( edges[iE] )) + // sm->SetIsAlwaysComputed( true ); sm->ComputeStateEngine(SMESH_subMesh::CHECK_COMPUTE_STATE); if ( sm->GetComputeState() != SMESH_subMesh::COMPUTE_OK ) return error(SMESH_Comment("Failed to create segments on the edge ")