From: eap Date: Mon, 28 Jul 2008 16:00:01 +0000 (+0000) Subject: [SALOME platform 0019943] Pb with projection 2d X-Git-Tag: V4_1_4a1~24 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=c00363237117e527e84564e854d3d452c1ea4083;p=modules%2Fsmesh.git [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 --- diff --git a/src/SMESH/SMESH_Pattern.cxx b/src/SMESH/SMESH_Pattern.cxx index 664e39419..9dc5b08f1 100644 --- a/src/SMESH/SMESH_Pattern.cxx +++ b/src/SMESH/SMESH_Pattern.cxx @@ -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 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++; } } } diff --git a/src/StdMeshers/StdMeshers_ProjectionUtils.cxx b/src/StdMeshers/StdMeshers_ProjectionUtils.cxx index 01b04541f..1ef60301f 100644 --- a/src/StdMeshers/StdMeshers_ProjectionUtils.cxx +++ b/src/StdMeshers/StdMeshers_ProjectionUtils.cxx @@ -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]; diff --git a/src/StdMeshers/StdMeshers_Projection_2D.cxx b/src/StdMeshers/StdMeshers_Projection_2D.cxx index a31487eef..7f193fbf9 100644 --- a/src/StdMeshers/StdMeshers_Projection_2D.cxx +++ b/src/StdMeshers/StdMeshers_Projection_2D.cxx @@ -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());