OGS
GEOObjects.h
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#pragma once
5
6#include <functional>
7#include <map>
8#include <string>
9#include <vector>
10
11#include "GeoType.h"
12#include "Point.h"
13#include "PointVec.h"
14#include "Polyline.h"
15#include "PolylineVec.h"
16#include "Surface.h"
17#include "SurfaceVec.h"
18
21namespace GeoLib
22{
45class GEOObjects final
46{
47public:
48 struct Callbacks
49 {
50 virtual void addPointVec(std::string const& /*unused*/) {}
51 virtual void removePointVec(std::string const& /*unused*/) {}
52 virtual void addStationVec(std::string const& /*unused*/) {}
53 virtual void removeStationVec(std::string const& /*unused*/) {}
54 virtual void addPolylineVec(std::string const& /*unused*/) {}
55 virtual void appendPolylineVec(std::string const& /*unused*/) {}
56 virtual void removePolylineVec(std::string const& /*unused*/) {}
57 virtual void addSurfaceVec(std::string const& /*unused*/) {}
58 virtual void appendSurfaceVec(std::string const& /*unused*/) {}
59 virtual void removeSurfaceVec(std::string const& /*unused*/) {}
60 virtual void renameGeometry(std::string const& /*unused*/,
61 std::string const& /*unused*/)
62 {
63 }
64 virtual ~Callbacks() = default;
65 };
66
67public:
75 void addPointVec(
76 std::vector<Point*>&& points, std::string& name,
77 PointVec::NameIdMap&& pnt_id_name_map,
78 double const eps = std::sqrt(std::numeric_limits<double>::epsilon()));
79
87 void addPointVec(
88 std::vector<Point*>&& points, std::string& name,
89 double const eps = std::sqrt(std::numeric_limits<double>::epsilon()));
90
94 const std::vector<Point*>* getPointVec(const std::string& name) const;
95
101 const PointVec* getPointVecObj(const std::string& name) const;
102
104 PointVec* getPointVecObj(const std::string& name)
105 {
106 return const_cast<PointVec*>(
107 static_cast<const GEOObjects&>(*this).getPointVecObj(name));
108 }
109
114 bool removePointVec(const std::string& name);
115
117 void addStationVec(std::vector<Point*>&& stations, std::string& name);
118
120 const std::vector<GeoLib::Point*>* getStationVec(
121 const std::string& name) const;
122
124 bool removeStationVec(const std::string& name)
125 {
126 _callbacks->removeStationVec(name);
127 return removePointVec(name);
128 }
129
138 void addPolylineVec(std::vector<Polyline*>&& lines,
139 std::string const& name,
140 PolylineVec::NameIdMap&& ply_names);
141
149 bool appendPolylineVec(const std::vector<Polyline*>& polylines,
150 const std::string& name);
151
155 const std::vector<Polyline*>* getPolylineVec(const std::string& name) const;
156
162 const PolylineVec* getPolylineVecObj(const std::string& name) const;
163
165 PolylineVec* getPolylineVecObj(const std::string& name)
166 {
167 return const_cast<PolylineVec*>(
168 static_cast<const GEOObjects&>(*this).getPolylineVecObj(name));
169 }
170
176 bool removePolylineVec(const std::string& name);
177
179 void addSurfaceVec(std::vector<Surface*>&& sfc,
180 const std::string& name,
181 SurfaceVec::NameIdMap&& sfc_names);
182
190 bool appendSurfaceVec(const std::vector<Surface*>& surfaces,
191 const std::string& name);
192
194 const std::vector<Surface*>* getSurfaceVec(const std::string& name) const;
195
197 SurfaceVec* getSurfaceVecObj(const std::string& name)
198 {
199 return const_cast<SurfaceVec*>(
200 static_cast<const GEOObjects&>(*this).getSurfaceVecObj(name));
201 }
202
204 bool removeSurfaceVec(const std::string& name);
212 const SurfaceVec* getSurfaceVecObj(const std::string& name) const;
213
215 std::vector<std::string> getGeometryNames() const;
216
217 std::string getElementNameByID(const std::string& geometry_name,
218 GeoLib::GEOTYPE type, std::size_t id) const;
219
221 void getStationVectorNames(std::vector<std::string>& names) const;
222
232 bool isUniquePointVecName(std::string& name) const;
233
243 int mergeGeometries(std::vector<std::string> const& geo_names,
244 std::string& merged_geo_name);
245
250 void renameGeometry(std::string const& old_name,
251 std::string const& new_name);
252
256 const std::string& geo_name,
257 GeoLib::GEOTYPE type,
258 const std::string& geo_obj_name) const;
259
261 // It is required that a tuple is a unique key for a geometric object!
262 // If there is another geo object with same name one of them is returned.
263 // In theory different types of geometric objects can have the same name.
264 // For instance it is possible that a point object and a polyline object
265 // share the same name. If there exists several objects sharing the same
266 // name the first object found will be returned.
267 // @param geo_name name of geometry
268 // @param geo_obj_name name of the geo object
270 const std::string& geo_name, const std::string& geo_obj_name) const;
271
275 ~GEOObjects();
276
279 std::size_t exists(const std::string& geometry_name) const;
280
283 bool isPntVecUsed(const std::string& name) const;
284
286 std::vector<PointVec*> const& getPoints() const { return _pnt_vecs; }
288 std::vector<PolylineVec*> const& getPolylines() const { return _ply_vecs; }
290 std::vector<SurfaceVec*> const& getSurfaces() const { return _sfc_vecs; }
291
292 std::unique_ptr<Callbacks> _callbacks{new Callbacks};
293
294 std::function<void(std::string const&)> addPolylineVecCallback =
295 [](std::string const& /*unused*/) {};
296
297 std::function<void(std::string const&)> appendPolylineVecCallback =
298 [](std::string const& /*unused*/) {};
299
300 std::function<void(std::string const&)> removePolylineVecCallback =
301 [](std::string const& /*unused*/) {};
302
303 std::function<void(std::string const&)> addSurfaceVecCallback =
304 [](std::string const& /*unused*/) {};
305
306 std::function<void(std::string const&)> appendSurfaceVecCallback =
307 [](std::string const& /*unused*/) {};
308
309 std::function<void(std::string const&)> removeSurfaceVecCallback =
310 [](std::string const& /*unused*/) {};
311
312private:
321 void mergePoints(std::vector<std::string> const& geo_names,
322 std::string& merged_geo_name,
323 std::vector<std::size_t>& pnt_offsets);
324
337 void mergePolylines(std::vector<std::string> const& geo_names,
338 std::string const& merged_geo_name,
339 std::vector<std::size_t> const& pnt_offsets);
340
351 void mergeSurfaces(std::vector<std::string> const& geo_names,
352 std::string const& merged_geo_name,
353 std::vector<std::size_t> const& pnt_offsets);
354
356 std::vector<PointVec*> _pnt_vecs;
358 std::vector<PolylineVec*> _ply_vecs;
360 std::vector<SurfaceVec*> _sfc_vecs;
361};
362
364// @param geo_obj geometry manager object
365// @param geo_name name of the geometry
366// @param stn_name name of the new station vector
367// @param only_usused_pnts if true only points not in a line or surface are
368// transferred, otherwise all points
369int geoPointsToStations(GEOObjects& geo_objects, std::string const& geo_name,
370 std::string& stn_name,
371 bool const only_unused_pnts = true);
372} // namespace GeoLib
Container class for geometric objects.
Definition GEOObjects.h:46
void mergeSurfaces(std::vector< std::string > const &geo_names, std::string const &merged_geo_name, std::vector< std::size_t > const &pnt_offsets)
std::function< void(std::string const &)> appendSurfaceVecCallback
Definition GEOObjects.h:306
std::size_t exists(const std::string &geometry_name) const
PointVec * getPointVecObj(const std::string &name)
Returns a pointer to a PointVec object for the given name.
Definition GEOObjects.h:104
void mergePolylines(std::vector< std::string > const &geo_names, std::string const &merged_geo_name, std::vector< std::size_t > const &pnt_offsets)
std::function< void(std::string const &)> addSurfaceVecCallback
Definition GEOObjects.h:303
std::vector< std::string > getGeometryNames() const
Returns the names of all geometry vectors.
void addPolylineVec(std::vector< Polyline * > &&lines, std::string const &name, PolylineVec::NameIdMap &&ply_names)
bool appendSurfaceVec(const std::vector< Surface * > &surfaces, const std::string &name)
const std::vector< Point * > * getPointVec(const std::string &name) const
void addPointVec(std::vector< Point * > &&points, std::string &name, PointVec::NameIdMap &&pnt_id_name_map, double const eps=std::sqrt(std::numeric_limits< double >::epsilon()))
std::vector< PolylineVec * > const & getPolylines() const
Read access to polylines w/o using a name.
Definition GEOObjects.h:288
const PointVec * getPointVecObj(const std::string &name) const
void renameGeometry(std::string const &old_name, std::string const &new_name)
std::function< void(std::string const &)> addPolylineVecCallback
Definition GEOObjects.h:294
bool removePointVec(const std::string &name)
bool isUniquePointVecName(std::string &name) const
bool removeSurfaceVec(const std::string &name)
void addStationVec(std::vector< Point * > &&stations, std::string &name)
Adds a vector of stations with the given name and colour to GEOObjects.
void mergePoints(std::vector< std::string > const &geo_names, std::string &merged_geo_name, std::vector< std::size_t > &pnt_offsets)
SurfaceVec * getSurfaceVecObj(const std::string &name)
Returns the surface vector with the given name.
Definition GEOObjects.h:197
PolylineVec * getPolylineVecObj(const std::string &name)
Returns a pointer to a PolylineVec object for the given name.
Definition GEOObjects.h:165
const std::vector< Surface * > * getSurfaceVec(const std::string &name) const
Returns the surface vector with the given name as a const.
std::vector< PointVec * > _pnt_vecs
Definition GEOObjects.h:356
std::function< void(std::string const &)> appendPolylineVecCallback
Definition GEOObjects.h:297
std::vector< PolylineVec * > _ply_vecs
Definition GEOObjects.h:358
std::unique_ptr< Callbacks > _callbacks
Definition GEOObjects.h:292
std::vector< PointVec * > const & getPoints() const
Read access to points w/o using a name.
Definition GEOObjects.h:286
void addSurfaceVec(std::vector< Surface * > &&sfc, const std::string &name, SurfaceVec::NameIdMap &&sfc_names)
bool isPntVecUsed(const std::string &name) const
const PolylineVec * getPolylineVecObj(const std::string &name) const
bool removeStationVec(const std::string &name)
Removes the station vector with the given name from GEOObjects.
Definition GEOObjects.h:124
int mergeGeometries(std::vector< std::string > const &geo_names, std::string &merged_geo_name)
void getStationVectorNames(std::vector< std::string > &names) const
Returns the names of all station vectors.
const std::vector< Polyline * > * getPolylineVec(const std::string &name) const
std::function< void(std::string const &)> removePolylineVecCallback
Definition GEOObjects.h:300
bool appendPolylineVec(const std::vector< Polyline * > &polylines, const std::string &name)
std::function< void(std::string const &)> removeSurfaceVecCallback
Definition GEOObjects.h:309
std::vector< SurfaceVec * > _sfc_vecs
Definition GEOObjects.h:360
std::vector< SurfaceVec * > const & getSurfaces() const
Read access to surfaces w/o using a name.
Definition GEOObjects.h:290
const GeoLib::GeoObject * getGeoObject(const std::string &geo_name, GeoLib::GEOTYPE type, const std::string &geo_obj_name) const
const std::vector< GeoLib::Point * > * getStationVec(const std::string &name) const
Returns the station vector with the given name.
bool removePolylineVec(const std::string &name)
std::string getElementNameByID(const std::string &geometry_name, GeoLib::GEOTYPE type, std::size_t id) const
This class manages pointers to Points in a std::vector along with a name. It also handles the deletio...
Definition PointVec.h:25
std::map< std::string, std::size_t > NameIdMap
Definition TemplateVec.h:30
int geoPointsToStations(GEOObjects &geo_objects, std::string const &geo_name, std::string &stn_name, bool const only_unused_pnts)
Constructs a station-vector based on the points of a given geometry.
GEOTYPE
Definition GeoType.h:12
TemplateVec< GeoLib::Surface > SurfaceVec
Definition SurfaceVec.h:17
TemplateVec< GeoLib::Polyline > PolylineVec
class PolylineVec encapsulate a std::vector of Polylines additional one can give the vector of polyli...
Definition PolylineVec.h:16
virtual void renameGeometry(std::string const &, std::string const &)
Definition GEOObjects.h:60
virtual void appendSurfaceVec(std::string const &)
Definition GEOObjects.h:58
virtual void removePolylineVec(std::string const &)
Definition GEOObjects.h:56
virtual void addSurfaceVec(std::string const &)
Definition GEOObjects.h:57
virtual void addStationVec(std::string const &)
Definition GEOObjects.h:52
virtual void removeSurfaceVec(std::string const &)
Definition GEOObjects.h:59
virtual void appendPolylineVec(std::string const &)
Definition GEOObjects.h:55
virtual ~Callbacks()=default
virtual void addPointVec(std::string const &)
Definition GEOObjects.h:50
virtual void removeStationVec(std::string const &)
Definition GEOObjects.h:53
virtual void removePointVec(std::string const &)
Definition GEOObjects.h:51
virtual void addPolylineVec(std::string const &)
Definition GEOObjects.h:54