Salome HOME
PAL13073 (Submesh hypothesises do not work for NETGEN 1D-2D-3D)
[modules/smesh.git] / src / SMESH_SWIG / smesh.py
index 504a26460eac844a8122e3f57b0c68c134b3164d..38388434252c54a7d1e3bc12e838cce5a16f9970 100644 (file)
@@ -1,3 +1,26 @@
+#  Copyright (C) 2005  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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+#  File   : smesh.py
+#  Author : Francis KLOSS, OCC
+#  Module : SMESH
+
 """
  \namespace smesh
  \brief Module smesh
@@ -11,7 +34,7 @@ from   SMESH import *
 
 import StdMeshers
 
-## import NETGENPlugin module if possible
+# import NETGENPlugin module if possible
 noNETGENPlugin = 0
 try:
     import NETGENPlugin
@@ -19,8 +42,7 @@ except ImportError:
     noNETGENPlugin = 1
     pass
     
-
-## Types of algo
+# Types of algo
 REGULAR = 1
 PYTHON  = 2
 
@@ -29,16 +51,16 @@ NETGEN  = 4
 GHS3D   = 5
 FULL_NETGEN = 6
 
-## MirrorType enumeration
+# MirrorType enumeration
 POINT = SMESH_MeshEditor.POINT
 AXIS =  SMESH_MeshEditor.AXIS 
 PLANE = SMESH_MeshEditor.PLANE
 
-## Smooth_Method enumeration
+# Smooth_Method enumeration
 LAPLACIAN_SMOOTH = SMESH_MeshEditor.LAPLACIAN_SMOOTH
 CENTROIDAL_SMOOTH = SMESH_MeshEditor.CENTROIDAL_SMOOTH
 
-## Fineness enumeration(for NETGEN)
+# Fineness enumeration(for NETGEN)
 VeryCoarse = 0
 Coarse = 1
 Moderate = 2
@@ -53,7 +75,7 @@ NO_NAME = "NoName"
 smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
 smesh.SetCurrentStudy(salome.myStudy)
 
-## Global functions
+# Global functions
 
 ## Gets object name
 def GetName(obj):
@@ -74,7 +96,7 @@ def SetName(obj, name):
         attr.SetValue(name)
         
 ## Returns long value from enumeration
-#  Uses for FT_... enumeration
+#  Uses for SMESH.FunctorType enumeration
 def EnumToLong(theItem):
     return theItem._v
 
@@ -124,8 +146,8 @@ def GetAxisStruct(theObj):
         return axis
     return None
 
-## From SMESH_Gen interface:
-#  ------------------------
+# From SMESH_Gen interface:
+# ------------------------
 
 ## Set the current mode
 def SetEmbeddedMode( theMode ):
@@ -177,8 +199,8 @@ def GetPattern():
 
 
 
-## Filtering. Auxiliary functions:
-#  ------------------------------
+# Filtering. Auxiliary functions:
+# ------------------------------
 
 ## Creates an empty criterion
 #  @return SMESH.Filter.Criterion
@@ -219,11 +241,17 @@ def GetCriterion(elementType,
         
     if Compare in [FT_LessThan, FT_MoreThan, FT_EqualTo]:
         aCriterion.Compare = EnumToLong(Compare)
+    elif Compare == "=" or Compare == "==":
+        aCriterion.Compare = EnumToLong(FT_EqualTo)
+    elif Compare == "<":
+        aCriterion.Compare = EnumToLong(FT_LessThan)
+    elif Compare == ">":
+        aCriterion.Compare = EnumToLong(FT_MoreThan)
     else:
         aCriterion.Compare = EnumToLong(FT_EqualTo)
         aTreshold = Compare
 
-    if CritType in [FT_BelongToGeom,     FT_BelongToPlane,
+    if CritType in [FT_BelongToGeom,     FT_BelongToPlane, FT_BelongToGenSurface, 
                     FT_BelongToCylinder, FT_LyingOnGeom]:
         # Check treshold
         if isinstance(aTreshold, geompy.GEOM._objref_GEOM_Object):
@@ -321,6 +349,43 @@ def GetFunctor(theCriterion):
         print "Error: given parameter is not numerucal functor type."
 
 
+## Private method. Print error message if a hypothesis was not assigned.
+def TreatHypoStatus(status, hypName, geomName, isAlgo):
+    if isAlgo:
+        hypType = "algorithm"
+    else:
+        hypType = "hypothesis"
+        pass
+    if status == HYP_UNKNOWN_FATAL :
+        reason = "for unknown reason"
+    elif status == HYP_INCOMPATIBLE :
+        reason = "this hypothesis mismatches algorithm"
+    elif status == HYP_NOTCONFORM :
+        reason = "not conform mesh would be built"
+    elif status == HYP_ALREADY_EXIST :
+        reason = hypType + " of the same dimension already assigned to this shape"
+    elif status == HYP_BAD_DIM :
+        reason = hypType + " mismatches shape"
+    elif status == HYP_CONCURENT :
+        reason = "there are concurrent hypotheses on sub-shapes"
+    elif status == HYP_BAD_SUBSHAPE :
+        reason = "shape is neither the main one, nor its subshape, nor a valid group"
+    elif status == HYP_BAD_GEOMETRY:
+        reason = "geometry mismatches algorithm's expectation"
+    elif status == HYP_HIDDEN_ALGO:
+        reason = "it is hidden by an algorithm of upper dimension generating all-dimensions elements"
+    elif status == HYP_HIDING_ALGO:
+        reason = "it hides algorithm(s) of lower dimension by generating all-dimensions elements"
+    else:
+        return
+    hypName = '"' + hypName + '"'
+    geomName= '"' + geomName+ '"'
+    if status < HYP_UNKNOWN_FATAL:
+        print hypName, "was assigned to",    geomName,"but", reason
+    else:
+        print hypName, "was not assigned to",geomName,":", reason
+        pass
+
     
     
 ## Mother class to define algorithm, recommended to don't use directly.
@@ -335,10 +400,8 @@ class Mesh_Algorithm:
     subm = 0
     algo = 0
 
-    ## If the algorithm is global, return 0
-    #  \fn else return the submesh associated to this algorithm.
-    #
-    #  More details.
+    ## If the algorithm is global, return 0; \n
+    #  else return the submesh associated to this algorithm.
     def GetSubMesh(self):
         return self.subm
 
@@ -365,36 +428,6 @@ class Mesh_Algorithm:
     def GetId(self):
         return self.algo.GetId()
     
-    ## Private method. Print error message if a hypothesis was not assigned.
-    def TreatHypoStatus(self, status, hypName, geomName, isAlgo):
-        if isAlgo:
-            hypType = "algorithm"
-        else:
-            hypType = "hypothesis"
-        if status == HYP_UNKNOWN_FATAL :
-            reason = "for unknown reason"
-        elif status == HYP_INCOMPATIBLE :
-            reason = "this hypothesis mismatches algorithm"
-        elif status == HYP_NOTCONFORM :
-            reason = "not conform mesh would be built"
-        elif status == HYP_ALREADY_EXIST :
-            reason = hypType + " of the same dimension already assigned to this shape"
-        elif status == HYP_BAD_DIM :
-            reason = hypType + " mismatches shape"
-        elif status == HYP_CONCURENT :
-            reason = "there are concurrent hypotheses on sub-shapes"
-        elif status == HYP_BAD_SUBSHAPE :
-            reason = "shape is neither the main one, nor its subshape, nor a valid group"
-        else:
-            return
-        hypName = '"' + hypName + '"'
-        geomName= '"' + geomName+ '"'
-        if status < HYP_UNKNOWN_FATAL:
-            print hypName, "was assigned to",    geomName,"but", reason
-        else:
-            print hypName, "was not assigned to",geomName,":", reason
-        pass
-        
     ## Private method.
     def Create(self, mesh, geom, hypo, so="libStdMeshersEngine.so"):
         if geom is None:
@@ -415,7 +448,7 @@ class Mesh_Algorithm:
         self.algo = smesh.CreateHypothesis(hypo, so)
         SetName(self.algo, name + "/" + hypo)
         status = mesh.mesh.AddHypothesis(self.geom, self.algo)
-        self.TreatHypoStatus( status, hypo, name, 1 )
+        TreatHypoStatus( status, hypo, name, 1 )
         
     ## Private method
     def Hypothesis(self, hyp, args=[], so="libStdMeshersEngine.so"):
@@ -431,7 +464,7 @@ class Mesh_Algorithm:
         name = GetName(self.geom)
         SetName(hypo, name + "/" + hyp + a)
         status = self.mesh.mesh.AddHypothesis(self.geom, hypo)
-        self.TreatHypoStatus( status, hyp, name, 0 )
+        TreatHypoStatus( status, hyp, name, 0 )
         return hypo
 
 
@@ -759,6 +792,8 @@ class Mesh_Hexahedron(Mesh_Algorithm):
 ## Class to define a NETGEN-based 2D or 3D algorithm
 #  that need no discrete boundary (i.e. independent)
 #
+#  This class is deprecated, only for compatibility!
+#
 #  More details.
 class Mesh_Netgen(Mesh_Algorithm):
 
@@ -782,7 +817,207 @@ class Mesh_Netgen(Mesh_Algorithm):
         else:
             hyp = self.Hypothesis("NETGEN_Parameters_2D", [], "libNETGENEngine.so")
         return hyp
+
+# Public class: Mesh_Projection1D
+# ------------------------------
+
+## Class to define a projection 1D algorithm
+#
+#  More details.
+class Mesh_Projection1D(Mesh_Algorithm):
+
+    ## Private constructor.
+    def __init__(self, mesh, geom=0):
+        self.Create(mesh, geom, "Projection_1D")
+
+    ## Define "Source Edge" hypothesis, specifying a meshed edge to
+    #  take a mesh pattern from, and optionally association of vertices
+    #  between the source edge and a target one (where a hipothesis is assigned to)
+    #  @param edge to take nodes distribution from
+    #  @param mesh to take nodes distribution from (optional)
+    #  @param srcV is vertex of \a edge to associate with \a tgtV (optional)
+    #  @param tgtV is vertex of \a the edge where the algorithm is assigned,
+    #  to associate with \a srcV (optional)
+    def SourceEdge(self, edge, mesh=None, srcV=None, tgtV=None):
+        hyp = self.Hypothesis("ProjectionSource1D")
+        hyp.SetSourceEdge( edge )
+        if not mesh is None and isinstance(mesh, Mesh):
+            mesh = mesh.GetMesh()
+        hyp.SetSourceMesh( mesh )
+        hyp.SetVertexAssociation( srcV, tgtV )
+        return hyp
+
+
+# Public class: Mesh_Projection2D
+# ------------------------------
+
+## Class to define a projection 2D algorithm
+#
+#  More details.
+class Mesh_Projection2D(Mesh_Algorithm):
+
+    ## Private constructor.
+    def __init__(self, mesh, geom=0):
+        self.Create(mesh, geom, "Projection_2D")
+
+    ## Define "Source Face" hypothesis, specifying a meshed face to
+    #  take a mesh pattern from, and optionally association of vertices
+    #  between the source face and a target one (where a hipothesis is assigned to)
+    #  @param face to take mesh pattern from
+    #  @param mesh to take mesh pattern from (optional)
+    #  @param srcV1 is vertex of \a face to associate with \a tgtV1 (optional)
+    #  @param tgtV1 is vertex of \a the face where the algorithm is assigned,
+    #  to associate with \a srcV1 (optional)
+    #  @param srcV2 is vertex of \a face to associate with \a tgtV1 (optional)
+    #  @param tgtV2 is vertex of \a the face where the algorithm is assigned,
+    #  to associate with \a srcV2 (optional)
+    #
+    #  Note: association vertices must belong to one edge of a face
+    def SourceFace(self, face, mesh=None, srcV1=None, tgtV1=None, srcV2=None, tgtV2=None):
+        hyp = self.Hypothesis("ProjectionSource2D")
+        hyp.SetSourceFace( face )
+        if not mesh is None and isinstance(mesh, Mesh):
+            mesh = mesh.GetMesh()
+        hyp.SetSourceMesh( mesh )
+        hyp.SetVertexAssociation( srcV1, srcV2, tgtV1, tgtV2 )
+        return hyp
+
+# Public class: Mesh_Projection3D
+# ------------------------------
+
+## Class to define a projection 3D algorithm
+#
+#  More details.
+class Mesh_Projection3D(Mesh_Algorithm):
+
+    ## Private constructor.
+    def __init__(self, mesh, geom=0):
+        self.Create(mesh, geom, "Projection_3D")
+
+    ## Define "Source Shape 3D" hypothesis, specifying a meshed solid to
+    #  take a mesh pattern from, and optionally association of vertices
+    #  between the source solid and a target one (where a hipothesis is assigned to)
+    #  @param solid to take mesh pattern from
+    #  @param mesh to take mesh pattern from (optional)
+    #  @param srcV1 is vertex of \a solid to associate with \a tgtV1 (optional)
+    #  @param tgtV1 is vertex of \a the solid where the algorithm is assigned,
+    #  to associate with \a srcV1 (optional)
+    #  @param srcV2 is vertex of \a solid to associate with \a tgtV1 (optional)
+    #  @param tgtV2 is vertex of \a the solid where the algorithm is assigned,
+    #  to associate with \a srcV2 (optional)
+    #
+    #  Note: association vertices must belong to one edge of a solid
+    def SourceShape3D(self, solid, mesh=0, srcV1=0, tgtV1=0, srcV2=0, tgtV2=0):
+        hyp = self.Hypothesis("ProjectionSource3D")
+        hyp.SetSource3DShape( solid )
+        if not mesh is None and isinstance(mesh, Mesh):
+            mesh = mesh.GetMesh()
+        hyp.SetSourceMesh( mesh )
+        hyp.SetVertexAssociation( srcV1, srcV2, tgtV1, tgtV2 )
+        return hyp
+
+
+# Public class: Mesh_Prism
+# ------------------------
+
+## Class to define a Prism 3D algorithm
+#
+#  More details.
+class Mesh_Prism3D(Mesh_Algorithm):
+
+    ## Private constructor.
+    def __init__(self, mesh, geom=0):
+        self.Create(mesh, geom, "Prism_3D")
+
+# Public class: Mesh_RadialPrism
+# -------------------------------
+
+## Class to define a Radial Prism 3D algorithm
+#
+#  More details.
+class Mesh_RadialPrism3D(Mesh_Algorithm):
+
+    ## Private constructor.
+    def __init__(self, mesh, geom=0):
+        self.Create(mesh, geom, "RadialPrism_3D")
+        self.distribHyp = self.Hypothesis( "LayerDistribution" )
+        self.nbLayers = None
+
+    ## Return 3D hypothesis holding the 1D one
+    def Get3DHypothesis(self):
+        return self.distribHyp
+
+    ## Private method creating 1D hypothes and storing it in the LayerDistribution
+    #  hypothes. Returns the created hypothes
+    def OwnHypothesis(self, hypType, args=[], so="libStdMeshersEngine.so"):
+        if not self.nbLayers is None:
+            self.mesh.GetMesh().RemoveHypothesis( self.geom, self.nbLayers )
+            self.mesh.GetMesh().AddHypothesis( self.geom, self.distribHyp )
+        study = GetCurrentStudy() # prevent publishing of own 1D hypothesis
+        hyp = smesh.CreateHypothesis(hypType, so)
+        SetCurrentStudy( study ) # anable publishing
+        self.distribHyp.SetLayerDistribution( hyp )
+        return hyp
+
+    ## Define "NumberOfLayers" hypothesis, specifying a number of layers of
+    #  prisms to build between the inner and outer shells
+    def NumberOfLayers(self, n ):
+        self.mesh.GetMesh().RemoveHypothesis( self.geom, self.distribHyp )
+        self.nbLayers = self.Hypothesis("NumberOfLayers")
+        self.nbLayers.SetNumberOfLayers( n )
+        return self.nbLayers
+
+    ## Define "LocalLength" hypothesis, specifying segment length
+    #  to build between the inner and outer shells
+    #  @param l for the length of segments
+    def LocalLength(self, l):
+        hyp = self.OwnHypothesis("LocalLength", [l])
+        hyp.SetLength(l)
+        return hyp
         
+    ## Define "NumberOfSegments" hypothesis, specifying a number of layers of
+    #  prisms to build between the inner and outer shells
+    #  @param n for the number of segments
+    #  @param s for the scale factor (optional)
+    def NumberOfSegments(self, n, s=[]):
+        if s == []:
+            hyp = self.OwnHypothesis("NumberOfSegments", [n])
+        else:
+            hyp = self.OwnHypothesis("NumberOfSegments", [n,s])
+            hyp.SetDistrType( 1 )
+            hyp.SetScaleFactor(s)
+        hyp.SetNumberOfSegments(n)
+        return hyp
+        
+    ## Define "Arithmetic1D" hypothesis, specifying distribution of segments
+    #  to build between the inner and outer shells as arithmetic length increasing
+    #  @param start for the length of the first segment
+    #  @param end   for the length of the last  segment
+    def Arithmetic1D(self, start, end):
+        hyp = self.OwnHypothesis("Arithmetic1D", [start, end])
+        hyp.SetLength(start, 1)
+        hyp.SetLength(end  , 0)
+        return hyp
+        
+    ## Define "StartEndLength" hypothesis, specifying distribution of segments
+    #  to build between the inner and outer shells as geometric length increasing
+    #  @param start for the length of the first segment
+    #  @param end   for the length of the last  segment
+    def StartEndLength(self, start, end):
+        hyp = self.OwnHypothesis("StartEndLength", [start, end])
+        hyp.SetLength(start, 1)
+        hyp.SetLength(end  , 0)
+        return hyp
+        
+    ## Define "AutomaticLength" hypothesis, specifying number of segments
+    #  to build between the inner and outer shells
+    #  @param fineness for the fineness [0-1]
+    def AutomaticLength(self, fineness=0):
+        hyp = self.OwnHypothesis("AutomaticLength")
+        hyp.SetFineness( fineness )
+        return hyp
+
+
 # Public class: Mesh
 # ==================
 
@@ -803,6 +1038,8 @@ class Mesh:
     #  @param obj Shape to be meshed or SMESH_Mesh object
     #  @param name Study name of the mesh
     def __init__(self, obj=0, name=0):
+        if obj is None:
+            obj = 0
         if obj != 0:
             if isinstance(obj, geompy.GEOM._objref_GEOM_Object):
                 self.geom = obj
@@ -840,7 +1077,7 @@ class Mesh:
     
     ## Get the subMesh object associated to a subShape. The subMesh object
     #  gives access to nodes and elements IDs.
-    #  SubMesh will be used instead of SubShape in a next idl version to
+    #  \n SubMesh will be used instead of SubShape in a next idl version to
     #  adress a specific subMesh...
     def GetSubMesh(self, theSubObject, name):
         submesh = self.mesh.GetSubMesh(theSubObject, name)
@@ -896,7 +1133,7 @@ class Mesh:
     ## Creates a segment discretization 1D algorithm.
     #  If the optional \a algo parameter is not sets, this algorithm is REGULAR.
     #  If the optional \a geom parameter is not sets, this algorithm is global.
-    #  Otherwise, this algorithm define a submesh based on \a geom subshape.
+    #  \n Otherwise, this algorithm define a submesh based on \a geom subshape.
     #  @param algo values are smesh.REGULAR or smesh.PYTHON for discretization via python function
     #  @param geom If defined, subshape to be meshed
     def Segment(self, algo=REGULAR, geom=0):
@@ -913,7 +1150,7 @@ class Mesh:
         
     ## Creates a triangle 2D algorithm for faces.
     #  If the optional \a geom parameter is not sets, this algorithm is global.
-    #  Otherwise, this algorithm define a submesh based on \a geom subshape.
+    #  \n Otherwise, this algorithm define a submesh based on \a geom subshape.
     #  @param algo values are: smesh.MEFISTO or smesh.NETGEN
     #  @param geom If defined, subshape to be meshed
     def Triangle(self, algo=MEFISTO, geom=0):
@@ -926,7 +1163,7 @@ class Mesh:
         
     ## Creates a quadrangle 2D algorithm for faces.
     #  If the optional \a geom parameter is not sets, this algorithm is global.
-    #  Otherwise, this algorithm define a submesh based on \a geom subshape.
+    #  \n Otherwise, this algorithm define a submesh based on \a geom subshape.
     #  @param geom If defined, subshape to be meshed
     def Quadrangle(self, geom=0):
         return Mesh_Quadrangle(self, geom)
@@ -934,7 +1171,7 @@ class Mesh:
     ## Creates a tetrahedron 3D algorithm for solids.
     #  The parameter \a algo permits to choice the algorithm: NETGEN or GHS3D
     #  If the optional \a geom parameter is not sets, this algorithm is global.
-    #  Otherwise, this algorithm define a submesh based on \a geom subshape.
+    #  \n Otherwise, this algorithm define a submesh based on \a geom subshape.
     #  @param algo values are: smesh.NETGEN, smesh.GHS3D, smesh.FULL_NETGEN
     #  @param geom If defined, subshape to be meshed
     def Tetrahedron(self, algo=NETGEN, geom=0):
@@ -946,21 +1183,50 @@ class Mesh:
         
     ## Creates a hexahedron 3D algorithm for solids.
     #  If the optional \a geom parameter is not sets, this algorithm is global.
-    #  Otherwise, this algorithm define a submesh based on \a geom subshape.
+    #  \n Otherwise, this algorithm define a submesh based on \a geom subshape.
     #  @param geom If defined, subshape to be meshed
     def Hexahedron(self, geom=0):
         return Mesh_Hexahedron(self, geom)
 
     ## Deprecated, only for compatibility!
-    #  Creates a NETGEN-based 2D or 3D independent algorithm (i.e. needs no
-    #  discrete boundary).
-    #  If the optional \a geom parameter is not sets, this algorithm is global.
-    #  Otherwise, this algorithm defines a submesh based on \a geom subshape.
-    #  @param is3D If 0 then algorithm is 2D, otherwise 3D
-    #  @param geom If defined, subshape to be meshed
     def Netgen(self, is3D, geom=0):
         return Mesh_Netgen(self, is3D, geom)
-      
+
+    ## Creates a projection 1D algorithm for edges.
+    #  If the optional \a geom parameter is not sets, this algorithm is global.
+    #  Otherwise, this algorithm define a submesh based on \a geom subshape.
+    #  @param geom If defined, subshape to be meshed
+    def Projection1D(self, geom=0):
+        return Mesh_Projection1D(self, geom)
+
+    ## Creates a projection 2D algorithm for faces.
+    #  If the optional \a geom parameter is not sets, this algorithm is global.
+    #  Otherwise, this algorithm define a submesh based on \a geom subshape.
+    #  @param geom If defined, subshape to be meshed
+    def Projection2D(self, geom=0):
+        return Mesh_Projection2D(self, geom)
+
+    ## Creates a projection 3D algorithm for solids.
+    #  If the optional \a geom parameter is not sets, this algorithm is global.
+    #  Otherwise, this algorithm define a submesh based on \a geom subshape.
+    #  @param geom If defined, subshape to be meshed
+    def Projection3D(self, geom=0):
+        return Mesh_Projection3D(self, geom)
+
+    ## Creates a Prism 3D or RadialPrism 3D algorithm for solids.
+    #  If the optional \a geom parameter is not sets, this algorithm is global.
+    #  Otherwise, this algorithm define a submesh based on \a geom subshape.
+    #  @param geom If defined, subshape to be meshed
+    def Prism(self, geom=0):
+        shape = geom
+        if shape==0:
+            shape = self.geom
+        nbSolids = len( geompy.SubShapeAll( shape, geompy.ShapeType["SOLID"] ))
+        nbShells = len( geompy.SubShapeAll( shape, geompy.ShapeType["SHELL"] ))
+        if nbSolids == 0 or nbSolids == nbShells:
+            return Mesh_Prism3D(self, geom)
+        return Mesh_RadialPrism3D(self, geom)
+
     ## Compute the mesh and return the status of the computation
     def Compute(self, geom=0):
         if geom == 0 or not isinstance(geom, geompy.GEOM._objref_GEOM_Object):
@@ -985,8 +1251,15 @@ class Mesh:
                 elif err.name == MISSING_HYPO:
                     name = '"' + err.algoName + '"'
                     reason = glob + dim + "D algorithm " + name + " misses " + dim + "D hypothesis"
-                else:
+                elif err.name == NOT_CONFORM_MESH:
                     reason = "Global \"Not Conform mesh allowed\" hypothesis is missing"
+                elif err.name == BAD_PARAM_VALUE:
+                    name = '"' + err.algoName + '"'
+                    reason = "Hypothesis of" + glob + dim + "D algorithm " + name +\
+                             " has a bad parameter value"
+                else:
+                    reason = "For unknown reason."+\
+                             " Revise Mesh.Compute() implementation in smesh.py!"
                     pass
                 if allReasons != "":
                     allReasons += "\n"
@@ -1007,7 +1280,7 @@ class Mesh:
         return ok
 
     ## Compute tetrahedral mesh using AutomaticLength + MEFISTO + NETGEN
-    #  The parameter \a fineness [0.-1.] defines mesh fineness
+    #  The parameter \a fineness [0,-1] defines mesh fineness
     def AutomaticTetrahedralization(self, fineness=0):
         dim = self.MeshDimension()
         # assign hypotheses
@@ -1022,7 +1295,7 @@ class Mesh:
         return self.Compute()
         
     ## Compute hexahedral mesh using AutomaticLength + Quadrangle + Hexahedron
-    #  The parameter \a fineness [0.-1.] defines mesh fineness
+    #  The parameter \a fineness [0,-1] defines mesh fineness
     def AutomaticHexahedralization(self, fineness=0):
         dim = self.MeshDimension()
         # assign hypotheses
@@ -1050,9 +1323,9 @@ class Mesh:
         pass
         
     ## Create a mesh group based on geometric object \a grp
-    #  and give a \a name, if this parameter is not defined
-    #  the name is the same as the geometric group name
-    #  Note: this function is obsolete. Works like GroupOnGeom(). 
+    #  and give a \a name, \n if this parameter is not defined
+    #  the name is the same as the geometric group name \n
+    #  Note: Works like GroupOnGeom(). 
     #  @param grp  is a geometric group, a vertex, an edge, a face or a solid
     #  @param name is the name of the mesh group
     #  @return SMESH_GroupOnGeom
@@ -1090,11 +1363,10 @@ class Mesh:
     #  @param ascii defined the kind of file contents
     def ExportSTL(self, f, ascii=1):
         self.mesh.ExportSTL(f, ascii)
-    
-    ###################################################################################
+   
         
-    ## Operations with groups
-    #  ----------------------
+    # Operations with groups:
+    # ----------------------
 
     ## Creates an empty mesh group
     #  @param elementType is the type of elements in the group
@@ -1104,7 +1376,7 @@ class Mesh:
         return self.mesh.CreateGroup(elementType, name)
     
     ## Creates a mesh group based on geometric object \a grp
-    #  and give a \a name, if this parameter is not defined
+    #  and give a \a name, \n if this parameter is not defined
     #  the name is the same as the geometric group name
     #  @param grp  is a geometric group, a vertex, an edge, a face or a solid
     #  @param name is the name of the mesh group
@@ -1214,7 +1486,7 @@ class Mesh:
     def GetIdsFromFilter(self, theFilter):
         return theFilter.GetElementsId(self.mesh)
 
-    ## Verify whether 2D mesh element has free edges( i.e. edges connected to one face only )
+    ## Verify whether 2D mesh element has free edges(edges connected to one face only)\n
     #  Returns list of special structures(borders).
     #  @return list of SMESH.FreeEdges.Border structure: edge id and two its nodes ids.
     def GetFreeBorders(self):
@@ -1263,8 +1535,8 @@ class Mesh:
         return self.mesh.CutGroups(mainGroup, toolGroup, name)
          
     
-    ## Get some info about mesh:
-    #  ------------------------
+    # Get some info about mesh:
+    # ------------------------
 
     ## Get the log of nodes and elements added or removed since previous
     #  clear of the log.
@@ -1304,8 +1576,8 @@ class Mesh:
         return self.mesh.GetMEDMesh()
     
     
-    ## Get informations about mesh contents:
-    #  ------------------------------------
+    # Get informations about mesh contents:
+    # ------------------------------------
 
     ## Returns number of nodes in mesh
     def NbNodes(self):
@@ -1430,8 +1702,8 @@ class Mesh:
     def GetNodesId(self):
         return self.mesh.GetNodesId()
     
-    ## Get informations about mesh elements:
-    #  ------------------------------------
+    # Get informations about mesh elements:
+    # ------------------------------------
     
     ## Returns type of mesh element
     def GetElementType(self, id, iselem):
@@ -1457,38 +1729,38 @@ class Mesh:
         return self.mesh.Dump()
 
     
-    ## Get information about nodes and elements of mesh by its ids:
-    #  -----------------------------------------------------------
+    # Get information about nodes and elements of mesh by its ids:
+    # -----------------------------------------------------------
 
     ## Get XYZ coordinates of node as list of double
-    #  If there is not node for given ID - returns empty list
+    #  \n If there is not node for given ID - returns empty list
     def GetNodeXYZ(self, id):
         return self.mesh.GetNodeXYZ(id)
 
     ## For given node returns list of IDs of inverse elements
-    #  If there is not node for given ID - returns empty list
+    #  \n If there is not node for given ID - returns empty list
     def GetNodeInverseElements(self, id):
         return self.mesh.GetNodeInverseElements(id)
 
     ## If given element is node returns IDs of shape from position
-    #  If there is not node for given ID - returns -1
+    #  \n If there is not node for given ID - returns -1
     def GetShapeID(self, id):
         return self.mesh.GetShapeID(id)
 
     ## For given element returns ID of result shape after 
     #  FindShape() from SMESH_MeshEditor
-    #  If there is not element for given ID - returns -1
+    #  \n If there is not element for given ID - returns -1
     def GetShapeIDForElem(id):
         return self.mesh.GetShapeIDForElem(id)
     
     ## Returns number of nodes for given element
-    #  If there is not element for given ID - returns -1
+    #  \n If there is not element for given ID - returns -1
     def GetElemNbNodes(self, id):
         return self.mesh.GetElemNbNodes(id)
 
     ## Returns ID of node by given index for given element
-    #  If there is not element for given ID - returns -1
-    #  If there is not node for given index - returns -2
+    #  \n If there is not element for given ID - returns -1
+    #  \n If there is not node for given index - returns -2
     def GetElemNode(self, id, index):
         return self.mesh.GetElemNode(id, index)
 
@@ -1520,13 +1792,13 @@ class Mesh:
 
     ## Returns XYZ coordinates of bary center for given element
     #  as list of double
-    #  If there is not element for given ID - returns empty list
+    #  \n If there is not element for given ID - returns empty list
     def BaryCenter(self, id):
         return self.mesh.BaryCenter(id)
     
     
-    ## Mesh edition (SMESH_MeshEditor functionality):
-    #  ---------------------------------------------
+    # Mesh edition (SMESH_MeshEditor functionality):
+    # ---------------------------------------------
 
     ## Removes elements from mesh by ids
     #  @param IDsOfElements is list of ids of elements to remove
@@ -1547,7 +1819,7 @@ class Mesh:
     #  by number of given nodes).
     #  @param IdsOfNodes List of node IDs for creation of element.
     #  Needed order of nodes in this list corresponds to description
-    #  of MED. This description is located by the following link:
+    #  of MED. \n This description is located by the following link:
     #  http://www.salome-platform.org/salome2/web_med_internet/logiciels/medV2.2.2_doc_html/html/modele_de_donnees.html#3.
     def AddEdge(self, IDsOfNodes):
         return self.editor.AddEdge(IDsOfNodes)
@@ -1556,7 +1828,7 @@ class Mesh:
     #  by number of given nodes).
     #  @param IdsOfNodes List of node IDs for creation of element.
     #  Needed order of nodes in this list corresponds to description
-    #  of MED. This description is located by the following link:
+    #  of MED. \n This description is located by the following link:
     #  http://www.salome-platform.org/salome2/web_med_internet/logiciels/medV2.2.2_doc_html/html/modele_de_donnees.html#3.
     def AddFace(self, IDsOfNodes):
         return self.editor.AddFace(IDsOfNodes)
@@ -1569,7 +1841,7 @@ class Mesh:
     #  by number of given nodes).
     #  @param IdsOfNodes List of node IDs for creation of element.
     #  Needed order of nodes in this list corresponds to description
-    #  of MED. This description is located by the following link:
+    #  of MED. \n This description is located by the following link:
     #  http://www.salome-platform.org/salome2/web_med_internet/logiciels/medV2.2.2_doc_html/html/modele_de_donnees.html#3.
     def AddVolume(self, IDsOfNodes):
         return self.editor.AddVolume(IDsOfNodes)
@@ -1740,7 +2012,7 @@ class Mesh:
         self.editor.ConvertToQuadratic(theForce3d)
 
     ## Converts all mesh from quadratic to ordinary ones,
-    #  deletes old quadratic elements, replacing 
+    #  deletes old quadratic elements, \n replacing 
     #  them with ordinary mesh elements with the same id.
     def ConvertFromQuadratic(self):
         return self.editor.ConvertFromQuadratic()
@@ -1985,13 +2257,13 @@ class Mesh:
         return self.editor.ChangeElemNodes(ide, newIDs)
     
     ## If during last operation of MeshEditor some nodes were
-    #  created this method returns list of it's IDs, if new nodes
-    #  not created - returns empty list
+    #  created this method returns list of it's IDs, \n
+    #  if new nodes not created - returns empty list
     def GetLastCreatedNodes(self):
         return self.editor.GetLastCreatedNodes()
 
     ## If during last operation of MeshEditor some elements were
-    #  created this method returns list of it's IDs, if new elements
-    #  not creared - returns empty list
+    #  created this method returns list of it's IDs, \n
+    #  if new elements not creared - returns empty list
     def GetLastCreatedElems(self):
         return self.editor.GetLastCreatedElems()