Salome HOME
#19926 [CEA 19782] renumbering meshes
[modules/smesh.git] / src / StdMeshers / StdMeshers_BlockRenumber.hxx
diff --git a/src/StdMeshers/StdMeshers_BlockRenumber.hxx b/src/StdMeshers/StdMeshers_BlockRenumber.hxx
new file mode 100644 (file)
index 0000000..f68b17e
--- /dev/null
@@ -0,0 +1,170 @@
+// Copyright (C) 2007-2020  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// 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, or (at your option) any later version.
+//
+// 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
+//
+
+//  SMESH SMESH : implementation of SMESH idl descriptions
+//  File   : StdMeshers_BlockRenumber.hxx
+//  Author : Edward AGAPOV, OCC
+//  Module : SMESH
+//
+#ifndef _SMESH_BlockRenumber_HXX_
+#define _SMESH_BlockRenumber_HXX_
+
+#include "SMESH_StdMeshers.hxx"
+
+#include "SMESH_ComputeError.hxx"
+#include "SMESH_Hypothesis.hxx"
+#include "SMESH_MeshEditor.hxx"
+
+#include <NCollection_DataMap.hxx>
+#include <TopTools_MapOfShape.hxx>
+#include <TopoDS_Vertex.hxx>
+
+#include <boost/serialization/vector.hpp>
+#include <map>
+
+class SMESH_Mesh;
+class TopoDS_Shape;
+class TopoDS_TShape;
+class TopoDS_Vertex;
+
+// =========================================================
+struct StdMeshers_BlockCS // Local coordinate system of a block
+{
+  std::string _solid;
+  std::string _vertex000;
+  std::string _vertex001;
+
+  bool operator==( const StdMeshers_BlockCS& other ) const
+  {
+    return ( _solid     == other._solid &&
+             _vertex000 == other._vertex000 &&
+             _vertex001 == other._vertex001 );
+  }
+};
+
+// =========================================================
+/*!
+ * \class 3D Hypothesis used by Hexahedron(ijk) algorithm
+ *        to renumber mesh of a block to be structured-like 
+ */
+// =========================================================
+
+class STDMESHERS_EXPORT StdMeshers_BlockRenumber : public SMESH_Hypothesis
+{
+public:
+  StdMeshers_BlockRenumber(int hypId, SMESH_Gen * gen);
+
+  void SetBlocksOrientation( std::vector< StdMeshers_BlockCS > & blockCS );
+
+  const std::vector< StdMeshers_BlockCS > &  GetBlocksOrientation() const { return _blockCS; }
+
+  virtual std::ostream & SaveTo(std::ostream & save) override;
+  virtual std::istream & LoadFrom(std::istream & load) override;
+
+  /*!
+   * \brief Initialize Fineness by the mesh built on the geometry
+   *  \param theMesh - the built mesh
+   *  \param theShape - the geometry of interest
+   *  \retval bool - true if parameter values have been successfully defined
+   */
+  bool SetParametersByMesh(const SMESH_Mesh* theMesh, const TopoDS_Shape& theShape) override
+  { return false; }
+
+  /*!
+   * \brief Initialize my parameter values by default parameters.
+   *  \retval bool - true if parameter values have been successfully defined
+   */
+  bool SetParametersByDefaults(const TDefaults&  dflts, const SMESH_Mesh* theMesh=0) override
+  { return false; }
+
+ public:
+
+  /*!
+   * \brief Check validity of parameter
+   */
+  SMESH_ComputeErrorPtr CheckHypothesis(SMESH_Mesh& theMesh, const TopoDS_Shape& theShape) const;
+
+  /*!
+   * \brief Return true and vertices if block orientation is defined for a given solid
+   */
+  bool IsSolidIncluded( SMESH_Mesh&         mesh,
+                        const TopoDS_Shape& solid,
+                        TopoDS_Vertex&      vertex000,
+                        TopoDS_Vertex&      vertex001 ) const;
+
+ private:
+
+  // Persistence: define both input and output at once
+  friend class boost::serialization::access;
+  template<class Archive> void serialize( Archive & ar, const unsigned int version )
+  {
+    ar & _blockCS;
+  }
+
+ protected:
+
+  std::vector< StdMeshers_BlockCS > _blockCS;
+
+  typedef NCollection_DataMap< TopoDS_Shape, std::pair< TopoDS_Vertex, TopoDS_Vertex > > TSolid2VV;
+  TSolid2VV                         _solids2vertices; // shapes defined by _blockCS, non-persistent
+};
+
+// =========================================================
+/*!
+ * \brief Help in using StdMeshers_BlockRenumber
+ */
+class StdMeshers_RenumberHelper
+{
+public:
+
+  StdMeshers_RenumberHelper( SMESH_Mesh&                     mesh,
+                             const StdMeshers_BlockRenumber* hyp);
+  /*!
+   * \brief Find default vertex at (0,0,0) local position
+   */
+  static TopoDS_Vertex GetVertex000( const TopTools_MapOfShape& cornerVertices );
+
+  /*!
+   * \brief Find a vertex of a solid located at the given point
+   */
+  static TopoDS_Vertex GetVertexAtPoint( const TopoDS_Shape& solid, const TopoDS_Shape& point );
+
+  /*!
+   * \brief Create a copy of an old node and remember this couple of nodes for replacement
+   */
+  void AddReplacingNode( const SMDS_MeshNode* & oldNode );
+
+  /*!
+   * \brief Replace old nodes by new ones
+   */
+  void DoReplaceNodes();
+
+private:
+
+  SMESH_Mesh*                     _mesh;
+  const StdMeshers_BlockRenumber* _hyp;
+
+  SMESH_MeshEditor::TListOfListOfNodes _nodesToMerge;
+  std::list< const SMDS_MeshNode* >    _newOldNodes;
+};
+
+#endif