X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_SWIG%2FStdMeshersBuilder.py;h=c2f0ed0aa068105683e627cdc64b9ae325fd6e37;hp=4849c746e8d77d56b56b9c905bb197b235a3e6c0;hb=HEAD;hpb=6600bcec782fc8b6c72871fe6e08bd19a34a4e2b diff --git a/src/SMESH_SWIG/StdMeshersBuilder.py b/src/SMESH_SWIG/StdMeshersBuilder.py index 4849c746e..1b76873ed 100644 --- a/src/SMESH_SWIG/StdMeshersBuilder.py +++ b/src/SMESH_SWIG/StdMeshersBuilder.py @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2022 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -25,6 +25,7 @@ LIBRARY = "libStdMeshersEngine.so" from salome.smesh.smesh_algorithm import Mesh_Algorithm import StdMeshers +from salome.geom import geomBuilder #---------------------------- # Mesh algo type identifiers @@ -187,7 +188,7 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): hyp.SetUsePreestimatedLength( length == 0.0 ) return hyp - def NumberOfSegments(self, n, s=[], reversedEdges=[], UseExisting=0): + def NumberOfSegments(self, n, s=[], reversedEdges=[], UseExisting=0, beta=None): """ Defines "NumberOfSegments" hypothesis to cut an edge in a fixed number of segments @@ -198,6 +199,7 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): A list item can also be a tuple (edge, 1st_vertex_of_edge) UseExisting: if ==true - searches for an existing hypothesis created with the same parameters, else (default) - create a new one + beta: beta coefficient for Beta Law distribution Returns: an instance of StdMeshers_NumberOfSegments hypothesis @@ -208,15 +210,22 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): reversedEdges, UseExisting = [], reversedEdges entry = self.MainShapeEntry() reversedEdgeInd = self.ReversedEdgeIndices(reversedEdges) - if not s: - hyp = self.Hypothesis("NumberOfSegments", [n, reversedEdgeInd, entry], - UseExisting=UseExisting, - CompareMethod=self._compareNumberOfSegments) - else: - hyp = self.Hypothesis("NumberOfSegments", [n,s, reversedEdgeInd, entry], - UseExisting=UseExisting, - CompareMethod=self._compareNumberOfSegments) + + args = [n, reversedEdgeInd, entry] + if s: + args.insert(1, s) + elif beta: + args.append(beta) + + hyp = self.Hypothesis( + "NumberOfSegments", args, + UseExisting=UseExisting, CompareMethod=self._compareNumberOfSegments) + + if s: hyp.SetScaleFactor(s) + elif beta: + hyp.SetBeta(s) + hyp.SetNumberOfSegments(n) hyp.SetReversedEdges( reversedEdgeInd ) hyp.SetObjectEntry( entry ) @@ -2015,3 +2024,106 @@ class StdMeshersBuilder_UseExisting_2D(Mesh_Algorithm): pass pass # end of StdMeshersBuilder_UseExisting_2D class + +class StdMeshersBuilder_ViscousLayer(Mesh_Algorithm): + """ Defines the prismatic layer builder. + + It is created by calling smeshBuilder.Mesh.ViscousLayerBuilder(geom=TheGeometry) + """ + + meshMethod = "ViscousLayerBuilder" + """ + name of the dynamic method in smeshBuilder.Mesh class + """ + algoType = "ViscousLayerBuilder" + """ + type of algorithm used with helper function in smeshBuilder.Mesh class + """ + docHelper = "Viscous layer builder for 2D and 3D geometries" + """ + doc string of the method + """ + + # On create method it will call create method from mesh python class + # + def __init__(self, mesh, geom = 0 ): + """ + Private constructor. + + Parameters: + mesh: parent mesh object algorithm is assigned to + geom: geometry (shape/sub-shape) algorithm is assigned to; + if it is :code:`0` (default), the algorithm is assigned to the main shape + """ + self.thickness = None + self.numberOfLayers = None + self.stretchFactor = None + self.elementsId = [] + self.isElementToIgnore = True + self.extrMethod = StdMeshers.SURF_OFFSET_SMOOTH + self.groupName = "" + self.shrinkGeometry = None + self.algo = self.Create(mesh, geom, self.algoType) + pass + + def setBuilderParameters( self, thickness, numberOfLayers, stretchFactor, elementsId=[], + isElementToIgnore=True, extrMethod=StdMeshers.SURF_OFFSET_SMOOTH, groupName="" ): + self.thickness = thickness + self.numberOfLayers = numberOfLayers + self.stretchFactor = stretchFactor + self.elementsId = elementsId # can be faces or edges + self.isElementToIgnore = isElementToIgnore + self.extrMethod = extrMethod + self.groupName = groupName + + self.algo.SetTotalThickness( thickness ) + self.algo.SetNumberLayers( numberOfLayers ) + self.algo.SetStretchFactor( stretchFactor ) + + #Faces are set based on int ids so if a collection of face geom objects is recived cast it to int + if elementsId and isinstance( elementsId, geomBuilder.GEOM._objref_GEOM_Object ): + elementsId = [ elementsId ] + if elementsId and isinstance( elementsId[0], geomBuilder.GEOM._objref_GEOM_Object ): + elementsIDs = [] + for shape in elementsId: + try: + ff = self.mesh.geompyD.SubShapeAll( shape, self.mesh.geompyD.ShapeType["FACE"] ) + if ( len( ff ) == 0 ): + #try to get edges + ff = self.mesh.geompyD.SubShapeAll( shape, self.mesh.geompyD.ShapeType["EDGE"] ) + + for f in ff: + elementsIDs.append( self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f)) + except: + # try to get the SHAPERSTUDY engine directly, because GetGen does not work because of + # simplification of access in geomBuilder: omniORB.registerObjref + from SHAPERSTUDY_utils import getEngine + gen = getEngine() + if gen: + aShapeOp = gen.GetIShapesOperations() + ff = aShapeOp.ExtractSubShapes( shape, self.mesh.geompyD.ShapeType["FACE"], False) + if (len(ff)==0): + #try to get edges + ff = aShapeOp.ExtractSubShapes( shape, self.mesh.geompyD.ShapeType["EDGE"], False) + for f in ff: + elementsIDs.append( aShapeOp.GetSubShapeIndex( self.mesh.geom, f )) + elementsId = elementsIDs + + self.algo.SetFaces( elementsId, isElementToIgnore ) + self.algo.SetGroupName( groupName ) + self.algo.SetMethod( extrMethod ) + + def GetShrinkGeometry( self ): + if isinstance(self.geom, geomBuilder.GEOM._objref_GEOM_Object): + self.shrinkGeometry = self.algo.GetShrinkGeometry( self.mesh.GetMesh(), self.geom ) + + return self.shrinkGeometry + + def AddLayers( self, shrinkMesh ): + success = self.algo.AddLayers( shrinkMesh.GetMesh(), self.mesh.GetMesh(), self.geom ) + if ( success ): + return self.mesh #Return the original mesh of the builder + else: + return shrinkMesh + + pass # end of StdMeshersBuilder_ViscousLayer class \ No newline at end of file