X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_SWIG%2Fsmesh_algorithm.py;h=ff601b47f476d27b8a3f735f716df7c3ce426559;hp=a0c368a0aa21fb5f924edf56b8d739e5be9c4025;hb=251f8c052dd12dd29922210dc901b295fe999a0e;hpb=59e80d2f8837a785e0e3c533dbdf44e01069ad81 diff --git a/src/SMESH_SWIG/smesh_algorithm.py b/src/SMESH_SWIG/smesh_algorithm.py index a0c368a0a..ff601b47f 100644 --- a/src/SMESH_SWIG/smesh_algorithm.py +++ b/src/SMESH_SWIG/smesh_algorithm.py @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2014 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 @@ -23,7 +23,7 @@ import salome from salome.geom import geomBuilder -import SMESH +import SMESH, StdMeshers ## The base class to define meshing algorithms # @@ -40,7 +40,7 @@ import SMESH # @code # meshMethod = "MyAlgorithm" # @endcode -# then an instance of @c MyPlugin_Algorithm can be created by the direct invokation of the function +# then an instance of @c MyPlugin_Algorithm can be created by the direct invocation of the function # of smesh.Mesh class: # @code # my_algo = mesh.MyAlgorithm() @@ -195,17 +195,11 @@ class Mesh_Algorithm: if geom is None and mesh.mesh.HasShapeToMesh(): raise RuntimeError, "Attemp to create " + algo + " algoritm on None shape" self.mesh = mesh - name = "" if not geom or geom.IsSame( mesh.geom ): self.geom = mesh.geom else: self.geom = geom AssureGeomPublished( mesh, geom ) - try: - name = GetName(geom) - pass - except: - pass self.subm = mesh.mesh.GetSubMesh(geom, algo.GetName()) self.algo = algo status = mesh.AddHypothesis(self.algo, self.geom) @@ -220,7 +214,7 @@ class Mesh_Algorithm: ## Private method def Hypothesis (self, hyp, args=[], so="libStdMeshersEngine.so", - UseExisting=0, CompareMethod=""): + UseExisting=0, CompareMethod="", toAdd=True): from salome.smesh.smeshBuilder import TreatHypoStatus, GetName hypo = None if UseExisting: @@ -249,8 +243,9 @@ class Mesh_Algorithm: geomName="" if self.geom: geomName = GetName(self.geom) - status = self.mesh.mesh.AddHypothesis(self.geom, hypo) - TreatHypoStatus( status, GetName(hypo), geomName, 0 ) + if toAdd: + status = self.mesh.mesh.AddHypothesis(self.geom, hypo) + TreatHypoStatus( status, GetName(hypo), geomName, 0, self.mesh ) return hypo ## Returns entry of the shape to mesh in the study @@ -262,7 +257,7 @@ class Mesh_Algorithm: ## Defines "ViscousLayers" hypothesis to give parameters of layers of prisms to build # near mesh boundary. This hypothesis can be used by several 3D algorithms: - # NETGEN 3D, GHS3D, Hexahedron(i,j,k) + # NETGEN 3D, MG-Tetra, Hexahedron(i,j,k) # @param thickness total thickness of layers of prisms # @param numberOfLayers number of layers of prisms # @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh @@ -271,26 +266,49 @@ class Mesh_Algorithm: # the value of \a isFacesToIgnore parameter. # @param isFacesToIgnore if \c True, the Viscous layers are not generated on the # faces specified by the previous parameter (\a faces). + # @param extrMethod extrusion method defines how position of new nodes are found during + # prism construction and how creation of distorted and intersecting prisms is + # prevented. Possible values are: + # - StdMeshers.SURF_OFFSET_SMOOTH (default) method extrudes nodes along normal + # to underlying geometrical surface. Smoothing of internal surface of + # element layers can be used to avoid creation of invalid prisms. + # - StdMeshers.FACE_OFFSET method extrudes nodes along average normal of + # surrounding mesh faces till intersection with a neighbor mesh face + # translated along its own normal by the layers thickness. Thickness + # of layers can be limited to avoid creation of invalid prisms. + # - StdMeshers.NODE_OFFSET method extrudes nodes along average normal of + # surrounding mesh faces by the layers thickness. Thickness of + # layers can be limited to avoid creation of invalid prisms. # @ingroup l3_hypos_additi def ViscousLayers(self, thickness, numberOfLayers, stretchFactor, - faces=[], isFacesToIgnore=True ): + faces=[], isFacesToIgnore=True, extrMethod=StdMeshers.SURF_OFFSET_SMOOTH ): if not isinstance(self.algo, SMESH._objref_SMESH_3D_Algo): raise TypeError, "ViscousLayers are supported by 3D algorithms only" if not "ViscousLayers" in self.GetCompatibleHypothesis(): raise TypeError, "ViscousLayers are not supported by %s"%self.algo.GetName() if faces and isinstance( faces[0], geomBuilder.GEOM._objref_GEOM_Object ): - faces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in faces ] + import GEOM + faceIDs = [] + for f in faces: + if self.mesh.geompyD.ShapeIdToType( f.GetType() ) == "GROUP": + faceIDs += f.GetSubShapeIndices() + else: + faceIDs += [self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f)] + faces = faceIDs hyp = self.Hypothesis("ViscousLayers", - [thickness, numberOfLayers, stretchFactor, faces]) - hyp.SetTotalThickness(thickness) - hyp.SetNumberLayers(numberOfLayers) - hyp.SetStretchFactor(stretchFactor) - hyp.SetFaces(faces, isFacesToIgnore) + [thickness, numberOfLayers, stretchFactor, faces, isFacesToIgnore], + toAdd=False) + hyp.SetTotalThickness( thickness ) + hyp.SetNumberLayers( numberOfLayers ) + hyp.SetStretchFactor( stretchFactor ) + hyp.SetFaces( faces, isFacesToIgnore ) + hyp.SetMethod( extrMethod ) + self.mesh.AddHypothesis( hyp, self.geom ) return hyp ## Defines "ViscousLayers2D" hypothesis to give parameters of layers of quadrilateral # elements to build near mesh boundary. This hypothesis can be used by several 2D algorithms: - # NETGEN 2D, NETGEN 1D-2D, Quadrangle (mapping), MEFISTO, BLSURF + # NETGEN 2D, NETGEN 1D-2D, Quadrangle (mapping), MEFISTO, MG-CADSurf # @param thickness total thickness of layers of quadrilaterals # @param numberOfLayers number of layers # @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh @@ -309,12 +327,13 @@ class Mesh_Algorithm: if edges and isinstance( edges[0], geomBuilder.GEOM._objref_GEOM_Object ): edges = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in edges ] hyp = self.Hypothesis("ViscousLayers2D", - [thickness, numberOfLayers, stretchFactor, - edges, isEdgesToIgnore]) + [thickness, numberOfLayers, stretchFactor, edges, isEdgesToIgnore], + toAdd=False) hyp.SetTotalThickness(thickness) hyp.SetNumberLayers(numberOfLayers) hyp.SetStretchFactor(stretchFactor) hyp.SetEdges(edges, isEdgesToIgnore) + self.mesh.AddHypothesis( hyp, self.geom ) return hyp ## Transform a list of either edges or tuples (edge, 1st_vertex_of_edge)