X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_SWIG%2FsmeshDC.py;h=f53fa33e4235fb7210ee66d50da1033dee3f82d6;hb=1c9e778a7c0d08bf2715957c9231e1be5bf388c7;hp=34a67d339936bff3afbf927b945788a1be8e1244;hpb=d0b3f328a8557f19fadf4bb5408572e0f091912c;p=modules%2Fsmesh.git diff --git a/src/SMESH_SWIG/smeshDC.py b/src/SMESH_SWIG/smeshDC.py index 34a67d339..f53fa33e4 100644 --- a/src/SMESH_SWIG/smeshDC.py +++ b/src/SMESH_SWIG/smeshDC.py @@ -188,10 +188,10 @@ None_Optimization, Light_Optimization, Medium_Optimization, Strong_Optimization None_Optimization, Light_Optimization, Standard_Optimization, StandardPlus_Optimization, Strong_Optimization = 0,1,2,3,4 # Topology treatment way of BLSURF -FromCAD, PreProcess, PreProcessPlus = 0,1,2 +FromCAD, PreProcess, PreProcessPlus, PreCAD = 0,1,2,3 # Element size flag of BLSURF -DefaultSize, DefaultGeom, Custom = 0,0,1 +DefaultSize, DefaultGeom, BLSURF_Custom, SizeMap = 0,0,1,2 PrecisionConfusion = 1e-07 @@ -450,7 +450,7 @@ def TreatHypoStatus(status, hypName, geomName, isAlgo): elif status == HYP_CONCURENT : reason = "there are concurrent hypotheses on sub-shapes" elif status == HYP_BAD_SUBSHAPE : - reason = "the shape is neither the main one, nor its subshape, nor a valid group" + 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" elif status == HYP_HIDDEN_ALGO: @@ -490,6 +490,45 @@ def CheckPlugin(plugin): return False return True +## Private method. Add geom (sub-shape of the main shape) into the study if not yet there +def AssureGeomPublished(mesh, geom, name=''): + if not isinstance( geom, geompyDC.GEOM._objref_GEOM_Object ): + return + if not geom.IsSame( mesh.geom ) and not geom.GetStudyEntry(): + ## set the study + studyID = mesh.smeshpyD.GetCurrentStudy()._get_StudyId() + if studyID != mesh.geompyD.myStudyId: + mesh.geompyD.init_geom( mesh.smeshpyD.GetCurrentStudy()) + ## get a name + if not name and geom.GetShapeType() != geompyDC.GEOM.COMPOUND: + # for all groups SubShapeName() returns "Compound_-1" + name = mesh.geompyD.SubShapeName(geom, mesh.geom) + if not name: + name = "%s_%s"%(geom.GetShapeType(), id(geom)%10000) + ## publish + mesh.geompyD.addToStudyInFather( mesh.geom, geom, name ) + return + +## Return the first vertex of a geomertical edge by ignoring orienation +def FirstVertexOnCurve(edge): + from geompy import SubShapeAll, ShapeType, KindOfShape, PointCoordinates + vv = SubShapeAll( edge, ShapeType["VERTEX"]) + if not vv: + raise TypeError, "Given object has no vertices" + if len( vv ) == 1: return vv[0] + info = KindOfShape(edge) + xyz = info[1:4] # coords of the first vertex + xyz1 = PointCoordinates( vv[0] ) + xyz2 = PointCoordinates( vv[1] ) + dist1, dist2 = 0,0 + for i in range(3): + dist1 += abs( xyz[i] - xyz1[i] ) + dist2 += abs( xyz[i] - xyz2[i] ) + if dist1 < dist2: + return vv[0] + else: + return vv[1] + # end of l1_auxiliary ## @} @@ -501,6 +540,16 @@ class smeshDC(SMESH._objref_SMESH_Gen): def DumpPython(self, theStudy, theIsPublished=True, theIsMultiFile=True): return SMESH._objref_SMESH_Gen.DumpPython(self, theStudy, theIsPublished, theIsMultiFile) + ## Set mode of DumpPython(), \a historical or \a snapshot. + # In the \a historical mode, the Python Dump script includes all commands + # performed by SMESH engine. In the \a snapshot mode, commands + # relating to objects removed from the Study are excluded from the script + # as well as commands not influencing the current state of meshes + def SetDumpPythonHistorical(self, isHistorical): + if isHistorical: val = "true" + else: val = "false" + SMESH._objref_SMESH_Gen.SetOption(self, "historical_python_dump", val) + ## Sets the current study and Geometry component # @ingroup l1_auxiliary def init_smesh(self,theStudy,geompyD): @@ -658,6 +707,17 @@ class smeshDC(SMESH._objref_SMESH_Gen): aMeshes.append(aMesh) return aMeshes, aStatus + ## Creates a Mesh object(s) importing data from the given SAUV file + # @return a list of Mesh class instances + # @ingroup l2_impexp + def CreateMeshesFromSAUV( self,theFileName ): + aSmeshMeshes, aStatus = SMESH._objref_SMESH_Gen.CreateMeshesFromSAUV(self,theFileName) + aMeshes = [] + for iMesh in range(len(aSmeshMeshes)) : + aMesh = Mesh(self, self.geompyD, aSmeshMeshes[iMesh]) + aMeshes.append(aMesh) + return aMeshes, aStatus + ## Creates a Mesh object importing data from the given STL file # @return an instance of Mesh class # @ingroup l2_impexp @@ -666,6 +726,17 @@ class smeshDC(SMESH._objref_SMESH_Gen): aMesh = Mesh(self, self.geompyD, aSmeshMesh) return aMesh + ## Creates Mesh objects importing data from the given CGNS file + # @return an instance of Mesh class + # @ingroup l2_impexp + def CreateMeshesFromCGNS( self, theFileName ): + aSmeshMeshes, aStatus = SMESH._objref_SMESH_Gen.CreateMeshesFromCGNS(self,theFileName) + aMeshes = [] + for iMesh in range(len(aSmeshMeshes)) : + aMesh = Mesh(self, self.geompyD, aSmeshMeshes[iMesh]) + aMeshes.append(aMesh) + return aMeshes, aStatus + ## Concatenate the given meshes into one mesh. # @return an instance of Mesh class # @param meshes the meshes to combine into one mesh @@ -749,7 +820,7 @@ class smeshDC(SMESH._objref_SMESH_Gen): # @param elementType the type of elements(NODE, EDGE, FACE, VOLUME) # @param CritType the type of criterion (FT_Taper, FT_Area, FT_RangeOfIds, FT_LyingOnGeom etc.) # @param Compare belongs to {FT_LessThan, FT_MoreThan, FT_EqualTo} - # @param Treshold the threshold value (range of ids as string, shape, numeric) + # @param Threshold the threshold value (range of ids as string, shape, numeric) # @param UnaryOp FT_LogicalNOT or FT_Undefined # @param BinaryOp a binary logical operation FT_LogicalAND, FT_LogicalOR or # FT_Undefined (must be for the last criterion of all criteria) @@ -762,16 +833,18 @@ class smeshDC(SMESH._objref_SMESH_Gen): def GetCriterion(self,elementType, CritType, Compare = FT_EqualTo, - Treshold="", + Threshold="", UnaryOp=FT_Undefined, BinaryOp=FT_Undefined, Tolerance=1e-07): + if not CritType in SMESH.FunctorType._items: + raise TypeError, "CritType should be of SMESH.FunctorType" aCriterion = self.GetEmptyCriterion() aCriterion.TypeOfElement = elementType aCriterion.Type = self.EnumToLong(CritType) aCriterion.Tolerance = Tolerance - aTreshold = Treshold + aThreshold = Threshold if Compare in [FT_LessThan, FT_MoreThan, FT_EqualTo]: aCriterion.Compare = self.EnumToLong(Compare) @@ -783,83 +856,85 @@ class smeshDC(SMESH._objref_SMESH_Gen): aCriterion.Compare = self.EnumToLong(FT_MoreThan) elif Compare != FT_Undefined: aCriterion.Compare = self.EnumToLong(FT_EqualTo) - aTreshold = Compare + aThreshold = Compare if CritType in [FT_BelongToGeom, FT_BelongToPlane, FT_BelongToGenSurface, FT_BelongToCylinder, FT_LyingOnGeom]: - # Checks the treshold - if isinstance(aTreshold, geompyDC.GEOM._objref_GEOM_Object): - aCriterion.ThresholdStr = GetName(aTreshold) - aCriterion.ThresholdID = salome.ObjectToID(aTreshold) + # Checks the Threshold + if isinstance(aThreshold, geompyDC.GEOM._objref_GEOM_Object): + aCriterion.ThresholdStr = GetName(aThreshold) + aCriterion.ThresholdID = salome.ObjectToID(aThreshold) else: - print "Error: The treshold should be a shape." + print "Error: The Threshold should be a shape." return None if isinstance(UnaryOp,float): aCriterion.Tolerance = UnaryOp UnaryOp = FT_Undefined pass elif CritType == FT_RangeOfIds: - # Checks the treshold - if isinstance(aTreshold, str): - aCriterion.ThresholdStr = aTreshold + # Checks the Threshold + if isinstance(aThreshold, str): + aCriterion.ThresholdStr = aThreshold else: - print "Error: The treshold should be a string." + print "Error: The Threshold should be a string." return None elif CritType == FT_CoplanarFaces: - # Checks the treshold - if isinstance(aTreshold, int): - aCriterion.ThresholdID = "%s"%aTreshold - elif isinstance(aTreshold, str): - ID = int(aTreshold) + # Checks the Threshold + if isinstance(aThreshold, int): + aCriterion.ThresholdID = "%s"%aThreshold + elif isinstance(aThreshold, str): + ID = int(aThreshold) if ID < 1: - raise ValueError, "Invalid ID of mesh face: '%s'"%aTreshold - aCriterion.ThresholdID = aTreshold + raise ValueError, "Invalid ID of mesh face: '%s'"%aThreshold + aCriterion.ThresholdID = aThreshold else: raise ValueError,\ - "The treshold should be an ID of mesh face and not '%s'"%aTreshold + "The Threshold should be an ID of mesh face and not '%s'"%aThreshold elif CritType == FT_ElemGeomType: - # Checks the treshold + # Checks the Threshold try: - aCriterion.Threshold = self.EnumToLong(aTreshold) + aCriterion.Threshold = self.EnumToLong(aThreshold) + assert( aThreshold in SMESH.GeometryType._items ) except: - if isinstance(aTreshold, int): - aCriterion.Threshold = aTreshold + if isinstance(aThreshold, int): + aCriterion.Threshold = aThreshold else: - print "Error: The treshold should be an integer or SMESH.GeometryType." + print "Error: The Threshold should be an integer or SMESH.GeometryType." return None pass pass elif CritType == FT_GroupColor: - # Checks the treshold + # Checks the Threshold try: - aCriterion.ThresholdStr = self.ColorToString(aTreshold) + aCriterion.ThresholdStr = self.ColorToString(aThreshold) except: print "Error: The threshold value should be of SALOMEDS.Color type" return None pass - elif CritType in [FT_FreeBorders, FT_FreeEdges, FT_BadOrientedVolume, FT_FreeNodes, - FT_FreeFaces, FT_LinearOrQuadratic, + elif CritType in [FT_FreeBorders, FT_FreeEdges, FT_FreeNodes, FT_FreeFaces, + FT_LinearOrQuadratic, FT_BadOrientedVolume, FT_BareBorderFace, FT_BareBorderVolume, - FT_OverConstrainedFace, FT_OverConstrainedVolume]: - # At this point the treshold is unnecessary - if aTreshold == FT_LogicalNOT: + FT_OverConstrainedFace, FT_OverConstrainedVolume, + FT_EqualNodes,FT_EqualEdges,FT_EqualFaces,FT_EqualVolumes ]: + # At this point the Threshold is unnecessary + if aThreshold == FT_LogicalNOT: aCriterion.UnaryOp = self.EnumToLong(FT_LogicalNOT) - elif aTreshold in [FT_LogicalAND, FT_LogicalOR]: - aCriterion.BinaryOp = aTreshold + elif aThreshold in [FT_LogicalAND, FT_LogicalOR]: + aCriterion.BinaryOp = aThreshold else: - # Check treshold + # Check Threshold try: - aTreshold = float(aTreshold) - aCriterion.Threshold = aTreshold + aThreshold = float(aThreshold) + aCriterion.Threshold = aThreshold except: - print "Error: The treshold should be a number." + print "Error: The Threshold should be a number." return None - if Treshold == FT_LogicalNOT or UnaryOp == FT_LogicalNOT: + if Threshold == FT_LogicalNOT or UnaryOp == FT_LogicalNOT: aCriterion.UnaryOp = self.EnumToLong(FT_LogicalNOT) - if Treshold in [FT_LogicalAND, FT_LogicalOR]: - aCriterion.BinaryOp = self.EnumToLong(Treshold) + if Threshold in [FT_LogicalAND, FT_LogicalOR]: + aCriterion.BinaryOp = self.EnumToLong(Threshold) if UnaryOp in [FT_LogicalAND, FT_LogicalOR]: aCriterion.BinaryOp = self.EnumToLong(UnaryOp) @@ -873,10 +948,10 @@ class smeshDC(SMESH._objref_SMESH_Gen): # @param elementType the type of elements in the group # @param CritType the type of criterion ( FT_Taper, FT_Area, FT_RangeOfIds, FT_LyingOnGeom etc. ) # @param Compare belongs to {FT_LessThan, FT_MoreThan, FT_EqualTo} - # @param Treshold the threshold value (range of id ids as string, shape, numeric) + # @param Threshold the threshold value (range of id ids as string, shape, numeric) # @param UnaryOp FT_LogicalNOT or FT_Undefined # @param Tolerance the tolerance used by FT_BelongToGeom, FT_BelongToSurface, - # FT_LyingOnGeom, FT_CoplanarFaces criteria + # FT_LyingOnGeom, FT_CoplanarFaces and FT_EqualNodes criteria # @return SMESH_Filter # # Example of Filters usage @@ -884,10 +959,10 @@ class smeshDC(SMESH._objref_SMESH_Gen): def GetFilter(self,elementType, CritType=FT_Undefined, Compare=FT_EqualTo, - Treshold="", + Threshold="", UnaryOp=FT_Undefined, Tolerance=1e-07): - aCriterion = self.GetCriterion(elementType, CritType, Compare, Treshold, UnaryOp, FT_Undefined,Tolerance) + aCriterion = self.GetCriterion(elementType, CritType, Compare, Threshold, UnaryOp, FT_Undefined,Tolerance) aFilterMgr = self.CreateFilterManager() aFilter = aFilterMgr.CreateFilter() aCriteria = [] @@ -954,7 +1029,7 @@ class smeshDC(SMESH._objref_SMESH_Gen): return SMESH._objref_SMESH_Gen.CreateHypothesis(self, theHType, theLibName ) ## Gets the mesh statistic - # @return dictionary - + # @return dictionary "element type" - "count of elements" # @ingroup l1_meshinfo def GetMeshInfo(self, obj): if isinstance( obj, Mesh ): @@ -1164,19 +1239,7 @@ class Mesh: # @return an object of type SMESH_SubMesh, representing a part of mesh, which lies on the given shape # @ingroup l2_submeshes def GetSubMesh(self, geom, name): - if not geom.IsSame( self.geom ) and not geom.GetStudyEntry(): - ## set the study - studyID = self.smeshpyD.GetCurrentStudy()._get_StudyId() - if studyID != self.geompyD.myStudyId: - self.geompyD.init_geom( self.smeshpyD.GetCurrentStudy()) - ## get a name - if not name and geom.GetShapeType() != geompyDC.GEOM.COMPOUND: - # for all groups SubShapeName() returns "Compound_-1" - name = self.geompyD.SubShapeName(geom, self.geom) - if not name: - name = "%s_%s"%(geom.GetShapeType(), id(geom)%10000) - ## publish - self.geompyD.addToStudyInFather( self.geom, geom, name ) + AssureGeomPublished( self, geom, name ) submesh = self.mesh.GetSubMesh( geom, name ) return submesh @@ -1192,8 +1255,12 @@ class Mesh: def SetShape(self, geom): self.mesh = self.smeshpyD.CreateMesh(geom) + ## Loads mesh from the study after opening the study + def Load(self): + self.mesh.Load() + ## Returns true if the hypotheses are defined well - # @param theSubObject a subshape of a mesh shape + # @param theSubObject a sub-shape of a mesh shape # @return True or False # @ingroup l2_construct def IsReadyToCompute(self, theSubObject): @@ -1201,7 +1268,7 @@ class Mesh: ## Returns errors of hypotheses definition. # The list of errors is empty if everything is OK. - # @param theSubObject a subshape of a mesh shape + # @param theSubObject a sub-shape of a mesh shape # @return a list of errors # @ingroup l2_construct def GetAlgoState(self, theSubObject): @@ -1235,12 +1302,12 @@ class Mesh: ## Creates a segment discretization 1D algorithm. # If the optional \a algo parameter is not set, this algorithm is REGULAR. # \n If the optional \a geom parameter is not set, this algorithm is global. - # Otherwise, this algorithm defines a submesh based on \a geom subshape. + # Otherwise, this algorithm defines a submesh based on \a geom sub-shape. # @param algo the type of the required algorithm. Possible values are: # - smesh.REGULAR, # - smesh.PYTHON for discretization via a python function, # - smesh.COMPOSITE for meshing a set of edges on one face side as a whole. - # @param geom If defined is the subshape to be meshed + # @param geom If defined is the sub-shape to be meshed # @return an instance of Mesh_Segment or Mesh_Segment_Python, or Mesh_CompositeSegment class # @ingroup l3_algos_basic def Segment(self, algo=REGULAR, geom=0): @@ -1260,7 +1327,7 @@ class Mesh: ## Creates 1D algorithm importing segments conatined in groups of other mesh. # If the optional \a geom parameter is not set, this algorithm is global. - # Otherwise, this algorithm defines a submesh based on \a geom subshape. + # Otherwise, this algorithm defines a submesh based on \a geom sub-shape. # @param geom If defined the subshape is to be meshed # @return an instance of Mesh_UseExistingElements class # @ingroup l3_algos_basic @@ -1270,7 +1337,7 @@ class Mesh: ## Creates 2D algorithm importing faces conatined in groups of other mesh. # If the optional \a geom parameter is not set, this algorithm is global. # Otherwise, this algorithm defines a submesh based on \a geom subshape. - # @param geom If defined the subshape is to be meshed + # @param geom If defined the sub-shape is to be meshed # @return an instance of Mesh_UseExistingElements class # @ingroup l3_algos_basic def UseExisting2DElements(self, geom=0): @@ -1280,8 +1347,8 @@ class Mesh: # The added nodes and segments must be bound to edges and vertices by # SetNodeOnVertex(), SetNodeOnEdge() and SetMeshElementOnShape() # If the optional \a geom parameter is not set, this algorithm is global. - # \n Otherwise, this algorithm defines a submesh based on \a geom subshape. - # @param geom the subshape to be manually meshed + # \n Otherwise, this algorithm defines a submesh based on \a geom sub-shape. + # @param geom the sub-shape to be manually meshed # @return StdMeshers_UseExisting_1D algorithm that generates nothing # @ingroup l3_algos_basic def UseExistingSegments(self, geom=0): @@ -1292,8 +1359,8 @@ class Mesh: # The added nodes and faces must be bound to geom faces by SetNodeOnFace() # and SetMeshElementOnShape() # If the optional \a geom parameter is not set, this algorithm is global. - # \n Otherwise, this algorithm defines a submesh based on \a geom subshape. - # @param geom the subshape to be manually meshed + # \n Otherwise, this algorithm defines a submesh based on \a geom sub-shape. + # @param geom the sub-shape to be manually meshed # @return StdMeshers_UseExisting_2D algorithm that generates nothing # @ingroup l3_algos_basic def UseExistingFaces(self, geom=0): @@ -1302,9 +1369,9 @@ class Mesh: ## Creates a triangle 2D algorithm for faces. # If the optional \a geom parameter is not set, this algorithm is global. - # \n Otherwise, this algorithm defines a submesh based on \a geom subshape. + # \n Otherwise, this algorithm defines a submesh based on \a geom sub-shape. # @param algo values are: smesh.MEFISTO || smesh.NETGEN_1D2D || smesh.NETGEN_2D || smesh.BLSURF - # @param geom If defined, the subshape to be meshed (GEOM_Object) + # @param geom If defined, the sub-shape to be meshed (GEOM_Object) # @return an instance of Mesh_Triangle algorithm # @ingroup l3_algos_basic def Triangle(self, algo=MEFISTO, geom=0): @@ -1316,8 +1383,8 @@ class Mesh: ## Creates a quadrangle 2D algorithm for faces. # If the optional \a geom parameter is not set, this algorithm is global. - # \n Otherwise, this algorithm defines a submesh based on \a geom subshape. - # @param geom If defined, the subshape to be meshed (GEOM_Object) + # \n Otherwise, this algorithm defines a submesh based on \a geom sub-shape. + # @param geom If defined, the sub-shape to be meshed (GEOM_Object) # @param algo values are: smesh.QUADRANGLE || smesh.RADIAL_QUAD # @return an instance of Mesh_Quadrangle algorithm # @ingroup l3_algos_basic @@ -1330,9 +1397,9 @@ class Mesh: ## Creates a tetrahedron 3D algorithm for solids. # The parameter \a algo permits to choose the algorithm: NETGEN or GHS3D # If the optional \a geom parameter is not set, this algorithm is global. - # \n Otherwise, this algorithm defines a submesh based on \a geom subshape. + # \n Otherwise, this algorithm defines a submesh based on \a geom sub-shape. # @param algo values are: smesh.NETGEN, smesh.GHS3D, smesh.GHS3DPRL, smesh.FULL_NETGEN - # @param geom If defined, the subshape to be meshed (GEOM_Object) + # @param geom If defined, the sub-shape to be meshed (GEOM_Object) # @return an instance of Mesh_Tetrahedron algorithm # @ingroup l3_algos_basic def Tetrahedron(self, algo=NETGEN, geom=0): @@ -1345,9 +1412,9 @@ class Mesh: ## Creates a hexahedron 3D algorithm for solids. # If the optional \a geom parameter is not set, this algorithm is global. - # \n Otherwise, this algorithm defines a submesh based on \a geom subshape. + # \n Otherwise, this algorithm defines a submesh based on \a geom sub-shape. # @param algo possible values are: smesh.Hexa, smesh.Hexotic - # @param geom If defined, the subshape to be meshed (GEOM_Object) + # @param geom If defined, the sub-shape to be meshed (GEOM_Object) # @return an instance of Mesh_Hexahedron algorithm # @ingroup l3_algos_basic def Hexahedron(self, algo=Hexa, geom=0): @@ -1365,26 +1432,35 @@ class Mesh: ## Creates a projection 1D algorithm for edges. # If the optional \a geom parameter is not set, this algorithm is global. - # Otherwise, this algorithm defines a submesh based on \a geom subshape. - # @param geom If defined, the subshape to be meshed + # Otherwise, this algorithm defines a submesh based on \a geom sub-shape. + # @param geom If defined, the sub-shape to be meshed # @return an instance of Mesh_Projection1D algorithm # @ingroup l3_algos_proj def Projection1D(self, geom=0): return Mesh_Projection1D(self, geom) + ## Creates a projection 1D-2D algorithm for faces. + # If the optional \a geom parameter is not set, this algorithm is global. + # Otherwise, this algorithm defines a submesh based on \a geom sub-shape. + # @param geom If defined, the sub-shape to be meshed + # @return an instance of Mesh_Projection2D algorithm + # @ingroup l3_algos_proj + def Projection1D2D(self, geom=0): + return Mesh_Projection2D(self, geom, "Projection_1D2D") + ## Creates a projection 2D algorithm for faces. # If the optional \a geom parameter is not set, this algorithm is global. - # Otherwise, this algorithm defines a submesh based on \a geom subshape. - # @param geom If defined, the subshape to be meshed + # Otherwise, this algorithm defines a submesh based on \a geom sub-shape. + # @param geom If defined, the sub-shape to be meshed # @return an instance of Mesh_Projection2D algorithm # @ingroup l3_algos_proj def Projection2D(self, geom=0): - return Mesh_Projection2D(self, geom) + return Mesh_Projection2D(self, geom, "Projection_2D") ## Creates a projection 3D algorithm for solids. # If the optional \a geom parameter is not set, this algorithm is global. - # Otherwise, this algorithm defines a submesh based on \a geom subshape. - # @param geom If defined, the subshape to be meshed + # Otherwise, this algorithm defines a submesh based on \a geom sub-shape. + # @param geom If defined, the sub-shape to be meshed # @return an instance of Mesh_Projection3D algorithm # @ingroup l3_algos_proj def Projection3D(self, geom=0): @@ -1392,8 +1468,8 @@ class Mesh: ## Creates a 3D extrusion (Prism 3D) or RadialPrism 3D algorithm for solids. # If the optional \a geom parameter is not set, this algorithm is global. - # Otherwise, this algorithm defines a submesh based on \a geom subshape. - # @param geom If defined, the subshape to be meshed + # Otherwise, this algorithm defines a submesh based on \a geom sub-shape. + # @param geom If defined, the sub-shape to be meshed # @return an instance of Mesh_Prism3D or Mesh_RadialPrism3D algorithm # @ingroup l3_algos_radialp l3_algos_3dextr def Prism(self, geom=0): @@ -1406,6 +1482,21 @@ class Mesh: return Mesh_Prism3D(self, geom) return Mesh_RadialPrism3D(self, geom) + ## Creates a "Body Fitted" 3D algorithm for solids, which generates + # 3D structured Cartesian mesh in the internal part of a solid shape + # and polyhedral volumes near the shape boundary. + # If the optional \a geom parameter is not set, this algorithm is global. + # Otherwise, this algorithm defines a submesh based on \a geom sub-shape. + # The algorithm does not support submeshes. + # Generally usage of this algorithm as a local one is useless since + # it does not discretize 1D and 2D sub-shapes in a usual way acceptable + # for other algorithms. + # @param geom If defined, the sub-shape to be meshed + # @return an instance of Mesh_Cartesian_3D algorithm + # @ingroup l3_algos_basic + def BodyFitted(self, geom=0): + return Mesh_Cartesian_3D(self, geom) + ## Evaluates size of prospective mesh on a shape # @return a list where i-th element is a number of elements of i-th SMESH.EntityType # To know predicted number of e.g. edges, inquire it this way @@ -1580,7 +1671,7 @@ class Mesh: salome.sg.updateObjBrowser(1) ## Computes a tetrahedral mesh using AutomaticLength + MEFISTO + NETGEN - # @param fineness [0,-1] defines mesh fineness + # @param fineness [0.0,1.0] defines mesh fineness # @return True or False # @ingroup l3_algos_basic def AutomaticTetrahedralization(self, fineness=0): @@ -1597,7 +1688,7 @@ class Mesh: return self.Compute() ## Computes an hexahedral mesh using AutomaticLength + Quadrangle + Hexahedron - # @param fineness [0,-1] defines mesh fineness + # @param fineness [0.0, 1.0] defines mesh fineness # @return True or False # @ingroup l3_algos_basic def AutomaticHexahedralization(self, fineness=0): @@ -1636,9 +1727,26 @@ class Mesh: TreatHypoStatus( status, hyp_name, geom_name, isAlgo ) return status + ## Return True if an algorithm of hypothesis is assigned to a given shape + # @param hyp a hypothesis to check + # @param geom a subhape of mesh geometry + # @return True of False + # @ingroup l2_hypotheses + def IsUsedHypothesis(self, hyp, geom): + if not hyp or not geom: + return False + if isinstance( hyp, Mesh_Algorithm ): + hyp = hyp.GetAlgorithm() + pass + hyps = self.GetHypothesisList(geom) + for h in hyps: + if h.GetId() == hyp.GetId(): + return True + return False + ## Unassigns a hypothesis # @param hyp a hypothesis to unassign - # @param geom a subshape of mesh geometry + # @param geom a sub-shape of mesh geometry # @return SMESH.Hypothesis_Status # @ingroup l2_hypotheses def RemoveHypothesis(self, hyp, geom=0): @@ -1652,7 +1760,7 @@ class Mesh: return status ## Gets the list of hypotheses added on a geometry - # @param geom a subshape of mesh geometry + # @param geom a sub-shape of mesh geometry # @return the sequence of SMESH_Hypothesis # @ingroup l2_hypotheses def GetHypothesisList(self, geom): @@ -1667,8 +1775,8 @@ class Mesh: pass pass - ## Deprecated, used only for compatibility! Please, use ExportMED() method instead. - ## Exports the mesh in a file in MED format and chooses the \a version of MED format + ## Deprecated, used only for compatibility! Please, use ExportToMEDX() method instead. + # Exports the mesh in a file in MED format and chooses the \a version of MED format ## allowing to overwrite the file if it exists or add the exported data to its contents # @param f the file name # @param version values are SMESH.MED_V2_1, SMESH.MED_V2_2 @@ -1697,6 +1805,15 @@ class Mesh: else: self.mesh.ExportToMEDX(f, auto_groups, version, overwrite) + ## Exports the mesh in a file in SAUV format + # @param f is the file name + # @param 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. + # @ingroup l2_impexp + def ExportSAUV(self, f, auto_groups=0): + self.mesh.ExportSAUV(f, auto_groups) + ## Exports the mesh in a file in DAT format # @param f the file name # @param meshPart a part of mesh (group, sub-mesh) to export instead of the mesh @@ -1734,6 +1851,19 @@ class Mesh: else: self.mesh.ExportSTL(f, ascii) + ## Exports the mesh in a file in CGNS format + # @param f is the file name + # @param overwrite boolean parameter for overwriting/not overwriting the file + # @param meshPart a part of mesh (group, sub-mesh) to export instead of the mesh + # @ingroup l2_impexp + def ExportCGNS(self, f, overwrite=1, meshPart=None): + if isinstance( meshPart, list ): + meshPart = self.GetIDSource( meshPart, SMESH.ALL ) + if isinstance( meshPart, Mesh ): + meshPart = meshPart.mesh + elif not meshPart: + meshPart = self.mesh + self.mesh.ExportCGNS(meshPart, f, overwrite) # Operations with groups: # ---------------------- @@ -1767,58 +1897,33 @@ class Mesh: # @return SMESH_GroupOnGeom # @ingroup l2_grps_create def GroupOnGeom(self, grp, name="", typ=None): + AssureGeomPublished( self, grp, name ) if name == "": name = grp.GetName() - - if typ == None: - tgeo = str(grp.GetShapeType()) - if tgeo == "VERTEX": - typ = NODE - elif tgeo == "EDGE": - typ = EDGE - elif tgeo == "FACE": - typ = FACE - elif tgeo == "SOLID": - typ = VOLUME - elif tgeo == "SHELL": - typ = VOLUME - elif tgeo == "COMPOUND": - try: # it raises on a compound of compounds - if len( self.geompyD.GetObjectIDs( grp )) == 0: - print "Mesh.Group: empty geometric group", GetName( grp ) - return 0 - pass - except: - pass - if grp.GetType() == 37: # GEOMImpl_Types.hxx: #define GEOM_GROUP 37 - # group - tgeo = self.geompyD.GetType(grp) - if tgeo == geompyDC.ShapeType["VERTEX"]: - typ = NODE - elif tgeo == geompyDC.ShapeType["EDGE"]: - typ = EDGE - elif tgeo == geompyDC.ShapeType["FACE"]: - typ = FACE - elif tgeo == geompyDC.ShapeType["SOLID"]: - typ = VOLUME - pass - pass - else: - # just a compound - for elemType, shapeType in [[VOLUME,"SOLID"],[FACE,"FACE"], - [EDGE,"EDGE"],[NODE,"VERTEX"]]: - if self.geompyD.SubShapeAll(grp,geompyDC.ShapeType[shapeType]): - typ = elemType - break - pass - pass - pass - pass - if typ == None: - print "Mesh.Group: bad first argument: expected a group, a vertex, an edge, a face or a solid" - return 0 + if not typ: + typ = self._groupTypeFromShape( grp ) + return self.mesh.CreateGroupFromGEOM(typ, name, grp) + + ## Pivate method to get a type of group on geometry + def _groupTypeFromShape( self, shape ): + tgeo = str(shape.GetShapeType()) + if tgeo == "VERTEX": + typ = NODE + elif tgeo == "EDGE": + typ = EDGE + elif tgeo == "FACE" or tgeo == "SHELL": + typ = FACE + elif tgeo == "SOLID" or tgeo == "COMPSOLID": + typ = VOLUME + elif tgeo == "COMPOUND": + sub = self.geompyD.SubShapeAll( shape, geompyDC.ShapeType["SHAPE"]) + if not sub: + raise ValueError,"_groupTypeFromShape(): empty geometric group or compound '%s'" % GetName(shape) + return self._groupTypeFromShape( sub[0] ) else: - return self.mesh.CreateGroupFromGEOM(typ, name, grp) + raise ValueError, \ + "_groupTypeFromShape(): invalid geometry '%s'" % GetName(shape) + return typ ## Creates a mesh group with given \a name based on the \a filter which ## is a special type of group dynamically updating it's contents during @@ -1847,7 +1952,7 @@ class Mesh: # @param elementType the type of elements in the group # @param CritType the type of criterion( FT_Taper, FT_Area, FT_RangeOfIds, FT_LyingOnGeom etc. ) # @param Compare belongs to {FT_LessThan, FT_MoreThan, FT_EqualTo} - # @param Treshold the threshold value (range of id ids as string, shape, numeric) + # @param Threshold the threshold value (range of id ids as string, shape, numeric) # @param UnaryOp FT_LogicalNOT or FT_Undefined # @param Tolerance the tolerance used by FT_BelongToGeom, FT_BelongToSurface, # FT_LyingOnGeom, FT_CoplanarFaces criteria @@ -1858,10 +1963,10 @@ class Mesh: elementType, CritType=FT_Undefined, Compare=FT_EqualTo, - Treshold="", + Threshold="", UnaryOp=FT_Undefined, Tolerance=1e-07): - aCriterion = self.smeshpyD.GetCriterion(elementType, CritType, Compare, Treshold, UnaryOp, FT_Undefined,Tolerance) + aCriterion = self.smeshpyD.GetCriterion(elementType, CritType, Compare, Threshold, UnaryOp, FT_Undefined,Tolerance) group = self.MakeGroupByCriterion(groupName, aCriterion) return group @@ -2175,6 +2280,12 @@ class Mesh: def NbQuadranglesOfOrder(self, elementOrder): return self.mesh.NbQuadranglesOfOrder(elementOrder) + ## Returns the number of biquadratic quadrangles in the mesh + # @return an integer value + # @ingroup l1_meshinfo + def NbBiQuadQuadrangles(self): + return self.mesh.NbBiQuadQuadrangles() + ## Returns the number of polygons in the mesh # @return an integer value # @ingroup l1_meshinfo @@ -2223,6 +2334,12 @@ class Mesh: def NbHexasOfOrder(self, elementOrder): return self.mesh.NbHexasOfOrder(elementOrder) + ## Returns the number of triquadratic hexahedrons in the mesh + # @return an integer value + # @ingroup l1_meshinfo + def NbTriQuadraticHexas(self): + return self.mesh.NbTriQuadraticHexas() + ## Returns the number of pyramids in the mesh # @return an integer value # @ingroup l1_meshinfo @@ -2251,6 +2368,12 @@ class Mesh: def NbPrismsOfOrder(self, elementOrder): return self.mesh.NbPrismsOfOrder(elementOrder) + ## Returns the number of hexagonal prisms in the mesh + # @return an integer value + # @ingroup l1_meshinfo + def NbHexagonalPrisms(self): + return self.mesh.NbHexagonalPrisms() + ## Returns the number of polyhedrons in the mesh # @return an integer value # @ingroup l1_meshinfo @@ -2298,8 +2421,8 @@ class Mesh: return self.mesh.GetElementGeomType(id) ## Returns the list of submesh elements IDs - # @param Shape a geom object(subshape) IOR - # Shape must be the subshape of a ShapeToMesh() + # @param Shape a geom object(sub-shape) IOR + # Shape must be the sub-shape of a ShapeToMesh() # @return the list of integer values # @ingroup l1_meshinfo def GetSubMeshElementsId(self, Shape): @@ -2310,8 +2433,8 @@ class Mesh: return self.mesh.GetSubMeshElementsId(ShapeID) ## Returns the list of submesh nodes IDs - # @param Shape a geom object(subshape) IOR - # Shape must be the subshape of a ShapeToMesh() + # @param Shape a geom object(sub-shape) IOR + # Shape must be the sub-shape of a ShapeToMesh() # @param all If true, gives all nodes of submesh elements, otherwise gives only submesh nodes # @return the list of integer values # @ingroup l1_meshinfo @@ -2323,8 +2446,8 @@ class Mesh: return self.mesh.GetSubMeshNodesId(ShapeID, all) ## Returns type of elements on given shape - # @param Shape a geom object(subshape) IOR - # Shape must be a subshape of a ShapeToMesh() + # @param Shape a geom object(sub-shape) IOR + # Shape must be a sub-shape of a ShapeToMesh() # @return element type # @ingroup l1_meshinfo def GetSubMeshElementType(self, Shape): @@ -2503,7 +2626,7 @@ class Mesh: return result ## Get measure structure specifying bounding box data of the specified object(s) - # @param objects single source object or list of source objects or list of nodes/elements IDs + # @param IDs single source object or list of source objects or list of nodes/elements IDs # @param isElem if @a objects is a list of IDs, @c True value in this parameters specifies that @a objects are elements, # @c False specifies that @a objects are nodes # @return Measure structure @@ -3371,9 +3494,10 @@ class Mesh: # @param StepVector vector or DirStruct, 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 with given ids are nodes # @return the list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise # @ingroup l2_modif_extrurev - def ExtrusionSweep(self, IDsOfElements, StepVector, NbOfSteps, MakeGroups=False): + def ExtrusionSweep(self, IDsOfElements, StepVector, NbOfSteps, MakeGroups=False, IsNodes = False): if IDsOfElements == []: IDsOfElements = self.GetElementsId() if ( isinstance( StepVector, geompyDC.GEOM._objref_GEOM_Object)): @@ -3383,8 +3507,14 @@ class Mesh: Parameters = StepVectorParameters + var_separator + Parameters self.mesh.SetParameters(Parameters) if MakeGroups: - return self.editor.ExtrusionSweepMakeGroups(IDsOfElements, StepVector, NbOfSteps) - self.editor.ExtrusionSweep(IDsOfElements, StepVector, NbOfSteps) + if(IsNodes): + return self.editor.ExtrusionSweepMakeGroups0D(IDsOfElements, StepVector, NbOfSteps) + else: + return self.editor.ExtrusionSweepMakeGroups(IDsOfElements, StepVector, NbOfSteps) + if(IsNodes): + self.editor.ExtrusionSweep0D(IDsOfElements, StepVector, NbOfSteps) + else: + self.editor.ExtrusionSweep(IDsOfElements, StepVector, NbOfSteps) return [] ## Generates new elements by extrusion of the elements with given ids @@ -3414,9 +3544,10 @@ class Mesh: # @param StepVector vector, 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 which belong to the object 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): + def ExtrusionSweepObject(self, theObject, StepVector, NbOfSteps, MakeGroups=False, IsNodes=False): if ( isinstance( theObject, Mesh )): theObject = theObject.GetMesh() if ( isinstance( StepVector, geompyDC.GEOM._objref_GEOM_Object)): @@ -3426,8 +3557,14 @@ class Mesh: Parameters = StepVectorParameters + var_separator + Parameters self.mesh.SetParameters(Parameters) if MakeGroups: - return self.editor.ExtrusionSweepObjectMakeGroups(theObject, StepVector, NbOfSteps) - self.editor.ExtrusionSweepObject(theObject, StepVector, NbOfSteps) + if(IsNodes): + return self.editor.ExtrusionSweepObject0DMakeGroups(theObject, StepVector, NbOfSteps) + else: + return self.editor.ExtrusionSweepObjectMakeGroups(theObject, StepVector, NbOfSteps) + if(IsNodes): + self.editor.ExtrusionSweepObject0D(theObject, StepVector, NbOfSteps) + else: + self.editor.ExtrusionSweepObject(theObject, StepVector, NbOfSteps) return [] ## Generates new elements by extrusion of the elements which belong to the object @@ -4149,6 +4286,7 @@ class Mesh: # This method provided for convenience works as DoubleNodes() described above. # @param theNodes list of groups of nodes to be doubled # @param theModifiedElems list of groups of elements to be updated. + # @param theMakeGroup forces the generation of a group containing new nodes. # @return TRUE if operation has been completed successfully, FALSE otherwise # @ingroup l2_modif_edit def DoubleNodeGroups(self, theNodes, theModifiedElems, theMakeGroup=False): @@ -4479,7 +4617,7 @@ class Mesh_Algorithm: self.geom = mesh.geom else: self.geom = geom - self.AssureGeomPublished( geom ) + AssureGeomPublished( mesh, geom ) try: name = GetName(geom) pass @@ -4491,25 +4629,6 @@ class Mesh_Algorithm: TreatHypoStatus( status, algo.GetName(), name, True ) return - ## Private method. Add geom into the study if not yet there - def AssureGeomPublished(self, geom, name=''): - if not isinstance( geom, geompyDC.GEOM._objref_GEOM_Object ): - return - if not geom.IsSame( self.mesh.geom ) and not geom.GetStudyEntry(): - ## set the study - studyID = self.mesh.smeshpyD.GetCurrentStudy()._get_StudyId() - if studyID != self.mesh.geompyD.myStudyId: - self.mesh.geompyD.init_geom( self.mesh.smeshpyD.GetCurrentStudy()) - ## get a name - if not name and geom.GetShapeType() != geompyDC.GEOM.COMPOUND: - # for all groups SubShapeName() returns "Compound_-1" - name = self.mesh.geompyD.SubShapeName(geom, self.mesh.geom) - if not name: - name = "%s_%s"%(geom.GetShapeType(), id(geom)%10000) - ## publish - self.mesh.geompyD.addToStudyInFather( self.mesh.geom, geom, name ) - return - def CompareHyp (self, hyp, args): print "CompareHyp is not implemented for ", self.__class__.__name__, ":", hyp.GetName() return False @@ -4529,13 +4648,19 @@ class Mesh_Algorithm: hypo = self.mesh.smeshpyD.CreateHypothesis(hyp, so) a = "" s = "=" - i = 0 - n = len(args) - while i 10: + argStr = argStr[:7]+"..." + if argStr[0] == '[': argStr += ']' + a = a + s + argStr s = "," - i = i + 1 pass + if len(a) > 50: + a = a[:47]+"..." self.mesh.smeshpyD.SetName(hypo, hyp + a) pass geomName="" @@ -4580,6 +4705,42 @@ class Mesh_Algorithm: hyp.SetIgnoreFaces(ignoreFaces) return hyp + ## Transform a list of ether edges or tuples (edge 1st_vertex_of_edge) + # into a list acceptable to SetReversedEdges() of some 1D hypotheses + # @ingroup l3_hypos_1dhyps + def ReversedEdgeIndices(self, reverseList): + resList = [] + geompy = self.mesh.geompyD + for i in reverseList: + if isinstance( i, int ): + s = geompy.SubShapes(self.mesh.geom, [i])[0] + if s.GetShapeType() != geompyDC.GEOM.EDGE: + raise TypeError, "Not EDGE index given" + resList.append( i ) + elif isinstance( i, geompyDC.GEOM._objref_GEOM_Object ): + if i.GetShapeType() != geompyDC.GEOM.EDGE: + raise TypeError, "Not an EDGE given" + resList.append( geompy.GetSubShapeID(self.mesh.geom, i )) + elif len( i ) > 1: + e = i[0] + v = i[1] + if not isinstance( e, geompyDC.GEOM._objref_GEOM_Object ) or \ + not isinstance( v, geompyDC.GEOM._objref_GEOM_Object ): + raise TypeError, "A list item must be a tuple (edge 1st_vertex_of_edge)" + if v.GetShapeType() == geompyDC.GEOM.EDGE and \ + e.GetShapeType() == geompyDC.GEOM.VERTEX: + v,e = e,v + if e.GetShapeType() != geompyDC.GEOM.EDGE or \ + v.GetShapeType() != geompyDC.GEOM.VERTEX: + raise TypeError, "A list item must be a tuple (edge 1st_vertex_of_edge)" + vFirst = FirstVertexOnCurve( e ) + tol = geompy.Tolerance( vFirst )[-1] + if geompy.MinDistance( v, vFirst ) > 1.5*tol: + resList.append( geompy.GetSubShapeID(self.mesh.geom, e )) + else: + raise TypeError, "Item must be either an edge or tuple (edge 1st_vertex_of_edge)" + return resList + # Public class: Mesh_Segment # -------------------------- @@ -4652,7 +4813,8 @@ class Mesh_Segment(Mesh_Algorithm): ## Defines "NumberOfSegments" hypothesis to cut an edge in a fixed number of segments # @param n for the number of segments that cut an edge # @param s for the scale factor (optional) - # @param reversedEdges is a list of edges to mesh using reversed orientation + # @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) - create a new one # @return an instance of StdMeshers_NumberOfSegments hypothesis @@ -4661,20 +4823,19 @@ class Mesh_Segment(Mesh_Algorithm): if not isinstance(reversedEdges,list): #old version script, before adding reversedEdges reversedEdges, UseExisting = [], reversedEdges entry = self.MainShapeEntry() - if reversedEdges and isinstance(reversedEdges[0],geompyDC.GEOM._objref_GEOM_Object): - reversedEdges = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, e) for e in reversedEdges ] + reversedEdgeInd = self.ReversedEdgeIndices(reversedEdges) if s == []: - hyp = self.Hypothesis("NumberOfSegments", [n, reversedEdges, entry], + hyp = self.Hypothesis("NumberOfSegments", [n, reversedEdgeInd, entry], UseExisting=UseExisting, CompareMethod=self.CompareNumberOfSegments) else: - hyp = self.Hypothesis("NumberOfSegments", [n,s, reversedEdges, entry], + hyp = self.Hypothesis("NumberOfSegments", [n,s, reversedEdgeInd, entry], UseExisting=UseExisting, CompareMethod=self.CompareNumberOfSegments) hyp.SetDistrType( 1 ) hyp.SetScaleFactor(s) hyp.SetNumberOfSegments(n) - hyp.SetReversedEdges( reversedEdges ) + hyp.SetReversedEdges( reversedEdgeInd ) hyp.SetObjectEntry( entry ) return hyp @@ -4697,7 +4858,8 @@ class Mesh_Segment(Mesh_Algorithm): ## Defines "Arithmetic1D" hypothesis to cut an edge in several segments with increasing arithmetic length # @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 + # @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_Arithmetic1D hypothesis @@ -4705,15 +4867,14 @@ class Mesh_Segment(Mesh_Algorithm): def Arithmetic1D(self, start, end, reversedEdges=[], UseExisting=0): if not isinstance(reversedEdges,list): #old version script, before adding reversedEdges reversedEdges, UseExisting = [], reversedEdges - if reversedEdges and isinstance(reversedEdges[0],geompyDC.GEOM._objref_GEOM_Object): - reversedEdges = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, e) for e in reversedEdges ] + reversedEdgeInd = self.ReversedEdgeIndices(reversedEdges) entry = self.MainShapeEntry() - hyp = self.Hypothesis("Arithmetic1D", [start, end, reversedEdges, entry], + hyp = self.Hypothesis("Arithmetic1D", [start, end, reversedEdgeInd, entry], UseExisting=UseExisting, CompareMethod=self.CompareArithmetic1D) hyp.SetStartLength(start) hyp.SetEndLength(end) - hyp.SetReversedEdges( reversedEdges ) + hyp.SetReversedEdges( reversedEdgeInd ) hyp.SetObjectEntry( entry ) return hyp @@ -4735,7 +4896,8 @@ class Mesh_Segment(Mesh_Algorithm): # values are equals 1 # @param points defines the list of parameters on curve # @param nbSegs defines the list of numbers of segments - # @param reversedEdges is a list of edges to mesh using reversed orientation + # @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_Arithmetic1D hypothesis @@ -4743,15 +4905,14 @@ class Mesh_Segment(Mesh_Algorithm): def FixedPoints1D(self, points, nbSegs=[1], reversedEdges=[], UseExisting=0): if not isinstance(reversedEdges,list): #old version script, before adding reversedEdges reversedEdges, UseExisting = [], reversedEdges - if reversedEdges and isinstance(reversedEdges[0],geompyDC.GEOM._objref_GEOM_Object): - reversedEdges = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, e) for e in reversedEdges ] + reversedEdgeInd = self.ReversedEdgeIndices(reversedEdges) entry = self.MainShapeEntry() - hyp = self.Hypothesis("FixedPoints1D", [points, nbSegs, reversedEdges, entry], + hyp = self.Hypothesis("FixedPoints1D", [points, nbSegs, reversedEdgeInd, entry], UseExisting=UseExisting, CompareMethod=self.CompareFixedPoints1D) hyp.SetPoints(points) hyp.SetNbSegments(nbSegs) - hyp.SetReversedEdges(reversedEdges) + hyp.SetReversedEdges(reversedEdgeInd) hyp.SetObjectEntry(entry) return hyp @@ -4771,7 +4932,8 @@ class Mesh_Segment(Mesh_Algorithm): ## Defines "StartEndLength" hypothesis to cut an edge in several segments with increasing geometric length # @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 + # @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_StartEndLength hypothesis @@ -4779,15 +4941,14 @@ class Mesh_Segment(Mesh_Algorithm): def StartEndLength(self, start, end, reversedEdges=[], UseExisting=0): if not isinstance(reversedEdges,list): #old version script, before adding reversedEdges reversedEdges, UseExisting = [], reversedEdges - if reversedEdges and isinstance(reversedEdges[0],geompyDC.GEOM._objref_GEOM_Object): - reversedEdges = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, e) for e in reversedEdges ] + reversedEdgeInd = self.ReversedEdgeIndices(reversedEdges) entry = self.MainShapeEntry() - hyp = self.Hypothesis("StartEndLength", [start, end, reversedEdges, entry], + hyp = self.Hypothesis("StartEndLength", [start, end, reversedEdgeInd, entry], UseExisting=UseExisting, CompareMethod=self.CompareStartEndLength) hyp.SetStartLength(start) hyp.SetEndLength(end) - hyp.SetReversedEdges( reversedEdges ) + hyp.SetReversedEdges( reversedEdgeInd ) hyp.SetObjectEntry( entry ) return hyp @@ -4859,7 +5020,7 @@ class Mesh_Segment(Mesh_Algorithm): ### 0D algorithm if self.geom is None: raise RuntimeError, "Attemp to create SegmentAroundVertex_0D algoritm on None shape" - self.AssureGeomPublished( self.geom ) + AssureGeomPublished( self.mesh, self.geom ) name = GetName(self.geom) algo = self.FindAlgorithm("SegmentAroundVertex_0D", self.mesh.smeshpyD) @@ -4957,7 +5118,6 @@ class Mesh_Triangle(Mesh_Algorithm): def __init__(self, mesh, algoType, geom=0): Mesh_Algorithm.__init__(self) - self.algoType = algoType if algoType == MEFISTO: self.Create(mesh, geom, "MEFISTO_2D") pass @@ -4974,6 +5134,8 @@ class Mesh_Triangle(Mesh_Algorithm): self.Create(mesh, geom, "NETGEN_2D_ONLY", "libNETGENEngine.so") pass + self.algoType = algoType + ## Defines "MaxElementArea" hypothesis basing on the definition of the maximum area of each triangle # @param area for the maximum area of each triangle # @param UseExisting if ==true - searches for an existing hypothesis created with the @@ -5009,98 +5171,276 @@ class Mesh_Triangle(Mesh_Algorithm): return hyp ## Sets a way to define size of mesh elements to generate. - # @param thePhysicalMesh is: DefaultSize or Custom. + # @param thePhysicalMesh is: DefaultSize, BLSURF_Custom or SizeMap. # @ingroup l3_hypos_blsurf def SetPhysicalMesh(self, thePhysicalMesh=DefaultSize): - # Parameter of BLSURF algo - self.Parameters().SetPhysicalMesh(thePhysicalMesh) + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetPhysicalMesh(thePhysicalMesh) ## Sets size of mesh elements to generate. # @ingroup l3_hypos_blsurf def SetPhySize(self, theVal): - # Parameter of BLSURF algo - self.SetPhysicalMesh(1) #Custom - else why to set the size? - self.Parameters().SetPhySize(theVal) + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetPhySize(theVal) ## Sets lower boundary of mesh element size (PhySize). # @ingroup l3_hypos_blsurf def SetPhyMin(self, theVal=-1): - # Parameter of BLSURF algo - self.Parameters().SetPhyMin(theVal) + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetPhyMin(theVal) ## Sets upper boundary of mesh element size (PhySize). # @ingroup l3_hypos_blsurf def SetPhyMax(self, theVal=-1): - # Parameter of BLSURF algo - self.Parameters().SetPhyMax(theVal) + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetPhyMax(theVal) ## Sets a way to define maximum angular deflection of mesh from CAD model. # @param theGeometricMesh is: 0 (None) or 1 (Custom) # @ingroup l3_hypos_blsurf def SetGeometricMesh(self, theGeometricMesh=0): - # Parameter of BLSURF algo - if self.Parameters().GetPhysicalMesh() == 0: theGeometricMesh = 1 - self.params.SetGeometricMesh(theGeometricMesh) + if self.Parameters(): + # Parameter of BLSURF algo + if self.params.GetPhysicalMesh() == 0: theGeometricMesh = 1 + self.params.SetGeometricMesh(theGeometricMesh) ## Sets angular deflection (in degrees) of a mesh face from CAD surface. # @ingroup l3_hypos_blsurf def SetAngleMeshS(self, theVal=_angleMeshS): - # Parameter of BLSURF algo - if self.Parameters().GetGeometricMesh() == 0: theVal = self._angleMeshS - self.params.SetAngleMeshS(theVal) + if self.Parameters(): + # Parameter of BLSURF algo + if self.params.GetGeometricMesh() == 0: theVal = self._angleMeshS + self.params.SetAngleMeshS(theVal) ## Sets angular deflection (in degrees) of a mesh edge from CAD curve. # @ingroup l3_hypos_blsurf def SetAngleMeshC(self, theVal=_angleMeshS): - # Parameter of BLSURF algo - if self.Parameters().GetGeometricMesh() == 0: theVal = self._angleMeshS - self.params.SetAngleMeshC(theVal) + if self.Parameters(): + # Parameter of BLSURF algo + if self.params.GetGeometricMesh() == 0: theVal = self._angleMeshS + self.params.SetAngleMeshC(theVal) ## Sets lower boundary of mesh element size computed to respect angular deflection. # @ingroup l3_hypos_blsurf def SetGeoMin(self, theVal=-1): - # Parameter of BLSURF algo - self.Parameters().SetGeoMin(theVal) + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetGeoMin(theVal) ## Sets upper boundary of mesh element size computed to respect angular deflection. # @ingroup l3_hypos_blsurf def SetGeoMax(self, theVal=-1): - # Parameter of BLSURF algo - self.Parameters().SetGeoMax(theVal) + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetGeoMax(theVal) ## Sets maximal allowed ratio between the lengths of two adjacent edges. # @ingroup l3_hypos_blsurf def SetGradation(self, theVal=_gradation): - # Parameter of BLSURF algo - if self.Parameters().GetGeometricMesh() == 0: theVal = self._gradation - self.params.SetGradation(theVal) + if self.Parameters(): + # Parameter of BLSURF algo + if self.params.GetGeometricMesh() == 0: theVal = self._gradation + self.params.SetGradation(theVal) ## Sets topology usage way. # @param way defines how mesh conformity is assured
    #
  • FromCAD - mesh conformity is assured by conformity of a shape
  • - #
  • PreProcess or PreProcessPlus - by pre-processing a CAD model
+ #
  • PreProcess or PreProcessPlus - by pre-processing a CAD model
  • + #
  • PreCAD - by pre-processing with PreCAD a CAD model
  • # @ingroup l3_hypos_blsurf def SetTopology(self, way): - # Parameter of BLSURF algo - self.Parameters().SetTopology(way) + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetTopology(way) ## To respect geometrical edges or not. # @ingroup l3_hypos_blsurf def SetDecimesh(self, toIgnoreEdges=False): - # Parameter of BLSURF algo - self.Parameters().SetDecimesh(toIgnoreEdges) + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetDecimesh(toIgnoreEdges) ## Sets verbosity level in the range 0 to 100. # @ingroup l3_hypos_blsurf def SetVerbosity(self, level): - # Parameter of BLSURF algo - self.Parameters().SetVerbosity(level) + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetVerbosity(level) + + ## To optimize merges edges. + # @ingroup l3_hypos_blsurf + def SetPreCADMergeEdges(self, toMergeEdges=False): + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetPreCADMergeEdges(toMergeEdges) + + ## To remove nano edges. + # @ingroup l3_hypos_blsurf + def SetPreCADRemoveNanoEdges(self, toRemoveNanoEdges=False): + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetPreCADRemoveNanoEdges(toRemoveNanoEdges) + + ## To compute topology from scratch + # @ingroup l3_hypos_blsurf + def SetPreCADDiscardInput(self, toDiscardInput=False): + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetPreCADDiscardInput(toDiscardInput) + + ## Sets the length below which an edge is considered as nano + # for the topology processing. + # @ingroup l3_hypos_blsurf + def SetPreCADEpsNano(self, epsNano): + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetPreCADEpsNano(epsNano) ## Sets advanced option value. # @ingroup l3_hypos_blsurf def SetOptionValue(self, optionName, level): - # Parameter of BLSURF algo - self.Parameters().SetOptionValue(optionName,level) + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetOptionValue(optionName,level) + + ## Sets advanced PreCAD option value. + # Keyword arguments: + # optionName: name of the option + # optionValue: value of the option + # @ingroup l3_hypos_blsurf + def SetPreCADOptionValue(self, optionName, optionValue): + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetPreCADOptionValue(optionName,optionValue) + + ## Sets GMF file for export at computation + # @ingroup l3_hypos_blsurf + def SetGMFFile(self, fileName): + if self.Parameters(): + # Parameter of BLSURF algo + self.params.SetGMFFile(fileName) + + ## Enforced vertices (BLSURF) + + ## To get all the enforced vertices + # @ingroup l3_hypos_blsurf + def GetAllEnforcedVertices(self): + if self.Parameters(): + # Parameter of BLSURF algo + return self.params.GetAllEnforcedVertices() + + ## To get all the enforced vertices sorted by face (or group, compound) + # @ingroup l3_hypos_blsurf + def GetAllEnforcedVerticesByFace(self): + if self.Parameters(): + # Parameter of BLSURF algo + return self.params.GetAllEnforcedVerticesByFace() + + ## To get all the enforced vertices sorted by coords of input vertices + # @ingroup l3_hypos_blsurf + def GetAllEnforcedVerticesByCoords(self): + if self.Parameters(): + # Parameter of BLSURF algo + return self.params.GetAllEnforcedVerticesByCoords() + + ## To get all the coords of input vertices sorted by face (or group, compound) + # @ingroup l3_hypos_blsurf + def GetAllCoordsByFace(self): + if self.Parameters(): + # Parameter of BLSURF algo + return self.params.GetAllCoordsByFace() + + ## To get all the enforced vertices on a face (or group, compound) + # @param theFace : GEOM face (or group, compound) on which to define an enforced vertex + # @ingroup l3_hypos_blsurf + def GetEnforcedVertices(self, theFace): + if self.Parameters(): + # Parameter of BLSURF algo + AssureGeomPublished( self.mesh, theFace ) + return self.params.GetEnforcedVertices(theFace) + + ## To clear all the enforced vertices + # @ingroup l3_hypos_blsurf + def ClearAllEnforcedVertices(self): + if self.Parameters(): + # Parameter of BLSURF algo + return self.params.ClearAllEnforcedVertices() + + ## To set an enforced vertex on a face (or group, compound) given the coordinates of a point. If the point is not on the face, it will projected on it. If there is no projection, no enforced vertex is created. + # @param theFace : GEOM face (or group, compound) on which to define an enforced vertex + # @param x : x coordinate + # @param y : y coordinate + # @param z : z coordinate + # @param vertexName : name of the enforced vertex + # @param groupName : name of the group + # @ingroup l3_hypos_blsurf + def SetEnforcedVertex(self, theFace, x, y, z, vertexName = "", groupName = ""): + if self.Parameters(): + # Parameter of BLSURF algo + AssureGeomPublished( self.mesh, theFace ) + if vertexName == "": + if groupName == "": + return self.params.SetEnforcedVertex(theFace, x, y, z) + else: + return self.params.SetEnforcedVertexWithGroup(theFace, x, y, z, groupName) + else: + if groupName == "": + return self.params.SetEnforcedVertexNamed(theFace, x, y, z, vertexName) + else: + return self.params.SetEnforcedVertexNamedWithGroup(theFace, x, y, z, vertexName, groupName) + + ## To set an enforced vertex on a face (or group, compound) given a GEOM vertex, group or compound. + # @param theFace : GEOM face (or group, compound) on which to define an enforced vertex + # @param theVertex : GEOM vertex (or group, compound) to be projected on theFace. + # @param groupName : name of the group + # @ingroup l3_hypos_blsurf + def SetEnforcedVertexGeom(self, theFace, theVertex, groupName = ""): + if self.Parameters(): + # Parameter of BLSURF algo + AssureGeomPublished( self.mesh, theFace ) + AssureGeomPublished( self.mesh, theVertex ) + if groupName == "": + return self.params.SetEnforcedVertexGeom(theFace, theVertex) + else: + return self.params.SetEnforcedVertexGeomWithGroup(theFace, theVertex,groupName) + + ## To remove an enforced vertex on a given GEOM face (or group, compound) given the coordinates. + # @param theFace : GEOM face (or group, compound) on which to remove the enforced vertex + # @param x : x coordinate + # @param y : y coordinate + # @param z : z coordinate + # @ingroup l3_hypos_blsurf + def UnsetEnforcedVertex(self, theFace, x, y, z): + if self.Parameters(): + # Parameter of BLSURF algo + AssureGeomPublished( self.mesh, theFace ) + return self.params.UnsetEnforcedVertex(theFace, x, y, z) + + ## To remove an enforced vertex on a given GEOM face (or group, compound) given a GEOM vertex, group or compound. + # @param theFace : GEOM face (or group, compound) on which to remove the enforced vertex + # @param theVertex : GEOM vertex (or group, compound) to remove. + # @ingroup l3_hypos_blsurf + def UnsetEnforcedVertexGeom(self, theFace, theVertex): + if self.Parameters(): + # Parameter of BLSURF algo + AssureGeomPublished( self.mesh, theFace ) + AssureGeomPublished( self.mesh, theVertex ) + return self.params.UnsetEnforcedVertexGeom(theFace, theVertex) + + ## To remove all enforced vertices on a given face. + # @param theFace : face (or group/compound of faces) on which to remove all enforced vertices + # @ingroup l3_hypos_blsurf + def UnsetEnforcedVertices(self, theFace): + if self.Parameters(): + # Parameter of BLSURF algo + AssureGeomPublished( self.mesh, theFace ) + return self.params.UnsetEnforcedVertices(theFace) + + ## Attractors (BLSURF) ## Sets an attractor on the chosen face. The mesh size will decrease exponentially with the distance from theAttractor, following the rule h(d) = theEndSize - (theEndSize - theStartSize) * exp [ - ( d / theInfluenceDistance ) ^ 2 ] # @param theFace : face on which the attractor will be defined @@ -5111,18 +5451,52 @@ class Mesh_Triangle(Mesh_Algorithm): # @param theConstantSizeDistance : distance until which the mesh size will be kept constant on theFace # @ingroup l3_hypos_blsurf def SetAttractorGeom(self, theFace, theAttractor, theStartSize, theEndSize, theInfluenceDistance, theConstantSizeDistance): - self.AssureGeomPublished( theFace ) - self.AssureGeomPublished( theAttractor ) - # Parameter of BLSURF algo - self.Parameters().SetAttractorGeom(theFace, theAttractor, theStartSize, theEndSize, theInfluenceDistance, theConstantSizeDistance) - + if self.Parameters(): + # Parameter of BLSURF algo + AssureGeomPublished( self.mesh, theFace ) + AssureGeomPublished( self.mesh, theAttractor ) + self.params.SetAttractorGeom(theFace, theAttractor, theStartSize, theEndSize, theInfluenceDistance, theConstantSizeDistance) + ## Unsets an attractor on the chosen face. # @param theFace : face on which the attractor has to be removed # @ingroup l3_hypos_blsurf def UnsetAttractorGeom(self, theFace): - self.AssureGeomPublished( theFace ) - # Parameter of BLSURF algo - self.Parameters().SetAttractorGeom(theFace) + if self.Parameters(): + # Parameter of BLSURF algo + AssureGeomPublished( self.mesh, theFace ) + self.params.SetAttractorGeom(theFace) + + ## Size maps (BLSURF) + + ## To set a size map on a face, edge or vertex (or group, compound) given Python function. + # If theObject is a face, the function can be: def f(u,v): return u+v + # If theObject is an edge, the function can be: def f(t): return t/2 + # If theObject is a vertex, the function can be: def f(): return 10 + # @param theObject : GEOM face, edge or vertex (or group, compound) on which to define a size map + # @param theSizeMap : Size map defined as a string + # @ingroup l3_hypos_blsurf + def SetSizeMap(self, theObject, theSizeMap): + if self.Parameters(): + # Parameter of BLSURF algo + AssureGeomPublished( self.mesh, theObject ) + return self.params.SetSizeMap(theObject, theSizeMap) + + ## To remove a size map defined on a face, edge or vertex (or group, compound) + # @param theObject : GEOM face, edge or vertex (or group, compound) on which to define a size map + # @ingroup l3_hypos_blsurf + def UnsetSizeMap(self, theObject): + if self.Parameters(): + # Parameter of BLSURF algo + AssureGeomPublished( self.mesh, theObject ) + return self.params.UnsetSizeMap(theObject) + + ## To remove all the size maps + # @ingroup l3_hypos_blsurf + def ClearSizeMaps(self): + if self.Parameters(): + # Parameter of BLSURF algo + return self.params.ClearSizeMaps() + ## Sets QuadAllowed flag. # Only for algoType == NETGEN(NETGEN_1D2D) || NETGEN_2D || BLSURF @@ -5520,7 +5894,8 @@ class Mesh_Tetrahedron(Mesh_Algorithm): # @ingroup l3_hypos_ghs3dh def SetToMeshHoles(self, toMesh): # Parameter of GHS3D - self.Parameters().SetToMeshHoles(toMesh) + if self.Parameters(): + self.params.SetToMeshHoles(toMesh) ## Set Optimization level: # None_Optimization, Light_Optimization, Standard_Optimization, StandardPlus_Optimization, @@ -5529,32 +5904,37 @@ class Mesh_Tetrahedron(Mesh_Algorithm): # @ingroup l3_hypos_ghs3dh def SetOptimizationLevel(self, level): # Parameter of GHS3D - self.Parameters().SetOptimizationLevel(level) + if self.Parameters(): + self.params.SetOptimizationLevel(level) ## Maximal size of memory to be used by the algorithm (in Megabytes). # @ingroup l3_hypos_ghs3dh def SetMaximumMemory(self, MB): # Advanced parameter of GHS3D - self.Parameters().SetMaximumMemory(MB) + if self.Parameters(): + self.params.SetMaximumMemory(MB) ## Initial size of memory to be used by the algorithm (in Megabytes) in # automatic memory adjustment mode. # @ingroup l3_hypos_ghs3dh def SetInitialMemory(self, MB): # Advanced parameter of GHS3D - self.Parameters().SetInitialMemory(MB) + if self.Parameters(): + self.params.SetInitialMemory(MB) ## Path to working directory. # @ingroup l3_hypos_ghs3dh def SetWorkingDirectory(self, path): # Advanced parameter of GHS3D - self.Parameters().SetWorkingDirectory(path) + if self.Parameters(): + self.params.SetWorkingDirectory(path) ## To keep working files or remove them. Log file remains in case of errors anyway. # @ingroup l3_hypos_ghs3dh def SetKeepFiles(self, toKeep): # Advanced parameter of GHS3D and GHS3DPRL - self.Parameters().SetKeepFiles(toKeep) + if self.Parameters(): + self.params.SetKeepFiles(toKeep) ## To set verbose level [0-10].
      #
    • 0 - no standard output, @@ -5567,20 +5947,23 @@ class Mesh_Tetrahedron(Mesh_Algorithm): # @ingroup l3_hypos_ghs3dh def SetVerboseLevel(self, level): # Advanced parameter of GHS3D - self.Parameters().SetVerboseLevel(level) + if self.Parameters(): + self.params.SetVerboseLevel(level) ## To create new nodes. # @ingroup l3_hypos_ghs3dh def SetToCreateNewNodes(self, toCreate): # Advanced parameter of GHS3D - self.Parameters().SetToCreateNewNodes(toCreate) + if self.Parameters(): + self.params.SetToCreateNewNodes(toCreate) ## To use boundary recovery version which tries to create mesh on a very poor # quality surface mesh. # @ingroup l3_hypos_ghs3dh def SetToUseBoundaryRecoveryVersion(self, toUse): # Advanced parameter of GHS3D - self.Parameters().SetToUseBoundaryRecoveryVersion(toUse) + if self.Parameters(): + self.params.SetToUseBoundaryRecoveryVersion(toUse) ## Applies finite-element correction by replacing overconstrained elements where # it is possible. The process is cutting first the overconstrained edges and @@ -5589,97 +5972,112 @@ class Mesh_Tetrahedron(Mesh_Algorithm): # @ingroup l3_hypos_ghs3dh def SetFEMCorrection(self, toUseFem): # Advanced parameter of GHS3D - self.Parameters().SetFEMCorrection(toUseFem) + if self.Parameters(): + self.params.SetFEMCorrection(toUseFem) ## To removes initial central point. # @ingroup l3_hypos_ghs3dh def SetToRemoveCentralPoint(self, toRemove): # Advanced parameter of GHS3D - self.Parameters().SetToRemoveCentralPoint(toRemove) + if self.Parameters(): + self.params.SetToRemoveCentralPoint(toRemove) ## To set an enforced vertex. + # @param x : x coordinate + # @param y : y coordinate + # @param z : z coordinate + # @param size : size of 1D element around enforced vertex + # @param vertexName : name of the enforced vertex + # @param groupName : name of the group # @ingroup l3_hypos_ghs3dh - def SetEnforcedVertex(self, x, y, z, size): + def SetEnforcedVertex(self, x, y, z, size, vertexName = "", groupName = ""): # Advanced parameter of GHS3D - return self.Parameters().SetEnforcedVertex(x, y, z, size) + if self.Parameters(): + if vertexName == "": + if groupName == "": + return self.params.SetEnforcedVertex(x, y, z, size) + else: + return self.params.SetEnforcedVertexWithGroup(x, y, z, size, groupName) + else: + if groupName == "": + return self.params.SetEnforcedVertexNamed(x, y, z, size, vertexName) + else: + return self.params.SetEnforcedVertexNamedWithGroup(x, y, z, size, vertexName, groupName) - ## To set an enforced vertex and add it in the group "groupName". - # Only on meshes w/o geometry + ## To set an enforced vertex given a GEOM vertex, group or compound. + # @param theVertex : GEOM vertex (or group, compound) to be projected on theFace. + # @param size : size of 1D element around enforced vertex + # @param groupName : name of the group # @ingroup l3_hypos_ghs3dh - def SetEnforcedVertexWithGroup(self, x, y, z, size, groupName): + def SetEnforcedVertexGeom(self, theVertex, size, groupName = ""): + AssureGeomPublished( self.mesh, theVertex ) # Advanced parameter of GHS3D - return self.Parameters().SetEnforcedVertex(x, y, z, size,groupName) + if self.Parameters(): + if groupName == "": + return self.params.SetEnforcedVertexGeom(theVertex, size) + else: + return self.params.SetEnforcedVertexGeomWithGroup(theVertex, size, groupName) ## To remove an enforced vertex. + # @param x : x coordinate + # @param y : y coordinate + # @param z : z coordinate # @ingroup l3_hypos_ghs3dh def RemoveEnforcedVertex(self, x, y, z): # Advanced parameter of GHS3D - return self.Parameters().RemoveEnforcedVertex(x, y, z) - - ## To set an enforced vertex given a GEOM vertex, group or compound. - # @ingroup l3_hypos_ghs3dh - def SetEnforcedVertexGeom(self, theVertex, size): - self.AssureGeomPublished( theVertex ) - # Advanced parameter of GHS3D - return self.Parameters().SetEnforcedVertexGeom(theVertex, size) - - ## To set an enforced vertex given a GEOM vertex, group or compound - # and add it in the group "groupName". - # Only on meshes w/o geometry - # @ingroup l3_hypos_ghs3dh - def SetEnforcedVertexGeomWithGroup(self, theVertex, size, groupName): - self.AssureGeomPublished( theVertex ) - # Advanced parameter of GHS3D - return self.Parameters().SetEnforcedVertexGeomWithGroup(theVertex, size,groupName) + if self.Parameters(): + return self.params.RemoveEnforcedVertex(x, y, z) ## To remove an enforced vertex given a GEOM vertex, group or compound. + # @param theVertex : GEOM vertex (or group, compound) to be projected on theFace. # @ingroup l3_hypos_ghs3dh def RemoveEnforcedVertexGeom(self, theVertex): - self.AssureGeomPublished( theVertex ) - # Advanced parameter of GHS3D - return self.Parameters().RemoveEnforcedVertexGeom(theVertex) - - ## To set an enforced mesh. - # @ingroup l3_hypos_ghs3dh - def SetEnforcedMesh(self, theSource, elementType): - # Advanced parameter of GHS3D - return self.Parameters().SetEnforcedMesh(theSource, elementType) - - ## To set an enforced mesh and add the enforced elements in the group "groupName". - # @ingroup l3_hypos_ghs3dh - def SetEnforcedMeshWithGroup(self, theSource, elementType, groupName): - # Advanced parameter of GHS3D - return self.Parameters().SetEnforcedMeshWithGroup(theSource, elementType, groupName) - - ## To set an enforced mesh with given size. - # @ingroup l3_hypos_ghs3dh - def SetEnforcedMeshSize(self, theSource, elementType, size): + AssureGeomPublished( self.mesh, theVertex ) # Advanced parameter of GHS3D - return self.Parameters().SetEnforcedMeshSize(theSource, elementType, size) + if self.Parameters(): + return self.params.RemoveEnforcedVertexGeom(theVertex) ## To set an enforced mesh with given size and add the enforced elements in the group "groupName". + # @param theSource : source mesh which provides constraint elements/nodes + # @param elementType : SMESH.ElementType (NODE, EDGE or FACE) + # @param size : size of elements around enforced elements. Unused if -1. + # @param groupName : group in which enforced elements will be added. Unused if "". # @ingroup l3_hypos_ghs3dh - def SetEnforcedMeshSizeWithGroup(self, theSource, elementType, size, groupName): + def SetEnforcedMesh(self, theSource, elementType, size = -1, groupName = ""): # Advanced parameter of GHS3D - return self.Parameters().SetEnforcedMeshSizeWithGroup(theSource, elementType, size, groupName) + if self.Parameters(): + if size >= 0: + if groupName != "": + return self.params.SetEnforcedMesh(theSource, elementType) + else: + return self.params.SetEnforcedMeshWithGroup(theSource, elementType, groupName) + else: + if groupName != "": + return self.params.SetEnforcedMeshSize(theSource, elementType, size) + else: + return self.params.SetEnforcedMeshSizeWithGroup(theSource, elementType, size, groupName) ## Sets command line option as text. # @ingroup l3_hypos_ghs3dh def SetTextOption(self, option): # Advanced parameter of GHS3D - self.Parameters().SetTextOption(option) + if self.Parameters(): + self.params.SetTextOption(option) ## Sets MED files name and path. def SetMEDName(self, value): - self.Parameters().SetMEDName(value) + if self.Parameters(): + self.params.SetMEDName(value) ## Sets the number of partition of the initial mesh def SetNbPart(self, value): - self.Parameters().SetNbPart(value) + if self.Parameters(): + self.params.SetNbPart(value) ## When big mesh, start tepal in background def SetBackground(self, value): - self.Parameters().SetBackground(value) + if self.Parameters(): + self.params.SetBackground(value) # Public class: Mesh_Hexahedron # ------------------------------ @@ -5781,14 +6179,14 @@ class Mesh_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): - self.AssureGeomPublished( edge ) - self.AssureGeomPublished( srcV ) - self.AssureGeomPublished( tgtV ) + AssureGeomPublished( self.mesh, edge ) + AssureGeomPublished( self.mesh, srcV ) + AssureGeomPublished( self.mesh, tgtV ) hyp = self.Hypothesis("ProjectionSource1D", [edge,mesh,srcV,tgtV], UseExisting=0) #UseExisting=UseExisting, CompareMethod=self.CompareSourceEdge) hyp.SetSourceEdge( edge ) - if not mesh is None and isinstance(mesh, Mesh): + if isinstance(mesh, Mesh): mesh = mesh.GetMesh() hyp.SetSourceMesh( mesh ) hyp.SetVertexAssociation( srcV, tgtV ) @@ -5809,9 +6207,9 @@ class Mesh_Projection1D(Mesh_Algorithm): class Mesh_Projection2D(Mesh_Algorithm): ## Private constructor. - def __init__(self, mesh, geom=0): + def __init__(self, mesh, geom=0, algoName="Projection_2D"): Mesh_Algorithm.__init__(self) - self.Create(mesh, geom, "Projection_2D") + self.Create(mesh, geom, algoName) ## Defines "Source Face" hypothesis, specifying a meshed face, from where # a mesh pattern is taken, and, optionally, the association of vertices @@ -5831,7 +6229,7 @@ class Mesh_Projection2D(Mesh_Algorithm): def SourceFace(self, face, mesh=None, srcV1=None, tgtV1=None, srcV2=None, tgtV2=None, UseExisting=0): for geom in [ face, srcV1, tgtV1, srcV2, tgtV2 ]: - self.AssureGeomPublished( geom ) + AssureGeomPublished( self.mesh, geom ) hyp = self.Hypothesis("ProjectionSource2D", [face,mesh,srcV1,tgtV1,srcV2,tgtV2], UseExisting=0) #UseExisting=UseExisting, CompareMethod=self.CompareSourceFace) @@ -5878,13 +6276,13 @@ class Mesh_Projection3D(Mesh_Algorithm): def SourceShape3D(self, solid, mesh=0, srcV1=0, tgtV1=0, srcV2=0, tgtV2=0, UseExisting=0): for geom in [ solid, srcV1, tgtV1, srcV2, tgtV2 ]: - self.AssureGeomPublished( geom ) + AssureGeomPublished( self.mesh, geom ) hyp = self.Hypothesis("ProjectionSource3D", [solid,mesh,srcV1,tgtV1,srcV2,tgtV2], UseExisting=0) #UseExisting=UseExisting, CompareMethod=self.CompareSourceShape3D) hyp.SetSource3DShape( solid ) - if not mesh is None and isinstance(mesh, Mesh): + if isinstance(mesh, Mesh): mesh = mesh.GetMesh() hyp.SetSourceMesh( mesh ) if srcV1 and srcV2 and tgtV1 and tgtV2: @@ -6137,10 +6535,10 @@ class Mesh_UseExistingElements(Mesh_Algorithm): # @param UseExisting if ==true - searches for the existing hypothesis created with # the same parameters, else (default) - creates a new one def SourceEdges(self, groups, toCopyMesh=False, toCopyGroups=False, UseExisting=False): - if self.algo.GetName() == "Import_2D": + if self.algo.GetName() != "Import_1D": raise ValueError, "algoritm dimension mismatch" for group in groups: - self.AssureGeomPublished( group ) + AssureGeomPublished( self.mesh, group ) hyp = self.Hypothesis("ImportSource1D", [groups, toCopyMesh, toCopyGroups], UseExisting=UseExisting, CompareMethod=self._compareHyp) hyp.SetSourceEdges(groups) @@ -6157,7 +6555,7 @@ class Mesh_UseExistingElements(Mesh_Algorithm): if self.algo.GetName() == "Import_1D": raise ValueError, "algoritm dimension mismatch" for group in groups: - self.AssureGeomPublished( group ) + AssureGeomPublished( self.mesh, group ) hyp = self.Hypothesis("ImportSource2D", [groups, toCopyMesh, toCopyGroups], UseExisting=UseExisting, CompareMethod=self._compareHyp) hyp.SetSourceFaces(groups) @@ -6186,8 +6584,63 @@ class Mesh_UseExistingElements(Mesh_Algorithm): return entries == entries2 return False +# Public class: Mesh_Cartesian_3D +# -------------------------------------- +## Defines a Body Fitting 3D algorithm +# @ingroup l3_algos_basic +# +class Mesh_Cartesian_3D(Mesh_Algorithm): + + def __init__(self, mesh, geom=0): + self.Create(mesh, geom, "Cartesian_3D") + self.hyp = None + return + + ## Defines "Body Fitting parameters" hypothesis + # @param xGridDef is definition of the grid along the X asix. + # It can be in either of two following forms: + # - Explicit coordinates of nodes, e.g. [-1.5, 0.0, 3.1] or range( -100,200,10) + # - Functions f(t) defining grid spacing at each point on grid axis. If there are + # several functions, they must be accompanied by relative coordinates of + # points dividing the whole shape into ranges where the functions apply; points + # coodrinates should vary within (0.0, 1.0) range. Parameter \a t of the spacing + # function f(t) varies from 0.0 to 1.0 witin a shape range. + # 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 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): + if not self.hyp: + self.hyp = self.Hypothesis("CartesianParameters3D", + [xGridDef, yGridDef, zGridDef, sizeThreshold], + UseExisting=UseExisting, CompareMethod=self._compareHyp) + if not self.mesh.IsUsedHypothesis( self.hyp, self.geom ): + self.mesh.AddHypothesis( self.hyp, self.geom ) + + 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 ) + elif isinstance( gridDef[0], str ): + self.hyp.SetGridSpacing( gridDef, [], axis ) + elif isinstance( gridDef[0], int ) or \ + isinstance( gridDef[0], float ): + self.hyp.SetGrid(gridDef, axis ) + else: + self.hyp.SetGridSpacing( gridDef[0], gridDef[1], axis ) + self.hyp.SetSizeThreshold( sizeThreshold ) + return self.hyp + + def _compareHyp(self,hyp,args): + # not implemented yet + return False -# Private class: Mesh_UseExisting +# Public class: Mesh_UseExisting # ------------------------------- class Mesh_UseExisting(Mesh_Algorithm):