]> SALOME platform Git repositories - modules/smesh.git/blobdiff - src/SMESH/SMESH_MeshEditor.hxx
Salome HOME
Merge with version on tag OCC-V2_1_0d
[modules/smesh.git] / src / SMESH / SMESH_MeshEditor.hxx
diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx
new file mode 100644 (file)
index 0000000..10b7f9f
--- /dev/null
@@ -0,0 +1,241 @@
+//  SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
+//
+//  Copyright (C) 2003  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. 
+// 
+//  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+//
+//
+//
+// File      : SMESH_MeshEditor.hxx
+// Created   : Mon Apr 12 14:56:19 2004
+// Author    : Edward AGAPOV (eap)
+// Module    : SMESH
+
+
+#ifndef SMESH_MeshEditor_HeaderFile
+#define SMESH_MeshEditor_HeaderFile
+
+#include "SMESH_Mesh.hxx"
+#include "SMESH_Controls.hxx"
+
+#include <list>
+#include <map>
+
+class SMDS_MeshElement;
+class SMDS_MeshFace;
+class SMDS_MeshNode;
+class gp_Ax1;
+class gp_Vec;
+
+class SMESH_MeshEditor {
+ public:
+
+  SMESH_MeshEditor( SMESH_Mesh* theMesh );
+
+  bool 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
+
+  bool InverseDiag (const SMDS_MeshElement * theTria1,
+                    const SMDS_MeshElement * theTria2 );
+  // Replace two neighbour triangles with ones built on the same 4 nodes
+  // but having other common link.
+  // Return False if args are improper
+
+  bool InverseDiag (const SMDS_MeshNode * theNode1,
+                    const SMDS_MeshNode * theNode2 );
+  // Replace two neighbour triangles sharing theNode1-theNode2 link
+  // with ones built on the same 4 nodes but having other common link.
+  // Return false if proper faces not found
+
+  bool DeleteDiag (const SMDS_MeshNode * theNode1,
+                   const SMDS_MeshNode * theNode2 );
+  // Replace two neighbour triangles sharing theNode1-theNode2 link
+  // with a quadrangle built on the same 4 nodes.
+  // Return false if proper faces not found
+
+  bool Reorient (const SMDS_MeshElement * theFace);
+  // Reverse the normal of theFace
+  // Return false if theFace is null
+
+
+  bool TriToQuad (std::set<const SMDS_MeshElement*> &  theElems,
+                  SMESH::Controls::NumericalFunctorPtr theCriterion,
+                  const double                         theMaxAngle);
+  // Fuse neighbour triangles into quadrangles.
+  // theCriterion is used to choose a neighbour to fuse with.
+  // theMaxAngle is a max angle between element normals at which
+  // fusion is still performed; theMaxAngle is mesured in radians.
+
+  bool QuadToTri (std::set<const SMDS_MeshElement*> &  theElems,
+                  SMESH::Controls::NumericalFunctorPtr theCriterion);
+  // Cut quadrangles into triangles.
+  // theCriterion is used to choose a diagonal to cut
+
+  bool QuadToTri (std::set<const SMDS_MeshElement*> & theElems,
+                  const bool                          the13Diag);
+  // Cut quadrangles into triangles
+
+
+  enum SmoothMethod { LAPLACIAN = 0, CENTROIDAL };
+
+  void Smooth (std::set<const SMDS_MeshElement*> & theElements,
+               std::set<const SMDS_MeshNode*> &    theFixedNodes,
+               const SmoothMethod                  theSmoothMethod,
+               const int                           theNbIterations,
+               double                              theTgtAspectRatio = 1.0);
+  // Smooth theElements using theSmoothMethod during theNbIterations
+  // or until a worst element has aspect ratio <= theTgtAspectRatio.
+  // Aspect Ratio varies in range [1.0, inf].
+  // If theElements is empty, the whole mesh is smoothed.
+  // theFixedNodes contains additionally fixed nodes. Nodes built
+  // on edges and boundary nodes are always fixed.
+
+
+  void RotationSweep (std::set<const SMDS_MeshElement*> & theElements,
+                      const gp_Ax1&                       theAxis,
+                      const double                        theAngle,
+                      const int                           theNbSteps,
+                      const double                        theToler);
+  // Generate new elements by rotation of theElements around theAxis
+  // by theAngle by theNbSteps
+
+  void ExtrusionSweep (std::set<const SMDS_MeshElement*> & theElements,
+                       const gp_Vec&                       theStep,
+                       const int                           theNbSteps);
+  // Generate new elements by extrusion of theElements 
+  // by theStep by theNbSteps
+
+
+  void Transform (std::set<const SMDS_MeshElement*> & theElements,
+                  const gp_Trsf&                      theTrsf,
+                  const bool                          theCopy);
+  // Move or copy theElements applying theTrsf to their nodes
+
+
+  typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes;
+
+  void FindCoincidentNodes (const double         theTolerance,
+                            TListOfListOfNodes & theGroupsOfNodes);
+  // Return list of group of nodes close to each other within theTolerance
+
+  void MergeNodes (TListOfListOfNodes & theNodeGroups);
+  // In each group, the cdr of nodes are substituted by the first one
+  // in all elements.
+
+  void MergeEqualElements();
+  // Remove all but one of elements built on the same nodes.
+  // Return nb of successfully merged groups.
+
+  static bool CheckFreeBorderNodes(const SMDS_MeshNode* theNode1,
+                                   const SMDS_MeshNode* theNode2,
+                                   const SMDS_MeshNode* theNode3 = 0);
+  // Return true if the three nodes are on a free border
+
+  enum Sew_Error {
+    SEW_OK,
+    // for SewFreeBorder()
+    SEW_BORDER1_NOT_FOUND,
+    SEW_BORDER2_NOT_FOUND,
+    SEW_BOTH_BORDERS_NOT_FOUND,
+    SEW_BAD_SIDE_NODES,
+    SEW_VOLUMES_TO_SPLIT,
+    // for SewSideElements()
+    SEW_DIFF_NB_OF_ELEMENTS,
+    SEW_TOPO_DIFF_SETS_OF_ELEMENTS,
+    SEW_BAD_SIDE1_NODES,
+    SEW_BAD_SIDE2_NODES
+    };
+    
+
+  Sew_Error SewFreeBorder (const SMDS_MeshNode* theBorderFirstNode,
+                           const SMDS_MeshNode* theBorderSecondNode,
+                           const SMDS_MeshNode* theBorderLastNode,
+                           const SMDS_MeshNode* theSide2FirstNode,
+                           const SMDS_MeshNode* theSide2SecondNode,
+                           const SMDS_MeshNode* theSide2ThirdNode = 0,
+                           bool                 theSide2IsFreeBorder = true);
+  // Sew the free border to the side2 by replacing nodes in
+  // elements on the free border with nodes of the elements
+  // of the side 2. If nb of links in the free border and
+  // between theSide2FirstNode and theSide2LastNode are different,
+  // additional nodes are inserted on a link provided that no
+  // volume elements share the splitted link.
+  // The side 2 is a free border if theSide2IsFreeBorder == true.
+  // Sewing is peformed between the given first, second and last
+  // nodes on the sides.
+  // theBorderFirstNode is merged with theSide2FirstNode.
+  // if (!theSide2IsFreeBorder) then theSide2SecondNode gives
+  // the last node on the side 2, which will be merged with
+  // theBorderLastNode.
+  // if (theSide2IsFreeBorder) then theSide2SecondNode will
+  // be merged with theBorderSecondNode.
+  // if (theSide2IsFreeBorder && theSide2ThirdNode == 0) then
+  // the 2 free borders are sewn link by link and no additional
+  // nodes are inserted.
+  // Return false, if sewing failed.
+
+  Sew_Error SewSideElements (std::set<const SMDS_MeshElement*>& theSide1,
+                             std::set<const SMDS_MeshElement*>& theSide2,
+                             const SMDS_MeshNode*               theFirstNode1ToMerge,
+                             const SMDS_MeshNode*               theFirstNode2ToMerge,
+                             const SMDS_MeshNode*               theSecondNode1ToMerge,
+                             const SMDS_MeshNode*               theSecondNode2ToMerge);
+  // Sew two sides of a mesh. Nodes belonging to theSide1 are
+  // merged with nodes of elements of theSide2.
+  // Number of elements in theSide1 and in theSide2 must be
+  // equal and they should have similar node connectivity.
+  // The nodes to merge should belong to side s borders and
+  // the first node should be linked to the second.
+
+  void InsertNodesIntoLink(const SMDS_MeshElement*          theFace,
+                           const SMDS_MeshNode*             theBetweenNode1,
+                           const SMDS_MeshNode*             theBetweenNode2,
+                           std::list<const SMDS_MeshNode*>& theNodesToInsert);
+  // insert theNodesToInsert into theFace between theBetweenNode1
+  // and theBetweenNode2 and split theElement.
+
+  static int SortQuadNodes (const SMDS_Mesh * theMesh,
+                            int               theNodeIds[] );
+  // Set 4 nodes of a quadrangle face in a good order.
+  // Swap 1<->2 or 2<->3 nodes and correspondingly return
+  // 1 or 2 else 0.
+
+  static bool SortHexaNodes (const SMDS_Mesh * theMesh,
+                             int               theNodeIds[] );
+  // Set 8 nodes of a hexahedron in a good order.
+  // Return success status
+  
+
+  int FindShape (const SMDS_MeshElement * theElem);
+  // Return an index of the shape theElem is on
+  // or zero if a shape not found
+
+
+  SMESH_Mesh * GetMesh() { return myMesh; }
+
+  SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
+
+
+ private:
+
+  SMESH_Mesh * myMesh;
+
+};
+
+#endif