+
+//================================================================================
+/*!
+ * \brief Costructor of TPCurveOnHorFaceAdaptor fills its map of
+ * normalized parameter to node UV on a horizontal face
+ * \param [in] sideFace - lateral prism side
+ * \param [in] isTop - is \a horFace top or bottom of the prism
+ * \param [in] horFace - top or bottom face of the prism
+ */
+//================================================================================
+
+StdMeshers_PrismAsBlock::
+TPCurveOnHorFaceAdaptor::TPCurveOnHorFaceAdaptor( const TSideFace* sideFace,
+ const bool isTop,
+ const TopoDS_Face& horFace)
+{
+ if ( sideFace && !horFace.IsNull() )
+ {
+ //cout << "\n\t FACE " << sideFace->FaceID() << endl;
+ const int Z = isTop ? sideFace->ColumnHeight() - 1 : 0;
+ map<double, const SMDS_MeshNode* > u2nodes;
+ sideFace->GetNodesAtZ( Z, u2nodes );
+
+ SMESH_MesherHelper helper( *sideFace->GetMesh() );
+ helper.SetSubShape( horFace );
+
+ bool okUV;
+ gp_XY uv;
+ double f,l;
+ Handle(Geom2d_Curve) C2d;
+ int edgeID = -1;
+ const double tol = 10 * helper.MaxTolerance( horFace );
+ const SMDS_MeshNode* prevNode = u2nodes.rbegin()->second;
+
+ map<double, const SMDS_MeshNode* >::iterator u2n = u2nodes.begin();
+ for ( ; u2n != u2nodes.end(); ++u2n )
+ {
+ const SMDS_MeshNode* n = u2n->second;
+ okUV = false;
+ if ( n->GetPosition()->GetTypeOfPosition() == SMDS_TOP_EDGE )
+ {
+ if ( n->getshapeId() != edgeID )
+ {
+ C2d.Nullify();
+ edgeID = n->getshapeId();
+ TopoDS_Shape S = helper.GetSubShapeByNode( n, helper.GetMeshDS() );
+ if ( !S.IsNull() && S.ShapeType() == TopAbs_EDGE )
+ {
+ C2d = BRep_Tool::CurveOnSurface( TopoDS::Edge( S ), horFace, f,l );
+ }
+ }
+ if ( !C2d.IsNull() )
+ {
+ double u = static_cast< const SMDS_EdgePosition* >( n->GetPosition() )->GetUParameter();
+ if ( f <= u && u <= l )
+ {
+ uv = C2d->Value( u ).XY();
+ okUV = helper.CheckNodeUV( horFace, n, uv, tol );
+ }
+ }
+ }
+ if ( !okUV )
+ uv = helper.GetNodeUV( horFace, n, prevNode, &okUV );
+
+ myUVmap.insert( myUVmap.end(), make_pair( u2n->first, uv ));
+ // cout << n->getshapeId() << " N " << n->GetID()
+ // << " \t" << uv.X() << ", " << uv.Y() << " \t" << u2n->first << endl;
+
+ prevNode = n;
+ }
+ }
+}
+