X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_SWIG%2FsmeshBuilder.py;h=fed6214bbc2a85023a408b43aef7a9b23c1bc373;hp=8706efa1b39ab8500192c7de92ba09a80b3ff338;hb=858b4bff6498075831d120d54f3dfe25566336b9;hpb=1b80c8bc605eaea62874a92d75613657bf664e9e diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py old mode 100644 new mode 100755 index 8706efa1b..fed6214bb --- a/src/SMESH_SWIG/smeshBuilder.py +++ b/src/SMESH_SWIG/smeshBuilder.py @@ -24,9 +24,19 @@ import salome from salome.geom import geomBuilder import SMESH # This is necessary for back compatibility -import omniORB # back compatibility -SMESH.MED_V2_1 = omniORB.EnumItem("MED_V2_1", 0) # back compatibility -SMESH.MED_V2_2 = omniORB.EnumItem("MED_V2_2", 1) # back compatibility +import omniORB # back compatibility +SMESH.MED_V2_1 = 11 #omniORB.EnumItem("MED_V2_1", 11) # back compatibility: use number > MED minor version +SMESH.MED_V2_2 = 12 #omniORB.EnumItem("MED_V2_2", 12) # back compatibility: latest minor will be used +SMESH.MED_MINOR_0 = 20 # back compatibility +SMESH.MED_MINOR_1 = 21 # back compatibility +SMESH.MED_MINOR_2 = 22 # back compatibility +SMESH.MED_MINOR_3 = 23 # back compatibility +SMESH.MED_MINOR_4 = 24 # back compatibility +SMESH.MED_MINOR_5 = 25 # back compatibility +SMESH.MED_MINOR_6 = 26 # back compatibility +SMESH.MED_MINOR_7 = 27 # back compatibility +SMESH.MED_MINOR_8 = 28 # back compatibility +SMESH.MED_MINOR_9 = 29 # back compatibility from SMESH import * from salome.smesh.smesh_algorithm import Mesh_Algorithm @@ -293,6 +303,8 @@ def AssureGeomPublished(mesh, geom, name=''): """ Private method. Add geom (sub-shape of the main shape) into the study if not yet there """ + if not mesh.smeshpyD.IsEnablePublish(): + return if not isinstance( geom, geomBuilder.GEOM._objref_GEOM_Object ): return if not geom.GetStudyEntry(): @@ -770,11 +782,46 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ): an instance of class :class:`Mesh` """ - if (isinstance( meshPart, Mesh )): + if isinstance( meshPart, Mesh ): meshPart = meshPart.GetMesh() mesh = SMESH._objref_SMESH_Gen.CopyMesh( self,meshPart,meshName,toCopyGroups,toKeepIDs ) return Mesh(self, self.geompyD, mesh) + def CopyMeshWithGeom( self, sourceMesh, newGeom, meshName="", toCopyGroups=True, + toReuseHypotheses=True, toCopyElements=True): + """ + Create a mesh by copying a mesh definition (hypotheses and groups) to a new geometry. + It is supposed that the new geometry is a modified geometry of *sourceMesh*. + To facilitate and speed up the operation, consider using + "Set presentation parameters and sub-shapes from arguments" option in + a dialog of geometrical operation used to create the new geometry. + + Parameters: + sourceMesh: the mesh to copy definition of. + newGeom: the new geomtry. + meshName: an optional name of the new mesh. If omitted, the mesh name is kept. + toCopyGroups: to create groups in the new mesh. + toReuseHypotheses: to reuse hypotheses of the *sourceMesh*. + toCopyElements: to copy mesh elements present on non-modified sub-shapes of + *sourceMesh*. + Returns: + tuple ( ok, newMesh, newGroups, newSubMeshes, newHypotheses, invalidEntries ) + *invalidEntries* are study entries of objects whose + counterparts are not found in the *newGeom*, followed by entries + of mesh sub-objects that are invalid because they depend on a not found + preceeding sub-shape + """ + if isinstance( sourceMesh, Mesh ): + sourceMesh = sourceMesh.GetMesh() + + ok, newMesh, newGroups, newSubMeshes, newHypotheses, invalidEntries = \ + SMESH._objref_SMESH_Gen.CopyMeshWithGeom( self, sourceMesh, newGeom, meshName, + toCopyGroups, + toReuseHypotheses, + toCopyElements) + return ( ok, Mesh(self, self.geompyD, newMesh), + newGroups, newSubMeshes, newHypotheses, invalidEntries ) + def GetSubShapesId( self, theMainObject, theListOfSubObjects ): """ Return IDs of sub-shapes @@ -1588,7 +1635,7 @@ class Mesh(metaclass = MeshMeta): algo1D = mesh.Segment(geom=Edge_1) - creates a sub-mesh on *Edge_1* and assign Wire Discretization algorithm to it. + create a sub-mesh on *Edge_1* and assign Wire Discretization algorithm to it. The created sub-mesh can be retrieved from the algorithm:: submesh = algo1D.GetSubMesh() @@ -1618,6 +1665,12 @@ class Mesh(metaclass = MeshMeta): self.mesh = self.smeshpyD.CreateMesh(geom) + def HasShapeToMesh(self): + """ + Return ``True`` if this mesh is based on geometry + """ + return self.mesh.HasShapeToMesh() + def Load(self): """ Load mesh from the study after opening the study @@ -2157,6 +2210,10 @@ class Mesh(metaclass = MeshMeta): auto_groups (boolean): parameter for creating/not creating the groups Group_On_All_Nodes, Group_On_All_Faces, ... ; the typical use is auto_groups=False. + minor (int): define the minor version (y, where version is x.y.z) of MED file format. + The minor must be between 0 and the current minor version of MED file library. + If minor is equal to -1, the minor version is not changed (default). + The major version (x, where version is x.y.z) cannot be changed. overwrite (boolean): parameter for overwriting/not overwriting the file meshPart: a part of mesh (:class:`sub-mesh, group or filter `) to export instead of the mesh autoDimension: if *True* (default), a space dimension of a MED mesh can be either @@ -2169,22 +2226,25 @@ class Mesh(metaclass = MeshMeta): fields: list of GEOM fields defined on the shape to mesh. geomAssocFields: each character of this string means a need to export a corresponding field; correspondence between fields and characters is following: - - 'v' stands for "_vertices _" field; - - 'e' stands for "_edges _" field; - - 'f' stands for "_faces _" field; - - 's' stands for "_solids _" field. + + - 'v' stands for "_vertices_" field; + - 'e' stands for "_edges_" field; + - 'f' stands for "_faces_" field; + - 's' stands for "_solids_" field. """ # process positional arguments - args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility + #args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility fileName = args[0] auto_groups = args[1] if len(args) > 1 else False - overwrite = args[2] if len(args) > 2 else True - meshPart = args[3] if len(args) > 3 else None - autoDimension = args[4] if len(args) > 4 else True - fields = args[5] if len(args) > 5 else [] - geomAssocFields = args[6] if len(args) > 6 else '' + minor = args[2] if len(args) > 2 else -1 + overwrite = args[3] if len(args) > 3 else True + meshPart = args[4] if len(args) > 4 else None + autoDimension = args[5] if len(args) > 5 else True + fields = args[6] if len(args) > 6 else [] + geomAssocFields = args[7] if len(args) > 7 else '' # process keywords arguments auto_groups = kwargs.get("auto_groups", auto_groups) + minor = kwargs.get("minor", minor) overwrite = kwargs.get("overwrite", overwrite) meshPart = kwargs.get("meshPart", meshPart) autoDimension = kwargs.get("autoDimension", autoDimension) @@ -2196,10 +2256,10 @@ class Mesh(metaclass = MeshMeta): if isinstance( meshPart, list ): meshPart = self.GetIDSource( meshPart, SMESH.ALL ) unRegister.set( meshPart ) - self.mesh.ExportPartToMED( meshPart, fileName, auto_groups, overwrite, autoDimension, + self.mesh.ExportPartToMED( meshPart, fileName, auto_groups, minor, overwrite, autoDimension, fields, geomAssocFields) else: - self.mesh.ExportMED(fileName, auto_groups, overwrite, autoDimension) + self.mesh.ExportMED(fileName, auto_groups, minor, overwrite, autoDimension) def ExportSAUV(self, f, auto_groups=0): """ @@ -2336,7 +2396,7 @@ class Mesh(metaclass = MeshMeta): print("WARNING: ExportToMED() is deprecated, use ExportMED() instead") # process positional arguments - args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility + #args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility fileName = args[0] auto_groups = args[1] if len(args) > 1 else False overwrite = args[2] if len(args) > 2 else True @@ -2346,8 +2406,9 @@ class Mesh(metaclass = MeshMeta): auto_groups = kwargs.get("auto_groups", auto_groups) # new keyword name overwrite = kwargs.get("overwrite", overwrite) autoDimension = kwargs.get("autoDimension", autoDimension) + minor = -1 # invoke engine's function - self.mesh.ExportMED(fileName, auto_groups, overwrite, autoDimension) + self.mesh.ExportMED(fileName, auto_groups, minor, overwrite, autoDimension) def ExportToMEDX(self, *args, **kwargs): """ @@ -2370,7 +2431,7 @@ class Mesh(metaclass = MeshMeta): print("WARNING: ExportToMEDX() is deprecated, use ExportMED() instead") # process positional arguments - args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility + #args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility fileName = args[0] auto_groups = args[1] if len(args) > 1 else False overwrite = args[2] if len(args) > 2 else True @@ -2379,14 +2440,15 @@ class Mesh(metaclass = MeshMeta): auto_groups = kwargs.get("auto_groups", auto_groups) overwrite = kwargs.get("overwrite", overwrite) autoDimension = kwargs.get("autoDimension", autoDimension) + minor = -1 # invoke engine's function - self.mesh.ExportMED(fileName, auto_groups, overwrite, autoDimension) + self.mesh.ExportMED(fileName, auto_groups, minor, overwrite, autoDimension) # Operations with groups: # ---------------------- def CreateEmptyGroup(self, elementType, name): """ - Create an empty mesh group + Create an empty standalone mesh group Parameters: elementType: the :class:`type ` of elements in the group; @@ -2421,7 +2483,7 @@ class Mesh(metaclass = MeshMeta): def GroupOnGeom(self, grp, name="", typ=None): """ Create a mesh group based on the geometrical object *grp* - and gives a *name*. + and give it a *name*. if *name* is not defined the name of the geometric group is used Parameters: @@ -2466,8 +2528,8 @@ class Mesh(metaclass = MeshMeta): def GroupOnFilter(self, typ, name, filter): """ - Create a mesh group with given *name* based on the *filter* which - is a special type of group dynamically updating it's contents during + Create a mesh group with given *name* based on the *filter*. + It is a special type of group dynamically updating it's contents during mesh modification Parameters: @@ -2617,15 +2679,15 @@ class Mesh(metaclass = MeshMeta): def GetGroups(self, elemType = SMESH.ALL): """ - Get the list of groups existing in the mesh in the order - of creation (starting from the oldest one) + Get the list of groups existing in the mesh in the order of creation + (starting from the oldest one) Parameters: elemType (SMESH.ElementType): type of elements the groups contain; by default groups of elements of all types are returned Returns: - a sequence of :class:`SMESH.SMESH_GroupBase` + a list of :class:`SMESH.SMESH_GroupBase` """ groups = self.mesh.GetGroups() @@ -3654,7 +3716,9 @@ class Mesh(metaclass = MeshMeta): isElem2: *True* if *id2* is element id, *False* if it is node id Returns: - minimum distance value **GetMinDistance()** + minimum distance value + See Also: + :meth:`GetMinDistance` """ aMeasure = self.GetMinDistance(id1, id2, isElem1, isElem2) @@ -3979,7 +4043,7 @@ class Mesh(metaclass = MeshMeta): def SetNodeOnVertex(self, NodeID, Vertex): """ - Binds a node to a vertex + Bind a node to a vertex Parameters: NodeID: a node ID @@ -4002,7 +4066,7 @@ class Mesh(metaclass = MeshMeta): def SetNodeOnEdge(self, NodeID, Edge, paramOnEdge): """ - Stores the node position on an edge + Store the node position on an edge Parameters: NodeID: a node ID @@ -4025,7 +4089,7 @@ class Mesh(metaclass = MeshMeta): def SetNodeOnFace(self, NodeID, Face, u, v): """ - Stores node position on a face + Store node position on a face Parameters: NodeID: a node ID @@ -4049,7 +4113,7 @@ class Mesh(metaclass = MeshMeta): def SetNodeInVolume(self, NodeID, Solid): """ - Binds a node to a solid + Bind a node to a solid Parameters: NodeID: a node ID @@ -4164,10 +4228,21 @@ class Mesh(metaclass = MeshMeta): else: return self.editor.FindElementsByPoint(x, y, z, elementType) + def ProjectPoint(self, x,y,z, meshObject, elementType): + """ + Project a point to a mesh object. + Return ID of an element of given type where the given point is projected + and coordinates of the projection point. + In the case if nothing found, return -1 and [] + """ + if ( isinstance( meshObject, Mesh )): + meshObject = meshObject.GetMesh() + return self.editor.ProjectPoint( x,y,z, meshObject, elementType ) + def GetPointState(self, x, y, z): """ Return point state in a closed 2D mesh in terms of TopAbs_State enumeration: - 0-IN, 1-OUT, 2-ON, 3-UNKNOWN. + smesh.TopAbs_IN, smesh.TopAbs_OUT, smesh.TopAbs_ON and smesh.TopAbs_UNKNOWN. UNKNOWN state means that either mesh is wrong or the analysis fails. """ @@ -5608,7 +5683,7 @@ class Mesh(metaclass = MeshMeta): Parameters: IDsOfElements: list of elements ids Mirror: is :class:`SMESH.AxisStruct` or geom object (point, line, plane) - theMirrorType: smeshBuilder.POINT, smeshBuilder.AXIS or smeshBuilder.PLANE. + theMirrorType: smesh.POINT, smesh.AXIS or smesh.PLANE. If the *Mirror* is a geom object this parameter is unnecessary Copy: allows to copy element (Copy is 1) or to replace with its mirroring (Copy is 0) MakeGroups: forces the generation of new groups from existing ones (if Copy) @@ -5636,7 +5711,7 @@ class Mesh(metaclass = MeshMeta): Parameters: IDsOfElements: the list of elements ids Mirror: is :class:`SMESH.AxisStruct` or geom object (point, line, plane) - theMirrorType: smeshBuilder.POINT, smeshBuilder.AXIS or smeshBuilder.PLANE. + theMirrorType: smesh.POINT, smesh.AXIS or smesh.PLANE. If the *Mirror* is a geom object this parameter is unnecessary MakeGroups: to generate new groups from existing ones NewMeshName: a name of the new mesh to create @@ -5663,7 +5738,7 @@ class Mesh(metaclass = MeshMeta): Parameters: theObject: :class:`mesh, sub-mesh, group or filter ` Mirror: :class:`SMESH.AxisStruct` or geom object (point, line, plane) - theMirrorType: smeshBuilder.POINT, smeshBuilder.AXIS or smeshBuilder.PLANE. + theMirrorType: smesh.POINT, smesh.AXIS or smesh.PLANE. If the *Mirror* is a geom object this parameter is unnecessary Copy: allows copying the element (Copy==True) or replacing it with its mirror (Copy==False) MakeGroups: forces the generation of new groups from existing ones (if Copy) @@ -5691,7 +5766,7 @@ class Mesh(metaclass = MeshMeta): Parameters: theObject: :class:`mesh, sub-mesh, group or filter ` Mirror: :class:`SMESH.AxisStruct` or geom object (point, line, plane) - theMirrorType: smeshBuilder.POINT, smeshBuilder.AXIS or smeshBuilder.PLANE. + theMirrorType: smesh.POINT, smesh.AXIS or smesh.PLANE. If the *Mirror* is a geom object this parameter is unnecessary MakeGroups: forces the generation of new groups from existing ones NewMeshName: the name of the new mesh to create @@ -6122,14 +6197,17 @@ class Mesh(metaclass = MeshMeta): return self.editor.FindFreeBorders( ClosedOnly ) - def FillHole(self, holeNodes): + def FillHole(self, holeNodes, groupName=""): """ Fill with 2D elements a hole defined by a SMESH.FreeBorder. Parameters: - FreeBorder: either a SMESH.FreeBorder or a list on node IDs. These nodes + holeNodes: either a SMESH.FreeBorder or a list on node IDs. These nodes must describe all sequential nodes of the hole border. The first and the last nodes must be the same. Use :meth:`FindFreeBorders` to get nodes of holes. + groupName (string): name of a group to add new faces + Returns: + a :class:`group ` containing the new faces; or :code:`None` if `groupName` == "" """ @@ -6137,7 +6215,7 @@ class Mesh(metaclass = MeshMeta): holeNodes = SMESH.FreeBorder(nodeIDs=holeNodes) if not isinstance( holeNodes, SMESH.FreeBorder ): raise TypeError("holeNodes must be either SMESH.FreeBorder or list of integer and not %s" % holeNodes) - self.editor.FillHole( holeNodes ) + self.editor.FillHole( holeNodes, groupName ) def FindCoincidentFreeBorders (self, tolerance=0.): """ @@ -6842,22 +6920,24 @@ class meshProxy(SMESH._objref_SMESH_Mesh): return SMESH._objref_SMESH_Mesh.CreateDimGroup(self, *args) def ExportToMEDX(self, *args): # function removed print("WARNING: ExportToMEDX() is deprecated, use ExportMED() instead") - args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] + #args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] SMESH._objref_SMESH_Mesh.ExportMED(self, *args) def ExportToMED(self, *args): # function removed print("WARNING: ExportToMED() is deprecated, use ExportMED() instead") - args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] - while len(args) < 4: # !!!! nb of parameters for ExportToMED IDL's method - args.append(True) - SMESH._objref_SMESH_Mesh.ExportMED(self, *args) + #args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] + args2 = list(args) + while len(args2) < 5: # !!!! nb of parameters for ExportToMED IDL's method + args2.append(True) + SMESH._objref_SMESH_Mesh.ExportMED(self, *args2) def ExportPartToMED(self, *args): # 'version' parameter removed - args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] + #args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] SMESH._objref_SMESH_Mesh.ExportPartToMED(self, *args) def ExportMED(self, *args): # signature of method changed - args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] - while len(args) < 4: # !!!! nb of parameters for ExportToMED IDL's method - args.append(True) - SMESH._objref_SMESH_Mesh.ExportMED(self, *args) + #args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] + args2 = list(args) + while len(args2) < 5: # !!!! nb of parameters for ExportToMED IDL's method + args2.append(True) + SMESH._objref_SMESH_Mesh.ExportMED(self, *args2) pass omniORB.registerObjref(SMESH._objref_SMESH_Mesh._NP_RepositoryId, meshProxy)