X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Regular_1D.cxx;h=73f11aff59838b56942fbddde96630ed2ad443a3;hb=0460bb60e03d87ed5c65071477c79cc7d2884db3;hp=cc964cfac209d603d8daf2111fc155f82f734529;hpb=63a442b2c3cbc5e2155d83e86dfdb77d6961fab3;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_Regular_1D.cxx b/src/StdMeshers/StdMeshers_Regular_1D.cxx index cc964cfac..73f11aff5 100644 --- a/src/StdMeshers/StdMeshers_Regular_1D.cxx +++ b/src/StdMeshers/StdMeshers_Regular_1D.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 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 @@ -68,6 +68,7 @@ #include using namespace std; +using namespace StdMeshers; //============================================================================= /*! @@ -689,25 +690,28 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh & theMesh, if ( smDS->NbNodes() < 1 ) return true; // 1 segment - vector< double > mainEdgeParams; - if ( ! SMESH_Algo::GetNodeParamOnEdge( theMesh.GetMeshDS(), mainEdge, mainEdgeParams )) + map< double, const SMDS_MeshNode* > mainEdgeParamsOfNodes; + if ( ! SMESH_Algo::GetSortedNodesOnEdge( theMesh.GetMeshDS(), mainEdge, _quadraticMesh, + mainEdgeParamsOfNodes, SMDSAbs_Edge )) return error("Bad node parameters on the source edge of Propagation Of Distribution"); - vector< double > segLen( mainEdgeParams.size() - 1 ); + vector< double > segLen( mainEdgeParamsOfNodes.size() - 1 ); double totalLen = 0; BRepAdaptor_Curve mainEdgeCurve( mainEdge ); - for ( size_t i = 1; i < mainEdgeParams.size(); ++i ) + map< double, const SMDS_MeshNode* >::iterator + u_n2 = mainEdgeParamsOfNodes.begin(), u_n1 = u_n2++; + for ( size_t i = 1; i < mainEdgeParamsOfNodes.size(); ++i, ++u_n1, ++u_n2 ) { segLen[ i-1 ] = GCPnts_AbscissaPoint::Length( mainEdgeCurve, - mainEdgeParams[i-1], - mainEdgeParams[i]); + u_n1->first, + u_n2->first); totalLen += segLen[ i-1 ]; } for ( size_t i = 0; i < segLen.size(); ++i ) segLen[ i ] *= theLength / totalLen; - size_t iSeg = theReverse ? segLen.size()-1 : 0; - size_t dSeg = theReverse ? -1 : +1; + size_t iSeg = theReverse ? segLen.size()-1 : 0; + size_t dSeg = theReverse ? -1 : +1; double param = theFirstU; int nbParams = 0; for ( int i = 0, nb = segLen.size()-1; i < nb; ++i, iSeg += dSeg ) @@ -967,13 +971,13 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh & theMesh, { if ( Abs( param - Un ) < 0.2 * Abs( param - theParams.back() )) { - compensateError( a1, eltSize, U1, Un, theLength, theC3d, theParams ); + compensateError( a1, Abs(eltSize), U1, Un, theLength, theC3d, theParams ); } else if ( Abs( Un - theParams.back() ) < - 0.2 * Abs( theParams.back() - *(--theParams.rbegin()))) + 0.2 * Abs( theParams.back() - *(++theParams.rbegin()))) { theParams.pop_back(); - compensateError( a1, an, U1, Un, theLength, theC3d, theParams ); + compensateError( a1, Abs(an), U1, Un, theLength, theC3d, theParams ); } } if (theReverse) theParams.reverse(); // NPAL18025 @@ -1169,10 +1173,13 @@ bool StdMeshers_Regular_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & t } if ( !_mainEdge.IsNull() ) { // take into account reversing the edge the hypothesis is propagated from + // (_mainEdge.Orientation() marks mutual orientation of EDGEs in propagation chain) reversed = ( _mainEdge.Orientation() == TopAbs_REVERSED ); - int mainID = meshDS->ShapeToIndex(_mainEdge); - if ( std::find( _revEdgesIDs.begin(), _revEdgesIDs.end(), mainID) != _revEdgesIDs.end()) - reversed = !reversed; + if ( !_isPropagOfDistribution ) { + int mainID = meshDS->ShapeToIndex(_mainEdge); + if ( std::find( _revEdgesIDs.begin(), _revEdgesIDs.end(), mainID) != _revEdgesIDs.end()) + reversed = !reversed; + } } // take into account this edge reversing if ( std::find( _revEdgesIDs.begin(), _revEdgesIDs.end(), shapeID) != _revEdgesIDs.end())