72{
73 TCLAP::CmdLine cmd(
74 "Computes ids of mesh nodes that are in polygonal regions and resides "
75 "on the top surface. The polygonal regions have to be given in a gml- "
76 "or gli-file. The found mesh nodes and the associated area are written "
77 "as txt and csv data. The documentation is available at "
78 "https://docs.opengeosys.org/docs/tools/model-preparation/"
79 "computesurfacenodeidsinpolygonalregion.\n\n"
80 "OpenGeoSys-6 software, version " +
82 ".\n"
83 "Copyright (c) 2012-2025, OpenGeoSys Community "
84 "(http://www.opengeosys.org)",
86 TCLAP::ValueArg<std::string> mesh_in(
87 "m", "mesh-input-file",
88 "the name of the file containing the input mesh", true, "",
89 "file name of input mesh");
90 cmd.add(mesh_in);
91 TCLAP::ValueArg<std::string> geo_in(
92 "g", "geo-file", "the name of the gml file containing the polygons",
93 true, "", "file name of input geometry");
94 cmd.add(geo_in);
95
96 TCLAP::ValueArg<std::string> gmsh_path_arg("", "gmsh-path",
97 "the path to the gmsh binary",
98 false, "", "path as string");
99 cmd.add(gmsh_path_arg);
100 cmd.parse(argc, argv);
101
103
104 std::unique_ptr<MeshLib::Mesh const> mesh(
106 INFO(
"Mesh read: {:d} nodes, {:d} elements.", mesh->getNumberOfNodes(),
107 mesh->getNumberOfElements());
108
111 gmsh_path_arg.getValue());
113 INFO(
"Geometry '{:s}' read: {:d} points, {:d} polylines.",
114 geo_name,
117
118 Eigen::Vector3d const dir({0.0, 0.0, -1.0});
119 double angle(90);
120
121 auto computeElementTopSurfaceAreas =
122 [](
MeshLib::Mesh const& mesh, Eigen::Vector3d
const& d,
double angle)
123 {
124 std::unique_ptr<MeshLib::Mesh> surface_mesh(
126 angle));
128 *surface_mesh);
129 };
130
131 std::vector<double> areas(computeElementTopSurfaceAreas(*mesh, dir, angle));
132 std::vector<MeshLib::Node*> all_sfc_nodes(
134 angle));
135
136 std::for_each(all_sfc_nodes.begin(), all_sfc_nodes.end(),
138
139 std::vector<MeshLib::Node*>
const& mesh_nodes(mesh->
getNodes());
141 auto const& plys(ply_vec->getVector());
142
143 for (std::size_t j(0); j < plys.size(); j++)
144 {
145 if (!plys[j]->isClosed())
146 {
147 continue;
148 }
149 std::string polygon_name;
150 ply_vec->getNameOfElement(plys[j], polygon_name);
151 if (polygon_name.empty())
152 {
153 polygon_name = "Polygon-" + std::to_string(j);
154 }
155
157
158 std::vector<std::pair<std::size_t, double>> ids_and_areas;
159 for (std::size_t k(0); k < all_sfc_nodes.size(); k++)
160 {
162 if (polygon.isPntInPolygon(surface_node))
163 {
164 ids_and_areas.emplace_back(surface_node.getID(), areas[k]);
165 }
166 }
167 if (ids_and_areas.empty())
168 {
169 ERR(
"Polygonal part of surface '{:s}' doesn't contains nodes. No "
170 "output will be generated.",
171 polygon_name);
172 continue;
173 }
174
176 std::string id_and_area_fname(out_path + polygon_name);
177 std::string csv_fname(out_path + polygon_name);
178 id_and_area_fname += std::to_string(j) + ".txt";
179 csv_fname += std::to_string(j) + ".csv";
181 "Polygonal part of surface '{}' contains {} nodes. Writing to "
182 "files '{}' and '{}'.",
183 polygon_name,
184 ids_and_areas.size(),
185 id_and_area_fname,
186 csv_fname);
187 writeToFile(id_and_area_fname, csv_fname, ids_and_areas, mesh_nodes);
188 }
189
190 std::for_each(all_sfc_nodes.begin(), all_sfc_nodes.end(),
191 std::default_delete<MeshLib::Node>());
192
193 return EXIT_SUCCESS;
194}
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Container class for geometric objects.
std::vector< std::string > getGeometryNames() const
Returns the names of all geometry vectors.
const std::vector< Point * > * getPointVec(const std::string &name) const
const PolylineVec * getPolylineVecObj(const std::string &name) const
const std::vector< Polyline * > * getPolylineVec(const std::string &name) const
The class TemplateVec takes a unique name and manages a std::vector of pointers to data elements of t...
std::vector< Node * > const & getNodes() const
Get the nodes-vector for the mesh.
void writeToFile(std::string const &id_area_fname, std::string const &csv_fname, std::vector< std::pair< std::size_t, double > > const &ids_and_areas, std::vector< MeshLib::Node * > const &mesh_nodes)
std::string extractPath(std::string const &pathname)
void readGeometryFromFile(std::string const &fname, GeoLib::GEOObjects &geo_objs, std::string const &gmsh_path)
GITINFOLIB_EXPORT const std::string ogs_version
MeshLib::Mesh * readMeshFromFile(const std::string &file_name, bool const compute_element_neighbors)