X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fpositioned.hxx;h=f6f61229a78750118aea77e719e12f5ceefacdcc;hb=0e53e2cbb1e7f511c40121ade43a539d15e0e155;hp=1c275dcf4db30ddcefe52340fcd23d5247394dad;hpb=89010e6b0ac344970dfe3e802e4e51703fedc8ff;p=flightgear.git diff --git a/src/Navaids/positioned.hxx b/src/Navaids/positioned.hxx index 1c275dcf4..f6f61229a 100644 --- a/src/Navaids/positioned.hxx +++ b/src/Navaids/positioned.hxx @@ -24,7 +24,7 @@ #include #include -#include +#include class FGPositioned; @@ -41,7 +41,9 @@ public: SEAPORT, RUNWAY, TAXIWAY, + PAVEMENT, PARK_STAND, + WAYPOINT, FIX, VOR, NDB, @@ -54,7 +56,6 @@ public: DME, TACAN, OBSTACLE, - WAYPOINT, // user-defined waypoint FREQ_GND, FREQ_TWR, FREQ_ATIS, @@ -83,12 +84,10 @@ public: { return mPosition; } /** - * Compute the cartesian position associated with this object + * The cartesian position associated with this object */ - SGVec3d cart() const; + const SGVec3d& cart() const; - SGBucket bucket() const; - double latitude() const { return mPosition.getLatitudeDeg(); } @@ -113,6 +112,22 @@ public: virtual bool pass(FGPositioned* aPos) const { return true; } + virtual Type minType() const + { return INVALID; } + + virtual Type maxType() const + { return INVALID; } + + /** + * Test if this filter has a non-empty type range + */ + bool hasTypeRange() const; + + /** + * Assuming hasTypeRange is true, test if a given type passes the range + */ + bool passType(Type aTy) const; + bool operator()(FGPositioned* aPos) const { return pass(aPos); } }; @@ -142,12 +157,20 @@ public: static FGPositionedRef findNextWithPartialId(FGPositionedRef aCur, const std::string& aId, Filter* aFilter = NULL); /** - * Find all items with the specified ident, and return then sorted by - * distance from a position - * + * Find all items with the specified ident * @param aFilter - optional filter on items */ - static List findAllWithIdentSortedByRange(const std::string& aIdent, const SGGeod& aPos, Filter* aFilter = NULL); + static List 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); + + /** + * Sort an FGPositionedList by distance from a position + */ + static void sortByRange(List&, const SGGeod& aPos); /** * Find the closest item to a position, which pass the specified filter @@ -165,26 +188,35 @@ public: * Very large cutoff values will make this slow. * * @result The matches (possibly less than N, depending on the filter and cutoff), - * sorted by distance from the search pos + * sorted by distance from the search pos * @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); - + /** + * 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); /** - * Debug helper, map a type to a human-readable string + * Map a type to a human-readable string */ static const char* nameForType(Type aTy); + + static FGPositioned* createUserWaypoint(const std::string& aIdent, const SGGeod& aPos); protected: - FGPositioned(Type ty, const std::string& aIdent, const SGGeod& aPos, bool aIndex = true); + FGPositioned(Type ty, const std::string& aIdent, const SGGeod& aPos); + + void init(bool aIndexed); // can't be const right now, navrecord at least needs to fix up the position // after navaids are parsed SGGeod mPosition; + SGVec3d mCart; // once mPosition is const, this can be const too const Type mType; const std::string mIdent; };