X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_SWIG%2Fsmesh.py;h=a764de5b9d873075dc63ef67284909824efa8639;hb=3fefd303ac5efcb36f07b6803d8a8600a5c8d2ca;hp=82d0750e5a50b38dc407788a3055f43af67eacf4;hpb=c63ee099ad2b149bd70136839c973e8910137bc5;p=modules%2Fsmesh.git diff --git a/src/SMESH_SWIG/smesh.py b/src/SMESH_SWIG/smesh.py index 82d0750e5..a764de5b9 100644 --- a/src/SMESH_SWIG/smesh.py +++ b/src/SMESH_SWIG/smesh.py @@ -1,610 +1,117 @@ -# Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# -*- coding: iso-8859-1 -*- +# 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 -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS # -# 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. +# 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. # -# 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 +# 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 +# +"""@package smesh \brief Module smesh """ import salome -import geompy -import StdMeshers -import SMESH - - -REGULAR = 1 -PYTHON = 2 - -NETGEN = 3 -GHS3D = 4 - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - - -NO_NAME = "NoName" - -def GetName(obj): - ior = salome.orb.object_to_string(obj) - sobj = salome.myStudy.FindObjectIOR(ior) - if sobj is None: - return NO_NAME - else: - attr = sobj.FindAttribute("AttributeName")[1] - return attr.Value() - -def SetName(obj, name): - ior = salome.orb.object_to_string(obj) - sobj = salome.myStudy.FindObjectIOR(ior) - if not sobj is None: - attr = sobj.FindAttribute("AttributeName")[1] - attr.SetValue(name) - -## Mother class to define algorithm, recommended to don't use directly. -# -# More details. -class Mesh_Algorithm: - # @class Mesh_Algorithm - # @brief Class Mesh_Algorithm - - mesh = 0 - geom = 0 - subm = 0 - algo = 0 - - ## If the algorithm is global, return 0 - # \fn else return the submesh associated to this algorithm. - # - # More details. - def GetSubMesh(self): - return self.subm - - ## Return the wrapped mesher. - def GetAlgorithm(self): - return self.algo - - ## 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 == SMESH.HYP_UNKNOWN_FATAL : - reason = "for unknown reason" - elif status == SMESH.HYP_INCOMPATIBLE : - reason = "this hypothesis mismatches algorithm" - elif status == SMESH.HYP_NOTCONFORM : - reason = "not conform mesh would be built" - elif status == SMESH.HYP_ALREADY_EXIST : - reason = hypType + " of the same dimension already assigned to this shape" - elif status == SMESH.HYP_BAD_DIM : - reason = hypType + " mismatches shape" - elif status == SMESH.HYP_CONCURENT : - reason = "there are concurrent hypotheses on sub-shapes" - elif status == SMESH.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 < SMESH.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: - raise RuntimeError, "Attemp to create " + hypo + " algoritm on None shape" - self.mesh = mesh - piece = mesh.geom - if geom==0: - self.geom = piece - name = GetName(piece) - else: - self.geom = geom - name = GetName(geom) - if name==NO_NAME: - name = geompy.SubShapeName(geom, piece) - geompy.addToStudyInFather(piece, geom, name) - self.subm = mesh.mesh.GetSubMesh(geom, hypo) - - 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 ) - - ## Private method - def Hypothesis(self, hyp, args=[], so="libStdMeshersEngine.so"): - hypo = smesh.CreateHypothesis(hyp, so) - a = "" - s = "=" - i = 0 - n = len(args) - while i 0 : - return 3 - elif geompy.NumberOfFaces( self.geom ) > 0 : - return 2 - elif geompy.NumberOfEdges( self.geom ) > 0 : - return 1 - else: - return 0; - pass - - ## 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. - # @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): - ## if Segment(geom) is called by mistake - if ( isinstance( algo, geompy.GEOM._objref_GEOM_Object)): - algo, geom = geom, algo - pass - if algo == REGULAR: - return Mesh_Segment(self, geom) - elif algo == PYTHON: - return Mesh_Segment_Python(self, geom) - else: - return Mesh_Segment(self, geom) - - ## 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. - # @param geom If defined, subshape to be meshed - def Triangle(self, geom=0): - return Mesh_Triangle(self, geom) - - ## 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. - # @param geom If defined, subshape to be meshed - def Quadrangle(self, geom=0): - return Mesh_Quadrangle(self, geom) - - ## 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. - # @param algo values are: smesh.NETGEN, smesh.GHS3D - # @param geom If defined, subshape to be meshed - def Tetrahedron(self, algo, geom=0): - ## if Tetrahedron(geom) is called by mistake - if ( isinstance( algo, geompy.GEOM._objref_GEOM_Object)): - algo, geom = geom, algo - pass - return Mesh_Tetrahedron(self, algo, geom) - - ## 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. - # @param geom If defined, subshape to be meshed - def Hexahedron(self, geom=0): - return Mesh_Hexahedron(self, geom) - - ## 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) - - ## Compute the mesh and return the status of the computation - def Compute(self): - ok = smesh.Compute(self.mesh, self.geom) - if not ok: - errors = smesh.GetAlgoState( self.mesh, self.geom ) - allReasons = "" - for err in errors: - if err.isGlobalAlgo: - glob = " global " - else: - glob = " local " - pass - dim = str(err.algoDim) - if err.name == SMESH.MISSING_ALGO: - reason = glob + dim + "D algorithm is missing" - elif err.name == SMESH.MISSING_HYPO: - name = '"' + err.algoName + '"' - reason = glob + dim + "D algorithm " + name + " misses " + dim + "D hypothesis" - else: - reason = "Global \"Not Conform mesh allowed\" hypothesis is missing" - pass - if allReasons != "": - allReasons += "\n" - pass - allReasons += reason + #print "pluginName: ", pluginName + pluginBuilderName = pluginName + "Builder" + try: + exec( "from salome.%s.%s import *" % (pluginName, pluginBuilderName)) + except Exception, e: + print "Exception while loading %s: %s" % ( pluginBuilderName, e ) + continue + exec( "from salome.%s import %s" % (pluginName, pluginBuilderName)) + plugin = eval( pluginBuilderName ) + + # add methods creating algorithms to Mesh + for k in dir( plugin ): + if k[0] == '_': continue + algo = getattr( plugin, k ) + if type( algo ).__name__ == 'classobj' and hasattr( algo, "meshMethod" ): + if not hasattr( Mesh, algo.meshMethod ): + setattr( Mesh, algo.meshMethod, algoCreator() ) pass - if allReasons != "": - print '"' + GetName(self.mesh) + '"',"not computed:" - print allReasons - pass - pass - if salome.sg.hasDesktop(): - smeshgui = salome.ImportComponentGUI("SMESH") - smeshgui.Init(salome.myStudyId) - smeshgui.SetMeshIcon( salome.ObjectToID( self.mesh ), ok ) - salome.sg.updateObjBrowser(1) - pass - return ok - - ## Compute tetrahedral mesh using AutomaticLength + MEFISTO + NETGEN - # The parameter \a fineness [0.-1.] defines mesh fineness - def AutomaticTetrahedralization(self, fineness=0): - dim = self.MeshDimension() - # assign hypotheses - self.RemoveGlobalHypotheses() - self.Segment().AutomaticLength(fineness) - if dim > 1 : - self.Triangle().LengthFromEdges() - pass - if dim > 2 : - self.Tetrahedron(NETGEN) - pass - return self.Compute() - - ## Compute hexahedral mesh using AutomaticLength + Quadrangle + Hexahedron - # The parameter \a fineness [0.-1.] defines mesh fineness - def AutomaticHexahedralization(self, fineness=0): - dim = self.MeshDimension() - # assign hypotheses - self.RemoveGlobalHypotheses() - self.Segment().AutomaticLength(fineness) - if dim > 1 : - self.Quadrangle() - pass - if dim > 2 : - self.Hexahedron() - pass - return self.Compute() - - ## Removes all global hypotheses - def RemoveGlobalHypotheses(self): - current_hyps = self.mesh.GetHypothesisList( self.geom ) - for hyp in current_hyps: - self.mesh.RemoveHypothesis( self.geom, hyp ) + getattr( Mesh, algo.meshMethod ).add( algo ) pass pass + pass +del pluginName + +# export the methods of smeshBuilder +if smesh: + for k in dir( smesh ): + if k[0] == '_': continue + globals()[k] = getattr( smesh, k ) + del k + pass + +print """ +=============================================================================== +WARNING: +Usage of smesh.py is deprecated in SALOME V7.2! +smesh.py will be removed in a future version! +TODO: +The following changes in your scripts are required to avoid this message: + +replace +------- + +import smesh, SMESH +smesh.SetCurrentStudy(theStudy) + +with +---- - ## 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 - # @param grp is a geometric group, a vertex, an edge, a face or a solid - # @param name is the name of the mesh group - def Group(self, grp, name=""): - if name == "": - name = grp.GetName() - - type = [] - tgeo = str(grp.GetShapeType()) - if tgeo == "VERTEX": - type = SMESH.NODE - elif tgeo == "EDGE": - type = SMESH.EDGE - elif tgeo == "FACE": - type = SMESH.FACE - elif tgeo == "SOLID": - type = SMESH.VOLUME - elif tgeo == "SHELL": - type = SMESH.VOLUME - elif tgeo == "COMPOUND": - if len( geompy.GetObjectIDs( grp )) == 0: - print "Mesh.Group: empty geometric group", GetName( grp ) - return 0 - tgeo = geompy.GetType(grp) - if tgeo == geompy.ShapeType["VERTEX"]: - type = SMESH.NODE - elif tgeo == geompy.ShapeType["EDGE"]: - type = SMESH.EDGE - elif tgeo == geompy.ShapeType["FACE"]: - type = SMESH.FACE - elif tgeo == geompy.ShapeType["SOLID"]: - type = SMESH.VOLUME - - if type == []: - print "Mesh.Group: bad first argument: expected a group, a vertex, an edge, a face or a solid" - return 0 - else: - return self.mesh.CreateGroupFromGEOM(type, name, grp) - - ## Export the mesh in a file with the MED format and choice the \a version of MED format - # @param f is the file name - # @param version values are SMESH.MED_V2_1, SMESH.MED_V2_2 - def ExportToMED(self, f, version, opt=0): - self.mesh.ExportToMED(f, opt, version) +import SMESH +from salome.smesh import smeshBuilder +smesh = smeshBuilder.New(salome.myStudy) - ## Export the mesh in a file with the MED format - # @param f is the file name - def ExportMED(self, f, opt=0): - self.mesh.ExportMED(f, opt) +you also need to modify some lines where smeshBuilder is used instead of smesh - ## Export the mesh in a file with the DAT format - # @param f is the file name - def ExportDAT(self, f): - self.mesh.ExportDAT(f) +algo=smesh.xxxx ==> algo=smeshBuilder.xxxx - ## Export the mesh in a file with the UNV format - # @param f is the file name - def ExportUNV(self, f): - self.mesh.ExportUNV(f) +See also SMESH User's Guide for more details - ## Export the mesh in a file with the STL format - # @param f is the file name - # @param ascii defined the kind of file contents - def ExportSTL(self, f, ascii=1): - self.mesh.ExportSTL(f, ascii) +=============================================================================== +"""