Salome HOME
Merge branch 'master' into gni/evolution
[modules/smesh.git] / doc / salome / examples / test_polyhedron_per_solid.py
1 #!/usr/bin/env python
2
3 import sys
4 import salome
5
6 salome.salome_init()
7
8 ###
9 ### GEOM component
10 ###
11
12 import GEOM
13 from salome.geom import geomBuilder
14 import math
15 import SALOMEDS
16
17
18 geompy = geomBuilder.New()
19
20 ## Creates a polygon given its centre, external radius and number of sides
21 def makePolygon(p_centre, radius, nb_sides, theName=""):
22   points = []
23   x, y, z = geompy.PointCoordinates(p_centre)
24   for i in range(nb_sides):
25     angle = i*2*math.pi/nb_sides
26     p = geompy.MakeVertex(x+radius*math.cos(angle), y+radius*math.sin(angle), 0)
27     points.append(p)
28   wire = geompy.MakePolyline(points, True)
29   face = geompy.MakeFace(wire, 1)
30   if theName:
31     geompy.addToStudy(face, theName)
32   return face
33
34 ## Creates a solid by adding a vertex on its top
35 def makeSummitSolid(face, height, theName=""):
36   p_cdg = geompy.MakeCDG(face)
37   p_top = geompy.MakeTranslation(p_cdg, 0, 0, height)
38   edges = geompy.SubShapeAll(face, geompy.ShapeType["EDGE"])
39   faces = [face]
40   for edge in edges:
41     p1, p2 = geompy.SubShapeAll(edge, geompy.ShapeType["VERTEX"])
42     wire = geompy.MakePolyline([p1, p2, p_top], True)
43     face = geompy.MakeFace(wire, 1)
44     faces.append(face)
45   shell = geompy.MakeShell(faces)
46   solid = geompy.MakeSolid(shell)
47   if theName:
48     geompy.addToStudy(solid, theName)
49   return solid
50
51 O = geompy.MakeVertex(0, 0, 0)
52 OX = geompy.MakeVectorDXDYDZ(1, 0, 0)
53 OY = geompy.MakeVectorDXDYDZ(0, 1, 0)
54 OZ = geompy.MakeVectorDXDYDZ(0, 0, 1)
55 geompy.addToStudy( O, 'O' )
56 geompy.addToStudy( OX, 'OX' )
57 geompy.addToStudy( OY, 'OY' )
58 geompy.addToStudy( OZ, 'OZ' )
59
60 height = 0.5
61
62 triangle = makePolygon(O, 1, 3, "triangle")
63
64 P1 = geompy.MakeVertex(2, 0, 0)
65 quadrangle = makePolygon(P1, 1, 4, "quadrangle")
66
67 P2 = geompy.MakeVertex(4, 0, 0)
68 pentagon = makePolygon(P2, 1, 5, "pentagon")
69
70 P3 = geompy.MakeVertex(6, 0, 0)
71 hexagon = makePolygon(P3, 1, 6, "hexagon")
72
73 P4 = geompy.MakeVertex(8, 0, 0)
74 heptagon = makePolygon(P4, 1, 7, "heptagon")
75
76 P5 = geompy.MakeVertex(10, 0, 0)
77 octagon = makePolygon(P5, 1, 7, "octagon")
78
79 polygons = [triangle, quadrangle, pentagon, hexagon, heptagon, octagon]
80 polyhedrons = []
81 for polygon in polygons:
82   name = polygon.GetName()
83   polygon_extruded = geompy.MakePrismVecH(polygon, OZ, height, theName="%s_prism"%name)
84   polygon_summit = makeSummitSolid(polygon, -height, theName="%s_summit"%name)
85   polyhedrons += [polygon_extruded, polygon_summit]
86
87 solids = geompy.MakeCompound(polyhedrons, theName="solids")
88
89
90 ###
91 ### SMESH component
92 ###
93
94 import  SMESH, SALOMEDS
95 from salome.smesh import smeshBuilder
96
97 smesh = smeshBuilder.New()
98
99 Mesh_1 = smesh.Mesh(solids)
100 Regular_1D = Mesh_1.Segment()
101 Number_of_Segments_1 = Regular_1D.NumberOfSegments(1)
102 PolygonPerFace_2D = Mesh_1.Polygon()
103 PolyhedronPerSolid_3D = Mesh_1.Polyhedron()
104
105 ok = Mesh_1.Compute()
106
107 if not ok:
108   raise Exception("Error when computing Mesh")
109
110 # check volumes
111 vol_geom = geompy.BasicProperties(solids)[2]
112 vol_mesh = Mesh_1.GetVolume()
113
114 assert abs(vol_geom - vol_mesh) < 1e-12
115
116 assert Mesh_1.NbVolumes() == 12
117
118 # check type of elements
119 assert Mesh_1.NbTetras() == 1
120 assert Mesh_1.NbHexas() == 1
121 assert Mesh_1.NbPyramids() == 1
122 assert Mesh_1.NbPrisms() == 1
123 assert Mesh_1.NbHexagonalPrisms() == 1
124 assert Mesh_1.NbPolyhedrons() == 7
125
126
127 if salome.sg.hasDesktop():
128   salome.sg.updateObjBrowser()