Salome HOME
Correction because of 'geompyDC' refactoring.
[modules/smesh.git] / src / SMESH_SWIG / smesh_algorithm.py
index dfeaba4fb7da741e3d39b1b8d1054d87ea9d8c97..caad9bb1a85d5b949d60fb840c5ed65ff832a8e3 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -22,7 +22,7 @@
 #  This package is a part of SALOME %Mesh module Python API
 
 import salome
-import geompyDC
+from salome.geom import geomBuilder
 import SMESH
 
 ## The base class to define meshing algorithms
@@ -32,8 +32,8 @@ import SMESH
 #
 #  For each meshing algorithm, a python class inheriting from class %Mesh_Algorithm
 #  should be defined. This descendant class should have two attributes defining the way
-#  it is created by class Mesh (see e.g. class @ref StdMeshersDC.StdMeshersDC_Segment "StdMeshersDC_Segment"
-#  in StdMeshersDC package):
+#  it is created by class Mesh (see e.g. class @ref StdMeshersBuilder.StdMeshersBuilder_Segment "StdMeshersBuilder_Segment"
+#  in StdMeshersBuilder package):
 #  - @c meshMethod attribute defines name of method of class smesh.Mesh by calling which the
 #    python class of algorithm is created; this method is dynamically added to the smesh.Mesh class
 #    in runtime. For example, if in @c class MyPlugin_Algorithm this attribute is defined as
@@ -71,6 +71,7 @@ class Mesh_Algorithm:
     #  @return SMESH.SMESH_Hypothesis
     def FindHypothesis (self, hypname, args, CompareMethod, smeshpyD):
         study = smeshpyD.GetCurrentStudy()
+        if not study: return None
         #to do: find component by smeshpyD object, not by its data type
         scomp = study.FindComponent(smeshpyD.ComponentDataType())
         if scomp is not None:
@@ -166,7 +167,7 @@ class Mesh_Algorithm:
 
     ## Gets the name of the algorithm
     def GetName(self):
-        from smesh import GetName
+        from salome.smesh.smeshBuilder import GetName
         return GetName(self.algo)
 
     ## Sets the name to the algorithm
@@ -190,12 +191,12 @@ class Mesh_Algorithm:
 
     ## Private method
     def Assign(self, algo, mesh, geom):
-        from smesh import AssureGeomPublished, TreatHypoStatus, GetName
+        from salome.smesh.smeshBuilder import AssureGeomPublished, TreatHypoStatus, GetName
         if geom is None:
             raise RuntimeError, "Attemp to create " + algo + " algoritm on None shape"
         self.mesh = mesh
         name = ""
-        if not geom:
+        if not geom or geom.IsSame( mesh.geom ):
             self.geom = mesh.geom
         else:
             self.geom = geom
@@ -221,7 +222,7 @@ class Mesh_Algorithm:
     ## Private method
     def Hypothesis (self, hyp, args=[], so="libStdMeshersEngine.so",
                     UseExisting=0, CompareMethod=""):
-        from smesh import TreatHypoStatus, GetName
+        from salome.smesh.smeshBuilder import TreatHypoStatus, GetName
         hypo = None
         if UseExisting:
             if CompareMethod == "": CompareMethod = self.CompareHyp
@@ -233,7 +234,7 @@ class Mesh_Algorithm:
             s = "="
             for arg in args:
                 argStr = str(arg)
-                if isinstance( arg, geompyDC.GEOM._objref_GEOM_Object ):
+                if isinstance( arg, geomBuilder.GEOM._objref_GEOM_Object ):
                     argStr = arg.GetStudyEntry()
                     if not argStr: argStr = "GEOM_Obj_%s", arg.GetEntry()
                 if len( argStr ) > 10:
@@ -273,7 +274,7 @@ class Mesh_Algorithm:
             raise TypeError, "ViscousLayers are supported by 3D algorithms only"
         if not "ViscousLayers" in self.GetCompatibleHypothesis():
             raise TypeError, "ViscousLayers are not supported by %s"%self.algo.GetName()
-        if ignoreFaces and isinstance( ignoreFaces[0], geompyDC.GEOM._objref_GEOM_Object ):
+        if ignoreFaces and isinstance( ignoreFaces[0], geomBuilder.GEOM._objref_GEOM_Object ):
             ignoreFaces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in ignoreFaces ]
         hyp = self.Hypothesis("ViscousLayers",
                               [thickness, numberOfLayers, stretchFactor, ignoreFaces])
@@ -283,36 +284,59 @@ class Mesh_Algorithm:
         hyp.SetIgnoreFaces(ignoreFaces)
         return hyp
 
+    ## Defines "ViscousLayers2D" hypothesis to give parameters of layers of quadrilateral
+    #  elements to build near mesh boundary. This hypothesis can be used by several 2D algorithms:
+    #  NETGEN 2D, NETGEN 1D-2D, Quadrangle (mapping), MEFISTO, BLSURF
+    #  @param thickness total thickness of layers of quadrilaterals
+    #  @param numberOfLayers number of layers
+    #  @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh
+    #  @param ignoreEdges list of geometrical edge (or their ids) not to generate layers on
+    #  @ingroup l3_hypos_additi
+    def ViscousLayers2D(self, thickness, numberOfLayers, stretchFactor, ignoreEdges=[]):
+        if not isinstance(self.algo, SMESH._objref_SMESH_2D_Algo):
+            raise TypeError, "ViscousLayers2D are supported by 2D algorithms only"
+        if not "ViscousLayers2D" in self.GetCompatibleHypothesis():
+            raise TypeError, "ViscousLayers2D are not supported by %s"%self.algo.GetName()
+        if ignoreEdges and isinstance( ignoreEdges[0], geomBuilder.GEOM._objref_GEOM_Object ):
+            ignoreEdges = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in ignoreEdges ]
+        hyp = self.Hypothesis("ViscousLayers2D",
+                              [thickness, numberOfLayers, stretchFactor, ignoreEdges])
+        hyp.SetTotalThickness(thickness)
+        hyp.SetNumberLayers(numberOfLayers)
+        hyp.SetStretchFactor(stretchFactor)
+        hyp.SetIgnoreEdges(ignoreEdges)
+        return hyp
+
     ## Transform a list of ether edges or tuples (edge, 1st_vertex_of_edge)
     #  into a list acceptable to SetReversedEdges() of some 1D hypotheses
     #  @ingroup l3_hypos_1dhyps
     def ReversedEdgeIndices(self, reverseList):
-        from smesh import FirstVertexOnCurve
+        from salome.smesh.smeshBuilder import FirstVertexOnCurve
         resList = []
         geompy = self.mesh.geompyD
         for i in reverseList:
             if isinstance( i, int ):
                 s = geompy.SubShapes(self.mesh.geom, [i])[0]
-                if s.GetShapeType() != geompyDC.GEOM.EDGE:
+                if s.GetShapeType() != geomBuilder.GEOM.EDGE:
                     raise TypeError, "Not EDGE index given"
                 resList.append( i )
-            elif isinstance( i, geompyDC.GEOM._objref_GEOM_Object ):
-                if i.GetShapeType() != geompyDC.GEOM.EDGE:
+            elif isinstance( i, geomBuilder.GEOM._objref_GEOM_Object ):
+                if i.GetShapeType() != geomBuilder.GEOM.EDGE:
                     raise TypeError, "Not an EDGE given"
                 resList.append( geompy.GetSubShapeID(self.mesh.geom, i ))
             elif len( i ) > 1:
                 e = i[0]
                 v = i[1]
-                if not isinstance( e, geompyDC.GEOM._objref_GEOM_Object ) or \
-                   not isinstance( v, geompyDC.GEOM._objref_GEOM_Object ):
+                if not isinstance( e, geomBuilder.GEOM._objref_GEOM_Object ) or \
+                   not isinstance( v, geomBuilder.GEOM._objref_GEOM_Object ):
                     raise TypeError, "A list item must be a tuple (edge, 1st_vertex_of_edge)"
-                if v.GetShapeType() == geompyDC.GEOM.EDGE and \
-                   e.GetShapeType() == geompyDC.GEOM.VERTEX:
+                if v.GetShapeType() == geomBuilder.GEOM.EDGE and \
+                   e.GetShapeType() == geomBuilder.GEOM.VERTEX:
                     v,e = e,v
-                if e.GetShapeType() != geompyDC.GEOM.EDGE or \
-                   v.GetShapeType() != geompyDC.GEOM.VERTEX:
+                if e.GetShapeType() != geomBuilder.GEOM.EDGE or \
+                   v.GetShapeType() != geomBuilder.GEOM.VERTEX:
                     raise TypeError, "A list item must be a tuple (edge, 1st_vertex_of_edge)"
-                vFirst = FirstVertexOnCurve( e )
+                vFirst = FirstVertexOnCurve( self.mesh, e )
                 tol    = geompy.Tolerance( vFirst )[-1]
                 if geompy.MinDistance( v, vFirst ) > 1.5*tol:
                     resList.append( geompy.GetSubShapeID(self.mesh.geom, e ))