-// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021 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
// Author : Edward AGAPOV (eap)
#include "SMESH_Delaunay.hxx"
+
+#include "SMESH_Comment.hxx"
+#include "SMESH_File.hxx"
#include "SMESH_MeshAlgos.hxx"
#include <BRepAdaptor_Surface.hxx>
#include <BRepMesh_Delaun.hxx>
+#include <Basics_OCCTVersion.hxx>
+
//================================================================================
/*!
* \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
*/
//================================================================================
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();
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;
}
_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 )
{
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;
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 )
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;
}
}
}
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 nbBndNodes = _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 < nbBndNodes &&
+ nodeIDs[1]-1 < nbBndNodes &&
+ nodeIDs[2]-1 < nbBndNodes )
+ 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 < nbBndNodes &&
+ nodeIDs[1]-1 < nbBndNodes &&
+ nodeIDs[2]-1 < nbBndNodes )
+ return &tria;
+ }
+ }
+ }
+ return 0;
}
//================================================================================
}
}
}
+
+//================================================================================
+/*!
+ * \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];
+ const char* dofName[] = { "Free",
+ "InVolume",
+ "OnSurface",
+ "OnCurve",
+ "Fixed",
+ "Frontier",
+ "Deleted" };
+ text << "# nb elements = " << _triaDS->NbElements() << endl;
+ std::vector< int > deletedElems;
+ for ( int i = 0; i < _triaDS->NbElements(); ++i )
+ {
+ const BRepMesh_Triangle& t = _triaDS->GetElement( i+1 );
+ if ( t.Movability() == BRepMesh_Deleted )
+ deletedElems.push_back( i+1 );
+ // continue;
+ _triaDS->ElementNodes( t, nodeIDs );
+ text << "mesh.AddFace([ " << nodeIDs[0] << ", " << nodeIDs[1] << ", " << nodeIDs[2] << " ]) # "
+ << dofName[ t.Movability() ] << endl;
+ }
+ text << "mesh.MakeGroupByIds( 'deleted elements', SMESH.FACE, [";
+ for ( int id : deletedElems )
+ text << id << ",";
+ text << "])" << 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())";
+}