X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_SWIG%2FsmeshBuilder.py;h=2c98e16531d3c1bfe36890986f53e22cb43d70a6;hp=3e3b6750d2f4049727e12c27e21a2172b881d9be;hb=5482b99d07dd144fd5be299e722f39a81de3b5be;hpb=38f832b912a159ca9d43b5bd031344fd7108a6d8 diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py index 3e3b6750d..2c98e1653 100644 --- a/src/SMESH_SWIG/smeshBuilder.py +++ b/src/SMESH_SWIG/smeshBuilder.py @@ -235,7 +235,7 @@ def TreatHypoStatus(status, hypName, geomName, isAlgo, mesh): elif status == HYP_BAD_SUBSHAPE : reason = "the shape is neither the main one, nor its sub-shape, nor a valid group" elif status == HYP_BAD_GEOMETRY: - reason = "geometry mismatches the expectation of the algorithm" + reason = "the algorithm is not applicable to this geometry" elif status == HYP_HIDDEN_ALGO: reason = "it is hidden by an algorithm of an upper dimension, which generates elements of all dimensions" elif status == HYP_HIDING_ALGO: @@ -929,7 +929,7 @@ class smeshBuilder(object, SMESH._objref_SMESH_Gen): ## Creates a numerical functor by its type # @param theCriterion functor type - an item of SMESH.FunctorType enumeration. # Type SMESH.FunctorType._items in the Python Console to see all items. - # Note that not all items corresponds to numerical functors. + # Note that not all items correspond to numerical functors. # @return SMESH_NumericalFunctor # @ingroup l1_controls def GetFunctor(self,theCriterion): @@ -1424,38 +1424,10 @@ class Mesh: # Treat compute errors computeErrors = self.smeshpyD.GetComputeErrors( self.mesh, geom ) + shapeText = "" for err in computeErrors: - shapeText = "" if self.mesh.HasShapeToMesh(): - try: - mainIOR = salome.orb.object_to_string(geom) - for sname in salome.myStudyManager.GetOpenStudies(): - s = salome.myStudyManager.GetStudyByName(sname) - if not s: continue - mainSO = s.FindObjectIOR(mainIOR) - if not mainSO: continue - if err.subShapeID == 1: - shapeText = ' on "%s"' % mainSO.GetName() - subIt = s.NewChildIterator(mainSO) - while subIt.More(): - subSO = subIt.Value() - subIt.Next() - obj = subSO.GetObject() - if not obj: continue - go = obj._narrow( geomBuilder.GEOM._objref_GEOM_Object ) - if not go: continue - ids = go.GetSubShapeIndices() - if len(ids) == 1 and ids[0] == err.subShapeID: - shapeText = ' on "%s"' % subSO.GetName() - break - if not shapeText: - shape = self.geompyD.GetSubShape( geom, [err.subShapeID]) - if shape: - shapeText = " on %s #%s" % (shape.GetShapeType(), err.subShapeID) - else: - shapeText = " on subshape #%s" % (err.subShapeID) - except: - shapeText = " on subshape #%s" % (err.subShapeID) + shapeText = " on %s" % self.GetSubShapeName( err.subShapeID ) errText = "" stdErrors = ["OK", #COMPERR_OK "Invalid input mesh", #COMPERR_BAD_INPUT_MESH @@ -1533,14 +1505,101 @@ class Mesh: pass return ok - ## Return submesh objects list in meshing order - # @return list of list of submesh objects + ## Return a name of a sub-shape by its ID + # @param subShapeID a unique ID of a sub-shape + # @return a string describing the sub-shape; possible variants: + # - "Face_12" (published sub-shape) + # - FACE #3 (not published sub-shape) + # - sub-shape #3 (invalid sub-shape ID) + # - #3 (error in this function) + def GetSubShapeName(self, subShapeID ): + if not self.mesh.HasShapeToMesh(): + return "" + try: + shapeText = "" + mainIOR = salome.orb.object_to_string( self.GetShape() ) + for sname in salome.myStudyManager.GetOpenStudies(): + s = salome.myStudyManager.GetStudyByName(sname) + if not s: continue + mainSO = s.FindObjectIOR(mainIOR) + if not mainSO: continue + if subShapeID == 1: + shapeText = '"%s"' % mainSO.GetName() + subIt = s.NewChildIterator(mainSO) + while subIt.More(): + subSO = subIt.Value() + subIt.Next() + obj = subSO.GetObject() + if not obj: continue + go = obj._narrow( geomBuilder.GEOM._objref_GEOM_Object ) + if not go: continue + try: + ids = self.geompyD.GetSubShapeID( self.GetShape(), go ) + except: + continue + if ids == subShapeID: + shapeText = '"%s"' % subSO.GetName() + break + if not shapeText: + shape = self.geompyD.GetSubShape( self.GetShape(), [subShapeID]) + if shape: + shapeText = '%s #%s' % (shape.GetShapeType(), subShapeID) + else: + shapeText = 'sub-shape #%s' % (subShapeID) + except: + shapeText = "#%s" % (subShapeID) + return shapeText + + ## Return a list of sub-shapes meshing of which failed, grouped into GEOM groups by + # error of an algorithm + # @param publish if @c True, the returned groups will be published in the study + # @return a list of GEOM groups each named after a failed algorithm + def GetFailedShapes(self, publish=False): + + algo2shapes = {} + computeErrors = self.smeshpyD.GetComputeErrors( self.mesh, self.GetShape() ) + for err in computeErrors: + shape = self.geompyD.GetSubShape( self.GetShape(), [err.subShapeID]) + if not shape: continue + if err.algoName in algo2shapes: + algo2shapes[ err.algoName ].append( shape ) + else: + algo2shapes[ err.algoName ] = [ shape ] + pass + + groups = [] + for algoName, shapes in algo2shapes.items(): + while shapes: + groupType = self.smeshpyD.EnumToLong( shapes[0].GetShapeType() ) + otherTypeShapes = [] + sameTypeShapes = [] + group = self.geompyD.CreateGroup( self.geom, groupType ) + for shape in shapes: + if shape.GetShapeType() == shapes[0].GetShapeType(): + sameTypeShapes.append( shape ) + else: + otherTypeShapes.append( shape ) + self.geompyD.UnionList( group, sameTypeShapes ) + if otherTypeShapes: + group.SetName( "%s %s" % ( algoName, shapes[0].GetShapeType() )) + else: + group.SetName( algoName ) + groups.append( group ) + shapes = otherTypeShapes + pass + if publish: + for group in groups: + self.geompyD.addToStudyInFather( self.geom, group, group.GetName() ) + return groups + + ## Return sub-mesh objects list in meshing order + # @return list of list of sub-meshes # @ingroup l2_construct def GetMeshOrder(self): return self.mesh.GetMeshOrder() - ## Return submesh objects list in meshing order - # @return list of list of submesh objects + ## Set order in which concurrent sub-meshes sould be meshed + # @param submeshes list of sub-meshes # @ingroup l2_construct def SetMeshOrder(self, submeshes): return self.mesh.SetMeshOrder(submeshes) @@ -1609,6 +1668,8 @@ class Mesh: # @return SMESH.Hypothesis_Status # @ingroup l2_hypotheses def AddHypothesis(self, hyp, geom=0): + if isinstance( hyp, geomBuilder.GEOM._objref_GEOM_Object ): + hyp, geom = geom, hyp if isinstance( hyp, Mesh_Algorithm ): hyp = hyp.GetAlgorithm() pass @@ -1621,9 +1682,10 @@ class Mesh: if self.mesh.HasShapeToMesh(): hyp_type = hyp.GetName() lib_name = hyp.GetLibName() - checkAll = ( not geom.IsSame( self.mesh.GetShapeToMesh() )) - if checkAll and geom: - checkAll = geom.GetType() == 37 + # checkAll = ( not geom.IsSame( self.mesh.GetShapeToMesh() )) + # if checkAll and geom: + # checkAll = geom.GetType() == 37 + checkAll = False isApplicable = self.smeshpyD.IsApplicable(hyp_type, lib_name, geom, checkAll) if isApplicable: AssureGeomPublished( self, geom, "shape for %s" % hyp.GetName()) @@ -2300,7 +2362,7 @@ class Mesh: # @return an integer value # @ingroup l1_meshinfo def NbPolygons(self, elementOrder = SMESH.ORDER_ANY): - return self.mesh.NbPolygons(elementOrder) + return self.mesh.NbPolygonsOfOrder(elementOrder) ## Returns the number of volumes in the mesh # @return an integer value @@ -2446,8 +2508,8 @@ class Mesh: # @return the list of integer values # @ingroup l1_meshinfo def GetSubMeshElementsId(self, Shape): - if ( isinstance( Shape, geomBuilder.GEOM._objref_GEOM_Object)): - ShapeID = Shape.GetSubShapeIndices()[0] + if isinstance( Shape, geomBuilder.GEOM._objref_GEOM_Object): + ShapeID = self.geompyD.GetSubShapeID( self.geom, Shape ) else: ShapeID = Shape return self.mesh.GetSubMeshElementsId(ShapeID) @@ -2459,7 +2521,7 @@ class Mesh: # @return the list of integer values # @ingroup l1_meshinfo def GetSubMeshNodesId(self, Shape, all): - if ( isinstance( Shape, geomBuilder.GEOM._objref_GEOM_Object)): + if isinstance( Shape, geomBuilder.GEOM._objref_GEOM_Object): ShapeID = self.geompyD.GetSubShapeID( self.geom, Shape ) else: ShapeID = Shape @@ -2471,8 +2533,8 @@ class Mesh: # @return element type # @ingroup l1_meshinfo def GetSubMeshElementType(self, Shape): - if ( isinstance( Shape, geomBuilder.GEOM._objref_GEOM_Object)): - ShapeID = Shape.GetSubShapeIndices()[0] + if isinstance( Shape, geomBuilder.GEOM._objref_GEOM_Object): + ShapeID = self.geompyD.GetSubShapeID( self.geom, Shape ) else: ShapeID = Shape return self.mesh.GetSubMeshElementType(ShapeID) @@ -2861,7 +2923,7 @@ class Mesh: # @ingroup l2_modif_add def SetNodeOnVertex(self, NodeID, Vertex): if ( isinstance( Vertex, geomBuilder.GEOM._objref_GEOM_Object)): - VertexID = Vertex.GetSubShapeIndices()[0] + VertexID = self.geompyD.GetSubShapeID( self.geom, Vertex ) else: VertexID = Vertex try: @@ -2879,7 +2941,7 @@ class Mesh: # @ingroup l2_modif_add def SetNodeOnEdge(self, NodeID, Edge, paramOnEdge): if ( isinstance( Edge, geomBuilder.GEOM._objref_GEOM_Object)): - EdgeID = Edge.GetSubShapeIndices()[0] + EdgeID = self.geompyD.GetSubShapeID( self.geom, Edge ) else: EdgeID = Edge try: @@ -2897,7 +2959,7 @@ class Mesh: # @ingroup l2_modif_add def SetNodeOnFace(self, NodeID, Face, u, v): if ( isinstance( Face, geomBuilder.GEOM._objref_GEOM_Object)): - FaceID = Face.GetSubShapeIndices()[0] + FaceID = self.geompyD.GetSubShapeID( self.geom, Face ) else: FaceID = Face try: @@ -2913,7 +2975,7 @@ class Mesh: # @ingroup l2_modif_add def SetNodeInVolume(self, NodeID, Solid): if ( isinstance( Solid, geomBuilder.GEOM._objref_GEOM_Object)): - SolidID = Solid.GetSubShapeIndices()[0] + SolidID = self.geompyD.GetSubShapeID( self.geom, Solid ) else: SolidID = Solid try: @@ -2929,7 +2991,7 @@ class Mesh: # @ingroup l2_modif_add def SetMeshElementOnShape(self, ElementID, Shape): if ( isinstance( Shape, geomBuilder.GEOM._objref_GEOM_Object)): - ShapeID = Shape.GetSubShapeIndices()[0] + ShapeID = self.geompyD.GetSubShapeID( self.geom, Shape ) else: ShapeID = Shape try: @@ -3113,9 +3175,9 @@ class Mesh: ## Fuses the neighbouring triangles into quadrangles. # @param IDsOfElements The triangles to be fused. # @param theCriterion a numerical functor, in terms of enum SMESH.FunctorType, used to - # choose a neighbour to fuse with. + # applied to possible quadrangles to choose a neighbour to fuse with. # Type SMESH.FunctorType._items in the Python Console to see all items. - # Note that not all items corresponds to numerical functors. + # Note that not all items correspond to numerical functors. # @param MaxAngle is the maximum angle between element normals at which the fusion # is still performed; theMaxAngle is mesured in radians. # Also it could be a name of variable which defines angle in degrees. @@ -3131,10 +3193,10 @@ class Mesh: ## Fuses the neighbouring triangles of the object into quadrangles # @param theObject is mesh, submesh or group - # @param theCriterion is a numerical functor, in terms of enum SMESH.FunctorType, used to - # choose a neighbour to fuse with. + # @param theCriterion is a numerical functor, in terms of enum SMESH.FunctorType, + # applied to possible quadrangles to choose a neighbour to fuse with. # Type SMESH.FunctorType._items in the Python Console to see all items. - # Note that not all items corresponds to numerical functors. + # Note that not all items correspond to numerical functors. # @param MaxAngle a max angle between element normals at which the fusion # is still performed; theMaxAngle is mesured in radians. # @return TRUE in case of success, FALSE otherwise. @@ -3149,11 +3211,11 @@ class Mesh: ## Splits quadrangles into triangles. # @param IDsOfElements the faces to be splitted. - # @param theCriterion is a numerical functor, in terms of enum SMESH.FunctorType, used to + # @param theCriterion is a numerical functor, in terms of enum SMESH.FunctorType, used to # choose a diagonal for splitting. If @a theCriterion is None, which is a default # value, then quadrangles will be split by the smallest diagonal. # Type SMESH.FunctorType._items in the Python Console to see all items. - # Note that not all items corresponds to numerical functors. + # Note that not all items correspond to numerical functors. # @return TRUE in case of success, FALSE otherwise. # @ingroup l2_modif_cutquadr def QuadToTri (self, IDsOfElements, theCriterion = None): @@ -3171,7 +3233,7 @@ class Mesh: # choose a diagonal for splitting. If @a theCriterion is None, which is a default # value, then quadrangles will be split by the smallest diagonal. # Type SMESH.FunctorType._items in the Python Console to see all items. - # Note that not all items corresponds to numerical functors. + # Note that not all items correspond to numerical functors. # @return TRUE in case of success, FALSE otherwise. # @ingroup l2_modif_cutquadr def QuadToTriObject (self, theObject, theCriterion = None): @@ -3224,7 +3286,7 @@ class Mesh: # @param theCriterion is a numerical functor, in terms of enum SMESH.FunctorType, used to # choose a diagonal for splitting. # Type SMESH.FunctorType._items in the Python Console to see all items. - # Note that not all items corresponds to numerical functors. + # Note that not all items correspond to numerical functors. # @return 1 if 1-3 diagonal is better, 2 if 2-4 # diagonal is better, 0 if error occurs. # @ingroup l2_modif_cutquadr @@ -3560,8 +3622,8 @@ class Mesh: ## Creates 2D mesh as skin on boundary faces of a 3D mesh # @return TRUE if operation has been completed successfully, FALSE otherwise # @ingroup l2_modif_edit - def Make2DMeshFrom3D(self): - return self.editor. Make2DMeshFrom3D() + def Make2DMeshFrom3D(self): + return self.editor.Make2DMeshFrom3D() ## Creates missing boundary elements # @param elements - elements whose boundary is to be checked: @@ -3780,7 +3842,7 @@ class Mesh: ## Generates new elements by extrusion of the elements with given ids - # @param IDsOfElements the list of elements ids for extrusion + # @param IDsOfElements the list of ids of elements or nodes for extrusion # @param StepVector vector or DirStruct or 3 vector components, defining # the direction and value of extrusion for one step (the total extrusion # length will be NbOfSteps * ||StepVector||) @@ -3796,8 +3858,8 @@ class Mesh: return self.ExtrusionSweepObjects(n,e,f, StepVector, NbOfSteps, MakeGroups) ## Generates new elements by extrusion along the normal to a discretized surface or wire - # @param Elements elements to extrude - a list including ids, groups, sub-meshes or a mesh - # Only faces can be extruded so far. Sub-mesh should be a sub-mesh on geom faces. + # @param Elements elements to extrude - a list including ids, groups, sub-meshes or a mesh. + # Only faces can be extruded so far. A sub-mesh should be a sub-mesh on geom faces. # @param StepSize length of one extrusion step (the total extrusion # length will be \a NbOfSteps * \a StepSize ). # @param NbOfSteps number of extrusion steps. @@ -3833,15 +3895,15 @@ class Mesh: return self.editor.ExtrusionByNormal(Elements, StepSize, NbOfSteps, ByAverageNormal, UseInputElemsOnly, MakeGroups, Dim) - ## Generates new elements by extrusion of the elements which belong to the object - # @param theObject the object which elements should be processed. - # It can be a mesh, a sub mesh or a group. + ## Generates new elements by extrusion of the elements or nodes which belong to the object + # @param theObject the object whose elements or nodes should be processed. + # It can be a mesh, a sub-mesh or a group. # @param StepVector vector or DirStruct or 3 vector components, defining # the direction and value of extrusion for one step (the total extrusion # length will be NbOfSteps * ||StepVector||) # @param NbOfSteps the number of steps # @param MakeGroups forces the generation of new groups from existing ones - # @param IsNodes is True if elements to extrude are nodes + # @param IsNodes is True if elements to extrude are nodes # @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise # @ingroup l2_modif_extrurev def ExtrusionSweepObject(self, theObject, StepVector, NbOfSteps, MakeGroups=False, IsNodes=False): @@ -3850,9 +3912,9 @@ class Mesh: else : e,f, = theObject,theObject return self.ExtrusionSweepObjects(n,e,f, StepVector, NbOfSteps, MakeGroups) - ## Generates new elements by extrusion of the elements which belong to the object - # @param theObject object which elements should be processed. - # It can be a mesh, a sub mesh or a group. + ## Generates new elements by extrusion of edges which belong to the object + # @param theObject object whose 1D elements should be processed. + # It can be a mesh, a sub-mesh or a group. # @param StepVector vector or DirStruct or 3 vector components, defining # the direction and value of extrusion for one step (the total extrusion # length will be NbOfSteps * ||StepVector||) @@ -3863,9 +3925,9 @@ class Mesh: def ExtrusionSweepObject1D(self, theObject, StepVector, NbOfSteps, MakeGroups=False): return self.ExtrusionSweepObjects([],theObject,[], StepVector, NbOfSteps, MakeGroups) - ## Generates new elements by extrusion of the elements which belong to the object - # @param theObject object which elements should be processed. - # It can be a mesh, a sub mesh or a group. + ## Generates new elements by extrusion of faces which belong to the object + # @param theObject object whose 2D elements should be processed. + # It can be a mesh, a sub-mesh or a group. # @param StepVector vector or DirStruct or 3 vector components, defining # the direction and value of extrusion for one step (the total extrusion # length will be NbOfSteps * ||StepVector||) @@ -3928,6 +3990,7 @@ class Mesh: if isinstance( RefPoint, geomBuilder.GEOM._objref_GEOM_Object): RefPoint = self.smeshpyD.GetPointStruct(RefPoint) if isinstance( RefPoint, list ): + if not RefPoint: RefPoint = [0,0,0] RefPoint = SMESH.PointStruct( *RefPoint ) if isinstance( PathMesh, Mesh ): PathMesh = PathMesh.GetMesh() @@ -3941,7 +4004,7 @@ class Mesh: ## Generates new elements by extrusion of the given elements # The path of extrusion must be a meshed edge. - # @param Base mesh or group, or submesh, or list of ids of elements for extrusion + # @param Base mesh or group, or sub-mesh, or list of ids of elements for extrusion # @param Path - 1D mesh or 1D sub-mesh, along which proceeds the extrusion # @param NodeStart the start node from Path. Defines the direction of extrusion # @param HasAngles allows the shape to be rotated around the path @@ -3960,8 +4023,9 @@ class Mesh: # only SMESH::Extrusion_Error otherwise # @ingroup l2_modif_extrurev def ExtrusionAlongPathX(self, Base, Path, NodeStart, - HasAngles, Angles, LinearVariation, - HasRefPoint, RefPoint, MakeGroups, ElemType): + HasAngles=False, Angles=[], LinearVariation=False, + HasRefPoint=False, RefPoint=[0,0,0], MakeGroups=False, + ElemType=SMESH.FACE): n,e,f = [],[],[] if ElemType == SMESH.NODE: n = Base if ElemType == SMESH.EDGE: e = Base @@ -3991,7 +4055,7 @@ class Mesh: # only SMESH::Extrusion_Error otherwise # @ingroup l2_modif_extrurev def ExtrusionAlongPath(self, IDsOfElements, PathMesh, PathShape, NodeStart, - HasAngles, Angles, HasRefPoint, RefPoint, + HasAngles=False, Angles=[], HasRefPoint=False, RefPoint=[], MakeGroups=False, LinearVariation=False): n,e,f = [],IDsOfElements,IDsOfElements gr,er = self.ExtrusionAlongPathObjects(n,e,f, PathMesh, PathShape, @@ -4003,7 +4067,7 @@ class Mesh: ## Generates new elements by extrusion of the elements which belong to the object # The path of extrusion must be a meshed edge. - # @param theObject the object which elements should be processed. + # @param theObject the object whose elements should be processed. # It can be a mesh, a sub-mesh or a group. # @param PathMesh mesh containing a 1D sub-mesh on the edge, along which the extrusion proceeds # @param PathShape shape(edge) defines the sub-mesh for the path @@ -4021,7 +4085,7 @@ class Mesh: # only SMESH::Extrusion_Error otherwise # @ingroup l2_modif_extrurev def ExtrusionAlongPathObject(self, theObject, PathMesh, PathShape, NodeStart, - HasAngles, Angles, HasRefPoint, RefPoint, + HasAngles=False, Angles=[], HasRefPoint=False, RefPoint=[], MakeGroups=False, LinearVariation=False): n,e,f = [],theObject,theObject gr,er = self.ExtrusionAlongPathObjects(n,e,f, PathMesh, PathShape, NodeStart, @@ -4030,10 +4094,10 @@ class Mesh: if MakeGroups: return gr,er return er - ## Generates new elements by extrusion of the elements which belong to the object + ## Generates new elements by extrusion of mesh segments which belong to the object # The path of extrusion must be a meshed edge. - # @param theObject the object which elements should be processed. - # It can be a mesh, a sub mesh or a group. + # @param theObject the object whose 1D elements should be processed. + # It can be a mesh, a sub-mesh or a group. # @param PathMesh mesh containing a 1D sub-mesh on the edge, along which the extrusion proceeds # @param PathShape shape(edge) defines the sub-mesh for the path # @param NodeStart the first or the last node on the edge. Defines the direction of extrusion @@ -4050,7 +4114,7 @@ class Mesh: # only SMESH::Extrusion_Error otherwise # @ingroup l2_modif_extrurev def ExtrusionAlongPathObject1D(self, theObject, PathMesh, PathShape, NodeStart, - HasAngles, Angles, HasRefPoint, RefPoint, + HasAngles=False, Angles=[], HasRefPoint=False, RefPoint=[], MakeGroups=False, LinearVariation=False): n,e,f = [],theObject,[] gr,er = self.ExtrusionAlongPathObjects(n,e,f, PathMesh, PathShape, NodeStart, @@ -4059,10 +4123,10 @@ class Mesh: if MakeGroups: return gr,er return er - ## Generates new elements by extrusion of the elements which belong to the object + ## Generates new elements by extrusion of faces which belong to the object # The path of extrusion must be a meshed edge. - # @param theObject the object which elements should be processed. - # It can be a mesh, a sub mesh or a group. + # @param theObject the object whose 2D elements should be processed. + # It can be a mesh, a sub-mesh or a group. # @param PathMesh mesh containing a 1D sub-mesh on the edge, along which the extrusion proceeds # @param PathShape shape(edge) defines the sub-mesh for the path # @param NodeStart the first or the last node on the edge. Defines the direction of extrusion @@ -4079,7 +4143,7 @@ class Mesh: # only SMESH::Extrusion_Error otherwise # @ingroup l2_modif_extrurev def ExtrusionAlongPathObject2D(self, theObject, PathMesh, PathShape, NodeStart, - HasAngles, Angles, HasRefPoint, RefPoint, + HasAngles=False, Angles=[], HasRefPoint=False, RefPoint=[], MakeGroups=False, LinearVariation=False): n,e,f = [],[],theObject gr,er = self.ExtrusionAlongPathObjects(n,e,f, PathMesh, PathShape, NodeStart, @@ -4428,9 +4492,13 @@ class Mesh: # @param GroupsOfNodes a list of groups of nodes IDs for merging # (e.g. [[1,12,13],[25,4]], then nodes 12, 13 and 4 will be removed and replaced # by nodes 1 and 25 correspondingly in all elements and groups + # @param NodesToKeep nodes to keep in the mesh: a list of groups, sub-meshes or node IDs. + # If @a NodesToKeep does not include a node to keep for some group to merge, + # then the first node in the group is kept. # @ingroup l2_modif_trsf - def MergeNodes (self, GroupsOfNodes): - self.editor.MergeNodes(GroupsOfNodes) + def MergeNodes (self, GroupsOfNodes, NodesToKeep=[]): + # NodesToKeep are converted to SMESH_IDSource in meshEditor.MergeNodes() + self.editor.MergeNodes(GroupsOfNodes,NodesToKeep) ## Finds the elements built on the same nodes. # @param MeshOrSubMeshOrGroup Mesh or SubMesh, or Group of elements for searching @@ -4456,6 +4524,52 @@ class Mesh: def MergeEqualElements(self): self.editor.MergeEqualElements() + ## Returns groups of FreeBorder's coincident within the given tolerance. + # @param tolerance the tolerance. If the tolerance <= 0.0 then one tenth of an average + # size of elements adjacent to free borders being compared is used. + # @return SMESH.CoincidentFreeBorders structure + # @ingroup l2_modif_trsf + def FindCoincidentFreeBorders (self, tolerance=0.): + return self.editor.FindCoincidentFreeBorders( tolerance ) + + ## Sew FreeBorder's of each group + # @param freeBorders either a SMESH.CoincidentFreeBorders structure or a list of lists + # where each enclosed list contains node IDs of a group of coincident free + # borders such that each consequent triple of IDs within a group describes + # a free border in a usual way: n1, n2, nLast - i.e. 1st node, 2nd node and + # last node of a border. + # For example [[1, 2, 10, 20, 21, 40], [11, 12, 15, 55, 54, 41]] describes two + # groups of coincident free borders, each group including two borders. + # @param createPolygons if @c True faces adjacent to free borders are converted to + # polygons if a node of opposite border falls on a face edge, else such + # faces are split into several ones. + # @param createPolyhedra if @c True volumes adjacent to free borders are converted to + # polyhedra if a node of opposite border falls on a volume edge, else such + # volumes, if any, remain intact and the mesh becomes non-conformal. + # @return a number of successfully sewed groups + # @ingroup l2_modif_trsf + def SewCoincidentFreeBorders (self, freeBorders, createPolygons=False, createPolyhedra=False): + if freeBorders and isinstance( freeBorders, list ): + # construct SMESH.CoincidentFreeBorders + if isinstance( freeBorders[0], int ): + freeBorders = [freeBorders] + borders = [] + coincidentGroups = [] + for nodeList in freeBorders: + if not nodeList or len( nodeList ) % 3: + raise ValueError, "Wrong number of nodes in this group: %s" % nodeList + group = [] + while nodeList: + group.append ( SMESH.FreeBorderPart( len(borders), 0, 1, 2 )) + borders.append( SMESH.FreeBorder( nodeList[:3] )) + nodeList = nodeList[3:] + pass + coincidentGroups.append( group ) + pass + freeBorders = SMESH.CoincidentFreeBorders( borders, coincidentGroups ) + + return self.editor.SewCoincidentFreeBorders( freeBorders, createPolygons, createPolyhedra ) + ## Sews free borders # @return SMESH::Sew_Error # @ingroup l2_modif_trsf @@ -4526,7 +4640,7 @@ class Mesh: def ClearLastCreated(self): self.editor.ClearLastCreated() - ## Creates Duplicates given elements, i.e. creates new elements based on the + ## Creates duplicates of given elements, i.e. creates new elements based on the # same nodes as the given ones. # @param theElements - container of elements to duplicate. It can be a Mesh, # sub-mesh, group, filter or a list of element IDs. If \a theElements is @@ -4733,6 +4847,7 @@ class Mesh: ## Returns value of a functor for a given element # @param funcType an item of SMESH.FunctorType enum + # Type "SMESH.FunctorType._items" in the Python Console to see all items. # @param elemId element or node ID # @param isElem @a elemId is ID of element or node # @return the functor value or zero in case of invalid arguments @@ -4846,6 +4961,8 @@ class Mesh: fun = self._getFunctor( funType ) if fun: if meshPart: + if hasattr( meshPart, "SetMesh" ): + meshPart.SetMesh( self.mesh ) # set mesh to filter hist = fun.GetLocalHistogram( 1, False, meshPart ) else: hist = fun.GetHistogram( 1, False ) @@ -4855,7 +4972,25 @@ class Mesh: pass # end of Mesh class -## class used to add to SMESH_MeshEditor methods removed from its CORBA API + +## class used to compensate change of CORBA API of SMESH_Mesh for backward compatibility +# with old dump scripts which call SMESH_Mesh directly and not via smeshBuilder.Mesh +# +class meshProxy(SMESH._objref_SMESH_Mesh): + def __init__(self): + SMESH._objref_SMESH_Mesh.__init__(self) + def __deepcopy__(self, memo=None): + new = self.__class__() + return new + def CreateDimGroup(self,*args): # 2 args added: nbCommonNodes, underlyingOnly + if len( args ) == 3: + args += SMESH.ALL_NODES, True + return SMESH._objref_SMESH_Mesh.CreateDimGroup( self, *args ) + pass +omniORB.registerObjref(SMESH._objref_SMESH_Mesh._NP_RepositoryId, meshProxy) + +## class used to compensate change of CORBA API of SMESH_MeshEditor for backward compatibility +# with old dump scripts which call SMESH_MeshEditor directly and not via smeshBuilder.Mesh # class meshEditor(SMESH._objref_SMESH_MeshEditor): def __init__(self): @@ -4867,12 +5002,29 @@ class meshEditor(SMESH._objref_SMESH_MeshEditor): if hasattr( self.mesh, name ): return getattr( self.mesh, name ) if name == "ExtrusionAlongPathObjX": - return getattr( self.mesh, "ExtrusionAlongPathX" ) - print name, "meshEditor: attribute '%s' NOT FOUND" % name + return getattr( self.mesh, "ExtrusionAlongPathX" ) # other method name + print "meshEditor: attribute '%s' NOT FOUND" % name return None def __deepcopy__(self, memo=None): new = self.__class__() return new + def FindCoincidentNodes(self,*args): # a 2nd arg added (SeparateCornerAndMediumNodes) + if len( args ) == 1: args += False, + return SMESH._objref_SMESH_MeshEditor.FindCoincidentNodes( self, *args ) + def FindCoincidentNodesOnPart(self,*args): # a 3d arg added (SeparateCornerAndMediumNodes) + if len( args ) == 2: args += False, + return SMESH._objref_SMESH_MeshEditor.FindCoincidentNodesOnPart( self, *args ) + def MergeNodes(self,*args): # a 2nd arg added (NodesToKeep) + if len( args ) == 1: + return SMESH._objref_SMESH_MeshEditor.MergeNodes( self, args[0], [] ) + NodesToKeep = args[1] + unRegister = genObjUnRegister() + if NodesToKeep: + if isinstance( NodesToKeep, list ) and isinstance( NodesToKeep[0], int ): + NodesToKeep = self.MakeIDSource( NodesToKeep, SMESH.NODE ) + if not isinstance( NodesToKeep, list ): + NodesToKeep = [ NodesToKeep ] + return SMESH._objref_SMESH_MeshEditor.MergeNodes( self, args[0], NodesToKeep ) pass omniORB.registerObjref(SMESH._objref_SMESH_MeshEditor._NP_RepositoryId, meshEditor) @@ -4880,6 +5032,13 @@ omniORB.registerObjref(SMESH._objref_SMESH_MeshEditor._NP_RepositoryId, meshEdit # class Pattern(SMESH._objref_SMESH_Pattern): + def LoadFromFile(self, patternTextOrFile ): + text = patternTextOrFile + if os.path.exists( text ): + text = open( patternTextOrFile ).read() + pass + return SMESH._objref_SMESH_Pattern.LoadFromFile( self, text ) + def ApplyToMeshFaces(self, theMesh, theFacesIDs, theNodeIndexOnKeyPoint1, theReverse): decrFun = lambda i: i-1 theNodeIndexOnKeyPoint1,Parameters,hasVars = ParseParameters(theNodeIndexOnKeyPoint1, decrFun) @@ -4892,6 +5051,11 @@ class Pattern(SMESH._objref_SMESH_Pattern): theMesh.SetParameters(Parameters) return SMESH._objref_SMESH_Pattern.ApplyToHexahedrons( self, theMesh, theVolumesIDs, theNode000Index, theNode001Index ) + def MakeMesh(self, mesh, CreatePolygons=False, CreatePolyhedra=False): + if isinstance( mesh, Mesh ): + mesh = mesh.GetMesh() + return SMESH._objref_SMESH_Pattern.MakeMesh( self, mesh, CreatePolygons, CreatePolyhedra ) + # Registering the new proxy for Pattern omniORB.registerObjref(SMESH._objref_SMESH_Pattern._NP_RepositoryId, Pattern)