+ reverse( myEdgeLength );
+ reverse( myIsUniform );
+ }
+ if ( nbEdges > 0 )
+ {
+ myNormPar[nbEdges-1]=1.;
+ myPoints.clear();
+ myFalsePoints.clear();
+ for ( size_t i = 0; i < myEdge.size(); ++i )
+ reverseProxySubmesh( myEdge[i] );
+ }
+ for ( size_t i = 0; i < myEdge.size(); ++i )
+ {
+ double fp,lp;
+ Handle(Geom_Curve) C3d = BRep_Tool::Curve(myEdge[i],fp,lp);
+ if ( !C3d.IsNull() )
+ myC3dAdaptor[i].Load( C3d, fp,lp );
+ }
+}
+
+//=======================================================================
+//function : SetIgnoreMediumNodes
+//purpose : Make ignore medium nodes
+//=======================================================================
+
+void StdMeshers_FaceSide::SetIgnoreMediumNodes(bool toIgnore)
+{
+ if ( myIgnoreMediumNodes != toIgnore )
+ {
+ myIgnoreMediumNodes = toIgnore;
+
+ if ( !myPoints.empty() )
+ {
+ UVPtStructVec newPoints;
+ newPoints.reserve( myPoints.size()/2 + 1 );
+ for ( size_t i = 0; i < myPoints.size(); i += 2 )
+ newPoints.push_back( myPoints[i] );
+
+ myPoints.swap( newPoints );
+ }
+ else
+ {
+ NbPoints( /*update=*/true );
+ }
+ }
+}
+
+//=======================================================================
+//function : NbPoints
+//purpose : Return nb nodes on edges and vertices (+1 to be == GetUVPtStruct().size() )
+// Call it with update == true if mesh of this side can be recomputed
+// since creation of this side
+//=======================================================================
+
+int StdMeshers_FaceSide::NbPoints(const bool update) const
+{
+ if ( !myPoints.empty() )
+ return myPoints.size();
+
+ // if ( !myFalsePoints.empty() )
+ // return myFalsePoints.size();
+
+ if ( update && myEdge.size() > 0 )
+ {
+ StdMeshers_FaceSide* me = (StdMeshers_FaceSide*) this;
+ me->myNbPonits = 0;
+ me->myNbSegments = 0;
+ me->myMissingVertexNodes = false;
+
+ for ( int i = 0; i < NbEdges(); ++i )
+ {
+ TopoDS_Vertex v1 = SMESH_MesherHelper::IthVertex( 0, myEdge[i] );
+ if ( SMESH_Algo::VertexNode( v1, myProxyMesh->GetMeshDS() ))
+ me->myNbPonits += 1; // for the first end
+ else
+ me->myMissingVertexNodes = true;
+
+ if ( const SMESHDS_SubMesh* sm = myProxyMesh->GetSubMesh( Edge(i) )) {
+ int nbN = sm->NbNodes();
+ if ( myIgnoreMediumNodes ) {
+ SMDS_ElemIteratorPtr elemIt = sm->GetElements();
+ if ( elemIt->more() && elemIt->next()->IsQuadratic() )
+ nbN -= sm->NbElements();
+ }
+ me->myNbPonits += nbN;
+ me->myNbSegments += sm->NbElements();
+ }
+ }
+ TopoDS_Vertex v1 = SMESH_MesherHelper::IthVertex( 1, Edge( NbEdges()-1 ));
+ if ( SMESH_Algo::VertexNode( v1, myProxyMesh->GetMeshDS() ))
+ me->myNbPonits++; // for the last end
+ else
+ me->myMissingVertexNodes = true;
+ }
+ return myNbPonits;
+}
+
+//=======================================================================
+//function : NbSegments
+//purpose : Return nb edges
+// Call it with update == true if mesh of this side can be recomputed
+// since creation of this side
+//=======================================================================
+
+int StdMeshers_FaceSide::NbSegments(const bool update) const
+{
+ return NbPoints( update ), myNbSegments;
+}
+
+//================================================================================
+/*!
+ * \brief Reverse UVPtStructVec if a proxy sub-mesh of E
+ */
+//================================================================================
+
+void StdMeshers_FaceSide::reverseProxySubmesh( const TopoDS_Edge& E )
+{
+ if ( !myProxyMesh ) return;
+ if ( const SMESH_ProxyMesh::SubMesh* sm = myProxyMesh->GetProxySubMesh( E ))
+ {
+ UVPtStructVec& edgeUVPtStruct = (UVPtStructVec& ) sm->GetUVPtStructVec();
+ for ( size_t i = 0; i < edgeUVPtStruct.size(); ++i )
+ {
+ UVPtStruct & uvPt = edgeUVPtStruct[i];
+ uvPt.normParam = 1 - uvPt.normParam;
+ uvPt.x = 1 - uvPt.x;
+ uvPt.y = 1 - uvPt.y;
+ }
+ reverse( edgeUVPtStruct );