+//================================================================================
+/*!
+ * \brief Divide a curve into equal segments
+ */
+//================================================================================
+
+bool StdMeshers_Regular_1D::divideIntoEqualSegments( SMESH_Mesh & theMesh,
+ Adaptor3d_Curve & theC3d,
+ smIdType theNbPoints,
+ double theTol,
+ double theLength,
+ double theFirstU,
+ double theLastU,
+ std::list<double> & theParameters )
+{
+ bool ok = false;
+ if ( theNbPoints < IntegerLast() )
+ {
+ int nbPnt = FromSmIdType<int>( theNbPoints );
+ GCPnts_UniformAbscissa discret(theC3d, nbPnt, theFirstU, theLastU, theTol );
+ if ( !discret.IsDone() )
+ return error( "GCPnts_UniformAbscissa failed");
+ if ( discret.NbPoints() < nbPnt )
+ discret.Initialize(theC3d, nbPnt + 1, theFirstU, theLastU, theTol );
+
+ int nbPoints = Min( discret.NbPoints(), nbPnt );
+ for ( int i = 2; i < nbPoints; i++ ) // skip 1st and last points
+ {
+ double param = discret.Parameter(i);
+ theParameters.push_back( param );
+ }
+ ok = true;
+ }
+ else // huge nb segments
+ {
+ // use FIXED_POINTS_1D method
+ StdMeshers_FixedPoints1D fixedPointsHyp( GetGen()->GetANewId(), GetGen() );
+ _fpHyp = &fixedPointsHyp;
+ std::vector<double> params = { 0., 1. };
+ std::vector<smIdType> nbSegs = { theNbPoints - 1 };
+ fixedPointsHyp.SetPoints( params );
+ fixedPointsHyp.SetNbSegments( nbSegs );
+
+ HypothesisType curType = _hypType;
+ _hypType = FIXED_POINTS_1D;
+
+ ok = computeInternalParameters( theMesh, theC3d, theLength, theFirstU, theLastU,
+ theParameters, /*reverse=*/false );
+ _hypType = curType;
+ _fpHyp = 0;
+ }
+ return ok;
+}
+