Salome HOME
020749: EDF 1291 SMESH : Create 2D Mesh from 3D improvement
[modules/smesh.git] / src / SMESH / SMESH_MeshEditor.hxx
index d9f4b5d28a737e19894bb570146b6c9f0cb7f594..bf7e8a620668fa84733bcd274761fd265eee9570 100644 (file)
@@ -34,8 +34,7 @@
 #include "SMDS_MeshElement.hxx"
 #include "SMESH_Controls.hxx"
 #include "SMESH_Mesh.hxx"
-#include "SMESH_SequenceOfElemPtr.hxx"
-#include "SMESH_SequenceOfNode.hxx"
+#include "SMESH_TypeDefs.hxx"
 
 #include <utilities.h>
 
@@ -54,16 +53,6 @@ class gp_Pnt;
 class SMESH_MesherHelper;
 
 
-typedef std::map<const SMDS_MeshElement*,
-                 std::list<const SMDS_MeshElement*> >        TElemOfElemListMap;
-typedef std::map<const SMDS_MeshNode*, const SMDS_MeshNode*> TNodeNodeMap;
-
-//!< Set of elements sorted by ID, to be used to assure predictability of edition
-typedef std::set< const SMDS_MeshElement*, TIDCompare >      TIDSortedElemSet;
-
-typedef pair< const SMDS_MeshNode*, const SMDS_MeshNode* >   NLink;
-
-
 //=======================================================================
 /*!
  * \brief Searcher for the node closest to point
@@ -92,35 +81,13 @@ struct SMESH_ElementSearcher
                                   std::vector< const SMDS_MeshElement* >& foundElems)=0;
 
   virtual TopAbs_State GetPointState(const gp_Pnt& point) = 0;
-};
-
-//=======================================================================
-/*!
- * \brief A sorted pair of nodes
- */
-//=======================================================================
 
-struct SMESH_TLink: public NLink
-{
-  SMESH_TLink(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2 ):NLink( n1, n2 )
-  { if ( n1->GetID() < n2->GetID() ) std::swap( first, second ); }
-  SMESH_TLink(const NLink& link ):NLink( link )
-  { if ( first->GetID() < second->GetID() ) std::swap( first, second ); }
-  const SMDS_MeshNode* node1() const { return first; }
-  const SMDS_MeshNode* node2() const { return second; }
-};
-
-//=======================================================================
-/*!
- * \brief SMESH_TLink knowing its orientation
- */
-//=======================================================================
-
-struct SMESH_OrientedLink: public SMESH_TLink
-{
-  bool _reversed;
-  SMESH_OrientedLink(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2 )
-    : SMESH_TLink( n1, n2 ), _reversed( n1 != node1() ) {}
+  /*!
+   * \brief Return elements possibly intersecting the line
+   */
+  virtual void GetElementsNearLine( const gp_Ax1&                           line,
+                                    SMDSAbs_ElementType                     type,
+                                    std::vector< const SMDS_MeshElement* >& foundElems)=0;
 };
 
 // ============================================================
@@ -131,27 +98,6 @@ struct SMESH_OrientedLink: public SMESH_TLink
 
 class SMESH_EXPORT SMESH_MeshEditor
 {
-public:
-  //------------------------------------------
-  /*!
-   * \brief SMDS_MeshNode -> gp_XYZ convertor
-   */
-  //------------------------------------------
-  struct TNodeXYZ : public gp_XYZ
-  {
-    const SMDS_MeshNode* _node;
-    TNodeXYZ( const SMDS_MeshElement* e):gp_XYZ(0,0,0),_node(0) {
-      if (e) {
-        ASSERT( e->GetType() == SMDSAbs_Node );
-        _node = static_cast<const SMDS_MeshNode*>(e);
-        SetCoord( _node->X(), _node->Y(), _node->Z() );
-      }
-    }
-    double Distance(const SMDS_MeshNode* n)       const { return (TNodeXYZ( n )-*this).Modulus(); }
-    double SquareDistance(const SMDS_MeshNode* n) const { return (TNodeXYZ( n )-*this).SquareModulus(); }
-    bool operator==(const TNodeXYZ& other) const { return _node == other._node; }
-  };
-
 public:
 
   SMESH_MeshEditor( SMESH_Mesh* theMesh );
@@ -162,16 +108,16 @@ public:
   SMDS_MeshElement* AddElement(const std::vector<const SMDS_MeshNode*> & nodes,
                                const SMDSAbs_ElementType                 type,
                                const bool                                isPoly,
-                               const int                                 ID = 0);
+                               const int                                 ID = -1);
   /*!
    * \brief Add element
    */
   SMDS_MeshElement* AddElement(const std::vector<int>  & nodeIDs,
                                const SMDSAbs_ElementType type,
                                const bool                isPoly,
-                               const int                 ID = 0);
+                               const int                 ID = -1);
 
-  bool Remove (const std::list< int >& theElemIDs, const bool isNodes);
+  int Remove (const std::list< int >& theElemIDs, const bool isNodes);
   // Remove a node or an element.
   // Modify a compute state of sub-meshes which become empty
 
@@ -237,7 +183,7 @@ public:
                  SMESH::Controls::NumericalFunctorPtr theCriterion);
 
 
-  enum SplitVolumToTetraFlags { HEXA_TO_5 = 1, HEXA_TO_6 = 2 };//!<arg of SplitVolumesIntoTetra()
+  enum SplitVolumToTetraFlags { HEXA_TO_5 = 1, HEXA_TO_6 = 2, HEXA_TO_24 = 3 };//!<arg of SplitVolumesIntoTetra()
   /*!
    * \brief Split volumic elements into tetrahedra.
    */
@@ -382,40 +328,24 @@ public:
   // Move or copy theElements applying theTrsf to their nodes
 
 
-  /*!
-   * Generate new elements by extrusion of theElements
-   * param theElems - list of elements for scale
-   * param thePoint - base point for scale
-   * param theScaleFact - scale factors for axises
-   * param theCopy - allows copying the translated elements
-   * param theMakeGroups - forces the generation of new groups from existing ones
-   * param theTargetMesh - the name of the newly created mesh
-   * return instance of Mesh class
-   */
-  PGroupIDs Scale (TIDSortedElemSet&        theElements,
-                   const gp_Pnt&            thePoint,
-                   const std::list<double>& theScaleFact,
-                   const bool               theCopy,
-                   const bool               theMakeGroups,
-                   SMESH_Mesh*              theTargetMesh=0);
-
   typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes;
 
-  void FindCoincidentNodes (std::set<const SMDS_MeshNode*> & theNodes,
-                            const double                     theTolerance,
-                            TListOfListOfNodes &             theGroupsOfNodes);
+  void FindCoincidentNodes (TIDSortedNodeSet &   theNodes,
+                            const double         theTolerance,
+                            TListOfListOfNodes & theGroupsOfNodes);
   // Return list of group of nodes close to each other within theTolerance.
   // Search among theNodes or in the whole mesh if theNodes is empty.
 
   /*!
-   * \brief Return SMESH_NodeSearcher
+   * \brief Return SMESH_NodeSearcher. The caller is responsible for deleteing it
    */
   SMESH_NodeSearcher* GetNodeSearcher();
 
   /*!
-   * \brief Return SMESH_ElementSearcher
+   * \brief Return SMESH_ElementSearcher. The caller is responsible for deleteing it
    */
   SMESH_ElementSearcher* GetElementSearcher();
+  SMESH_ElementSearcher* GetElementSearcher( SMDS_ElemIteratorPtr elemIt );
   /*!
    * \brief Return true if the point is IN or ON of the element
    */
@@ -532,12 +462,18 @@ public:
   // theBetweenNode1 - theBetweenNode2, between theBetweenNode1 and theBetweenNode2.
 
   void ConvertToQuadratic(const bool theForce3d);
-  //converts all mesh to quadratic one, deletes old elements, replacing 
-  //them with quadratic ones with the same id.
+  // Converts all mesh to quadratic one, deletes old elements, replacing 
+  // them with quadratic ones with the same id.
+  // If theForce3d = 1; this results in the medium node lying at the 
+  // middle of the line segments connecting start and end node of a mesh 
+  // element
+  // If theForce3d = 0; this results in the medium node lying at the 
+  // geometrical edge from which the mesh element is built
 
   bool ConvertFromQuadratic();
-  //converts all mesh from quadratic to ordinary ones, deletes old quadratic elements, replacing 
-  //them with ordinary mesh elements with the same id.
+  // Converts all mesh from quadratic to ordinary ones, deletes old quadratic elements, replacing 
+  // them with ordinary mesh elements with the same id.
+  // Returns true in case of success, false otherwise.
 
   static void AddToSameGroups (const SMDS_MeshElement* elemToAdd,
                                const SMDS_MeshElement* elemInGroups,
@@ -627,14 +563,29 @@ public:
                             const TIDSortedElemSet& theNodesNot,
                             const TopoDS_Shape&     theShape );
   
+  bool DoubleNodesOnGroupBoundaries( const std::vector<TIDSortedElemSet>& theElems,
+                                     bool createJointElems);
+
   /*!
    * \brief Generated skin mesh (containing 2D cells) from 3D mesh
    * The created 2D mesh elements based on nodes of free faces of boundary volumes
    * \return TRUE if operation has been completed successfully, FALSE otherwise
    */
   bool Make2DMeshFrom3D();
-  
-private:
+
+  enum Bnd_Dimension { BND_2DFROM3D, BND_1DFROM3D, BND_1DFROM2D };
+
+  int MakeBoundaryMesh(const TIDSortedElemSet& elements,
+                       Bnd_Dimension           dimension,
+                       SMESH_Group*            group = 0,
+                       SMESH_Mesh*             targetMesh = 0,
+                       bool                    toCopyElements = false,
+                       bool                    toCopyExistingBondary = false,
+                       bool                    toAddExistingBondary = false,
+                       bool                    aroundElements = false);
+
+
+ private:
 
   /*!
    * \brief Convert elements contained in a submesh to quadratic