X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_SWIG%2FStdMeshersBuilder.py;h=6dd91e28875d897a6c5f0a6025d70ff08f96a216;hp=2163fed5a3e2c37d02e5e9a64899352bb97a049b;hb=03335084a6a8286c16af9f416fb7e1a6df936ca6;hpb=127524b9c2dc5a7bc35912c581f243fa8801cae2 diff --git a/src/SMESH_SWIG/StdMeshersBuilder.py b/src/SMESH_SWIG/StdMeshersBuilder.py index 2163fed5a..6dd91e288 100644 --- a/src/SMESH_SWIG/StdMeshersBuilder.py +++ b/src/SMESH_SWIG/StdMeshersBuilder.py @@ -1,9 +1,9 @@ -# Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2015 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. +# version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -42,9 +42,14 @@ Hexa = "Hexa_3D" QUADRANGLE = "Quadrangle_2D" ## Algorithm type: Radial Quadrangle 1D-2D algorithm, see StdMeshersBuilder_RadialQuadrangle1D2D RADIAL_QUAD = "RadialQuadrangle_1D2D" +## Algorithm type: Quadrangle (Medial Axis Projection) 1D-2D algorithm, see StdMeshersBuilder_QuadMA_1D2D +QUAD_MA_PROJ = "QuadFromMedialAxis_1D2D" +## Algorithm type: Polygon Per Face 2D algorithm, see StdMeshersBuilder_PolygonPerFace +POLYGON = "PolygonPerFace_2D" -# import items of enum QuadType +# import items of enums for e in StdMeshers.QuadType._items: exec('%s = StdMeshers.%s'%(e,e)) +for e in StdMeshers.VLExtrusionMethod._items: exec('%s = StdMeshers.%s'%(e,e)) #---------------------- # Algorithms @@ -63,7 +68,7 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): ## type of algorithm used with helper function in smeshBuilder.Mesh class # @internal algoType = REGULAR - ## flag pointing either this algorithm should be used by default in dynamic method + ## flag pointing whether this algorithm should be used by default in dynamic method # of smeshBuilder.Mesh class # @internal isDefault = True @@ -143,7 +148,7 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): reversedEdges, UseExisting = [], reversedEdges entry = self.MainShapeEntry() reversedEdgeInd = self.ReversedEdgeIndices(reversedEdges) - if s == []: + if not s: hyp = self.Hypothesis("NumberOfSegments", [n, reversedEdgeInd, entry], UseExisting=UseExisting, CompareMethod=self._compareNumberOfSegments) @@ -151,7 +156,6 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): hyp = self.Hypothesis("NumberOfSegments", [n,s, reversedEdgeInd, entry], UseExisting=UseExisting, CompareMethod=self._compareNumberOfSegments) - hyp.SetDistrType( 1 ) hyp.SetScaleFactor(s) hyp.SetNumberOfSegments(n) hyp.SetReversedEdges( reversedEdgeInd ) @@ -199,7 +203,8 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): hyp.SetDeflection(deflection) return hyp - ## Defines "Arithmetic1D" hypothesis to cut an edge in several segments with increasing arithmetic length + ## Defines "Arithmetic1D" hypothesis to cut an edge in several segments with a length + # that changes in arithmetic progression # @param start defines the length of the first segment # @param end defines the length of the last segment # @param reversedEdges is a list of edges to mesh using reversed orientation. @@ -226,6 +231,32 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): hyp.SetObjectEntry( entry ) return hyp + ## Defines "GeometricProgression" hypothesis to cut an edge in several + # segments with a length that changes in Geometric progression + # @param start defines the length of the first segment + # @param ratio defines the common ratio of the geometric progression + # @param reversedEdges is a list of edges to mesh using reversed orientation. + # A list item can also be a tuple (edge, 1st_vertex_of_edge) + # @param UseExisting if ==true - searches for an existing hypothesis created with + # the same parameters, else (default) - creates a new one + # @return an instance of StdMeshers_Geometric1D hypothesis + # @ingroup l3_hypos_1dhyps + def GeometricProgression(self, start, ratio, reversedEdges=[], UseExisting=0): + reversedEdgeInd = self.ReversedEdgeIndices(reversedEdges) + entry = self.MainShapeEntry() + from salome.smesh.smeshBuilder import IsEqual + compFun = lambda hyp, args: ( IsEqual(hyp.GetLength(1), args[0]) and \ + IsEqual(hyp.GetLength(0), args[1]) and \ + hyp.GetReversedEdges() == args[2] and \ + (not args[2] or hyp.GetObjectEntry() == args[3])) + hyp = self.Hypothesis("GeometricProgression", [start, ratio, reversedEdgeInd, entry], + UseExisting=UseExisting, CompareMethod=compFun) + hyp.SetStartLength( start ) + hyp.SetCommonRatio( ratio ) + hyp.SetReversedEdges( reversedEdgeInd ) + hyp.SetObjectEntry( entry ) + return hyp + ## Defines "FixedPoints1D" hypothesis to cut an edge using parameter # on curve from 0 to 1 (additionally it is neecessary to check # orientation of edges and create list of reversed edges if it is @@ -237,7 +268,7 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): # A list item can also be a tuple (edge, 1st_vertex_of_edge) # @param UseExisting if ==true - searches for an existing hypothesis created with # the same parameters, else (default) - creates a new one - # @return an instance of StdMeshers_Arithmetic1D hypothesis + # @return an instance of StdMeshers_FixedPoints1D hypothesis # @ingroup l3_hypos_1dhyps def FixedPoints1D(self, points, nbSegs=[1], reversedEdges=[], UseExisting=0): if not isinstance(reversedEdges,list): #old version script, before adding reversedEdges @@ -295,12 +326,23 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): hyp.SetDeflection(d) return hyp - ## Defines "Propagation" hypothesis that propagates all other hypotheses on all other edges that are at - # the opposite side in case of quadrangular faces + ## Defines "Propagation" hypothesis that propagates 1D hypotheses + # from an edge where this hypothesis is assigned to + # on all other edges that are at the opposite side in case of quadrangular faces + # This hypothesis should be assigned to an edge to propagate a hypothesis from. # @ingroup l3_hypos_additi def Propagation(self): return self.Hypothesis("Propagation", UseExisting=1, CompareMethod=self.CompareEqualHyp) + ## Defines "Propagation of Node Distribution" hypothesis that propagates + # distribution of nodes from an edge where this hypothesis is assigned to, + # to opposite edges of quadrangular faces, so that number of segments on all these + # edges will be the same, as well as relations between segment lengths. + # @ingroup l3_hypos_additi + def PropagationOfDistribution(self): + return self.Hypothesis("PropagOfDistribution", UseExisting=1, + CompareMethod=self.CompareEqualHyp) + ## Defines "AutomaticLength" hypothesis # @param fineness for the fineness [0-1] # @param UseExisting if ==true - searches for an existing hypothesis created with the @@ -347,7 +389,7 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): algo = self.mesh.smeshpyD.CreateHypothesis("SegmentAroundVertex_0D", "libStdMeshersEngine.so") pass status = self.mesh.mesh.AddHypothesis(self.geom, algo) - TreatHypoStatus(status, "SegmentAroundVertex_0D", name, True) + TreatHypoStatus(status, "SegmentAroundVertex_0D", name, True, self.mesh) # from salome.smesh.smeshBuilder import IsEqual comFun = lambda hyp, args: IsEqual(hyp.GetLength(), args[0]) @@ -384,7 +426,7 @@ class StdMeshersBuilder_CompositeSegment(StdMeshersBuilder_Segment): ## type of algorithm used with helper function in smeshBuilder.Mesh class # @internal algoType = COMPOSITE - ## flag pointing either this algorithm should be used by default in dynamic method + ## flag pointing whether this algorithm should be used by default in dynamic method # of smeshBuilder.Mesh class # @internal isDefault = False @@ -417,9 +459,6 @@ class StdMeshersBuilder_Segment_Python(Mesh_Algorithm): algoType = PYTHON ## doc string of the method # @internal - docHelper = "Creates tetrahedron 3D algorithm for solids" - ## doc string of the method - # @internal docHelper = "Creates segment 1D algorithm for edges" ## Private constructor. @@ -460,7 +499,7 @@ class StdMeshersBuilder_Triangle_MEFISTO(Mesh_Algorithm): ## type of algorithm used with helper function in smeshBuilder.Mesh class # @internal algoType = MEFISTO - ## flag pointing either this algorithm should be used by default in dynamic method + ## flag pointing whether this algorithm should be used by default in dynamic method # of smeshBuilder.Mesh class # @internal isDefault = True @@ -514,7 +553,7 @@ class StdMeshersBuilder_Quadrangle(Mesh_Algorithm): ## type of algorithm used with helper function in smeshBuilder.Mesh class # @internal algoType = QUADRANGLE - ## flag pointing either this algorithm should be used by default in dynamic method + ## flag pointing whether this algorithm should be used by default in dynamic method # of smeshBuilder.Mesh class # @internal isDefault = True @@ -552,28 +591,56 @@ class StdMeshersBuilder_Quadrangle(Mesh_Algorithm): # same number of segments, the other pair must have an even difference # between the numbers of segments on the sides. # @param triangleVertex: vertex of a trilateral geometrical face, around which triangles - # will be created while other elements will be quadrangles. - # Vertex can be either a GEOM_Object or a vertex ID within the - # shape to mesh - # @param UseExisting: if ==true - searches for the existing hypothesis created with - # the same parameters, else (default) - creates a new one + # will be created while other elements will be quadrangles. + # Vertex can be either a GEOM_Object or a vertex ID within the + # shape to mesh + # @param enfVertices: list of shapes defining positions where nodes (enforced nodes) + # must be created by the mesher. Shapes can be of any type, + # vertices of given shapes define positions of enforced nodes. + # Only vertices successfully projected to the face are used. + # @param enfPoints: list of points giving positions of enforced nodes. + # Point can be defined either as SMESH.PointStruct's + # ([SMESH.PointStruct(x1,y1,z1), SMESH.PointStruct(x2,y2,z2),...]) + # or triples of values ([[x1,y1,z1], [x2,y2,z2], ...]). + # In the case if the defined QuadrangleParameters() refer to a sole face, + # all given points must lie on this face, else the mesher fails. + # @param UseExisting: if \c True - searches for the existing hypothesis created with + # the same parameters, else (default) - creates a new one # @ingroup l3_hypos_quad - def QuadrangleParameters(self, quadType=StdMeshers.QUAD_STANDARD, triangleVertex=0, UseExisting=0): - import GEOM + def QuadrangleParameters(self, quadType=StdMeshers.QUAD_STANDARD, triangleVertex=0, + enfVertices=[],enfPoints=[],UseExisting=0): + import GEOM, SMESH vertexID = triangleVertex if isinstance( triangleVertex, GEOM._objref_GEOM_Object ): vertexID = self.mesh.geompyD.GetSubShapeID( self.mesh.geom, triangleVertex ) + if isinstance( enfVertices, int ) and not enfPoints and not UseExisting: + # a call of old syntax, before inserting enfVertices and enfPoints before UseExisting + UseExisting, enfVertices = enfVertices, [] + pStructs, xyz = [], [] + for p in enfPoints: + if isinstance( p, SMESH.PointStruct ): + xyz.append(( p.x, p.y, p.z )) + pStructs.append( p ) + else: + xyz.append(( p[0], p[1], p[2] )) + pStructs.append( SMESH.PointStruct( p[0], p[1], p[2] )) if not self.params: compFun = lambda hyp,args: \ hyp.GetQuadType() == args[0] and \ - ( hyp.GetTriaVertex()==args[1] or ( hyp.GetTriaVertex()<1 and args[1]<1)) - self.params = self.Hypothesis("QuadrangleParams", [quadType,vertexID], + (hyp.GetTriaVertex()==args[1] or ( hyp.GetTriaVertex()<1 and args[1]<1)) and \ + ((hyp.GetEnforcedNodes()) == (args[2],args[3])) # True w/o enfVertices only + entries = [ shape.GetStudyEntry() for shape in enfVertices ] + self.params = self.Hypothesis("QuadrangleParams", [quadType,vertexID,entries,xyz], UseExisting = UseExisting, CompareMethod=compFun) pass if self.params.GetQuadType() != quadType: self.params.SetQuadType(quadType) if vertexID > 0: self.params.SetTriaVertex( vertexID ) + from salome.smesh.smeshBuilder import AssureGeomPublished + for v in enfVertices: + AssureGeomPublished( self.mesh, v ) + self.params.SetEnforcedNodes( enfVertices, pStructs ) return self.params ## Defines "QuadrangleParams" hypothesis with a type of quadrangulation that only @@ -633,7 +700,7 @@ class StdMeshersBuilder_Hexahedron(Mesh_Algorithm): ## type of algorithm used with helper function in smeshBuilder.Mesh class # @internal algoType = Hexa - ## flag pointing either this algorithm should be used by default in dynamic method + ## flag pointing whether this algorithm should be used by default in dynamic method # of smeshBuilder.Mesh class # @internal isDefault = True @@ -665,7 +732,7 @@ class StdMeshersBuilder_Projection1D(Mesh_Algorithm): ## type of algorithm used with helper function in smeshBuilder.Mesh class # @internal algoType = "Projection_1D" - ## flag pointing either this algorithm should be used by default in dynamic method + ## flag pointing whether this algorithm should be used by default in dynamic method # of smeshBuilder.Mesh class # @internal isDefault = True @@ -693,7 +760,7 @@ class StdMeshersBuilder_Projection1D(Mesh_Algorithm): # @param UseExisting if ==true - searches for the existing hypothesis created with # the same parameters, else (default) - creates a new one def SourceEdge(self, edge, mesh=None, srcV=None, tgtV=None, UseExisting=0): - from salome.smesh.smeshBuilder import AssureGeomPublished + from salome.smesh.smeshBuilder import AssureGeomPublished, Mesh AssureGeomPublished( self.mesh, edge ) AssureGeomPublished( self.mesh, srcV ) AssureGeomPublished( self.mesh, tgtV ) @@ -723,7 +790,7 @@ class StdMeshersBuilder_Projection2D(Mesh_Algorithm): ## type of algorithm used with helper function in smeshBuilder.Mesh class # @internal algoType = "Projection_2D" - ## flag pointing either this algorithm should be used by default in dynamic method + ## flag pointing whether this algorithm should be used by default in dynamic method # of smeshBuilder.Mesh class # @internal isDefault = True @@ -764,12 +831,13 @@ class StdMeshersBuilder_Projection2D(Mesh_Algorithm): from salome.smesh.smeshBuilder import AssureGeomPublished AssureGeomPublished( self.mesh, geom ) hyp = self.Hypothesis("ProjectionSource2D", [face,mesh,srcV1,tgtV1,srcV2,tgtV2], - UseExisting=0) + UseExisting=0, toAdd=False) # it does not seem to be useful to reuse the existing "SourceFace" hypothesis #UseExisting=UseExisting, CompareMethod=self.CompareSourceFace) hyp.SetSourceFace( face ) hyp.SetSourceMesh( mesh ) hyp.SetVertexAssociation( srcV1, srcV2, tgtV1, tgtV2 ) + self.mesh.AddHypothesis(hyp, self.geom) return hyp pass # end of StdMeshersBuilder_Projection2D class @@ -789,7 +857,7 @@ class StdMeshersBuilder_Projection1D2D(StdMeshersBuilder_Projection2D): algoType = "Projection_1D2D" ## doc string of the method # @internal - docHelper = "Creates projection 1D-2D algorithm for edges and faces" + docHelper = "Creates projection 1D-2D algorithm for faces" ## Private constructor. # @param mesh parent mesh object algorithm is assigned to @@ -853,6 +921,7 @@ class StdMeshersBuilder_Projection3D(Mesh_Algorithm): # seems to be not really useful to reuse existing "SourceShape3D" hypothesis #UseExisting=UseExisting, CompareMethod=self.CompareSourceShape3D) hyp.SetSource3DShape( solid ) + from salome.smesh.smeshBuilder import Mesh if isinstance(mesh, Mesh): mesh = mesh.GetMesh() if mesh: @@ -969,17 +1038,17 @@ class StdMeshersBuilder_Prism3D(Mesh_Algorithm): if self.algoType != "RadialPrism_3D": print "Prism_3D algorith doesn't support any hyposesis" return None - if s == []: + if not s: hyp = self.OwnHypothesis("NumberOfSegments", [n]) else: hyp = self.OwnHypothesis("NumberOfSegments", [n,s]) - hyp.SetDistrType( 1 ) hyp.SetScaleFactor(s) hyp.SetNumberOfSegments(n) return hyp ## Defines "Arithmetic1D" hypothesis, specifying the distribution of segments - # to build between the inner and the outer shells with a length that changes in arithmetic progression + # to build between the inner and the outer shells with a length that changes + # in arithmetic progression # @param start the length of the first segment # @param end the length of the last segment def Arithmetic1D(self, start, end ): @@ -991,6 +1060,20 @@ class StdMeshersBuilder_Prism3D(Mesh_Algorithm): hyp.SetLength(end , 0) return hyp + ## Defines "GeometricProgression" hypothesis, specifying the distribution of segments + # to build between the inner and the outer shells with a length that changes + # in Geometric progression + # @param start the length of the first segment + # @param ratio the common ratio of the geometric progression + def GeometricProgression(self, start, ratio ): + if self.algoType != "RadialPrism_3D": + print "Prism_3D algorith doesn't support any hyposesis" + return None + hyp = self.OwnHypothesis("GeometricProgression", [start, ratio]) + hyp.SetStartLength( start ) + hyp.SetCommonRatio( ratio ) + return hyp + ## Defines "StartEndLength" hypothesis, specifying distribution of segments # to build between the inner and the outer shells as geometric length increasing # @param start for the length of the first segment @@ -1017,8 +1100,7 @@ class StdMeshersBuilder_Prism3D(Mesh_Algorithm): pass # end of StdMeshersBuilder_Prism3D class -## Defines a Prism 3D algorithm, which is either "Extrusion 3D" or "Radial Prism" -# depending on geometry +## Defines a Prism 3D algorithm # # It is created by calling smeshBuilder.Mesh.Prism(geom=0) # @@ -1033,7 +1115,7 @@ class StdMeshersBuilder_RadialPrism3D(StdMeshersBuilder_Prism3D): algoType = "RadialPrism_3D" ## doc string of the method # @internal - docHelper = "Creates prism 3D algorithm for volumes" + docHelper = "Creates Raial Prism 3D algorithm for volumes" ## Private constructor. # @param mesh parent mesh object algorithm is assigned to @@ -1050,30 +1132,12 @@ class StdMeshersBuilder_RadialPrism3D(StdMeshersBuilder_Prism3D): self.nbLayers = None return -## Defines a Radial Quadrangle 1D-2D algorithm +## Base class for algorithms supporting radial distribution hypotheses # -# It is created by calling smeshBuilder.Mesh.Quadrangle(smeshBuilder.RADIAL_QUAD,geom=0) -# -# @ingroup l2_algos_radialq -class StdMeshersBuilder_RadialQuadrangle1D2D(Mesh_Algorithm): - - ## name of the dynamic method in smeshBuilder.Mesh class - # @internal - meshMethod = "Quadrangle" - ## type of algorithm used with helper function in smeshBuilder.Mesh class - # @internal - algoType = RADIAL_QUAD - ## doc string of the method - # @internal - docHelper = "Creates quadrangle 1D-2D algorithm for triangular faces" +class StdMeshersBuilder_RadialAlgorithm(Mesh_Algorithm): - ## Private constructor. - # @param mesh parent mesh object algorithm is assigned to - # @param geom geometry (shape/sub-shape) algorithm is assigned to; - # if it is @c 0 (default), the algorithm is assigned to the main shape - def __init__(self, mesh, geom=0): + def __init__(self): Mesh_Algorithm.__init__(self) - self.Create(mesh, geom, self.algoType) self.distribHyp = None #self.Hypothesis("LayerDistribution2D", UseExisting=0) self.nbLayers = None @@ -1147,6 +1211,16 @@ class StdMeshersBuilder_RadialQuadrangle1D2D(Mesh_Algorithm): hyp.SetLength(end , 0) return hyp + ## Defines "GeometricProgression" hypothesis, specifying the distribution of segments + # with a length that changes in Geometric progression + # @param start the length of the first segment + # @param ratio the common ratio of the geometric progression + def GeometricProgression(self, start, ratio ): + hyp = self.OwnHypothesis("GeometricProgression", [start, ratio]) + hyp.SetStartLength( start ) + hyp.SetCommonRatio( ratio ) + return hyp + ## Defines "StartEndLength" hypothesis, specifying distribution of segments # as geometric length increasing # @param start for the length of the first segment @@ -1166,6 +1240,96 @@ class StdMeshersBuilder_RadialQuadrangle1D2D(Mesh_Algorithm): pass # end of StdMeshersBuilder_RadialQuadrangle1D2D class +## Defines a Radial Quadrangle 1D-2D algorithm +# +# It is created by calling smeshBuilder.Mesh.Quadrangle(smeshBuilder.RADIAL_QUAD,geom=0) +# +# @ingroup l2_algos_radialq +class StdMeshersBuilder_RadialQuadrangle1D2D(StdMeshersBuilder_RadialAlgorithm): + + ## name of the dynamic method in smeshBuilder.Mesh class + # @internal + meshMethod = "Quadrangle" + ## type of algorithm used with helper function in smeshBuilder.Mesh class + # @internal + algoType = RADIAL_QUAD + ## doc string of the method + # @internal + docHelper = "Creates quadrangle 1D-2D algorithm for faces having a shape of disk or a disk segment" + + ## Private constructor. + # @param mesh parent mesh object algorithm is assigned to + # @param geom geometry (shape/sub-shape) algorithm is assigned to; + # if it is @c 0 (default), the algorithm is assigned to the main shape + def __init__(self, mesh, geom=0): + StdMeshersBuilder_RadialAlgorithm.__init__(self) + self.Create(mesh, geom, self.algoType) + + self.distribHyp = None #self.Hypothesis("LayerDistribution2D", UseExisting=0) + self.nbLayers = None + pass + + +## Defines a Quadrangle (Medial Axis Projection) 1D-2D algorithm +# +# It is created by calling smeshBuilder.Mesh.Quadrangle(smeshBuilder.QUAD_MA_PROJ,geom=0) +# +# @ingroup l2_algos_quad_ma +class StdMeshersBuilder_QuadMA_1D2D(StdMeshersBuilder_RadialAlgorithm): + + ## name of the dynamic method in smeshBuilder.Mesh class + # @internal + meshMethod = "Quadrangle" + ## type of algorithm used with helper function in smeshBuilder.Mesh class + # @internal + algoType = QUAD_MA_PROJ + ## doc string of the method + # @internal + docHelper = "Creates quadrangle 1D-2D algorithm for faces" + + ## Private constructor. + # @param mesh parent mesh object algorithm is assigned to + # @param geom geometry (shape/sub-shape) algorithm is assigned to; + # if it is @c 0 (default), the algorithm is assigned to the main shape + def __init__(self, mesh, geom=0): + StdMeshersBuilder_RadialAlgorithm.__init__(self) + self.Create(mesh, geom, self.algoType) + pass + + pass + +## Defines a Polygon Per Face 2D algorithm +# +# It is created by calling smeshBuilder.Mesh.Polygon(geom=0) +# +# @ingroup l2_algos_quad_ma +class StdMeshersBuilder_PolygonPerFace(Mesh_Algorithm): + + ## name of the dynamic method in smeshBuilder.Mesh class + # @internal + meshMethod = "Polygon" + ## type of algorithm used with helper function in smeshBuilder.Mesh class + # @internal + algoType = POLYGON + ## flag pointing whether this algorithm should be used by default in dynamic method + # of smeshBuilder.Mesh class + # @internal + isDefault = True + ## doc string of the method + # @internal + docHelper = "Creates polygon 2D algorithm for faces" + + ## Private constructor. + # @param mesh parent mesh object algorithm is assigned to + # @param geom geometry (shape/sub-shape) algorithm is assigned to; + # if it is @c 0 (default), the algorithm is assigned to the main shape + def __init__(self, mesh, geom=0): + Mesh_Algorithm.__init__(self) + self.Create(mesh, geom, self.algoType) + pass + + pass + ## Defines a Use Existing Elements 1D algorithm # # It is created by calling smeshBuilder.Mesh.UseExisting1DElements(geom=0) @@ -1179,7 +1343,7 @@ class StdMeshersBuilder_UseExistingElements_1D(Mesh_Algorithm): ## type of algorithm used with helper function in smeshBuilder.Mesh class # @internal algoType = "Import_1D" - ## flag pointing either this algorithm should be used by default in dynamic method + ## flag pointing whether this algorithm should be used by default in dynamic method # of smeshBuilder.Mesh class # @internal isDefault = True @@ -1229,13 +1393,13 @@ class StdMeshersBuilder_UseExistingElements_1D2D(Mesh_Algorithm): ## type of algorithm used with helper function in smeshBuilder.Mesh class # @internal algoType = "Import_1D2D" - ## flag pointing either this algorithm should be used by default in dynamic method + ## flag pointing whether this algorithm should be used by default in dynamic method # of smeshBuilder.Mesh class # @internal isDefault = True ## doc string of the method # @internal - docHelper = "Creates 1D-2D algorithm for edges/faces with reusing of existing mesh elements" + docHelper = "Creates 1D-2D algorithm for faces with reusing of existing mesh elements" ## Private constructor. # @param mesh parent mesh object algorithm is assigned to @@ -1253,15 +1417,16 @@ class StdMeshersBuilder_UseExistingElements_1D2D(Mesh_Algorithm): # @param UseExisting if ==true - searches for the existing hypothesis created with # the same parameters, else (default) - creates a new one def SourceFaces(self, groups, toCopyMesh=False, toCopyGroups=False, UseExisting=False): - for group in groups: - from salome.smesh.smeshBuilder import AssureGeomPublished - AssureGeomPublished( self.mesh, group ) + import SMESH compFun = lambda hyp, args: ( hyp.GetSourceFaces() == args[0] and \ hyp.GetCopySourceMesh() == args[1], args[2] ) hyp = self.Hypothesis("ImportSource2D", [groups, toCopyMesh, toCopyGroups], - UseExisting=UseExisting, CompareMethod=compFun) + UseExisting=UseExisting, CompareMethod=compFun, toAdd=False) + if groups and isinstance( groups, SMESH._objref_SMESH_GroupBase ): + groups = [groups] hyp.SetSourceFaces(groups) hyp.SetCopySourceMesh(toCopyMesh, toCopyGroups) + self.mesh.AddHypothesis(hyp, self.geom) return hyp pass # end of StdMeshersBuilder_UseExistingElements_1D2D class @@ -1279,13 +1444,13 @@ class StdMeshersBuilder_Cartesian_3D(Mesh_Algorithm): ## type of algorithm used with helper function in smeshBuilder.Mesh class # @internal algoType = "Cartesian_3D" - ## flag pointing either this algorithm should be used by default in dynamic method + ## flag pointing whether this algorithm should be used by default in dynamic method # of smeshBuilder.Mesh class # @internal isDefault = True ## doc string of the method # @internal - docHelper = "Creates body fitting 3D algorithm for volumes" + docHelper = "Creates Body Fitting 3D algorithm for volumes" ## Private constructor. # @param mesh parent mesh object algorithm is assigned to @@ -1308,22 +1473,21 @@ class StdMeshersBuilder_Cartesian_3D(Mesh_Algorithm): # Examples: # - "10.5" - defines a grid with a constant spacing # - [["1", "1+10*t", "11"] [0.1, 0.6]] - defines different spacing in 3 ranges. - # @param yGridDef defines the grid along the Y asix the same way as \a xGridDef does - # @param zGridDef defines the grid along the Z asix the same way as \a xGridDef does + # @param yGridDef defines the grid along the Y asix the same way as \a xGridDef does. + # @param zGridDef defines the grid along the Z asix the same way as \a xGridDef does. # @param sizeThreshold (> 1.0) defines a minimal size of a polyhedron so that - # a polyhedron of size less than hexSize/sizeThreshold is not created - # @param UseExisting if ==true - searches for the existing hypothesis created with - # the same parameters, else (default) - creates a new one - def SetGrid(self, xGridDef, yGridDef, zGridDef, sizeThreshold=4.0, UseExisting=False): + # a polyhedron of size less than hexSize/sizeThreshold is not created. + # @param implEdges enables implementation of geometrical edges into the mesh. + def SetGrid(self, xGridDef, yGridDef, zGridDef, sizeThreshold=4.0, implEdges=False): if not self.hyp: compFun = lambda hyp, args: False self.hyp = self.Hypothesis("CartesianParameters3D", [xGridDef, yGridDef, zGridDef, sizeThreshold], - UseExisting=UseExisting, CompareMethod=compFun) + UseExisting=False, CompareMethod=compFun) if not self.mesh.IsUsedHypothesis( self.hyp, self.geom ): self.mesh.AddHypothesis( self.hyp, self.geom ) - for axis, gridDef in enumerate( [xGridDef, yGridDef, zGridDef]): + for axis, gridDef in enumerate( [xGridDef, yGridDef, zGridDef] ): if not gridDef: raise ValueError, "Empty grid definition" if isinstance( gridDef, str ): self.hyp.SetGridSpacing( [gridDef], [], axis ) @@ -1335,7 +1499,68 @@ class StdMeshersBuilder_Cartesian_3D(Mesh_Algorithm): else: self.hyp.SetGridSpacing( gridDef[0], gridDef[1], axis ) self.hyp.SetSizeThreshold( sizeThreshold ) + self.hyp.SetToAddEdges( implEdges ) + return self.hyp + + ## Defines custom directions of axes of the grid + # @param xAxis either SMESH.DirStruct or a vector, or 3 vector components + # @param yAxis either SMESH.DirStruct or a vector, or 3 vector components + # @param zAxis either SMESH.DirStruct or a vector, or 3 vector components + def SetAxesDirs( self, xAxis, yAxis, zAxis ): + import GEOM + if hasattr( xAxis, "__getitem__" ): + xAxis = self.mesh.smeshpyD.MakeDirStruct( xAxis[0],xAxis[1],xAxis[2] ) + elif isinstance( xAxis, GEOM._objref_GEOM_Object ): + xAxis = self.mesh.smeshpyD.GetDirStruct( xAxis ) + if hasattr( yAxis, "__getitem__" ): + yAxis = self.mesh.smeshpyD.MakeDirStruct( yAxis[0],yAxis[1],yAxis[2] ) + elif isinstance( yAxis, GEOM._objref_GEOM_Object ): + yAxis = self.mesh.smeshpyD.GetDirStruct( yAxis ) + if hasattr( zAxis, "__getitem__" ): + zAxis = self.mesh.smeshpyD.MakeDirStruct( zAxis[0],zAxis[1],zAxis[2] ) + elif isinstance( zAxis, GEOM._objref_GEOM_Object ): + zAxis = self.mesh.smeshpyD.GetDirStruct( zAxis ) + if not self.hyp: + self.hyp = self.Hypothesis("CartesianParameters3D") + if not self.mesh.IsUsedHypothesis( self.hyp, self.geom ): + self.mesh.AddHypothesis( self.hyp, self.geom ) + self.hyp.SetAxesDirs( xAxis, yAxis, zAxis ) + return self.hyp + + ## Automatically defines directions of axes of the grid at which + # a number of generated hexahedra is maximal + # @param isOrthogonal defines whether the axes mush be orthogonal + def SetOptimalAxesDirs(self, isOrthogonal=True): + if not self.hyp: + self.hyp = self.Hypothesis("CartesianParameters3D") + if not self.mesh.IsUsedHypothesis( self.hyp, self.geom ): + self.mesh.AddHypothesis( self.hyp, self.geom ) + x,y,z = self.hyp.ComputeOptimalAxesDirs( self.geom, isOrthogonal ) + self.hyp.SetAxesDirs( x,y,z ) + return self.hyp + + ## Sets/unsets a fixed point. The algorithm makes a plane of the grid pass + # through the fixed point in each direction at which the grid is defined + # by spacing + # @param p coordinates of the fixed point. Either SMESH.PointStruct or + # a vertex or 3 components of coordinates. + # @param toUnset defines whether the fixed point is defined or removed. + def SetFixedPoint( self, p, toUnset=False ): + import SMESH, GEOM + if toUnset: + if not self.hyp: return + p = SMESH.PointStruct(0,0,0) + elif hasattr( p, "__getitem__" ): + p = SMESH.PointStruct( p[0],p[1],p[2] ) + elif isinstance( p, GEOM._objref_GEOM_Object ): + p = self.mesh.smeshpyD.GetPointStruct( p ) + if not self.hyp: + self.hyp = self.Hypothesis("CartesianParameters3D") + if not self.mesh.IsUsedHypothesis( self.hyp, self.geom ): + self.mesh.AddHypothesis( self.hyp, self.geom ) + self.hyp.SetFixedPoint( p, toUnset ) return self.hyp + pass # end of StdMeshersBuilder_Cartesian_3D class @@ -1355,7 +1580,7 @@ class StdMeshersBuilder_UseExisting_1D(Mesh_Algorithm): algoType = "UseExisting_1D" ## doc string of the method # @internal - docHelper = "Creates 1D algorithm for edges with reusing of existing mesh elements" + docHelper = "Creates 1D algorithm allowing batch meshing of edges" ## Private constructor. # @param mesh parent mesh object algorithm is assigned to @@ -1383,7 +1608,7 @@ class StdMeshersBuilder_UseExisting_2D(Mesh_Algorithm): algoType = "UseExisting_2D" ## doc string of the method # @internal - docHelper = "Creates 2D algorithm for faces with reusing of existing mesh elements" + docHelper = "Creates 2D algorithm allowing batch meshing of faces" ## Private constructor. # @param mesh parent mesh object algorithm is assigned to