-// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2019 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
#include "SMESH_HypoFilter.hxx"
#include "SMESH_Mesh.hxx"
#include "SMESH_MeshAlgos.hxx"
+#include "SMESH_MeshEditor.hxx"
#include "SMESH_ProxyMesh.hxx"
#include "SMESH_subMesh.hxx"
namespace {
- inline SMESH_TNodeXYZ XYZ(const SMDS_MeshNode* n) { return SMESH_TNodeXYZ(n); }
+ inline SMESH_NodeXYZ XYZ(const SMDS_MeshNode* n) { return SMESH_NodeXYZ(n); }
enum { U_periodic = 1, V_periodic = 2 };
}
// check that uv is correct
TopLoc_Location loc;
Handle(Geom_Surface) surface = BRep_Tool::Surface( F,loc );
- gp_Pnt nodePnt = XYZ( n ), surfPnt(0,0,0);
+ SMESH_NodeXYZ nXYZ( n );
+ gp_Pnt nodePnt = nXYZ, surfPnt(0,0,0);
double dist = 0;
if ( !loc.IsIdentity() ) nodePnt.Transform( loc.Transformation().Inverted() );
if ( infinit ||
(dist = nodePnt.Distance( surfPnt = surface->Value( uv.X(), uv.Y() ))) > tol )
{
setPosOnShapeValidity( shapeID, false );
- if ( !infinit && distXYZ ) {
- surfPnt.Transform( loc );
- distXYZ[0] = dist;
- distXYZ[1] = surfPnt.X(); distXYZ[2] = surfPnt.Y(); distXYZ[3]=surfPnt.Z();
- }
// uv incorrect, project the node to surface
- GeomAPI_ProjectPointOnSurf& projector = GetProjector( F, loc, tol );
- projector.SetExtremaFlag( Extrema_ExtFlag_MIN );
- projector.Perform( nodePnt );
- if ( !projector.IsDone() || projector.NbPoints() < 1 )
- {
- MESSAGE( "SMESH_MesherHelper::CheckNodeUV() failed to project" );
- return false;
- }
- Standard_Real U,V;
- projector.LowerDistanceParameters(U,V);
- uv.SetCoord( U,V );
- surfPnt = surface->Value( U, V );
- dist = nodePnt.Distance( surfPnt );
+ Handle(ShapeAnalysis_Surface) sprojector = GetSurface( F );
+ uv = sprojector->ValueOfUV( nXYZ, tol ).XY();
+ surfPnt = sprojector->Value( uv );
+ dist = surfPnt.Distance( nXYZ );
if ( distXYZ ) {
- surfPnt.Transform( loc );
distXYZ[0] = dist;
distXYZ[1] = surfPnt.X(); distXYZ[2] = surfPnt.Y(); distXYZ[3]=surfPnt.Z();
}
if ( dist > tol )
{
- Handle(ShapeAnalysis_Surface) sprojector = GetSurface( F );
- uv = sprojector->ValueOfUV( nodePnt, tol ).XY();
- surfPnt = sprojector->Value( uv );
- dist = nodePnt.Distance( surfPnt );
- if ( distXYZ ) {
- surfPnt.Transform( loc );
- distXYZ[0] = dist;
- distXYZ[1] = surfPnt.X(); distXYZ[2] = surfPnt.Y(); distXYZ[3]=surfPnt.Z();
- }
- if ( dist > tol )
- {
- MESSAGE( "SMESH_MesherHelper::CheckNodeUV(), invalid projection" );
- return false;
- }
+ MESSAGE( "SMESH_MesherHelper::CheckNodeUV(), invalid projection" );
+ return false;
}
// store the fixed UV on the face
if ( myShape.IsSame(F) && shapeID == myShapeID && myFixNodeParameters )
const_cast<SMDS_MeshNode*>(n)->SetPosition
- ( SMDS_PositionPtr( new SMDS_FacePosition( U, V )));
+ ( SMDS_PositionPtr( new SMDS_FacePosition( uv.X(), uv.Y() )));
}
else if ( myShape.IsSame(F) && uv.Modulus() > numeric_limits<double>::min() )
{
int vertexID = n->getshapeId();
const TopoDS_Vertex& V = TopoDS::Vertex(meshDS->IndexToShape(vertexID));
param = BRep_Tool::Parameter( V, E );
+
+ if ( inEdgeNode )
+ {
+ BRepAdaptor_Curve curve( E );
+ if ( curve.IsPeriodic() )
+ {
+ double uInEdge = GetNodeU( E, inEdgeNode );
+ param += ShapeAnalysis::AdjustByPeriod( param, uInEdge, curve.Period() );
+ }
+ }
}
}
if ( check )