1 # Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2.1 of the License.
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 # Lesser General Public License for more details.
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 ## @package smesh_algorithm
21 # Python API for base Mesh_Algorithm class.
22 # This package is a part of SALOME %Mesh module Python API
28 ## The base class to define meshing algorithms
30 # @note This class should not be used directly, it is supposed to be sub-classed
31 # for implementing Python API for specific meshing algorithms
33 # For each meshing algorithm, a python class inheriting from class %Mesh_Algorithm
34 # should be defined. This descendant class should have two attributes defining the way
35 # it is created by class Mesh (see e.g. class @ref StdMeshersDC.StdMeshersDC_Segment "StdMeshersDC_Segment"
36 # in StdMeshersDC package):
37 # - @c meshMethod attribute defines name of method of class smesh.Mesh by calling which the
38 # python class of algorithm is created; this method is dynamically added to the smesh.Mesh class
39 # in runtime. For example, if in @c class MyPlugin_Algorithm this attribute is defined as
41 # meshMethod = "MyAlgorithm"
43 # then an instance of @c MyPlugin_Algorithm can be created by the direct invokation of the function
44 # of smesh.Mesh class:
46 # my_algo = mesh.MyAlgorithm()
48 # - @c algoType defines type of algorithm and is used mostly to discriminate
49 # algorithms that are created by the same method of class smesh.Mesh. For example, if this attribute
50 # is specified in @c MyPlugin_Algorithm class as
52 # algoType = "MyPLUGIN"
54 # then it's creation code can be:
56 # my_algo = mesh.MyAlgorithm(algo="MyPLUGIN")
58 # @ingroup l2_algorithms
69 ## Finds a hypothesis in the study by its type name and parameters.
70 # Finds only the hypotheses created in smeshpyD engine.
71 # @return SMESH.SMESH_Hypothesis
72 def FindHypothesis (self, hypname, args, CompareMethod, smeshpyD):
73 study = smeshpyD.GetCurrentStudy()
74 #to do: find component by smeshpyD object, not by its data type
75 scomp = study.FindComponent(smeshpyD.ComponentDataType())
77 res,hypRoot = scomp.FindSubObject(SMESH.Tag_HypothesisRoot)
78 # Check if the root label of the hypotheses exists
79 if res and hypRoot is not None:
80 iter = study.NewChildIterator(hypRoot)
81 # Check all published hypotheses
83 hypo_so_i = iter.Value()
84 attr = hypo_so_i.FindAttribute("AttributeIOR")[1]
87 hypo_o_i = salome.orb.string_to_object(anIOR)
88 if hypo_o_i is not None:
89 # Check if this is a hypothesis
90 hypo_i = hypo_o_i._narrow(SMESH.SMESH_Hypothesis)
91 if hypo_i is not None:
92 # Check if the hypothesis belongs to current engine
93 if smeshpyD.GetObjectId(hypo_i) > 0:
94 # Check if this is the required hypothesis
95 if hypo_i.GetName() == hypname:
97 if CompareMethod(hypo_i, args):
111 ## Finds the algorithm in the study by its type name.
112 # Finds only the algorithms, which have been created in smeshpyD engine.
113 # @return SMESH.SMESH_Algo
114 def FindAlgorithm (self, algoname, smeshpyD):
115 study = smeshpyD.GetCurrentStudy()
116 if not study: return None
117 #to do: find component by smeshpyD object, not by its data type
118 scomp = study.FindComponent(smeshpyD.ComponentDataType())
119 if scomp is not None:
120 res,hypRoot = scomp.FindSubObject(SMESH.Tag_AlgorithmsRoot)
121 # Check if the root label of the algorithms exists
122 if res and hypRoot is not None:
123 iter = study.NewChildIterator(hypRoot)
124 # Check all published algorithms
126 algo_so_i = iter.Value()
127 attr = algo_so_i.FindAttribute("AttributeIOR")[1]
130 algo_o_i = salome.orb.string_to_object(anIOR)
131 if algo_o_i is not None:
132 # Check if this is an algorithm
133 algo_i = algo_o_i._narrow(SMESH.SMESH_Algo)
134 if algo_i is not None:
135 # Checks if the algorithm belongs to the current engine
136 if smeshpyD.GetObjectId(algo_i) > 0:
137 # Check if this is the required algorithm
138 if algo_i.GetName() == algoname:
151 ## If the algorithm is global, returns 0; \n
152 # else returns the submesh associated to this algorithm.
153 def GetSubMesh(self):
156 ## Returns the wrapped mesher.
157 def GetAlgorithm(self):
160 ## Gets the list of hypothesis that can be used with this algorithm
161 def GetCompatibleHypothesis(self):
164 mylist = self.algo.GetCompatibleHypothesis()
167 ## Gets the name of the algorithm
169 from smesh import GetName
170 return GetName(self.algo)
172 ## Sets the name to the algorithm
173 def SetName(self, name):
174 self.mesh.smeshpyD.SetName(self.algo, name)
176 ## Gets the id of the algorithm
178 return self.algo.GetId()
181 def Create(self, mesh, geom, hypo, so="libStdMeshersEngine.so"):
183 raise RuntimeError, "Attemp to create " + hypo + " algoritm on None shape"
184 algo = self.FindAlgorithm(hypo, mesh.smeshpyD)
186 algo = mesh.smeshpyD.CreateHypothesis(hypo, so)
188 self.Assign(algo, mesh, geom)
192 def Assign(self, algo, mesh, geom):
193 from smesh import AssureGeomPublished, TreatHypoStatus, GetName
195 raise RuntimeError, "Attemp to create " + algo + " algoritm on None shape"
199 self.geom = mesh.geom
202 AssureGeomPublished( mesh, geom )
208 self.subm = mesh.mesh.GetSubMesh(geom, algo.GetName())
210 status = mesh.mesh.AddHypothesis(self.geom, self.algo)
211 TreatHypoStatus( status, algo.GetName(), name, True )
214 def CompareHyp (self, hyp, args):
215 print "CompareHyp is not implemented for ", self.__class__.__name__, ":", hyp.GetName()
218 def CompareEqualHyp (self, hyp, args):
222 def Hypothesis (self, hyp, args=[], so="libStdMeshersEngine.so",
223 UseExisting=0, CompareMethod=""):
224 from smesh import TreatHypoStatus, GetName
227 if CompareMethod == "": CompareMethod = self.CompareHyp
228 hypo = self.FindHypothesis(hyp, args, CompareMethod, self.mesh.smeshpyD)
231 hypo = self.mesh.smeshpyD.CreateHypothesis(hyp, so)
236 if isinstance( arg, geompyDC.GEOM._objref_GEOM_Object ):
237 argStr = arg.GetStudyEntry()
238 if not argStr: argStr = "GEOM_Obj_%s", arg.GetEntry()
239 if len( argStr ) > 10:
240 argStr = argStr[:7]+"..."
241 if argStr[0] == '[': argStr += ']'
247 self.mesh.smeshpyD.SetName(hypo, hyp + a)
251 geomName = GetName(self.geom)
252 status = self.mesh.mesh.AddHypothesis(self.geom, hypo)
253 TreatHypoStatus( status, GetName(hypo), geomName, 0 )
256 ## Returns entry of the shape to mesh in the study
257 def MainShapeEntry(self):
258 if not self.mesh or not self.mesh.GetMesh(): return ""
259 if not self.mesh.GetMesh().HasShapeToMesh(): return ""
260 shape = self.mesh.GetShape()
261 return shape.GetStudyEntry()
263 ## Defines "ViscousLayers" hypothesis to give parameters of layers of prisms to build
264 # near mesh boundary. This hypothesis can be used by several 3D algorithms:
265 # NETGEN 3D, GHS3D, Hexahedron(i,j,k)
266 # @param thickness total thickness of layers of prisms
267 # @param numberOfLayers number of layers of prisms
268 # @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh
269 # @param ignoreFaces list of geometrical faces (or their ids) not to generate layers on
270 # @ingroup l3_hypos_additi
271 def ViscousLayers(self, thickness, numberOfLayers, stretchFactor, ignoreFaces=[]):
272 if not isinstance(self.algo, SMESH._objref_SMESH_3D_Algo):
273 raise TypeError, "ViscousLayers are supported by 3D algorithms only"
274 if not "ViscousLayers" in self.GetCompatibleHypothesis():
275 raise TypeError, "ViscousLayers are not supported by %s"%self.algo.GetName()
276 if ignoreFaces and isinstance( ignoreFaces[0], geompyDC.GEOM._objref_GEOM_Object ):
277 ignoreFaces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in ignoreFaces ]
278 hyp = self.Hypothesis("ViscousLayers",
279 [thickness, numberOfLayers, stretchFactor, ignoreFaces])
280 hyp.SetTotalThickness(thickness)
281 hyp.SetNumberLayers(numberOfLayers)
282 hyp.SetStretchFactor(stretchFactor)
283 hyp.SetIgnoreFaces(ignoreFaces)
286 ## Transform a list of ether edges or tuples (edge, 1st_vertex_of_edge)
287 # into a list acceptable to SetReversedEdges() of some 1D hypotheses
288 # @ingroup l3_hypos_1dhyps
289 def ReversedEdgeIndices(self, reverseList):
290 from smesh import FirstVertexOnCurve
292 geompy = self.mesh.geompyD
293 for i in reverseList:
294 if isinstance( i, int ):
295 s = geompy.SubShapes(self.mesh.geom, [i])[0]
296 if s.GetShapeType() != geompyDC.GEOM.EDGE:
297 raise TypeError, "Not EDGE index given"
299 elif isinstance( i, geompyDC.GEOM._objref_GEOM_Object ):
300 if i.GetShapeType() != geompyDC.GEOM.EDGE:
301 raise TypeError, "Not an EDGE given"
302 resList.append( geompy.GetSubShapeID(self.mesh.geom, i ))
306 if not isinstance( e, geompyDC.GEOM._objref_GEOM_Object ) or \
307 not isinstance( v, geompyDC.GEOM._objref_GEOM_Object ):
308 raise TypeError, "A list item must be a tuple (edge, 1st_vertex_of_edge)"
309 if v.GetShapeType() == geompyDC.GEOM.EDGE and \
310 e.GetShapeType() == geompyDC.GEOM.VERTEX:
312 if e.GetShapeType() != geompyDC.GEOM.EDGE or \
313 v.GetShapeType() != geompyDC.GEOM.VERTEX:
314 raise TypeError, "A list item must be a tuple (edge, 1st_vertex_of_edge)"
315 vFirst = FirstVertexOnCurve( e )
316 tol = geompy.Tolerance( vFirst )[-1]
317 if geompy.MinDistance( v, vFirst ) > 1.5*tol:
318 resList.append( geompy.GetSubShapeID(self.mesh.geom, e ))
320 raise TypeError, "Item must be either an edge or tuple (edge, 1st_vertex_of_edge)"