mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-01-14 21:00:33 +05:00
[SALOME platform 0019943] Pb with projection 2d
distinguish the case of seam edge encountered twice in face wire from the case of seam encountered once
This commit is contained in:
parent
030beb0855
commit
c003632371
@ -521,7 +521,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh,
|
||||
|
||||
TopoDS_Face face = TopoDS::Face( theFace.Oriented( TopAbs_FORWARD ));
|
||||
|
||||
// check that face is not closed
|
||||
// check if face is closed
|
||||
bool isClosed = helper.HasSeam();
|
||||
TopoDS_Vertex bidon;
|
||||
list<TopoDS_Edge> eList;
|
||||
@ -634,26 +634,13 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh,
|
||||
// vertices
|
||||
for ( elIt = eList.begin(); elIt != eList.end(); elIt++ ) {
|
||||
myShapeIDMap.Add( TopExp::FirstVertex( *elIt, true ));
|
||||
bool isClosed1 = BRep_Tool::IsClosed( *elIt, theFace );
|
||||
// BEGIN: jfa for bug 0019943
|
||||
if (isClosed1) {
|
||||
isClosed1 = false;
|
||||
for (TopExp_Explorer expw (theFace, TopAbs_WIRE); expw.More() && !isClosed1; expw.Next()) {
|
||||
const TopoDS_Wire& wire = TopoDS::Wire(expw.Current());
|
||||
int nbe = 0;
|
||||
for (BRepTools_WireExplorer we (wire, theFace); we.More() && !isClosed1; we.Next()) {
|
||||
if (we.Current().IsSame(*elIt)) {
|
||||
nbe++;
|
||||
if (nbe == 2) isClosed1 = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( helper.IsSeamShape( *elIt ) ) {
|
||||
// vertices present twice in the wire have two corresponding key points
|
||||
const TopoDS_Vertex& lastV = TopExp::LastVertex( *elIt, true );
|
||||
if ( helper.IsRealSeam( lastV ))
|
||||
myShapeIDMap.Add( lastV );// vertex orienation is REVERSED
|
||||
}
|
||||
// END: jfa for bug 0019943
|
||||
if (isClosed1)
|
||||
myShapeIDMap.Add( TopExp::LastVertex( *elIt, true ));
|
||||
SMESHDS_SubMesh * eSubMesh = aMeshDS->MeshElements( *elIt );
|
||||
if ( eSubMesh )
|
||||
if ( SMESHDS_SubMesh * eSubMesh = aMeshDS->MeshElements( *elIt ))
|
||||
nbNodes += eSubMesh->NbNodes() + 1;
|
||||
}
|
||||
// edges
|
||||
@ -681,15 +668,15 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh,
|
||||
v2.Reverse();
|
||||
|
||||
// on closed face we must have REVERSED some of seam vertices
|
||||
bool isSeam = helper.IsSeamShape( edge );
|
||||
if ( isClosed ) {
|
||||
if ( isSeam ) { // reverse on reversed SEAM edge
|
||||
if ( !isForward ) {
|
||||
if ( helper.IsSeamShape( edge ) ) {
|
||||
if ( helper.IsRealSeam( edge ) && !isForward ) {
|
||||
// reverse on reversed SEAM edge
|
||||
v1.Reverse();
|
||||
v2.Reverse();
|
||||
}
|
||||
}
|
||||
else { // on CLOSED edge
|
||||
else { // on CLOSED edge (i.e. having one vertex with different orienations)
|
||||
for ( int is2 = 0; is2 < 2; ++is2 ) {
|
||||
TopoDS_Shape & v = is2 ? v2 : v1;
|
||||
if ( helper.IsSeamShape( v ) ) {
|
||||
@ -773,6 +760,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh,
|
||||
}
|
||||
}
|
||||
// put U in [0,1] so that the first key-point has U==0
|
||||
bool isSeam = helper.IsRealSeam( edge );
|
||||
double du = l - f;
|
||||
TParamNodeMap::iterator unIt = paramNodeMap.begin();
|
||||
TParamNodeMap::reverse_iterator unRIt = paramNodeMap.rbegin();
|
||||
@ -867,6 +855,7 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh,
|
||||
p->myInitXYZ.SetCoord( p->myInitUV.X(), p->myInitUV.Y(), 0 );
|
||||
}
|
||||
// load elements
|
||||
TNodePointIDMap::iterator n_id, not_found = closeNodePointIDMap.end();
|
||||
SMDS_ElemIteratorPtr elemIt = fSubMesh->GetElements();
|
||||
while ( elemIt->more() )
|
||||
{
|
||||
@ -880,10 +869,8 @@ bool SMESH_Pattern::Load (SMESH_Mesh* theMesh,
|
||||
const SMDS_MeshNode* node = smdsNode( nIt->next() );
|
||||
iPoint = nodePointIDMap[ node ]; // point index of interest
|
||||
// for a node on a seam edge there are two points
|
||||
TNodePointIDMap::iterator n_id = closeNodePointIDMap.end();
|
||||
if ( helper.IsSeamShape( node->GetPosition()->GetShapeId() ))
|
||||
n_id = closeNodePointIDMap.find( node );
|
||||
if ( n_id != closeNodePointIDMap.end() )
|
||||
if ( helper.IsRealSeam( node->GetPosition()->GetShapeId() ) &&
|
||||
( n_id = closeNodePointIDMap.find( node )) != not_found )
|
||||
{
|
||||
TPoint & p1 = myPoints[ iPoint ];
|
||||
TPoint & p2 = myPoints[ n_id->second ];
|
||||
@ -2386,7 +2373,7 @@ bool SMESH_Pattern::Apply (const TopoDS_Face& theFace,
|
||||
}
|
||||
// END: jfa for bug 0019943
|
||||
if (isClosed1)
|
||||
myShapeIDMap.Add( TopExp::LastVertex( *elIt, true ));
|
||||
myShapeIDMap.Add( TopExp::LastVertex( *elIt, true ));// vertex orienation is REVERSED
|
||||
}
|
||||
int nbVertices = myShapeIDMap.Extent();
|
||||
|
||||
@ -2395,7 +2382,7 @@ bool SMESH_Pattern::Apply (const TopoDS_Face& theFace,
|
||||
|
||||
myShapeIDMap.Add( face );
|
||||
|
||||
if ( myShapeIDToPointsMap.size() != myShapeIDMap.Extent()/* + nbSeamShapes*/ ) {
|
||||
if ( myShapeIDToPointsMap.size() != myShapeIDMap.Extent() ) {
|
||||
MESSAGE( myShapeIDToPointsMap.size() <<" != " << myShapeIDMap.Extent());
|
||||
return setErrorCode( ERR_APPLF_INTERNAL_EEROR );
|
||||
}
|
||||
@ -4578,28 +4565,15 @@ bool SMESH_Pattern::setShapeToMesh(const TopoDS_Shape& theShape)
|
||||
// check if a face is closed
|
||||
int nbNodeOnSeamEdge = 0;
|
||||
if ( myIs2D ) {
|
||||
TopTools_MapOfShape seamVertices;
|
||||
TopoDS_Face face = TopoDS::Face( theShape );
|
||||
TopExp_Explorer eExp( theShape, TopAbs_EDGE );
|
||||
for ( ; eExp.More() && nbNodeOnSeamEdge == 0; eExp.Next() ) {
|
||||
const TopoDS_Edge& ee = TopoDS::Edge(eExp.Current());
|
||||
bool isClosed1 = BRep_Tool::IsClosed(ee, face);
|
||||
// BEGIN: jfa for bug 0019943
|
||||
if (isClosed1) {
|
||||
isClosed1 = false;
|
||||
for (TopExp_Explorer expw (face, TopAbs_WIRE); expw.More() && !isClosed1; expw.Next()) {
|
||||
const TopoDS_Wire& wire = TopoDS::Wire(expw.Current());
|
||||
int nbe = 0;
|
||||
for (BRepTools_WireExplorer we (wire, face); we.More() && !isClosed1; we.Next()) {
|
||||
if (we.Current().IsSame(ee)) {
|
||||
nbe++;
|
||||
if (nbe == 2) isClosed1 = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// END: jfa for bug 0019943
|
||||
if (isClosed1) {
|
||||
nbNodeOnSeamEdge = 2;
|
||||
if ( BRep_Tool::IsClosed(ee, face) ) {
|
||||
// seam edge and vertices encounter twice in theFace
|
||||
if ( !seamVertices.Add( TopExp::FirstVertex( ee ))) nbNodeOnSeamEdge++;
|
||||
if ( !seamVertices.Add( TopExp::LastVertex( ee ))) nbNodeOnSeamEdge++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1358,7 +1358,7 @@ FindMatchingNodesOnFaces( const TopoDS_Face& face1,
|
||||
}
|
||||
if ( nodesOfFaces )
|
||||
{
|
||||
if ( BRep_Tool::IsClosed( e2, face2 )) {
|
||||
if ( helper2.IsRealSeam( e2 )) {
|
||||
seam1 = e1; seam2 = e2;
|
||||
}
|
||||
else {
|
||||
@ -1430,7 +1430,7 @@ FindMatchingNodesOnFaces( const TopoDS_Face& face1,
|
||||
const TopoDS_Face & face = is2 ? face2 : face1;
|
||||
SMDS_ElemIteratorPtr eIt = sm->GetElements();
|
||||
|
||||
if ( !helper->IsSeamShape( is2 ? edge2 : edge1 ))
|
||||
if ( !helper->IsRealSeam( is2 ? edge2 : edge1 ))
|
||||
{
|
||||
while ( eIt->more() ) elems.insert( eIt->next() );
|
||||
}
|
||||
@ -1515,7 +1515,7 @@ FindMatchingNodesOnFaces( const TopoDS_Face& face1,
|
||||
|
||||
// On a sphere, add matching nodes on the edge
|
||||
|
||||
if ( helper1.IsSeamShape( edge1 ))
|
||||
if ( helper1.IsRealSeam( edge1 ))
|
||||
{
|
||||
// sort nodes on edges by param on edge
|
||||
map< double, const SMDS_MeshNode* > u2nodesMaps[2];
|
||||
|
@ -295,16 +295,14 @@ namespace {
|
||||
// Find a new node connected to nV1 and belonging to edge submesh;
|
||||
const SMDS_MeshNode* nE = 0;
|
||||
SMESHDS_SubMesh* smDS = sm->GetSubMeshDS();
|
||||
SMDS_ElemIteratorPtr vElems = nV1->GetInverseElementIterator();
|
||||
SMDS_ElemIteratorPtr vElems = nV1->GetInverseElementIterator(SMDSAbs_Face);
|
||||
while ( vElems->more() && !nE ) {
|
||||
const SMDS_MeshElement* elem = vElems->next();
|
||||
if ( elem->GetType() != SMDSAbs_Face )
|
||||
continue; // new nodes are shared by faces
|
||||
int nbNodes = elem->NbNodes();
|
||||
if ( elem->IsQuadratic() )
|
||||
nbNodes /= 2;
|
||||
int iV1 = elem->GetNodeIndex( nV1 );
|
||||
// try next aftre nV1
|
||||
// try next after nV1
|
||||
int iE = SMESH_MesherHelper::WrapIndex( iV1 + 1, nbNodes );
|
||||
if ( smDS->Contains( elem->GetNode( iE ) ))
|
||||
nE = elem->GetNode( iE );
|
||||
@ -515,7 +513,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape&
|
||||
|
||||
// Sort new and old nodes of a submesh separately
|
||||
|
||||
bool isSeam = helper.IsSeamShape( sm->GetId() );
|
||||
bool isSeam = helper.IsRealSeam( sm->GetId() );
|
||||
|
||||
enum { NEW_NODES = 0, OLD_NODES };
|
||||
map< double, const SMDS_MeshNode* > u2nodesMaps[2], u2nodesOnSeam;
|
||||
@ -537,7 +535,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape&
|
||||
continue; // node is already in the map
|
||||
}
|
||||
|
||||
// sort nodes on edges by its position
|
||||
// sort nodes on edges by their position
|
||||
map< double, const SMDS_MeshNode* > & pos2nodes = u2nodesMaps[isOld ? OLD_NODES : NEW_NODES];
|
||||
switch ( node->GetPosition()->GetTypeOfPosition() )
|
||||
{
|
||||
@ -558,12 +556,13 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape&
|
||||
}
|
||||
if ( u2nodesMaps[ NEW_NODES ].size() != u2nodesMaps[ OLD_NODES ].size() )
|
||||
{
|
||||
if ( u2nodesMaps[ NEW_NODES ].size() == 0 &&
|
||||
sm->GetSubShape().ShapeType() == TopAbs_EDGE &&
|
||||
BRep_Tool::Degenerated( TopoDS::Edge( sm->GetSubShape() )))
|
||||
if ( u2nodesMaps[ NEW_NODES ].size() == 0 &&
|
||||
sm->GetSubShape().ShapeType() == TopAbs_EDGE &&
|
||||
helper.IsDegenShape( sm->GetId() ) )
|
||||
// NPAL15894 (tt88bis.py) - project mesh built by NETGEN_1d_2D that
|
||||
// does not make segments/nodes on degenerated edges
|
||||
// does not make segments/nodes on degenerated edges
|
||||
continue;
|
||||
|
||||
RETURN_BAD_RESULT("Different nb of old and new nodes on shape #"<< sm->GetId() <<" "<<
|
||||
u2nodesMaps[ OLD_NODES ].size() << " != " <<
|
||||
u2nodesMaps[ NEW_NODES ].size());
|
||||
|
Loading…
Reference in New Issue
Block a user