X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHUtils%2FSMESH_Delaunay.cxx;h=22b1659f44dd33d8db10e6d0c825e991bb83b739;hp=d5bc2f663bd2d24bbcfb24bcbb1a6f83bf5356a7;hb=0fc0831670e27a5611b941c52dc152fd63964515;hpb=f6b5d2f920970263bd4aa50e6ef7116d5c1b1625 diff --git a/src/SMESHUtils/SMESH_Delaunay.cxx b/src/SMESHUtils/SMESH_Delaunay.cxx index d5bc2f663..22b1659f4 100644 --- a/src/SMESHUtils/SMESH_Delaunay.cxx +++ b/src/SMESHUtils/SMESH_Delaunay.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2020 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 @@ -24,18 +24,22 @@ // Author : Edward AGAPOV (eap) #include "SMESH_Delaunay.hxx" + +#include "SMESH_Comment.hxx" +#include "SMESH_File.hxx" #include "SMESH_MeshAlgos.hxx" #include #include +#include + //================================================================================ /*! * \brief Construct a Delaunay triangulation of given boundary nodes * \param [in] boundaryNodes - vector of nodes of a wire * \param [in] face - the face * \param [in] faceID - the face ID - * \param [in] nbNodesToVisit - nb of non-marked nodes on the face */ //================================================================================ @@ -51,6 +55,8 @@ SMESH_Delaunay::SMESH_Delaunay(const std::vector< const UVPtStructVec* > & bound const int nbDiv = 100; const double uRange = surf.LastUParameter() - surf.FirstUParameter(); const double vRange = surf.LastVParameter() - surf.FirstVParameter(); + const double uFixed = surf.FirstUParameter() + 0.5 * uRange; + const double vFixed = surf.FirstVParameter() + 0.5 * vRange; const double dU = uRange / nbDiv; const double dV = vRange / nbDiv; double u = surf.FirstUParameter(), v = surf.FirstVParameter(); @@ -58,10 +64,10 @@ SMESH_Delaunay::SMESH_Delaunay(const std::vector< const UVPtStructVec* > & bound double lenU = 0, lenV = 0; for ( ; u < surf.LastUParameter(); u += dU, v += dV ) { - gp_Pnt p1U = surf.Value( u, surf.FirstVParameter() ); + gp_Pnt p1U = surf.Value( u, vFixed ); lenU += p1U.Distance( p0U ); p0U = p1U; - gp_Pnt p1V = surf.Value( surf.FirstUParameter(), v ); + gp_Pnt p1V = surf.Value( uFixed, v ); lenV += p1V.Distance( p0V ); p0V = p1V; } @@ -79,7 +85,11 @@ SMESH_Delaunay::SMESH_Delaunay(const std::vector< const UVPtStructVec* > & bound _bndNodes.resize( nbP ); // fill boundary points +#if OCC_VERSION_LARGE <= 0x07030000 BRepMesh::Array1OfVertexOfDelaun bndVert( 1, 1 + nbP ); +#else + IMeshData::Array1OfVertexOfDelaun bndVert( 1, 1 + nbP ); +#endif BRepMesh_Vertex v( 0, 0, BRepMesh_Frontier ); for ( size_t iW = 0; iW < boundaryNodes.size(); ++iW ) { @@ -195,6 +205,12 @@ const BRepMesh_Triangle* SMESH_Delaunay::FindTriangle( const gp_XY& bc[0], bc[1] ); if ( bc[0] >= 0 && bc[1] >= 0 && bc[0] + bc[1] <= 1 ) { + if ( _triaDS->GetNode( nodeIDs[0] ).Movability() != BRepMesh_Frontier || + _triaDS->GetNode( nodeIDs[1] ).Movability() != BRepMesh_Frontier || + _triaDS->GetNode( nodeIDs[2] ).Movability() != BRepMesh_Frontier ) + { + return 0; + } bc[2] = 1 - bc[0] - bc[1]; triaNodes[0] = nodeIDs[0] - 1; triaNodes[1] = nodeIDs[1] - 1; @@ -209,7 +225,8 @@ const BRepMesh_Triangle* SMESH_Delaunay::FindTriangle( const gp_XY& gp_XY seg = uv - gc; tria->Edges( linkIDs, ori ); - int triaID = _triaDS->IndexOf( *tria ); + + const BRepMesh_Triangle* prevTria = tria; tria = 0; for ( int i = 0; i < 3; ++i ) @@ -232,8 +249,11 @@ const BRepMesh_Triangle* SMESH_Delaunay::FindTriangle( const gp_XY& double uSeg = ( uv1 - gc ) ^ lin / crossSegLin; if ( 0. <= uSeg && uSeg <= 1. ) { - tria = & _triaDS->GetElement( triIDs.Index( 1 + ( triIDs.Index(1) == triaID ))); - break; + tria = & _triaDS->GetElement( triIDs.Index( 1 )); + if ( tria == prevTria ) + tria = & _triaDS->GetElement( triIDs.Index( 2 )); + if ( tria->Movability() != BRepMesh_Deleted ) + break; } } } @@ -250,10 +270,45 @@ const BRepMesh_Triangle* SMESH_Delaunay::FindTriangle( const gp_XY& const BRepMesh_Triangle* SMESH_Delaunay::GetTriangleNear( int iBndNode ) { - const BRepMesh::ListOfInteger & linkIds = _triaDS->LinksConnectedTo( iBndNode + 1 ); - const BRepMesh_PairOfIndex & triaIds = _triaDS->ElementsConnectedTo( linkIds.First() ); - const BRepMesh_Triangle& tria = _triaDS->GetElement( triaIds.Index(1) ); - return &tria; + if ( iBndNode >= _triaDS->NbNodes() ) + return 0; + int nodeIDs[3]; + int nbNbNodes = _bndNodes.size(); +#if OCC_VERSION_LARGE <= 0x07030000 + typedef BRepMesh::ListOfInteger TLinkList; +#else + typedef IMeshData::ListOfInteger TLinkList; +#endif + const TLinkList & linkIds = _triaDS->LinksConnectedTo( iBndNode + 1 ); + TLinkList::const_iterator iLink = linkIds.cbegin(); + for ( ; iLink != linkIds.cend(); ++iLink ) + { + const BRepMesh_PairOfIndex & triaIds = _triaDS->ElementsConnectedTo( *iLink ); + { + const BRepMesh_Triangle& tria = _triaDS->GetElement( triaIds.Index(1) ); + if ( tria.Movability() != BRepMesh_Deleted ) + { + _triaDS->ElementNodes( tria, nodeIDs ); + if ( nodeIDs[0]-1 < nbNbNodes && + nodeIDs[1]-1 < nbNbNodes && + nodeIDs[2]-1 < nbNbNodes ) + return &tria; + } + } + if ( triaIds.Extent() > 1 ) + { + const BRepMesh_Triangle& tria = _triaDS->GetElement( triaIds.Index(2) ); + if ( tria.Movability() != BRepMesh_Deleted ) + { + _triaDS->ElementNodes( tria, nodeIDs ); + if ( nodeIDs[0]-1 < nbNbNodes && + nodeIDs[1]-1 < nbNbNodes && + nodeIDs[2]-1 < nbNbNodes ) + return &tria; + } + } + } + return 0; } //================================================================================ @@ -294,3 +349,43 @@ void SMESH_Delaunay::addCloseNodes( const SMDS_MeshNode* node, } } } + +//================================================================================ +/*! + * \brief Write a python script that creates an equal mesh in Mesh module + */ +//================================================================================ + +void SMESH_Delaunay::ToPython() const +{ + SMESH_Comment text; + text << "import salome, SMESH\n"; + text << "salome.salome_init()\n"; + text << "from salome.smesh import smeshBuilder\n"; + text << "smesh = smeshBuilder.New()\n"; + text << "mesh=smesh.Mesh()\n"; + const char* endl = "\n"; + + for ( int i = 0; i < _triaDS->NbNodes(); ++i ) + { + const BRepMesh_Vertex& v = _triaDS->GetNode( i+1 ); + text << "mesh.AddNode( " << v.Coord().X() << ", " << v.Coord().Y() << ", 0 )" << endl; + } + + int nodeIDs[3]; + for ( int i = 0; i < _triaDS->NbElements(); ++i ) + { + const BRepMesh_Triangle& t = _triaDS->GetElement( i+1 ); + if ( t.Movability() == BRepMesh_Deleted ) + continue; + _triaDS->ElementNodes( t, nodeIDs ); + text << "mesh.AddFace([ " << nodeIDs[0] << ", " << nodeIDs[1] << ", " << nodeIDs[2] << " ])" << endl; + } + + const char* fileName = "/tmp/Delaunay.py"; + SMESH_File file( fileName, false ); + file.remove(); + file.openForWriting(); + file.write( text.c_str(), text.size() ); + std::cout << "exec(open('" << fileName << "', 'rb').read())"; +}