Salome HOME
[SALOME platform 0019943] Pb with projection 2d
authoreap <eap@opencascade.com>
Mon, 28 Jul 2008 16:00:01 +0000 (16:00 +0000)
committereap <eap@opencascade.com>
Mon, 28 Jul 2008 16:00:01 +0000 (16:00 +0000)
    distinguish the case of seam edge encountered twice in face wire from
    the case of seam encountered once

src/SMESH/SMESH_Pattern.cxx
src/StdMeshers/StdMeshers_ProjectionUtils.cxx
src/StdMeshers/StdMeshers_Projection_2D.cxx

index 664e39419c846c292c319392b1c6ee8b335e24b8..9dc5b08f159617804fe0cdfd355475ba9cfb2e5d 100644 (file)
@@ -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++;
       }
     }
   }
index 01b04541f1617623b4077a8b6471bf5f507a1391..1ef60301f29360ec997ea6b5ee2c82ffbc833347 100644 (file)
@@ -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];
index a31487eefe6b40827458d56e6beb185294fc7b83..7f193fbf93f32f33010412a992f94c1dc7e4dae5 100644 (file)
@@ -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());