12 import GEOM, SMESH, SALOMEDS
14 from salome.geom import geomBuilder
15 from salome.smesh import smeshBuilder
19 smesh = smeshBuilder.New()
20 geompy = geomBuilder.New()
22 import medcoupling as mc
24 def create_gmsh_empty_param_file(param_file):
25 """ Create a parameter file for runner """
27 with open(param_file, "w") as ffile:
30 def create_gmsh_param_file(param_file):
31 """ Create a parameter file for runner """
47 with open(param_file, "w") as ffile:
51 def runTheMesher( mesh_2d, geo, emptyParam=False ):
56 with tempfile.TemporaryDirectory() as tmp_dir:
57 mesh_file = path.join(tmp_dir, "mesh.med")
58 shape_file = path.join(tmp_dir, "shape.brep")
59 param_file = path.join(tmp_dir, "gmsh_param.txt")
60 new_elementsbinary = path.join(tmp_dir, "nodesAndElements.bin")
61 output_mesh = path.join(tmp_dir, "mesh3D.med")
63 print("Running in folder: ", tmp_dir)
64 if not ( emptyParam ):
65 create_gmsh_param_file(param_file)
67 create_gmsh_empty_param_file(param_file)
68 mesh_2d.ExportMED(mesh_file, 0, 41, 1, mesh_2d, 1, [], '', -1, 1)
69 geompy.ExportBREP( geo, shape_file )
71 runner = path.join("${GMSHPLUGIN_ROOT_DIR}",
76 if sys.platform == 'win32':
79 cmd = "{runner} GMSH3D {mesh_file} {shape_file} "\
80 "{param_file} NONE {new_elementsbinary} {output_mesh}"\
81 .format(runner=runner,
83 shape_file=shape_file,
84 param_file=param_file,
85 new_elementsbinary=new_elementsbinary,
86 output_mesh=output_mesh)
88 subprocess.check_call(cmd, shell=True)
90 mesh_read = mc.ReadUMeshFromFile(output_mesh, "MESH", 0)
92 nb_tetras = mesh_read.getNumberOfCellsWithType(mc.NORM_TETRA4)
93 nb_points = mesh_read.getNumberOfNodes()
95 mesh_read = mc.ReadUMeshFromFile(output_mesh, "MESH", -1)
96 nb_triangles = mesh_read.getNumberOfCellsWithType(mc.NORM_TRI3)
98 mesh_read = mc.ReadUMeshFromFile(output_mesh, "MESH", -2)
99 nb_segments = mesh_read.getNumberOfCellsWithType(mc.NORM_SEG2)
101 return [nb_points, nb_segments, nb_triangles, nb_tetras]
103 def test_gmsh3dDefault():
106 box = geompy.MakeBoxDXDYDZ(200, 200, 200)
108 geompy.ExtractShapes(box, geompy.ShapeType["FACE"], True)
109 groupe_1 = geompy.CreateGroup(box, geompy.ShapeType["FACE"] )
110 geompy.UnionIDs(groupe_1, [3, 13, 23, 27, 31, 33])
112 [_, _, _, _, _, _, groupe_1] = geompy.GetExistingSubObjects(box, False)
114 shape_faces = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])
116 mesh_2d = smesh.Mesh(box, 'Maillage_1')
118 mesh_2d.Triangle(algo=smeshBuilder.NETGEN_1D2D)
119 isDone = mesh_2d.Compute()
120 premeshedTriangles = mesh_2d.NbFaces()
121 premeshedTetras = mesh_2d.NbVolumes()
124 raise Exception("Error when computing Mesh")
126 smesh.SetName(mesh_2d, 'Maillage_1')
128 [nb_points, nb_segments, nb_triangles, nb_tetras] = runTheMesher( mesh_2d, box )
131 print("Nb Tetras:", nb_tetras)
132 print("Nb Triangles:", nb_triangles)
133 print("Nb Segments:", nb_segments)
134 print("Nb Points:", nb_points)
136 assert premeshedTetras == 0
137 assert nb_triangles == premeshedTriangles
138 assert nb_tetras == 6 # number of tetras for normalized 2D premesh (update if default 2D netgen change!)
139 assert nb_points == 8 # one node in each vertex of the cube
140 assert nb_segments > 0
145 box = geompy.MakeBoxDXDYDZ(200, 200, 200)
147 geompy.ExtractShapes(box, geompy.ShapeType["FACE"], True)
148 groupe_1 = geompy.CreateGroup(box, geompy.ShapeType["FACE"] )
149 geompy.UnionIDs(groupe_1, [3, 13, 23, 27, 31, 33])
151 [_, _, _, _, _, _, groupe_1] = geompy.GetExistingSubObjects(box, False)
153 shape_faces = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])
156 netgen_2d_parameters_1 = smesh.CreateHypothesisByAverageLength(
157 'NETGEN_Parameters_2D', 'NETGENEngine', 34.641, 0 )
159 mesh_2d = smesh.Mesh(box, 'Maillage_1')
160 mesh_2d.AddHypothesis(box, netgen_2d_parameters_1)
162 mesh_2d.Triangle(algo=smeshBuilder.NETGEN_1D2D)
163 isDone = mesh_2d.Compute()
164 premeshedTriangles = mesh_2d.NbFaces()
165 premeshedTetras = mesh_2d.NbVolumes()
168 raise Exception("Error when computing Mesh")
170 smesh.SetName(mesh_2d, 'Maillage_1')
172 [nb_points, nb_segments, nb_triangles, nb_tetras] = runTheMesher( mesh_2d, box )
175 print("Nb Tetras:", nb_tetras)
176 print("Nb Triangles:", nb_triangles)
177 print("Nb Segments:", nb_segments)
178 print("Nb Points:", nb_points)
180 assert premeshedTetras == 0
181 assert nb_triangles == premeshedTriangles
184 assert nb_segments > 0
186 def test_gmsh3d_empty_parameters():
189 box = geompy.MakeBoxDXDYDZ(200, 200, 200)
191 geompy.ExtractShapes(box, geompy.ShapeType["FACE"], True)
192 groupe_1 = geompy.CreateGroup(box, geompy.ShapeType["FACE"] )
193 geompy.UnionIDs(groupe_1, [3, 13, 23, 27, 31, 33])
195 [_, _, _, _, _, _, groupe_1] = geompy.GetExistingSubObjects(box, False)
197 shape_faces = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])
200 netgen_2d_parameters_1 = smesh.CreateHypothesisByAverageLength(
201 'NETGEN_Parameters_2D', 'NETGENEngine', 34.641, 0 )
203 mesh_2d = smesh.Mesh(box, 'Maillage_1')
204 mesh_2d.AddHypothesis(box, netgen_2d_parameters_1)
206 mesh_2d.Triangle(algo=smeshBuilder.NETGEN_1D2D)
207 isDone = mesh_2d.Compute()
208 premeshedTriangles = mesh_2d.NbFaces()
209 premeshedTetras = mesh_2d.NbVolumes()
212 raise Exception("Error when computing Mesh")
214 smesh.SetName(mesh_2d, 'Maillage_1')
216 [nb_points, nb_segments, nb_triangles, nb_tetras] = runTheMesher( mesh_2d, box, True )
219 print("Nb Tetras:", nb_tetras)
220 print("Nb Triangles:", nb_triangles)
221 print("Nb Segments:", nb_segments)
222 print("Nb Points:", nb_points)
224 assert premeshedTetras == 0
225 assert nb_triangles == premeshedTriangles
228 assert nb_segments > 0
230 if __name__ == "__main__":
231 if sys.platform == "win32":
232 print("Disabled on windows")
237 test_gmsh3d_empty_parameters()