25int main(
int argc,
char* argv[])
28 "Creates a boundary representation for a layered 3D mesh in "
29 "*.smesh-format. This boundary representation can be used with the "
30 "TetGen Tetrahedral Mesh Generator to create 3D meshes of the given "
31 "geometry at arbitrary resolutions and with varying properties. "
32 "Details on command line switches and possible parametrisation can be "
33 "found in the TetGen User's Manual. Supported raster formats are "
34 "ArcGIS ascii rasters (*.asc), Surfer Grids (*.grd) and XYZ raster "
36 "Only input meshes consisting of line and triangle elements are "
37 "currently supported as mapping of quads might result in invalid mesh "
39 "OpenGeoSys-6 software, version " +
42 "Copyright (c) 2012-2026, OpenGeoSys Community "
43 "(http://www.opengeosys.org)",
46 TCLAP::SwitchArg use_ascii_arg(
"",
"ascii_output",
47 "Write VTU output in ASCII format.");
48 cmd.add(use_ascii_arg);
50 double min_thickness(std::numeric_limits<double>::epsilon());
51 TCLAP::ValueArg<double> min_thickness_arg(
53 "The minimum thickness of a layer to be integrated at any given "
55 false, min_thickness,
"MIN_THICKNESS");
56 cmd.add(min_thickness_arg);
58 TCLAP::ValueArg<std::string> raster_path_arg(
60 "Input (.vtu). An ascii-file containing a list of raster files, "
63 true,
"",
"INPUT_FILE_LIST");
64 cmd.add(raster_path_arg);
66 TCLAP::ValueArg<std::string> mesh_out_arg(
67 "o",
"output-mesh-file",
68 "Output (.smesh). The file name of the resulting 3D mesh",
true,
"",
70 cmd.add(mesh_out_arg);
72 TCLAP::ValueArg<std::string> mesh_arg(
73 "i",
"input-mesh-file",
74 "Input (.vtu | .msh). The file name of the 2D input mesh",
true,
"",
79 cmd.add(log_level_arg);
81 cmd.parse(argc, argv);
86 if (min_thickness_arg.isSet())
88 min_thickness = min_thickness_arg.getValue();
89 if (min_thickness < 0)
91 ERR(
"Minimum layer thickness must be non-negative value.");
96 INFO(
"Reading mesh '{:s}' ... ", mesh_arg.getValue());
98 mesh_arg.getValue(),
true ));
101 ERR(
"Error reading mesh '{:s}'.", mesh_arg.getValue());
104 if (sfc_mesh->getDimension() != 2)
106 ERR(
"Input mesh must be a 2D mesh.");
111 std::vector<std::string> raster_paths =
113 if (raster_paths.size() < 2)
115 ERR(
"At least two raster files needed to create 3D mesh.");
118 std::reverse(raster_paths.begin(), raster_paths.end());
120 std::string output_name(mesh_out_arg.getValue());
123 output_name.append(
".smesh");
130 if (!lv.
createLayers(*sfc_mesh, *rasters, min_thickness))
132 ERR(
"Creating the layers was erroneous.");
138 ERR(
"The raster files are not accessible.");
141 std::unique_ptr<MeshLib::Mesh> tg_mesh =
142 lv.
getMesh(
"BoundaryRepresentation");
143 if (tg_mesh !=
nullptr)
148 INFO(
"Smesh was successfully written.");
152 ERR(
"The tetgen-smesh could not be created.");