Salome HOME
Fix for the bug IPAL22851: Sub-shapes spelling
[modules/smesh.git] / src / StdMeshers / StdMeshers_HexaFromSkin_3D.cxx
index 2516de0848f44709e8680ebc5c087e7be3e6d09f..4e471253f584f84995ad44916ffdd11b5460453e 100644 (file)
@@ -1,26 +1,25 @@
-//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
 //
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of the GNU Lesser General Public
-//  License as published by the Free Software Foundation; either
-//  version 2.1 of the License.
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
 //
-//  This library is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-//  Lesser General Public License for more details.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
 //
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 
 // File      : StdMeshers_HexaFromSkin_3D.cxx
 // Created   : Wed Jan 27 12:28:07 2010
 // Author    : Edward AGAPOV (eap)
-//
+
 #include "StdMeshers_HexaFromSkin_3D.hxx"
 
 #include "SMDS_VolumeOfNodes.hxx"
 //#include "utilities.h"
 #include <limits>
 
-// Define error message
+// Define error message and _MYDEBUG_ if needed
 #ifdef _DEBUG_
 #define BAD_MESH_ERR \
   error(SMESH_Comment("Can't detect block-wise structure of the input 2D mesh.\n" \
                       __FILE__ ":" )<<__LINE__)
+//#define _MYDEBUG_
 #else
 #define BAD_MESH_ERR \
   error(SMESH_Comment("Can't detect block-wise structure of the input 2D mesh"))
 #endif
 
-// Debug output
-#define _DUMP_(msg) //cout << msg << endl
 
+// Debug output
+#ifdef _MYDEBUG_
+#define _DUMP_(msg) cout << msg << endl
+#else
+#define _DUMP_(msg)
+#endif
 
 
 namespace
@@ -54,10 +58,12 @@ namespace
     {
       B_BOTTOM=0, B_RIGHT, B_TOP, B_LEFT, B_FRONT, B_BACK, NB_BLOCK_SIDES
     };
-//   const char* SBoxSides[] = //!< names of block sides -- needed for DEBUG only
-//     {
-//       "BOTTOM", "RIGHT", "TOP", "LEFT", "FRONT", "BACK", "UNDEFINED"
-//     };
+#ifdef _MYDEBUG_
+  const char* SBoxSides[] = //!< names of block sides -- needed for DEBUG only
+    {
+      "BOTTOM", "RIGHT", "TOP", "LEFT", "FRONT", "BACK", "UNDEFINED"
+    };
+#endif
   enum EQuadEdge //!< edges of quadrangle side
     {
       Q_BOTTOM = 0, Q_RIGHT, Q_TOP, Q_LEFT, NB_QUAD_SIDES
@@ -85,37 +91,6 @@ namespace
     return true;
   }
 
-  //================================================================================
-  /*!
-   * \brief Description of node used to detect corner nodes
-   */
-  struct _NodeDescriptor
-  {
-    int nbInverseFaces, nbNodesInInverseFaces;
-
-    _NodeDescriptor(const SMDS_MeshNode* n): nbInverseFaces(0), nbNodesInInverseFaces(0)
-    {
-      if ( n )
-      {
-        set<const SMDS_MeshNode*> nodes;
-        SMDS_ElemIteratorPtr fIt = n->GetInverseElementIterator(SMDSAbs_Face );
-        while ( fIt->more() )
-        {
-          const SMDS_MeshElement* face = fIt->next();
-          nodes.insert( face->begin_nodes(), face->end_nodes() );
-          nbInverseFaces++;
-        }
-        nbNodesInInverseFaces = nodes.size();
-      }
-    }
-    bool operator==(const _NodeDescriptor& other) const
-    {
-      return
-        nbInverseFaces == other.nbInverseFaces &&
-        nbNodesInInverseFaces == other.nbNodesInInverseFaces;
-    }
-  };
-
   //================================================================================
   /*!
    * \brief return true if a node is at block corner
@@ -126,7 +101,19 @@ namespace
 
   bool isCornerNode( const SMDS_MeshNode* n )
   {
-    return n && n->NbInverseElements( SMDSAbs_Face ) % 2;
+    int nbF = n ? n->NbInverseElements( SMDSAbs_Face ) : 1;
+    if ( nbF % 2 )
+      return true;
+
+    set<const SMDS_MeshNode*> nodesInInverseFaces;
+    SMDS_ElemIteratorPtr fIt = n->GetInverseElementIterator(SMDSAbs_Face );
+    while ( fIt->more() )
+    {
+      const SMDS_MeshElement* face = fIt->next();
+      nodesInInverseFaces.insert( face->begin_nodes(), face->end_nodes() );
+    }
+
+    return nodesInInverseFaces.size() != ( 6 + (nbF/2-1)*3 );
   }
 
   //================================================================================
@@ -761,7 +748,7 @@ namespace
           // compute angle of (sideIDir projection to pln) and (X dir of pln)
           gp_Vec2d sideIDirProj( sideIDir * pln.XDirection(), sideIDir * pln.YDirection());
           double angle = sideIDirProj.Angle( gp::DX2d() );
-          if ( angle < 0 ) angle += 2 * PI; // angle [0-2*PI]
+          if ( angle < 0 ) angle += 2. * M_PI; // angle [0-2*PI]
           angleOfSide.insert( make_pair( angle, sideI ));
           _DUMP_("  "<< sideI << " - side dir ("
                  << sideIDir.X() << ", " << sideIDir.Y() << ", " << sideIDir.Z() << ")"
@@ -770,8 +757,8 @@ namespace
         if ( nbLoadedSides == 1 )
         {
           double angF = angleOfSide.begin()->first, angL = angleOfSide.rbegin()->first;
-          if ( angF > PI ) angF = 2*PI - angF;
-          if ( angL > PI ) angL = 2*PI - angL;
+          if ( angF > M_PI ) angF = 2.*M_PI - angF;
+          if ( angL > M_PI ) angL = 2.*M_PI - angL;
           foundSide = angF < angL ? angleOfSide.begin()->second : angleOfSide.rbegin()->second;
         }
         else
@@ -849,14 +836,12 @@ namespace
       row2.push_back( n1 = oppositeNode( quad, i1 ));
     }
 
-    _NodeDescriptor nDesc( row1[1] );
-    if ( nDesc == _NodeDescriptor( row1[0] ))
-      return true; // row of 2 nodes
+    if ( isCornerNode( row1[1] ))
+      return true;
 
     // Find the rest nodes
     TIDSortedElemSet emptySet, avoidSet;
-    //while ( !isCornerNode( n2 ))
-    while ( nDesc == _NodeDescriptor( n2 ))
+    while ( !isCornerNode( n2 ) )
     {
       avoidSet.clear(); avoidSet.insert( quad );
       quad = SMESH_MeshEditor::FindFaceInSet( n1, n2, emptySet, avoidSet, &i1, &i2 );
@@ -1009,7 +994,7 @@ bool StdMeshers_HexaFromSkin_3D::Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper*
     // ----------------------------
     // Add internal nodes of a box
     // ----------------------------
-    // projection points of internal nodes on box subshapes by which
+    // projection points of internal nodes on box sub-shapes by which
     // coordinates of internal nodes are computed
     vector<gp_XYZ> pointOnShape( SMESH_Block::ID_Shell );
 
@@ -1218,4 +1203,3 @@ bool StdMeshers_HexaFromSkin_3D::Compute(SMESH_Mesh&, const TopoDS_Shape&)
 {
   return error("Algorithm can't work with geometrical shapes");
 }
-