Modifying Meshes

Adding Nodes and Elements

Add Node

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# add node

aMeshEditor = mesh.GetMeshEditor()

if aMeshEditor.AddNode(50, 10, 0) == 1:

    print "Node addition is OK!"

else:

    print "KO node addition."

    

salome.sg.updateObjBrowser(1)

 

Add Edge

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# add node

aMeshEditor = mesh.GetMeshEditor()

if aMeshEditor.AddNode(50, 10, 0) == 1:

    print "Node addition is OK!"

else:

    print "KO node addition."

 

# add edge

LastNodeId = mesh.NbNodes()

if aMeshEditor.AddEdge([LastNodeId, 38]) == 1:

    print "Edge addition is OK!"

else:

    print "KO edge addition."

 

salome.sg.updateObjBrowser(1)

 

Add Triangle

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# add node

aMeshEditor = mesh.GetMeshEditor()

if aMeshEditor.AddNode(50, 10, 0) == 1:

    print "Node addition is OK!"

else:

    print "KO node addition."

 

LastNodeId = mesh.NbNodes()

 

# add triangle

if aMeshEditor.AddFace([LastNodeId, 38, 39]) == 1:

    print "Triangle addition is OK!"

else:

    print "KO triangle addition."

    

salome.sg.updateObjBrowser(1)

 

Add Quadrangle

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# add node

aMeshEditor = mesh.GetMeshEditor()

if aMeshEditor.AddNode(50, 10, 0) == 1:

    print "Node addition is OK!"

else:

    print "KO node addition."

 

LastNodeId = mesh.NbNodes()

 

# add quadrangle

if aMeshEditor.AddNode(40, 20, 0) == 1:

    print "Node addition is OK!"

else:

    print "KO node addition."

if aMeshEditor.AddFace([mesh.NbNodes(), LastNodeId, 38, 39]) == 1:

    print "Quadrangle addition is OK!"

else:

    print "KO quadrangle addition."

 

salome.sg.updateObjBrowser(1)

 

Add Tetrahedron

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# add node

aMeshEditor = mesh.GetMeshEditor()

if aMeshEditor.AddNode(50, 10, 0) == 1:

    print "Node addition is OK!"

else:

    print "KO node addition."

 

LastNodeId = mesh.NbNodes()

 

# add tetrahedron

if aMeshEditor.AddVolume([LastNodeId, 38, 39, 246]) == 1:

    print "Tetrahedron addition is OK!"

else:

    print "KO tetrahedron addition."

    

salome.sg.updateObjBrowser(1)

 

Add Hexahedron

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# add nodes

aMeshEditor = mesh.GetMeshEditor()

if aMeshEditor.AddNode(50, 10, 0) == 1:

    print "Node addition is OK!"

else:

    print "KO node addition."

aNodeId1 = mesh.NbNodes()

 

if aMeshEditor.AddNode(47, 12, 0) == 1:

    print "Node addition is OK!"

else:

    print "KO node addition."

aNodeId2 = mesh.NbNodes()

 

if aMeshEditor.AddNode(50, 10, 10) == 1:

    print "Node addition is OK!"

else:

    print "KO node addition."

aNodeId3 = mesh.NbNodes()

 

if aMeshEditor.AddNode(47, 12, 10) == 1:

    print "Node addition is OK!"

else:

    print "KO node addition."

aNodeId4 = mesh.NbNodes()

 

# add hexahedron

if aMeshEditor.AddVolume([aNodeId2, aNodeId1, 38, 39, aNodeId4, aNodeId3, 245, 246]) == 1:

    print "Hexahedron addition is OK!"

else:

    print "KO Hexahedron addition."

    

salome.sg.updateObjBrowser(1)

 

Add Polygon

import salome

import geompy

import math

 

import StdMeshers

 

# GEOM module

shape_mesh = geompy.MakeCylinderRH(13, 77)

geompy.addToStudy(shape_mesh, "cylinder")

 

# SMESH module

smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")

smesh.SetCurrentStudy(salome.myStudy)

mesh = smesh.CreateMesh(shape_mesh)

MeshEditor = mesh.GetMeshEditor()

 

# a method to build a polygonal mesh element with nb_vert angles:

def MakePolygon (a_mesh, x0, y0, z0, radius, nb_vert):

    node_start_id = a_mesh.NbNodes() + 1

    al = 2.0 * math.pi / nb_vert

    node_ids = []

    

# Create nodes for a polyhedron

    for ii in range(nb_vert):

        MeshEditor.AddNode(x0 + radius * math.cos(ii*al),

                           y0 + radius * math.sin(ii*al),

                           z0)

        node_ids.append(node_start_id + ii)

        pass

    

# Create a polygon

    MeshEditor.AddPolygonalFace(node_ids)

    return 0

 

# Create three polygons

MakePolygon(mesh, 0, 0,  0, 30, 13)

MakePolygon(mesh, 0, 0, 10, 21,  9)

MakePolygon(mesh, 0, 0, 20, 13,  6)

 

salome.sg.updateObjBrowser(1)  

 

Add polyhedron

import salome

import geompy

import math

 

#import SMESH

import StdMeshers

 

# GEOM

shape_mesh = geompy.MakeCylinderRH(13, 77)

geompy.addToStudy(shape_mesh, "cylinder")

 

# SMESH

smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")

smesh.SetCurrentStudy(salome.myStudy)

mesh = smesh.CreateMesh(shape_mesh)

MeshEditor = mesh.GetMeshEditor()

 

# Now we are going to create a 12-hedron:

 

# Create nodes for polyhedron

al = 2 * math.pi / 5.0

cosal = math.cos(al)

 

aa = 13

rr = aa / (2.0 * math.sin(al/2.0))

dr = 2.0 * rr * cosal

r1 = rr + dr

dh = rr * math.sqrt(2.0 * (1.0 - cosal * (1.0 + 2.0 * cosal)))

hh = 2.0 * dh - dr * (rr*(cosal - 1) + (rr + dr)*(math.cos(al/2) - 1)) / dh

 

for i in range(5):

    MeshEditor.AddNode(rr*math.cos(i*al), rr*math.sin(i*al),  0) # 1,3,5,7, 9 # bottom

    MeshEditor.AddNode(r1*math.cos(i*al), r1*math.sin(i*al), dh) # 2,4,6,8,10 # above bottom

 

for i in range(5):

    MeshEditor.AddNode(rr*math.cos(i*al + al/2.0),

                       rr*math.sin(i*al + al/2.0), hh) # 11,13,15,17,19 # top

    MeshEditor.AddNode(r1*math.cos(i*al + al/2.0),

                       r1*math.sin(i*al + al/2.0), hh - dh) # 12,14,16,18,20 # below top

 

# Create a polyhedral volume

MeshEditor.AddPolyhedralVolume([ 1,  3,  5,  7,  9,  # bottom

                                 1,  2, 12,  4,  3,  # .

                                 3,  4, 14,  6,  5,  # .

                                 5,  6, 16,  8,  7,  # . above bottom

                                 7,  8, 18, 10,  9,  # .

                                 9, 10, 20,  2,  1,  # .

                                11, 12,  4, 14, 13,  # -

                                13, 14,  6, 16, 15,  # -

                                15, 16,  8, 18, 17,  # - below top

                                17, 18, 10, 20, 19,  # -

                                19, 20,  2, 12, 11,  # -

                                11, 13, 15, 17, 19], # top

                               [5,5,5,5,5,5,5,5,5,5,5,5])

 

salome.sg.updateObjBrowser(1)  

 

Removing Nodes and Elements

Removing Nodes

 

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# add node

aMeshEditor = mesh.GetMeshEditor()

if aMeshEditor.RemoveNodes([246, 255]) == 1:

    print "Node removing is OK!"

else:

    print "KO node removing."

    

salome.sg.updateObjBrowser(1)

 

Removing Elements

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

anEditor = mesh.GetMeshEditor()

anEditor.RemoveElements([850, 859, 814])

 

salome.sg.updateObjBrowser(1)

 

Renumbering Nodes and Elements

import SMESH

import SMESH_mechanic

 

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

anEditor = mesh.GetMeshEditor()

anEditor.RenumberNodes()

 

salome.sg.updateObjBrowser(1)

 

 

Moving Nodes

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# move node

aMeshEditor = mesh.GetMeshEditor()

aMeshEditor.MoveNode(38, 20, 10, 0)

    

salome.sg.updateObjBrowser(1)

 

Diagonal Inversion

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# inverse diagonal

aMeshEditor = mesh.GetMeshEditor()

aMeshEditor.InverseDiag(700, 642)

    

salome.sg.updateObjBrowser(1)

 

Uniting two Triangles

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# delete diagonal

aMeshEditor = mesh.GetMeshEditor()

aMeshEditor.DeleteDiag(700, 642)

    

salome.sg.updateObjBrowser(1)

 

Uniting a Set of Triangles

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# unite a set of triangles

aFilterMgr = smesh.CreateFilterManager()

aFunctor = aFilterMgr.CreateMinimumAngle()

 

aMeshEditor = mesh.GetMeshEditor()

aMeshEditor.TriToQuad([1145, 1147, 1159, 1135], aFunctor, 60)

    

salome.sg.updateObjBrowser(1)

 

Orientation

import salome

import geompy

 

import StdMeshers

 

# GEOM module

shape_mesh = geompy.MakeCylinderRH(13, 77)

geompy.addToStudy(shape_mesh, "cylinder")

 

# SMESH module

smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")

smesh.SetCurrentStudy(salome.myStudy)

mesh = smesh.CreateMesh(shape_mesh)

MeshEditor = mesh.GetMeshEditor()

 

# build five quadrangles:

node_start_id = mesh.NbNodes() + 1

dx = 10

dy = 20

 

MeshEditor.AddNode(0.0 * dx, 0, 0) # 1

MeshEditor.AddNode(1.0 * dx, 0, 0) # 2

MeshEditor.AddNode(2.0 * dx, 0, 0) # 3

MeshEditor.AddNode(3.0 * dx, 0, 0) # 4

MeshEditor.AddNode(4.0 * dx, 0, 0) # 5

MeshEditor.AddNode(5.0 * dx, 0, 0) # 6

 

MeshEditor.AddNode(0.0 * dx, dy, 0) # 7

MeshEditor.AddNode(1.0 * dx, dy, 0) # 8

MeshEditor.AddNode(2.0 * dx, dy, 0) # 9

MeshEditor.AddNode(3.0 * dx, dy, 0) # 10

MeshEditor.AddNode(4.0 * dx, dy, 0) # 11

MeshEditor.AddNode(5.0 * dx, dy, 0) # 12

 

MeshEditor.AddFace([1, 2,  8,  7])

MeshEditor.AddFace([2, 3,  9,  8])

MeshEditor.AddFace([3, 4, 10,  9])

MeshEditor.AddFace([4, 5, 11, 10])

MeshEditor.AddFace([5, 6, 12, 11])

 

# Change orientation of the second and the fourth faces.

MeshEditor.Reorient([2, 4])

 

salome.sg.updateObjBrowser(1)  

 

Cutting Quadrangles

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# unite a set of triangles

aFilterMgr = smesh.CreateFilterManager()

aFunctor = aFilterMgr.CreateMinimumAngle()

 

aMeshEditor = mesh.GetMeshEditor()

aMeshEditor.QuadToTri([405, 406], aFunctor)

    

salome.sg.updateObjBrowser(1)

 

Smoothing

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# smooth

FacesSmooth = [911, 931, 950, 864, 932]

GroupSmooth = mesh.CreateGroup(SMESH.FACE,"Group of faces (smooth)")

GroupSmooth.Add(FacesSmooth)

 

aMeshEditor = mesh.GetMeshEditor()

aMeshEditor.SmoothObject(GroupSmooth, [], 20, 2, SMESH.SMESH_MeshEditor.CENTROIDAL_SMOOTH)

 

salome.sg.updateObjBrowser(1)

 

 

Extrusion

import SMESH

import SMESH_mechanic

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# extrusion of the group

point = SMESH.PointStruct(0, 0, 5)

vector = SMESH.DirStruct(point)

FacesTriToQuad = [2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422]

 

GroupTriToQuad = mesh.CreateGroup(SMESH.FACE,"Group of faces (quad)")

GroupTriToQuad.Add(FacesTriToQuad)

 

aMeshEditor = mesh.GetMeshEditor()

aMeshEditor.ExtrusionSweepObject(GroupTriToQuad, vector, 5)

 

salome.sg.updateObjBrowser(1)

 

Extrusion along a Path

import geompy

import smesh

import salome

import SMESH

 

# create a face to be meshed

px = geompy.MakeVertex(100., 0.  , 0.  )

py = geompy.MakeVertex(0.  , 100., 0.  )

pz = geompy.MakeVertex(0.  , 0.  , 100.)

 

vxy = geompy.MakeVector(px, py)

arc = geompy.MakeArc(py, pz, px)

 

wire = geompy.MakeWire([vxy, arc])

isPlanarFace = 1

 

face1 = geompy.MakeFace(wire, isPlanarFace)

id_face1 = geompy.addToStudy(face1, "Face1")

 

# create a 2D mesh on the face

trias = smesh.Mesh(face1, "Face : 2D mesh")

 

algo = trias.Segment()

algo.NumberOfSegments(6)

 

algo = trias.Triangle()

algo.LengthFromEdges()

 

trias.Compute()

 

# create a path mesh

px1 = geompy.MakeVertex(100., 100.  , 0.  )

py1 = geompy.MakeVertex(-100.  , -100., 0.  )

pz1 = geompy.MakeVertex(0.  , 0.  , 50.)

 

circle = geompy.MakeCircleThreePnt(py1, pz1, px1)

id_circle = geompy.addToStudy(circle, "Path")

 

circlemesh = smesh.Mesh(circle, "Path mesh")

 

algo = circlemesh.Segment()

algo.NumberOfSegments(10)

 

circlemesh.Compute()

 

# extrusion of the mesh

# The mesh "trias" will be extruded along another mesh, which is a sub-mesh of "circlemesh",

# corresponding to geometry "circle". In this particular case the path mesh will be the whole "circlemesh"

 

aMeshEditor = trias.GetMesh().GetMeshEditor()

aMeshEditor.ExtrusionAlongPathObject(trias.GetMesh(), circlemesh.GetMesh(), circle, 1, 0, [], 0, SMESH.PointStruct(0, 0, 0))

 

salome.sg.updateObjBrowser(1)

Revolution

import SMESH

import SMESH_mechanic

import math

 

smesh  = SMESH_mechanic.smesh

mesh   = SMESH_mechanic.mesh

salome = SMESH_mechanic.salome

 

# rotate a sweep object

FacesRotate = [492, 493, 502, 503]

GroupRotate = mesh.CreateGroup(SMESH.FACE,"Group of faces (rotate)")

GroupRotate.Add(FacesRotate)

angle45 =  45*math.pi/180

axisXYZ = SMESH.AxisStruct(-38.3128, -73.3658, -23.321, -13.3402, -13.3265, 6.66632)

 

aMeshEditor = mesh.GetMeshEditor()

aMeshEditor.RotationSweepObject(GroupRotate, axisXYZ, angle45, 4, 1e-5)

 

salome.sg.updateObjBrowser(1)

 

Pattern Mapping

Attention! This script was written using old approach, based on direct usage of SMESH idl interface. To be updated for version 3.2.1 to use smesh package.
 

import salome

import geompy

import SMESH, smesh

 

geompy.init_geom(salome.myStudy)

smesh.smesh.SetCurrentStudy(salome.myStudy)

 

# define geometry

Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200)

geompy.addToStudy(Box_1, "Box_1")

 

faces = geompy.SubShapeAll(Box_1, geompy.ShapeType["FACE"])

Face_1 = faces[0]

Face_2 = faces[1]

geompy.addToStudyInFather(Box_1, Face_1, "Face_1")

geompy.addToStudyInFather(Box_1, Face_2, "Face_2")

 

# build quadrangle mesh 3x3 on Face_1

Mesh_1 = smesh.Mesh(Face_1)

Wire_discretisation = Mesh_1.Segment()

Wire_discretisation.NumberOfSegments(3)

Mesh_1.Quadrangle()

 

isDone = Mesh_1.Compute()

if not isDone: print 'Mesh Mesh_1 : computation failed'

 

# pattern the mesh

Mesh_2 = smesh.Mesh(Face_2)

Nb_Segments_1 = smesh.smesh.CreateHypothesis('NumberOfSegments', 'libStdMeshersEngine.so')

Nb_Segments_1.SetNumberOfSegments(1)

status = Mesh_2.GetMesh().AddHypothesis(Face_2, Nb_Segments_1)

status = Mesh_2.GetMesh().AddHypothesis(Face_2, Wire_discretisation.GetAlgorithm())

Triangle_Mefisto = Mesh_2.Triangle()

Max_Element_Area = Triangle_Mefisto.MaxElementArea(240)

 

isDone = Mesh_2.Compute()

if not isDone: print 'Mesh Mesh_2 : computation failed'

 

# create a pattern

pattern = smesh.smesh.GetPattern()

isDone = pattern.LoadFromFace(Mesh_2.GetMesh(), Face_2, 0)

if (isDone != 1):

print 'LoadFromFace :', pattern.GetErrorCode()

 

# apply the pattern to a face of the first mesh

pattern.ApplyToMeshFaces(Mesh_1.GetMesh(), [17], 0, 0)

isDone = pattern.MakeMesh(Mesh_1.GetMesh(), 0, 0)

if (isDone != 1):

print 'MakeMesh :', pattern.GetErrorCode()

 

salome.sg.updateObjBrowser(1)