+ // Extend nodeDataVec by a node located at the end of not shared _LayerEdge
+ /* n - to add to nodeDataVec
+ * o-----o---
+ * |\ |
+ * | o---o---
+ * | |x--x--- L2
+ * | /
+ * |/ L
+ * x
+ * / */
+ for ( int isR = 0; isR < 2; ++isR )
+ {
+ _PolyLine& L2 = *( isR ? L._rightLine : L._leftLine ); // line with layers
+ if ( ! L2._advancable || L.IsCommonEdgeShared( L2 ) )
+ continue;
+ vector< const SMDS_MeshNode* >& layerNodes2 = isR ? L2._leftNodes : L2._rightNodes;
+ _LayerEdge& LE2 = isR ? L2._lEdges.front() : L2._lEdges.back();
+ if ( layerNodes2.empty() )
+ {
+ // refine the not shared _LayerEdge
+ vector<double> layersHeight;
+ calcLayersHeight( LE2._length2D, layersHeight );
+
+ vector<gp_XY>& nodeUV2 = LE2._uvRefined;
+ nodeUV2.resize ( _hyp->GetNumberLayers() );
+ layerNodes2.resize( _hyp->GetNumberLayers() );
+ for ( size_t i = 0; i < layersHeight.size(); ++i )
+ {
+ gp_XY uv = LE2._uvOut + LE2._normal2D * layersHeight[i];
+ gp_Pnt p = _surface->Value( uv.X(), uv.Y() );
+ nodeUV2 [ i ] = uv;
+ layerNodes2[ i ] = _helper.AddNode( p.X(), p.Y(), p.Z(), /*id=*/0, uv.X(), uv.Y() );
+ }
+ }
+ UVPtStruct ptOfNode;
+ ptOfNode.u = LE2._uvRefined.back().X();
+ ptOfNode.v = LE2._uvRefined.back().Y();
+ ptOfNode.node = layerNodes2.back();
+ ptOfNode.param = isR ? ul : uf;
+ ptOfNode.normParam = isR ? 1 : 0;
+
+ nodeDataVec.insert(( isR ? nodeDataVec.end() : nodeDataVec.begin() ), ptOfNode );
+
+ // recompute normParam of nodes in nodeDataVec
+ newLength = GCPnts_AbscissaPoint::Length( curve,
+ nodeDataVec.front().param,
+ nodeDataVec.back().param);
+ for ( size_t iP = 1; iP < nodeDataVec.size(); ++iP )
+ {
+ const double len = GCPnts_AbscissaPoint::Length( curve,
+ nodeDataVec.front().param,
+ nodeDataVec[iP].param );
+ nodeDataVec[iP].normParam = len / newLength;
+ }
+ }
+