X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_SWIG%2Fsmesh_algorithm.py;h=a81f825a6ac4ebd2440f3d079bb63423a13a8340;hb=716b8a81b9bd9db166c0314ebf70461e6aedf9a1;hp=dfeaba4fb7da741e3d39b1b8d1054d87ea9d8c97;hpb=f5016d85b7b4b88623723027a1585c6414c4dc66;p=modules%2Fsmesh.git diff --git a/src/SMESH_SWIG/smesh_algorithm.py b/src/SMESH_SWIG/smesh_algorithm.py index dfeaba4fb..a81f825a6 100644 --- a/src/SMESH_SWIG/smesh_algorithm.py +++ b/src/SMESH_SWIG/smesh_algorithm.py @@ -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 @@ -179,7 +180,7 @@ class Mesh_Algorithm: ## Private method. def Create(self, mesh, geom, hypo, so="libStdMeshersEngine.so"): - if geom is None: + if geom is None and mesh.mesh.HasShapeToMesh(): raise RuntimeError, "Attemp to create " + hypo + " algoritm on None shape" algo = self.FindAlgorithm(hypo, mesh.smeshpyD) if algo is None: @@ -190,12 +191,12 @@ class Mesh_Algorithm: ## Private method def Assign(self, algo, mesh, geom): - from smesh import AssureGeomPublished, TreatHypoStatus, GetName - if geom is None: + from salome.smesh.smeshBuilder import AssureGeomPublished, TreatHypoStatus, GetName + if geom is None and mesh.mesh.HasShapeToMesh(): 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,65 @@ 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 edges list of geometrical edge (or their ids). + # Viscous layers are either generated on these edges or not, depending on + # the values of \a isEdgesToIgnore parameter. + # @param isEdgesToIgnore if \c True, the Viscous layers are not generated on the + # edges specified by the previous parameter (\a edges). + # @ingroup l3_hypos_additi + def ViscousLayers2D(self, thickness, numberOfLayers, stretchFactor, + edges=[], isEdgesToIgnore=True ): + 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 edges and isinstance( edges[0], geomBuilder.GEOM._objref_GEOM_Object ): + edges = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in edges ] + hyp = self.Hypothesis("ViscousLayers2D", + [thickness, numberOfLayers, stretchFactor, + edges, isEdgesToIgnore]) + hyp.SetTotalThickness(thickness) + hyp.SetNumberLayers(numberOfLayers) + hyp.SetStretchFactor(stretchFactor) + hyp.SetEdges(edges, isEdgesToIgnore) + 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 ))