41{
42 TCLAP::CmdLine cmd(
43 "Takes a mesh with multiple MaterialIDs and writes elements of a given "
44 "ID into a new mesh. If no ID is specified, meshes for each existing "
45 "MaterialID are created.\n\n"
46 "OpenGeoSys-6 software, version " +
48 ".\n"
49 "Copyright (c) 2012-2025, OpenGeoSys Community "
50 "(http://www.opengeosys.org)",
52 TCLAP::ValueArg<std::size_t> arg_mat_id(
53 "m", "material-id",
54 "The MaterialID for which elements should be extracted into a new "
55 "mesh.",
56 false, 0, "Number specifying the MaterialID");
57 cmd.add(arg_mat_id);
58 TCLAP::ValueArg<std::string> output_arg("o", "output",
59 "Name of the output mesh (*.vtu)",
60 true, "", "output file name");
61 cmd.add(output_arg);
62 TCLAP::ValueArg<std::string> input_arg("i", "input",
63 "Name of the input mesh (*.vtu)",
64 true, "", "input file name");
65 cmd.add(input_arg);
66 cmd.parse(argc, argv);
67
69
70 std::string const input_name = input_arg.getValue();
71 std::string const output_name = output_arg.getValue();
74
75 std::unique_ptr<MeshLib::Mesh> const mesh(
77 if (mesh == nullptr)
78 {
79 ERR(
"Error reading input mesh. Aborting...");
80 return EXIT_FAILURE;
81 }
82
84 if (mat_ids == nullptr)
85 {
86 ERR(
"No material IDs found in mesh. Aborting...");
87 return EXIT_FAILURE;
88 }
89
90 auto const [min, max] = ranges::minmax(*mat_ids);
91 if (min == max)
92 {
93 ERR(
"Mesh only contains one material, no extraction required.");
94 return EXIT_FAILURE;
95 }
96 int min_id, max_id;
97 if (arg_mat_id.isSet())
98 {
99 min_id = static_cast<int>(arg_mat_id.getValue());
100 if (min_id < min || min_id > max)
101 {
102 ERR(
"Specified material ID does not exist.");
103 return EXIT_FAILURE;
104 }
105 max_id = min_id;
106 }
107 else
108 {
109 min_id = min;
110 max_id = max;
111 }
112
113 std::ofstream ostream;
114 if (min_id != max_id)
115 {
116 ostream.open(base_name + "_Layers.txt");
117 }
118
119 for (int i = min_id; i <= max_id; ++i)
120 {
121 INFO(
"Extracting material group {:d}...", i);
123 if (mat_group == nullptr)
124 {
125 WARN(
"No elements with material group {:d} found.", i);
126 continue;
127 }
129 std::string const file_name(base_name + "_Layer" + std::to_string(i) +
130 ext);
131 vtu.writeToFile(file_name);
132 if (ostream.is_open())
133 {
134 ostream << file_name << "\n";
135 }
136 }
137 if (ostream.is_open())
138 {
139 ostream.close();
140 }
141 return EXIT_SUCCESS;
142}
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
Reads and writes VtkXMLUnstructuredGrid-files (vtu) to and from OGS data structures....
std::string getFileExtension(const std::string &path)
std::string dropFileExtension(std::string const &filename)
GITINFOLIB_EXPORT const std::string ogs_version
MeshLib::Mesh * readMeshFromFile(const std::string &file_name, bool const compute_element_neighbors)
PropertyVector< int > const * materialIDs(Mesh const &mesh)