Salome HOME
PR: synchro V6_main tag mergeto_V7_main_11Feb13
[modules/smesh.git] / src / SMESH / SMESH_Algo.hxx
index 83b34c3a9d74c1a05cf3bcb050730581114b81ba..76f6de97957d6168ffd8a7d2ada8f59598e06321 100644 (file)
@@ -1,23 +1,23 @@
-//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012  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
+// 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.
+// 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
+// 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
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
 //  SMESH SMESH : implementaion of SMESH idl descriptions
 #include <list>
 #include <map>
 
+class SMDS_MeshNode;
+class SMESHDS_Mesh;
+class SMESHDS_SubMesh;
 class SMESH_Gen;
-class SMESH_Mesh;
 class SMESH_HypoFilter;
-class TopoDS_Vertex;
+class SMESH_Mesh;
+class SMESH_MesherHelper;
+class SMESH_subMesh;
 class TopoDS_Face;
 class TopoDS_Shape;
-class SMESHDS_Mesh;
-class SMDS_MeshNode;
-class SMESH_subMesh;
-class SMESH_MesherHelper;
+class TopoDS_Vertex;
+class TopoDS_Wire;
 class gp_XYZ;
 
 typedef std::map< SMESH_subMesh*, std::vector<int> >           MapShapeNbElems;
@@ -118,9 +120,9 @@ public:
     * \param aShape - the shape
     * \retval bool - is a success
     *
-    * Algorithms that !NeedDescretBoundary() || !OnlyUnaryInput() are
+    * Algorithms that !NeedDiscreteBoundary() || !OnlyUnaryInput() are
     * to set SMESH_ComputeError returned by SMESH_submesh::GetComputeError()
-    * to report problematic subshapes
+    * to report problematic sub-shapes
    */
   virtual bool Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) = 0;
 
@@ -134,6 +136,12 @@ public:
    */
   virtual bool Compute(SMESH_Mesh & aMesh, SMESH_MesherHelper* aHelper);
 
+  /*!
+   * \brief Sets _computeCanceled to true. It's usage depends on
+   *        implementation of a particular mesher.
+   */
+  virtual void CancelCompute();
+
   /*!
    * \brief evaluates size of prospective mesh on a shape
     * \param aMesh - the mesh
@@ -215,15 +223,19 @@ public:
   // an input temporary shape that is neither MainShape nor
   // its child.
 
-  bool NeedDescretBoundary() const { return _requireDescretBoundary; }
+  bool NeedDiscreteBoundary() const { return _requireDiscreteBoundary; }
   // 3 - is a Dim-1 mesh prerequisite
 
   bool NeedShape() const { return _requireShape; }
   // 4 - is shape existance required
 
   bool SupportSubmeshes() const { return _supportSubmeshes; }
-  // 5 - whether supports submeshes if !NeedDescretBoundary()
+  // 5 - whether supports submeshes if !NeedDiscreteBoundary()
 
+  bool NeedLowerHyps(int dim) const { return _neededLowerHyps[ dim ]; }
+  // 6 - if algo !NeedDiscreteBoundary() but requires presence of
+  // hypotheses of dimension <dim> to generate all-dimensional mesh.
+  // This info is used not to issue warnings on hiding of lower global algos.
 
 public:
   // ==================================================================
@@ -295,6 +307,9 @@ public:
    */
   static bool FaceNormal(const SMDS_MeshElement* F, gp_XYZ& normal, bool normalized=true);
 
+  //static int NumberOfWires(const TopoDS_Shape& S);
+  int NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W);
+
   /*!
    * \brief Return continuity of two edges
     * \param E1 - the 1st edge
@@ -324,6 +339,13 @@ public:
   static std::vector< const SMDS_MeshNode*> GetCommonNodes(const SMDS_MeshElement* e1,
                                                            const SMDS_MeshElement* e2);
 
+  enum EMeshError { MEr_OK = 0, MEr_HOLES, MEr_BAD_ORI, MEr_EMPTY };
+
+  /*!
+   * \brief Finds topological errors of a sub-mesh 
+   */
+  static EMeshError GetMeshError(SMESH_subMesh* subMesh);
+
  protected:
 
   /*!
@@ -346,6 +368,9 @@ public:
    */
   void addBadInputElement(const SMDS_MeshElement* elem);
 
+  void addBadInputElements(const SMESHDS_SubMesh* sm,
+                           const bool             addNodes=false);
+
 protected:
 
   std::vector<std::string>              _compatibleHypothesis;
@@ -354,19 +379,46 @@ protected:
 
   // Algo features influencing which Compute() and how is called:
   // in what turn and with what input shape.
-  // This fields must be redefined if necessary by each descendant at constructor.
+  // These fields must be redefined if necessary by each descendant at constructor.
   bool _onlyUnaryInput;         // mesh one shape of GetDim() at once. Default TRUE
-  bool _requireDescretBoundary; // GetDim()-1 mesh must be present. Default TRUE
+  bool _requireDiscreteBoundary;// GetDim()-1 mesh must be present. Default TRUE
   bool _requireShape;           // work with GetDim()-1 mesh bound to geom only. Default TRUE
-  bool _supportSubmeshes;       // if !_requireDescretBoundary. Default FALSE
+  bool _supportSubmeshes;       // if !_requireDiscreteBoundary. Default FALSE
+  bool _neededLowerHyps[4];     // hyp dims needed by algo that !NeedDiscreteBoundary(). Df. FALSE
 
-  // quadratic mesh creation required,
-  // is usually set trough SMESH_MesherHelper::IsQuadraticSubMesh()
+  // indicates if quadratic mesh creation is required,
+  // is usually set like this: _quadraticMesh = SMESH_MesherHelper::IsQuadraticSubMesh(shape)
   bool _quadraticMesh;
 
   int         _error;    //!< SMESH_ComputeErrorName or anything algo specific
   std::string _comment;  //!< any text explaining what is wrong in Compute()
   std::list<const SMDS_MeshElement*> _badInputElements; //!< to explain COMPERR_BAD_INPUT_MESH
+
+  volatile bool _computeCanceled; //!< is set to True while computing to stop it
+};
+
+class SMESH_EXPORT SMESH_0D_Algo: public SMESH_Algo
+{
+public:
+  SMESH_0D_Algo(int hypId, int studyId,  SMESH_Gen* gen);
+};
+
+class SMESH_EXPORT SMESH_1D_Algo: public SMESH_Algo
+{
+public:
+  SMESH_1D_Algo(int hypId, int studyId,  SMESH_Gen* gen);
+};
+
+class SMESH_EXPORT SMESH_2D_Algo: public SMESH_Algo
+{
+public:
+  SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen);
+};
+
+class SMESH_EXPORT SMESH_3D_Algo: public SMESH_Algo
+{
+public:
+  SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen);
 };
 
 #endif