1 # Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
21 # Author : Francis KLOSS, OCC
43 smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
44 smesh.SetCurrentStudy(salome.myStudy)
52 ior = salome.orb.object_to_string(obj)
53 sobj = salome.myStudy.FindObjectIOR(ior)
57 attr = sobj.FindAttribute("AttributeName")[1]
60 def SetName(obj, name):
61 ior = salome.orb.object_to_string(obj)
62 sobj = salome.myStudy.FindObjectIOR(ior)
63 attr = sobj.FindAttribute("AttributeName")[1]
66 # Algorithms and hypothesis
67 # =========================
69 # Private class: Mesh_Algorithm
70 # -----------------------------
74 Mother class to define algorithm, recommended to don't use directly
84 If the algorithm is global, return 0
85 else return the submesh associated to this algorithm
89 def GetAlgorithm(self):
91 Return the wrapped mesher
95 def Create(self, mesh, geom, hypo, so="libStdMeshersEngine.so"):
103 name = GetName(piece)
108 name = geompy.SubShapeName(geom, piece)
109 geompy.addToStudyInFather(piece, geom, name)
110 self.subm = mesh.mesh.GetSubMesh(geom, hypo)
112 self.algo = smesh.CreateHypothesis(hypo, so)
113 SetName(self.algo, name + "/" + hypo)
114 mesh.mesh.AddHypothesis(self.geom, self.algo)
116 def Hypothesis(self, hyp, args=[], so="libStdMeshersEngine.so"):
120 hypo = smesh.CreateHypothesis(hyp, so)
126 a = a + s + str(args[i])
129 SetName(hypo, GetName(self.geom) + "/" + hyp + a)
130 self.mesh.mesh.AddHypothesis(self.geom, hypo)
133 # Public class: Mesh_Segment
134 # --------------------------
136 class Mesh_Segment(Mesh_Algorithm):
138 Class to define a segment 1D algorithm for discretization
141 def __init__(self, mesh, geom=0):
145 self.Create(mesh, geom, "Regular_1D")
147 def LocalLength(self, l):
149 Define "LocalLength" hypothesis to cut an edge in several segments with the same length
150 \param l for the length of segments that cut an edge
152 hyp = self.Hypothesis("LocalLength", [l])
156 def NumberOfSegments(self, n, s=[]):
158 Define "NumberOfSegments" hypothesis to cut an edge in several fixed number of segments
159 \param n for the number of segments that cut an edge
160 \param s for the scale factor (optional)
163 hyp = self.Hypothesis("NumberOfSegments", [n])
165 hyp = self.Hypothesis("NumberOfSegments", [n,s])
166 hyp.SetDistrType( 1 )
167 hyp.SetScaleFactor(s)
168 hyp.SetNumberOfSegments(n)
171 def Arithmetic1D(self, start, end):
173 Define "Arithmetic1D" hypothesis to cut an edge in several segments with arithmetic length increasing
174 \param start for the length of the first segment
175 \param end for the length of the last segment
177 hyp = self.Hypothesis("Arithmetic1D", [start, end])
178 hyp.SetLength(start, 1)
179 hyp.SetLength(end , 0)
182 def StartEndLength(self, start, end):
184 Define "StartEndLength" hypothesis to cut an edge in several segments with geometric length increasing
185 \param start for the length of the first segment
186 \param end for the length of the last segment
188 hyp = self.Hypothesis("StartEndLength", [start, end])
189 hyp.SetLength(start, 1)
190 hyp.SetLength(end , 0)
193 def Deflection1D(self, d):
195 Define "Deflection1D" hypothesis
196 \param d for the deflection
198 hyp = self.Hypothesis("Deflection1D", [d])
202 def Propagation(self):
204 Define "Propagation" hypothesis that propagate all other hypothesis on all others edges that are in
205 the opposite side in the case of quadrangular faces
207 return self.Hypothesis("Propagation")
209 def AutomaticLength(self, fineness):
211 Define "AutomaticLength" hypothesis
212 \param fineness for the fineness [0-1]
214 hyp = self.Hypothesis("AutomaticLength")
215 hyp.SetFineness( fineness )
218 def QuadraticMesh(self):
220 Define "QuadraticMesh" hypothesis, forcing construction of quadratic edges.
221 If the 2D mesher sees that all boundary edges are quadratic ones,
222 it generates quadratic faces, else it generates linear faces using
223 medium nodes as if they were vertex ones.
224 The 3D mesher generates quadratic volumes only if all boundary faces
225 are quadratic ones, else it fails.
227 hyp = self.Hypothesis("QuadraticMesh")
230 # Public class: Mesh_Segment_Python
231 # ---------------------------------
233 class Mesh_Segment_Python(Mesh_Segment):
235 Class to define a segment 1D algorithm for discretization with python function
238 def __init__(self, mesh, geom=0):
242 import Python1dPlugin
243 self.Create(mesh, geom, "Python_1D", "libPython1dEngine.so")
245 def PythonSplit1D(self, n, func):
247 Define "PythonSplit1D" hypothesis based on the Erwan Adam patch, awaiting equivalent SALOME functionality
248 \param n for the number of segments that cut an edge
249 \param func for the python function that calculate the length of all segments
251 hyp = self.Hypothesis("PythonSplit1D", [n], "libPython1dEngine.so")
252 hyp.SetNumberOfSegments(n)
253 hyp.SetPythonLog10RatioFunction(func)
256 # Public class: Mesh_Triangle
257 # ---------------------------
259 class Mesh_Triangle(Mesh_Algorithm):
261 Class to define a triangle 2D algorithm
264 def __init__(self, mesh, geom=0):
268 self.Create(mesh, geom, "MEFISTO_2D")
270 def MaxElementArea(self, area):
272 Define "MaxElementArea" hypothesis to give the maximun area of each triangles
273 \param area for the maximum area of each triangles
275 hyp = self.Hypothesis("MaxElementArea", [area])
276 hyp.SetMaxElementArea(area)
279 def LengthFromEdges(self):
281 Define "LengthFromEdges" hypothesis to build triangles based on the length of the edges taken from the wire
283 return self.Hypothesis("LengthFromEdges")
285 # Public class: Mesh_Quadrangle
286 # -----------------------------
288 class Mesh_Quadrangle(Mesh_Algorithm):
290 Class to define a quadrangle 2D algorithm
293 def __init__(self, mesh, geom=0):
297 self.Create(mesh, geom, "Quadrangle_2D")
299 def QuadranglePreference(self):
301 Define "QuadranglePreference" hypothesis, forcing construction
302 of quadrangles if the number of nodes on opposite edges is not the same
303 in the case where the global number of nodes on edges is even
305 hyp = self.Hypothesis("QuadranglePreference")
308 # Public class: Mesh_Tetrahedron
309 # ------------------------------
311 class Mesh_Tetrahedron(Mesh_Algorithm):
313 Class to define a tetrahedron 3D algorithm
316 def __init__(self, mesh, algo, geom=0):
321 self.Create(mesh, geom, "NETGEN_3D", "libNETGENEngine.so")
324 self.Create(mesh, geom, "GHS3D_3D" , "libGHS3DEngine.so")
326 def MaxElementVolume(self, vol):
328 Define "MaxElementVolume" hypothesis to give the maximun volume of each tetrahedral
329 \param vol for the maximum volume of each tetrahedral
331 hyp = self.Hypothesis("MaxElementVolume", [vol])
332 hyp.SetMaxElementVolume(vol)
335 # Public class: Mesh_Hexahedron
336 # ------------------------------
338 class Mesh_Hexahedron(Mesh_Algorithm):
340 Class to define a hexahedron 3D algorithm
343 def __init__(self, mesh, geom=0):
347 self.Create(mesh, geom, "Hexa_3D")
354 Class to define a mesh
360 def __init__(self, geom, name=0):
364 Creates mesh on the shape \a geom,
365 sets GUI name of this mesh to \a name.
366 \param geom Shape to be meshed
367 \param name Study name of the mesh
370 self.mesh = smesh.CreateMesh(geom)
372 SetName(self.mesh, GetName(geom))
374 SetName(self.mesh, name)
378 Method that returns the mesh
384 Method that returns the shape associated to the mesh
388 def MeshDimension(self):
390 Returns mesh dimension depending on shape one
392 shells = geompy.SubShapeAllIDs( self.geom, geompy.ShapeType["SHELL"] )
393 if len( shells ) > 0 :
395 elif geompy.NumberOfFaces( self.geom ) > 0 :
397 elif geompy.NumberOfEdges( self.geom ) > 0 :
403 def Segment(self, algo=REGULAR, geom=0):
405 Creates a segment discretization 1D algorithm.
406 If the optional \a algo parameter is not sets, this algorithm is REGULAR.
407 If the optional \a geom parameter is not sets, this algorithm is global.
408 Otherwise, this algorithm define a submesh based on \a geom subshape.
409 \param algo values are smesh.REGULAR or smesh.PYTHON for discretization via python function
410 \param geom If defined, subshape to be meshed
412 ## if Segment(geom) is called by mistake
413 if ( isinstance( algo, geompy.GEOM._objref_GEOM_Object)):
414 algo, geom = geom, algo
417 return Mesh_Segment(self, geom)
419 return Mesh_Segment_Python(self, geom)
421 return Mesh_Segment(self, geom)
423 def Triangle(self, geom=0):
425 Creates a triangle 2D algorithm for faces.
426 If the optional \a geom parameter is not sets, this algorithm is global.
427 Otherwise, this algorithm define a submesh based on \a geom subshape.
428 \param geom If defined, subshape to be meshed
430 return Mesh_Triangle(self, geom)
432 def Quadrangle(self, geom=0):
434 Creates a quadrangle 2D algorithm for faces.
435 If the optional \a geom parameter is not sets, this algorithm is global.
436 Otherwise, this algorithm define a submesh based on \a geom subshape.
437 \param geom If defined, subshape to be meshed
439 return Mesh_Quadrangle(self, geom)
441 def Tetrahedron(self, algo, geom=0):
443 Creates a tetrahedron 3D algorithm for solids.
444 The parameter \a algo permits to choice the algorithm: NETGEN or GHS3D
445 If the optional \a geom parameter is not sets, this algorithm is global.
446 Otherwise, this algorithm define a submesh based on \a geom subshape.
447 \param algo values are: smesh.NETGEN, smesh.GHS3D
448 \param geom If defined, subshape to be meshed
450 ## if Tetrahedron(geom) is called by mistake
451 if ( isinstance( algo, geompy.GEOM._objref_GEOM_Object)):
452 algo, geom = geom, algo
454 return Mesh_Tetrahedron(self, algo, geom)
456 def Hexahedron(self, geom=0):
458 Creates a hexahedron 3D algorithm for solids.
459 If the optional \a geom parameter is not sets, this algorithm is global.
460 Otherwise, this algorithm define a submesh based on \a geom subshape.
461 \param geom If defined, subshape to be meshed
463 return Mesh_Hexahedron(self, geom)
467 Compute the mesh and return the status of the computation
469 b = smesh.Compute(self.mesh, self.geom)
470 if salome.sg.hasDesktop():
471 smeshgui = salome.ImportComponentGUI("SMESH")
472 smeshgui.Init(salome.myStudyId)
473 smeshgui.SetMeshIcon( salome.ObjectToID( self.mesh ), b )
474 salome.sg.updateObjBrowser(1)
477 def AutomaticTetrahedralization(self):
479 Compute tetrahedral mesh using AutomaticLength + MEFISTO + NETGEN
481 dim = self.MeshDimension()
483 self.RemoveGlobalHypotheses()
484 self.Segment().AutomaticLength()
486 self.Triangle().LengthFromEdges()
489 self.Tetrahedron(NETGEN)
491 return self.Compute()
493 def AutomaticHexahedralization(self):
495 Compute hexahedral mesh using AutomaticLength + Quadrangle + Hexahedron
497 dim = self.MeshDimension()
499 self.RemoveGlobalHypotheses()
500 self.Segment().AutomaticLength()
507 return self.Compute()
509 def RemoveGlobalHypotheses(self):
511 Removes all global hypotheses
513 current_hyps = self.mesh.GetHypothesisList( self.geom )
514 for hyp in current_hyps:
515 self.mesh.RemoveHypothesis( self.geom, hyp )
519 def Group(self, grp, name=""):
521 Create a mesh group based on geometric object \a grp
522 and give a \a name, if this parameter is not defined
523 the name is the same as the geometric group name
524 \param grp is a geometric group, a vertex, an edge, a face or a solid
525 \param name is the name of the mesh group
531 tgeo = str(grp.GetShapeType())
538 elif tgeo == "SOLID":
540 elif tgeo == "SHELL":
542 elif tgeo == "COMPOUND":
543 tgeo = geompy.GetType(grp)
544 if tgeo == geompy.ShapeType["VERTEX"]:
546 elif tgeo == geompy.ShapeType["EDGE"]:
548 elif tgeo == geompy.ShapeType["FACE"]:
550 elif tgeo == geompy.ShapeType["SOLID"]:
554 print "Mesh.Group: bad first argument: expected a group, a vertex, an edge, a face or a solid"
557 return self.mesh.CreateGroupFromGEOM(type, name, grp)
559 def ExportToMED(self, f, version, opt=0):
561 Export the mesh in a file with the MED format and choice the \a version of MED format
562 \param f is the file name
563 \param version values are smesh.MED_V2_1, smesh.MED_V2_2
565 self.mesh.ExportToMED(f, opt, version)
567 def ExportMED(self, f, opt=0):
569 Export the mesh in a file with the MED format
570 \param f is the file name
572 self.mesh.ExportMED(f, opt)
574 def ExportDAT(self, f):
576 Export the mesh in a file with the DAT format
577 \param f is the file name
579 self.mesh.ExportDAT(f)
581 def ExportUNV(self, f):
583 Export the mesh in a file with the UNV format
584 \param f is the file name
586 self.mesh.ExportUNV(f)
588 def ExportSTL(self, f, ascii=1):
590 Export the mesh in a file with the STL format
591 \param f is the file name
592 \param ascii defined the kind of file contents
594 self.mesh.ExportSTL(f, ascii)