# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # # ======================================= # Testing export/import of sample meshes from meshio repository # File : SMESH_MeshioFiles.py # Module : SMESH import tempfile import subprocess import os from pathlib import Path from SMESH_MeshioShapes import export_mesh, import_file def supported_extensions(): """ Returns a list of format extensions that salome already supports for import/export operations. """ return [ '.med', '.unv', '.stl', '.cgns', '.mesh', '.meshb' ] def convert(source_file, target_file, errors): """ Converts files with meshio shell command. """ try: cmd = 'meshio convert {} {}'.format(source_file, target_file) print('{} start...'.format(cmd)) subprocess.run(['meshio', 'convert', source_file, target_file], check=True) return True except Exception: source_ext = Path(source_file).suffix.upper() target_ext = Path(target_file).suffix.upper() errors.append('[{} -> {}]: {} failed!'.format(source_ext, target_ext, cmd)) return False def print_errors(errors): """ Checks if we have got any saved error messages and print them. """ if not len(errors): return print('\nErrors:') for idx, err in enumerate(errors): print('{:02}: {}'.format(idx, err)) print('\n===============================================') def perform_ext(directory, ext, errors): """ Exports a given mesh and imports it back for each mesh file through a file with a given extension. It uses shell meshio convert command for conversion. """ for subdir, _, files in os.walk(directory): for file in files: # Skip helper files if file.endswith('.md') or file.endswith('Makefile'): continue filepath = os.path.join(subdir, file) with tempfile.NamedTemporaryFile(suffix=ext) as temp_file: temp_file.close() # prevents PermissionError on Windows if not convert(filepath, temp_file.name, errors): continue file_extension = Path(file).suffix with tempfile.NamedTemporaryFile(suffix=file_extension) as temp_file_back: temp_file.close() # prevents PermissionError on Windows temp_file_back.close() # prevents PermissionError on Windows convert(temp_file.name, temp_file_back.name, errors) def test_shell(directory, errors): """ Iterates salome extensions and convert meshes through a corresponding format. . """ for ext in supported_extensions(): perform_ext(directory, ext, errors) def test_salome(directory, errors): """ Iterates over mesh files in a given directory and tries to import them into salome and export back to a temp file with the same format. """ for subdir, _, files in os.walk(directory): for file in files: # Skip helper files if file.endswith('.md') or file.endswith('Makefile'): continue # Skip files those have issues with current meshio version if (file.endswith('.f3grid') or file.endswith('.ugrid') or file.endswith('.su2') or file.endswith('element_elset.inp') or file.endswith('insulated-4.1.msh') or file.endswith('insulated-2.2.msh') or file.endswith('simple1')): continue filepath = os.path.join(subdir, file) # Import a file mesh = import_file(filepath, errors) if not mesh: continue file_extension = Path(file).suffix with tempfile.NamedTemporaryFile(suffix=file_extension) as temp_file: temp_file.close() # prevents PermissionError on Windows export_mesh(mesh, temp_file.name, errors) def test(): """ Tests import/export of meshes from a given directory and prints errors if we have any. """ errors = [] directory = 'data/meshio_meshes' # Only for debug purpose. # Uncomment if you need to test meshio library shell command itself. # test_shell(directory, errors) test_salome(directory, errors) print_errors(errors) assert not len(errors) if __name__ == "__main__": test()