// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
-// SMESH SMESH : implementaion of SMESH idl descriptions
// File : StdMeshers_FaceSide.hxx
// Created : Wed Jan 31 18:41:25 2007
// Author : Edward AGAPOV (eap)
#include <Adaptor2d_Curve2d.hxx>
#include <BRepAdaptor_CompCurve.hxx>
-#include <BRepAdaptor_Curve.hxx>
#include <BRep_Builder.hxx>
#include <BRep_Tool.hxx>
+#include <GCPnts_AbscissaPoint.hxx>
+#include <Geom2dAdaptor_Curve.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Wire.hxx>
-#include <GCPnts_AbscissaPoint.hxx>
-#include <Geom2dAdaptor_Curve.hxx>
-
#include <map>
#include "utilities.h"
{
int nbEdges = theEdges.size();
myEdge.resize( nbEdges );
+ myEdgeID.resize( nbEdges );
myC2d.resize( nbEdges );
myC3dAdaptor.resize( nbEdges );
myFirst.resize( nbEdges );
if ( myEdgeLength[i] < DBL_MIN ) nbDegen++;
myLength += myEdgeLength[i];
myEdge[i] = *edge;
+ myEdgeID[i] = meshDS->ShapeToIndex( *edge );
if ( !theIsForward ) myEdge[i].Reverse();
if ( theFace.IsNull() )
const SMDS_MeshNode* node = nItr->next();
if ( myIgnoreMediumNodes && SMESH_MeshEditor::IsMedium( node, SMDSAbs_Edge ))
continue;
- double u = helper.GetNodeU( myEdge[i], node, ¶mOK );
+ double u = helper.GetNodeU( myEdge[i], node, 0, ¶mOK );
double aLenU = GCPnts_AbscissaPoint::Length
( const_cast<GeomAdaptor_Curve&>( myC3dAdaptor[i]), myFirst[i], u );
if ( myEdgeLength[i] < aLenU ) // nonregression test "3D_mesh_NETGEN/G6"
const SMDS_MeshNode* node = nItr->next();
if ( myIgnoreMediumNodes && SMESH_MeshEditor::IsMedium( node, SMDSAbs_Edge ))
continue;
- double u = helper.GetNodeU( myEdge[i], node, ¶mOK );
+ double u = helper.GetNodeU( myEdge[i], node, 0, ¶mOK );
// paramSize is signed so orientation is taken into account
double normPar = prevNormPar + r * ( u - myFirst[i] ) / paramSize;
uvPt.x = uvPt.y = uvPt.normParam = u_node->first;
if ( isXConst ) uvPt.x = constValue;
else uvPt.y = constValue;
- if ( myNormPar[ EdgeIndex ] < uvPt.normParam ) {
+ const SMDS_EdgePosition* epos =
+ dynamic_cast<const SMDS_EdgePosition*>(uvPt.node->GetPosition());
+ if (( myNormPar[ EdgeIndex ] < uvPt.normParam ) ||
+ ( epos && uvPt.node->getshapeId() != myEdgeID[ EdgeIndex ])) // for myMissingVertexNodes
+ {
prevNormPar = myNormPar[ EdgeIndex ];
++EdgeIndex;
#ifdef _DEBUG_
#endif
paramSize = myNormPar[ EdgeIndex ] - prevNormPar;
}
- const SMDS_EdgePosition* epos =
- dynamic_cast<const SMDS_EdgePosition*>(uvPt.node->GetPosition().get());
if ( epos ) {
uvPt.param = epos->GetUParameter();
}
}
if ( nbEdges > 1 ) {
reverse( myEdge );
+ reverse( myEdgeID );
reverse( myC2d );
reverse( myC3dAdaptor );
reverse( myFirst );
reverse( myEdgeLength );
reverse( myIsUniform );
}
- myNormPar[nbEdges-1]=1.;
- myPoints.clear();
- myFalsePoints.clear();
+ if ( nbEdges > 0 )
+ {
+ myNormPar[nbEdges-1]=1.;
+ myPoints.clear();
+ myFalsePoints.clear();
+ }
}
//================================================================================
if ( myEdge.empty() )
return 0;
-// if ( myEdge.size() == 1 )
-// return new BRepAdaptor_Curve( myEdge[0] );
-
TopoDS_Wire aWire;
BRep_Builder aBuilder;
aBuilder.MakeWire(aWire);
for ( int i=0; i<myEdge.size(); ++i )
aBuilder.Add( aWire, myEdge[i] );
+
+ if ( myEdge.size() == 2 && FirstVertex().IsSame( LastVertex() ))
+ aWire.Closed(true); // issue 0021141
+
return new BRepAdaptor_CompCurve( aWire );
}
TError & theError)
{
TopoDS_Vertex V1;
- list< TopoDS_Edge > edges;
+ list< TopoDS_Edge > edges, internalEdges;
list< int > nbEdgesInWires;
int nbWires = SMESH_Block::GetOrderedEdges (theFace, V1, edges, nbEdgesInWires);
// split list of all edges into separate wires
TSideVector wires( nbWires );
list< int >::iterator nbE = nbEdgesInWires.begin();
- list< TopoDS_Edge >::iterator from, to;
- from = to = edges.begin();
- for ( int iW = 0; iW < nbWires; ++iW )
+ list< TopoDS_Edge >::iterator from = edges.begin(), to = from;
+ for ( int iW = 0; iW < nbWires; ++iW, ++nbE )
{
- std::advance( to, *nbE++ );
+ std::advance( to, *nbE );
if ( *nbE == 0 ) // Issue 0020676
{
--nbWires;
// assure that there is a node on the first vertex
// as StdMeshers_FaceSide::GetUVPtStruct() requires
if ( wireEdges.front().Orientation() != TopAbs_INTERNAL ) // Issue 0020676
+ {
while ( !SMESH_Algo::VertexNode( TopExp::FirstVertex( wireEdges.front(), true),
theMesh.GetMeshDS()))
{
return TSideVector(0);
}
}
- const bool isForward = true;
+ }
+ else if ( *nbE > 1 ) // Issue 0020676 (Face_pb_netgen.brep) - several internal edges in a wire
+ {
+ internalEdges.splice( internalEdges.end(), wireEdges, ++wireEdges.begin(), wireEdges.end());
+ }
+
StdMeshers_FaceSide* wire = new StdMeshers_FaceSide( theFace, wireEdges, &theMesh,
- isForward, theIgnoreMediumNodes);
+ /*isForward=*/true, theIgnoreMediumNodes);
wires[ iW ] = StdMeshers_FaceSidePtr( wire );
from = to;
}
+ while ( !internalEdges.empty() )
+ {
+ StdMeshers_FaceSide* wire = new StdMeshers_FaceSide( theFace, internalEdges.back(), &theMesh,
+ /*isForward=*/true, theIgnoreMediumNodes);
+ wires.push_back( StdMeshers_FaceSidePtr( wire ));
+ internalEdges.pop_back();
+ }
return wires;
}