OGS
OGSFileConverter.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#define BOOST_FILESYSTEM_VERSION 3
5
6#include "OGSFileConverter.h"
7
8#include <QFileInfo>
9
12#include "BaseLib/FileTools.h"
13#include "BaseLib/StringTools.h"
14#include "FileListDialog.h"
15#include "GeoLib/GEOObjects.h"
19#include "MeshLib/Mesh.h"
20
21OGSFileConverter::OGSFileConverter(std::string const& gmsh_path,
22 QWidget* parent)
23 : QDialog(parent), _gmsh_path(gmsh_path)
24{
25 setupUi(this);
26}
27
29
30void OGSFileConverter::convertGML2GLI(const QStringList& input,
31 const QString& output) const
32{
33 if (input.empty())
34 {
35 return;
36 }
37
38 GeoLib::GEOObjects geo_objects;
39 GeoLib::IO::XmlGmlInterface xml(geo_objects);
40
41 for (const auto& input_string : input)
42 {
43 const QFileInfo fi(input_string);
44 const std::string output_str =
45 QString(output + "/" + fi.completeBaseName() + ".gli")
46 .toStdString();
47
48 if (fileExists(output_str))
49 {
50 continue;
51 }
52
53 try
54 {
55 if (!xml.readFile(input_string))
56 {
57 OGSError::box("Error reading geometry " + fi.fileName());
58 continue;
59 }
60 }
61 catch (std::runtime_error const& err)
62 {
63 OGSError::box(err.what(),
64 "Failed to read file `" + input_string + "'");
65 continue;
66 }
67
68 auto const geo_name = geo_objects.getGeometryNames()[0];
69 FileIO::Legacy::writeGLIFileV4(output_str, geo_name, geo_objects);
70 geo_objects.removeSurfaceVec(geo_name);
71 geo_objects.removePolylineVec(geo_name);
72 geo_objects.removePointVec(geo_name);
73 }
74 OGSError::box("File conversion finished");
75}
76
77void OGSFileConverter::convertGLI2GML(const QStringList& input,
78 const QString& output) const
79{
80 if (input.empty())
81 {
82 return;
83 }
84
85 GeoLib::GEOObjects geo_objects;
86 GeoLib::IO::XmlGmlInterface xml(geo_objects);
87
88 for (const auto& input_string : input)
89 {
90 const QFileInfo fi(input_string);
91 const std::string output_str =
92 QString(output + "/" + fi.completeBaseName() + ".gml")
93 .toStdString();
94
95 if (fileExists(output_str))
96 {
97 continue;
98 }
99
100 std::string unique_name;
101 std::vector<std::string> errors;
102
103 FileIO::Legacy::readGLIFileV4(input_string.toStdString(), geo_objects,
104 unique_name, errors, _gmsh_path);
105 if (errors.empty() ||
106 (errors.size() == 1 &&
107 errors[0] == "[readSurface] polyline for surface not found!"))
108 {
109 std::string const geo_name =
110 BaseLib::extractBaseName(input_string.toStdString());
111 xml.export_name = geo_name;
113 geo_objects.removeSurfaceVec(geo_name);
114 geo_objects.removePolylineVec(geo_name);
115 geo_objects.removePointVec(geo_name);
116 }
117 else
118 {
119 for (auto& error : errors)
120 {
121 OGSError::box(QString::fromStdString(error));
122 }
123 }
124 }
125 OGSError::box("File conversion finished");
126}
127
128void OGSFileConverter::convertVTU2MSH(const QStringList& input,
129 const QString& output) const
130{
131 if (input.empty())
132 {
133 return;
134 }
135
136 for (const auto& input_string : input)
137 {
138 const QFileInfo fi(input_string);
139 const std::string output_str =
140 QString(output + "/" + fi.completeBaseName() + ".msh")
141 .toStdString();
142
143 if (fileExists(output_str))
144 {
145 continue;
146 }
147
148 MeshLib::Mesh const* const mesh(
149 MeshLib::IO::VtuInterface::readVTUFile(input_string.toStdString()));
150 if (mesh == nullptr)
151 {
152 OGSError::box("Error reading mesh " + fi.fileName());
153 continue;
154 }
156 meshIO.setMesh(mesh);
157 BaseLib::IO::writeStringToFile(meshIO.writeToString(), output_str);
158 delete mesh;
159 }
160 OGSError::box("File conversion finished");
161}
162
163void OGSFileConverter::convertMSH2VTU(const QStringList& input,
164 const QString& output) const
165{
166 if (input.empty())
167 {
168 return;
169 }
170
171 for (const auto& input_string : input)
172 {
173 const QFileInfo fi(input_string);
174 const std::string output_str =
175 QString(output + "/" + fi.completeBaseName() + ".vtu")
176 .toStdString();
177
178 if (fileExists(output_str))
179 {
180 continue;
181 }
182
184 MeshLib::Mesh const* const mesh(
185 meshIO.loadMeshFromFile(input_string.toStdString()));
186 if (mesh == nullptr)
187 {
188 OGSError::box("Error reading mesh " + fi.fileName());
189 continue;
190 }
192 vtu.writeToFile(output_str);
193 delete mesh;
194 }
195 OGSError::box("File conversion finished");
196}
197
199{
201 if (dlg.exec())
202 {
204 }
205}
206
208{
210 if (dlg.exec())
211 {
213 }
214}
215
217{
219 if (dlg.exec())
220 {
222 }
223}
224
226{
228 if (dlg.exec())
229 {
231 }
232}
233
235{
236 this->close();
237}
238
239bool OGSFileConverter::fileExists(const std::string& file_name) const
240{
241 std::ifstream const file(file_name.c_str());
242 if (file)
243 {
244 QString const name =
245 QString::fromStdString(BaseLib::extractBaseName(file_name));
246 return !OGSError::question(
247 "The file '" + name +
248 "' already exists.\n Do you want to overwrite it?",
249 "Warning");
250 }
251 return false;
252}
std::string writeToString()
Writes the object to a string.
Definition Writer.cpp:20
const QStringList getInputFileList() const
Returns list of all selected files.
const QString getOutputDir() const
Returns selected output directory.
Container class for geometric objects.
Definition GEOObjects.h:46
std::vector< std::string > getGeometryNames() const
Returns the names of all geometry vectors.
bool removePointVec(const std::string &name)
bool removeSurfaceVec(const std::string &name)
bool removePolylineVec(const std::string &name)
Reads and writes GeoObjects to and from XML files.
int readFile(const QString &fileName) override
Reads an xml-file containing geometric object definitions into the GEOObjects used in the constructor...
Interface for handling mesh files from OGS-5 and below. (*.msh files)
Definition MeshIO.h:26
MeshLib::Mesh * loadMeshFromFile(const std::string &file_name)
Read mesh from file.
Definition MeshIO.cpp:267
void setMesh(const MeshLib::Mesh *mesh)
Set mesh for writing.
Definition MeshIO.cpp:427
Reads and writes VtkXMLUnstructuredGrid-files (vtu) to and from OGS data structures....
static MeshLib::Mesh * readVTUFile(std::string const &file_name, bool const compute_element_neighbors=false)
bool writeToFile(std::filesystem::path const &file_path)
static void box(const QString &e)
Definition OGSError.cpp:13
static bool question(const QString &e, const QString &t)
Definition OGSError.cpp:26
bool fileExists(const std::string &file_name) const
Checks if a given file already exists.
void on_vtu2mshButton_pressed() const
void convertGLI2GML(const QStringList &input, const QString &output) const
std::string const _gmsh_path
void on_msh2vtuButton_pressed() const
OGSFileConverter(std::string const &gmsh_path, QWidget *parent=nullptr)
Constructor.
void on_gml2gliButton_pressed() const
~OGSFileConverter() override
Destructor.
void convertVTU2MSH(const QStringList &input, const QString &output) const
void convertGML2GLI(const QStringList &input, const QString &output) const
Converts all files in the input list and writes the new files to the output directory with the same f...
void convertMSH2VTU(const QStringList &input, const QString &output) const
void on_gli2gmlButton_pressed() const
int writeStringToFile(std::string_view content, std::filesystem::path const &file_path)
Definition Writer.cpp:34
std::string extractBaseName(std::string const &pathname)
bool readGLIFileV4(const std::string &fname, GeoLib::GEOObjects &geo, std::string &unique_name, std::vector< std::string > &errors, std::string const &gmsh_path)
void writeGLIFileV4(const std::string &fname, const std::string &geo_name, const GeoLib::GEOObjects &geo)