FlightGear next
positioned.hxx
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: (C) 2008 James Turner <james@flightgear.org>
3 * SPDX_FileComment: base class for objects which are spatially located in the simulated world
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#pragma once
8
9#include <cassert>
10#include <string>
11#include <vector>
12#include <stdint.h>
13
14#include <simgear/sg_inlines.h>
15#include <simgear/structure/SGSharedPtr.hxx>
16#include <simgear/math/SGMath.hxx>
17
18class FGPositioned;
19typedef SGSharedPtr<FGPositioned> FGPositionedRef;
20typedef std::vector<FGPositionedRef> FGPositionedList;
21
22typedef int64_t PositionedID;
23typedef std::vector<PositionedID> PositionedIDVec;
24
25namespace flightgear { class NavDataCache; }
26
27class FGPositioned : public SGReferenced
28{
29public:
81
82 virtual ~FGPositioned();
83
84 Type type() const
85 {
86 return mType;
87 }
88
89 // True for the following types: AIRPORT, HELIPORT, SEAPORT.
90 // False for other types, as well as if pos == nullptr.
91 static bool isAirportType(FGPositioned* pos);
92 // True for the following type: RUNWAY.
93 // False for other types, as well as if pos == nullptr.
94 static bool isRunwayType(FGPositioned* pos);
95 // True for the following types: NDB, VOR, ILS, LOC, GS, DME, TACAN.
96 // False for other types, as well as if pos == nullptr.
97 static bool isNavaidType(FGPositioned* pos);
98
99 const char* typeString() const
100 { return nameForType(mType); }
101
102 const std::string& ident() const
103 { return mIdent; }
104
110 virtual const std::string& name() const
111 { return mIdent; }
112
113 virtual const SGGeod& geod() const
114 { return mPosition; }
115
117 { return mGuid; }
118
122 virtual const SGVec3d& cart() const;
123
124 double latitude() const
125 { return geod().getLatitudeDeg(); }
126
127 double longitude() const
128 { return geod().getLongitudeDeg(); }
129
130 double elevation() const
131 { return geod().getElevationFt(); }
132
133 double elevationM() const
134 { return geod().getElevationM(); }
135
140 class Filter
141 {
142 public:
143 virtual ~Filter() { ; }
144
148 virtual bool pass(FGPositioned* aPos) const
149 { return true; }
150
151 virtual Type minType() const
152 { return INVALID; }
153
154 virtual Type maxType() const
155 { return INVALID; }
156
157
158 bool operator()(FGPositioned* aPos) const
159 { return pass(aPos); }
160 };
161
162 class TypeFilter : public Filter
163 {
164 public:
165 TypeFilter(Type aTy = INVALID);
166
167 TypeFilter(std::initializer_list<Type> types);
168
175 TypeFilter(Type aMinType, Type aMaxType);
176
177 bool pass(FGPositioned* aPos) const override;
178
179 Type minType() const override
180 { return mMinType; }
181
182 Type maxType() const override
183 { return mMaxType; }
184
185 void addType(Type aTy);
186
187 static TypeFilter fromString(const std::string& aFilterSpec);
188 private:
189
190 std::vector<Type> types;
191 Type mMinType = LAST_TYPE,
192 mMaxType = INVALID;
193 };
194
195 static FGPositionedList findWithinRange(const SGGeod& aPos, double aRangeNm, Filter* aFilter);
196
197 static FGPositionedList findWithinRangePartial(const SGGeod& aPos, double aRangeNm, Filter* aFilter, bool& aPartial);
198
199 static FGPositionedRef findClosestWithIdent(const std::string& aIdent, const SGGeod& aPos, Filter* aFilter = NULL);
200
201 static FGPositionedRef findFirstWithIdent(const std::string& aIdent, Filter* aFilter);
202
207 static FGPositionedList findAllWithIdent(const std::string& aIdent, Filter* aFilter = NULL, bool aExact = true);
208
212 static FGPositionedList findAllWithName(const std::string& aName, Filter* aFilter = NULL, bool aExact = true);
213
217 static void sortByRange(FGPositionedList&, const SGGeod& aPos);
218
227 static FGPositionedRef findClosest(const SGGeod& aPos, double aCutoffNm, Filter* aFilter = NULL);
228
239 static FGPositionedList findClosestN(const SGGeod& aPos, unsigned int aN, double aCutoffNm, Filter* aFilter = NULL);
240
244 static FGPositionedList findClosestNPartial(const SGGeod& aPos, unsigned int aN, double aCutoffNm, Filter* aFilter,
245 bool& aPartial);
246
247 template<class T>
248 static SGSharedPtr<T> loadById(PositionedID id)
249 {
250 return static_pointer_cast<T>( loadByIdImpl(id) );
251 }
252
253 template<class T>
254 static SGSharedPtr<T> loadById(const PositionedIDVec& id_vec, size_t index)
255 {
256 assert(index >= 0 && index < id_vec.size());
257 return loadById<T>(id_vec[index]);
258 }
259
260 template<class T>
261 static std::vector<SGSharedPtr<T> > loadAllById(const PositionedIDVec& id_vec)
262 {
263 std::vector<SGSharedPtr<T> > vec(id_vec.size());
264
265 for(size_t i = 0; i < id_vec.size(); ++i)
266 vec[i] = loadById<T>(id_vec[i]);
267
268 return vec;
269 }
270
275 static Type typeFromName(const std::string& aName);
276
280 static const char* nameForType(Type aTy);
281
282 static FGPositionedRef createWaypoint(FGPositioned::Type aType, const std::string& aIdent, const SGGeod& aPos,
283 bool isTemporary = false,
284 const std::string& aName = {});
285 static bool deleteWaypoint(FGPositionedRef aWpt);
286protected:
288
289 FGPositioned(PositionedID aGuid, Type ty, const std::string& aIdent, const SGGeod& aPos);
290
291 // called by NavDataCache::updatePosition
292 void modifyPosition(const SGGeod& newPos);
293 void invalidatePosition();
294
296
298 const Type mType;
299 const std::string mIdent;
300
301private:
302 SG_DISABLE_COPY(FGPositioned);
303
304 const SGGeod mPosition;
305 const SGVec3d mCart;
306};
307
308
309
310template <class T>
312{
313 if (T::isType(p->type())) {
314 return static_cast<T*>(p);
315 }
316
317 return nullptr;
318}
319
320template <class T>
322{
323 if (!p) return nullptr;
324
325 if (T::isType(p->type())) {
326 return static_cast<T*>(p.ptr());
327 }
328
329 return nullptr;
330}
331
332class POI : public FGPositioned
333{
334public:
335 POI(PositionedID aGuid, Type ty, const std::string& aIdent, const SGGeod& aPos, const std::string& aName);
336
337 const std::string& name() const override
338 {
339 return mName;
340 }
341
342 static bool isType(FGPositioned::Type ty);
343
344 private:
345 std::string mName;
346};
#define p(x)
#define i(x)
SGSharedPtr< FGPositioned > FGPositionedRef
Definition airways.hxx:30
Predicate class to support custom filtering of FGPositioned queries Default implementation of this pa...
bool operator()(FGPositioned *aPos) const
virtual Type maxType() const
virtual Type minType() const
virtual bool pass(FGPositioned *aPos) const
Over-rideable filter method.
Type minType() const override
bool pass(FGPositioned *aPos) const override
Over-rideable filter method.
TypeFilter(Type aTy=INVALID)
static TypeFilter fromString(const std::string &aFilterSpec)
Type maxType() const override
static Type typeFromName(const std::string &aName)
Map a candidate type string to a real type.
static FGPositionedList findAllWithName(const std::string &aName, Filter *aFilter=NULL, bool aExact=true)
As above, but searches names instead of idents.
static bool isRunwayType(FGPositioned *pos)
FGPositioned(PositionedID aGuid, Type ty, const std::string &aIdent, const SGGeod &aPos)
static FGPositionedRef createWaypoint(FGPositioned::Type aType, const std::string &aIdent, const SGGeod &aPos, bool isTemporary=false, const std::string &aName={})
static SGSharedPtr< T > loadById(const PositionedIDVec &id_vec, size_t index)
virtual const std::string & name() const
Return the name of this positioned.
double longitude() const
PositionedID guid() const
static FGPositionedRef findClosestWithIdent(const std::string &aIdent, const SGGeod &aPos, Filter *aFilter=NULL)
void modifyPosition(const SGGeod &newPos)
const std::string mIdent
const char * typeString() const
static std::vector< SGSharedPtr< T > > loadAllById(const PositionedIDVec &id_vec)
static FGPositionedList findWithinRange(const SGGeod &aPos, double aRangeNm, Filter *aFilter)
static FGPositionedList findClosestNPartial(const SGGeod &aPos, unsigned int aN, double aCutoffNm, Filter *aFilter, bool &aPartial)
Same as above, but with a time-bound in msec too.
virtual const SGGeod & geod() const
virtual const SGVec3d & cart() const
The cartesian position associated with this object.
static FGPositionedRef findFirstWithIdent(const std::string &aIdent, Filter *aFilter)
double latitude() const
static void sortByRange(FGPositionedList &, const SGGeod &aPos)
Sort an FGPositionedList by distance from a position.
static FGPositionedRef loadByIdImpl(PositionedID id)
void invalidatePosition()
static bool isAirportType(FGPositioned *pos)
static SGSharedPtr< T > loadById(PositionedID id)
const PositionedID mGuid
@ TOWER
an actual airport tower - not a radio comms facility!
@ PARKING
parking position - might be a gate, or stand
@ DME
important that DME & TACAN are adjacent to keep the TacanFilter efficient - DMEs are proxies for TACA...
virtual ~FGPositioned()
double elevation() const
static FGPositionedList findAllWithIdent(const std::string &aIdent, Filter *aFilter=NULL, bool aExact=true)
Find all items with the specified ident.
static const char * nameForType(Type aTy)
Map a type to a human-readable string.
double elevationM() const
static bool isNavaidType(FGPositioned *pos)
const Type mType
static FGPositionedList findClosestN(const SGGeod &aPos, unsigned int aN, double aCutoffNm, Filter *aFilter=NULL)
Find the closest N items to a position, which pass the specified filter A cutoff range in NM must be ...
Type type() const
static FGPositionedList findWithinRangePartial(const SGGeod &aPos, double aRangeNm, Filter *aFilter, bool &aPartial)
const std::string & ident() const
static bool deleteWaypoint(FGPositionedRef aWpt)
static FGPositionedRef findClosest(const SGGeod &aPos, double aCutoffNm, Filter *aFilter=NULL)
Find the closest item to a position, which pass the specified filter A cutoff range in NM must be spe...
static bool isType(FGPositioned::Type ty)
const std::string & name() const override
Return the name of this positioned.
POI(PositionedID aGuid, Type ty, const std::string &aIdent, const SGGeod &aPos, const std::string &aName)
FlightPlan.hxx - defines a full flight-plan object, including departure, cruise, arrival information ...
Definition Addon.cxx:53
SGSharedPtr< FGPositioned > FGPositionedRef
std::vector< PositionedID > PositionedIDVec
T * fgpositioned_cast(FGPositioned *p)
std::vector< FGPositionedRef > FGPositionedList
int64_t PositionedID