X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fpositioned.hxx;h=8b4fb6a3f8c4b4c86e9816d9ed50677eb86efbb4;hb=3e46c7998ce2bf23ec322d1dfe65c8da35621d51;hp=e76ab83f674ddafc618a237d13291605a1a588b9;hpb=b1ff365a8f0bf2f25f030ef2058c42f3052e0d8b;p=flightgear.git diff --git a/src/Navaids/positioned.hxx b/src/Navaids/positioned.hxx index e76ab83f6..8b4fb6a3f 100644 --- a/src/Navaids/positioned.hxx +++ b/src/Navaids/positioned.hxx @@ -21,6 +21,7 @@ #ifndef FG_POSITIONED_HXX #define FG_POSITIONED_HXX +#include #include #include #include @@ -31,6 +32,7 @@ class FGPositioned; typedef SGSharedPtr FGPositionedRef; +typedef std::vector FGPositionedList; typedef int64_t PositionedID; typedef std::vector PositionedIDVec; @@ -47,6 +49,7 @@ public: HELIPORT, SEAPORT, RUNWAY, + HELIPAD, TAXIWAY, PAVEMENT, WAYPOINT, @@ -80,16 +83,23 @@ public: // groundnet items PARKING, ///< parking position - might be a gate, or stand TAXI_NODE, +// POI items + COUNTRY, + CITY, + TOWN, + VILLAGE, + LAST_TYPE } Type; - typedef std::vector List; - virtual ~FGPositioned(); Type type() const { return mType; } + const char* typeString() const + { return nameForType(mType); } + const std::string& ident() const { return mIdent; } @@ -121,6 +131,9 @@ public: double elevation() const { return mPosition.getElevationFt(); } + double elevationM() const + { return mPosition.getElevationM(); } + /** * Predicate class to support custom filtering of FGPositioned queries * Default implementation of this passes any FGPositioned instance. @@ -150,7 +163,7 @@ public: class TypeFilter : public Filter { public: - TypeFilter(Type aTy); + TypeFilter(Type aTy = INVALID); virtual bool pass(FGPositioned* aPos) const; virtual Type minType() const @@ -160,12 +173,17 @@ public: { return mMaxType; } void addType(Type aTy); + + static TypeFilter fromString(const std::string& aFilterSpec); private: + std::vector types; Type mMinType, mMaxType; }; - - static List findWithinRange(const SGGeod& aPos, double aRangeNm, Filter* aFilter = NULL); + + static FGPositionedList findWithinRange(const SGGeod& aPos, double aRangeNm, Filter* aFilter = NULL); + + static FGPositionedList findWithinRangePartial(const SGGeod& aPos, double aRangeNm, Filter* aFilter, bool& aPartial); static FGPositionedRef findClosestWithIdent(const std::string& aIdent, const SGGeod& aPos, Filter* aFilter = NULL); @@ -175,17 +193,17 @@ public: * Find all items with the specified ident * @param aFilter - optional filter on items */ - static List findAllWithIdent(const std::string& aIdent, Filter* aFilter = NULL, bool aExact = true); + static FGPositionedList findAllWithIdent(const std::string& aIdent, Filter* aFilter = NULL, bool aExact = true); /** * As above, but searches names instead of idents */ - static List findAllWithName(const std::string& aName, Filter* aFilter = NULL, bool aExact = true); + static FGPositionedList findAllWithName(const std::string& aName, Filter* aFilter = NULL, bool aExact = true); /** * Sort an FGPositionedList by distance from a position */ - static void sortByRange(List&, const SGGeod& aPos); + static void sortByRange(FGPositionedList&, const SGGeod& aPos); /** * Find the closest item to a position, which pass the specified filter @@ -207,27 +225,60 @@ public: * @param aN - number of matches to find * @param aCutoffNm - maximum distance to search within, in nautical miles */ - static List findClosestN(const SGGeod& aPos, unsigned int aN, double aCutoffNm, Filter* aFilter = NULL); + static FGPositionedList findClosestN(const SGGeod& aPos, unsigned int aN, double aCutoffNm, Filter* aFilter = NULL); + + /** + * Same as above, but with a time-bound in msec too. + */ + static FGPositionedList findClosestNPartial(const SGGeod& aPos, unsigned int aN, double aCutoffNm, Filter* aFilter, + bool& aPartial); + template + static SGSharedPtr loadById(PositionedID id) + { + return static_pointer_cast( loadByIdImpl(id) ); + } + + template + static SGSharedPtr loadById(const PositionedIDVec& id_vec, size_t index) + { + assert(index >= 0 && index < id_vec.size()); + return loadById(id_vec[index]); + } + + template + static std::vector > loadAllById(const PositionedIDVec& id_vec) + { + std::vector > vec(id_vec.size()); + + for(size_t i = 0; i < id_vec.size(); ++i) + vec[i] = loadById(id_vec[i]); + + return vec; + } + /** * Map a candidate type string to a real type. Returns INVALID if the string * does not correspond to a defined type. */ static Type typeFromName(const std::string& aName); - + /** * Map a type to a human-readable string */ static const char* nameForType(Type aTy); - + static FGPositioned* createUserWaypoint(const std::string& aIdent, const SGGeod& aPos); + static bool deleteUserWaypoint(const std::string& aIdent); protected: friend class flightgear::NavDataCache; - + FGPositioned(PositionedID aGuid, Type ty, const std::string& aIdent, const SGGeod& aPos); - + void modifyPosition(const SGGeod& newPos); - + + static FGPositionedRef loadByIdImpl(PositionedID id); + const PositionedID mGuid; const SGGeod mPosition; const SGVec3d mCart;