import os
from Muscat.Containers.Mesh import Mesh
from Muscat.IO.StlWriter import WriteMeshToStl
from Muscat.Helpers.IO.TemporaryDirectory import TemporaryDirectory
from Muscat.Helpers.IO.FileTools import WriteTempFile
from Muscat.Helpers.Logger import Info
from Muscat.IO.GmshReader import ReadGmsh
from Muscat.IO.CodeInterface import Interface
from Muscat.Helpers.IO.Which import Which
gmshExec = "gmsh"
[docs]def StlToMesh(stlmesh: Mesh) -> Mesh:
"""Fill 2D close surface with 3D elements. This functionality uses gmsh whit a external call
Parameters
----------
stlmesh : Mesh
a close mesh composed only by 2D elements.
Returns
-------
Mesh
a mesh composed with by the 2D exterior mesh filled with 3D elements. The order of the 2D
element (and nodes) is not necessarily preserved.
"""
gmshTemplate = """
Merge "{stlFileName}"; // load the surface mesh
Surface Loop(1) = Surface{{:}}; // make a single shell from all surfaces, assuming that the mesh is watertight
Volume(1) = {{1}}; // create a volume from the shell
Mesh.Algorithm3D=10; // test the new 3D algorithm
exit();
"""
inter = Interface(workingDirectory=TemporaryDirectory.GetTempPath())
inter.inputFileExtension = ".geo"
inter.inputFilename = "StlToMeshScript"
inter.tpl = gmshTemplate
inter.codeCommand = Which(gmshExec)
inter.acceptedReturnCodes = [0, 1]
stlFileName = "StlToMesh_mesh.stl"
inter.parameters = {"stlFileName": stlFileName}
WriteMeshToStl(TemporaryDirectory.GetTempPath() + os.sep+stlFileName, stlmesh)
inter.WriteFile(0)
inter.options = ["-3", "-f", "msh2"]
workingFileName = TemporaryDirectory.GetTempPath() + inter.inputFilename + "0.msh"
if os.path.isfile(workingFileName):
os.remove(workingFileName)
Info("---------------")
Info(workingFileName)
Info(os.path.isfile(workingFileName))
Info(inter.SingleRunComputationAndReturnOutput(0))
return ReadGmsh(workingFileName)
[docs]def CheckIntegrity(GUI: bool = False):
from Muscat.Helpers.CheckTools import SkipTest
if SkipTest("GMSH_NO_FAIL"): # pragma: no cover
return "skip"
if not Which(gmshExec): # pragma: no cover
print("gmsh not found")
return "skip"
print(Which(gmshExec))
from Muscat.IO.StlReader import ReadStl
from Muscat.TestData import GetTestDataPath
stlmesh = ReadStl(GetTestDataPath()+"stlsphere.stl")
mesh = StlToMesh(stlmesh)
mesh = StlToMesh(stlmesh)
print(stlmesh)
print(mesh)
if GUI: # pragma: no cover
from Muscat.Actions.OpenInParaView import OpenInParaView
OpenInParaView(mesh, wait=GUI)
return 'ok'
if __name__ == '__main__':
print(CheckIntegrity(True)) # pragma: no cover