X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Regular_1D.cxx;h=413a9249439750c71c91cc85d961dfc3a2a1935c;hb=7d08ac8481b4a92dcad8fe4a3ea88956856dea15;hp=da5abc3ecb096f0562999b5ecf6d89ec31139633;hpb=6bac08c1a81f34d3f21c550bd92f83654b2546a5;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_Regular_1D.cxx b/src/StdMeshers/StdMeshers_Regular_1D.cxx index da5abc3ec..413a92494 100644 --- a/src/StdMeshers/StdMeshers_Regular_1D.cxx +++ b/src/StdMeshers/StdMeshers_Regular_1D.cxx @@ -343,9 +343,9 @@ bool StdMeshers_Regular_1D::CheckHypothesis( SMESH_Mesh& aMesh, return ( aStatus == SMESH_Hypothesis::HYP_OK ); } -static bool computeParamByFunc(Adaptor3d_Curve& C3d, double first, double last, - double length, bool theReverse, - int nbSeg, Function& func, +static bool computeParamByFunc(Adaptor3d_Curve& C3d, + double first, double last, double length, + bool theReverse, int nbSeg, Function& func, list& theParams) { // never do this way @@ -359,31 +359,23 @@ static bool computeParamByFunc(Adaptor3d_Curve& C3d, double first, double last, int nbPnt = 1 + nbSeg; vector x(nbPnt, 0.); - if (!buildDistribution(func, 0.0, 1.0, nbSeg, x, 1E-4)) + if ( !buildDistribution( func, 0.0, 1.0, nbSeg, x, 1E-4 )) return false; - MESSAGE( "Points:\n" ); - char buf[1024]; - for ( int i=0; i<=nbSeg; i++ ) - { - sprintf( buf, "%f\n", float(x[i] ) ); - MESSAGE( buf ); - } - - - // apply parameters in range [0,1] to the space of the curve double prevU = first; - double sign = 1.; - if (theReverse) + double sign = 1.; + if ( theReverse ) { prevU = last; - sign = -1.; + sign = -1.; } - for( int i = 1; i < nbSeg; i++ ) + + for ( int i = 1; i < nbSeg; i++ ) { double curvLength = length * (x[i] - x[i-1]) * sign; - GCPnts_AbscissaPoint Discret( C3d, curvLength, prevU ); + double tol = Min( Precision::Confusion(), curvLength / 100. ); + GCPnts_AbscissaPoint Discret( tol, C3d, curvLength, prevU ); if ( !Discret.IsDone() ) return false; double U = Discret.Parameter(); @@ -690,27 +682,30 @@ 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; + size_t nbParams = 0; for ( int i = 0, nb = segLen.size()-1; i < nb; ++i, iSeg += dSeg ) { GCPnts_AbscissaPoint Discret( theC3d, segLen[ iSeg ], param ); @@ -985,9 +980,9 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh & theMesh, case FIXED_POINTS_1D: { const std::vector& aPnts = _fpHyp->GetPoints(); const std::vector& nbsegs = _fpHyp->GetNbSegments(); - int i = 0; TColStd_SequenceOfReal Params; - for(; i0.9999 ) continue; int j=1; bool IsExist = false; @@ -1011,8 +1006,9 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh & theMesh, } double eltSize, segmentSize = 0.; double currAbscissa = 0; - for(i=0; i nbsegs.size()-1 ) ? nbsegs[0] : nbsegs[i]; + for ( int i = 0; i < Params.Length(); i++ ) + { + int nbseg = ( i > (int)nbsegs.size()-1 ) ? nbsegs[0] : nbsegs[i]; segmentSize = Params.Value(i+1)*theLength - currAbscissa; currAbscissa += segmentSize; GCPnts_AbscissaPoint APnt(theC3d, sign*segmentSize, par1); @@ -1049,7 +1045,7 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh & theMesh, par1 = par2; } // add for last - int nbseg = ( nbsegs.size() > Params.Length() ) ? nbsegs[Params.Length()] : nbsegs[0]; + int nbseg = ( (int)nbsegs.size() > Params.Length() ) ? nbsegs[Params.Length()] : nbsegs[0]; segmentSize = theLength - currAbscissa; eltSize = segmentSize/nbseg; GCPnts_UniformAbscissa Discret;