X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FAirports%2Fsimple.hxx;h=93c76fbe1d63a6377083abeb7103fad404cb42b2;hb=2dee4ef14ff449381d11ef2d55d07b2e199677af;hp=2236b76607a3677262a2eae5cb90b8a0fa5f5fd3;hpb=aa78341698c0ede62bd45d864c1e866d309b420d;p=flightgear.git diff --git a/src/Airports/simple.hxx b/src/Airports/simple.hxx index 2236b7660..93c76fbe1 100644 --- a/src/Airports/simple.hxx +++ b/src/Airports/simple.hxx @@ -30,58 +30,48 @@ #include #include -#include -#include #include -#include - -#include "Navaids/positioned.hxx" +#include // forward decls class FGAirportDynamics; class FGRunway; +class FGTaxiway; +class FGPavement; +class SGPropertyNode; typedef SGSharedPtr FGRunwayPtr; +typedef SGSharedPtr FGTaxiwayPtr; +typedef SGSharedPtr FGPavementPtr; /*************************************************************************************** * **************************************************************************************/ -class FGAirport { -private: - std::string _id; - SGGeod _location; - SGGeod _tower_location; - std::string _name; - bool _has_metar; - bool _is_airport; - bool _is_seaport; - bool _is_heliport; - FGAirportDynamics *_dynamics; - +class FGAirport : public FGPositioned +{ public: - FGAirport(); - // FGAirport(const FGAirport &other); FGAirport(const std::string& id, const SGGeod& location, const SGGeod& tower, - const std::string& name, - bool has_metar, bool is_airport, bool is_seaport, bool is_heliport); + const std::string& name, bool has_metar, Type aType); ~FGAirport(); - const std::string& getId() const { return _id; } + const std::string& getId() const { return ident(); } const std::string& getName() const { return _name; } - double getLongitude() const { return _location.getLongitudeDeg(); } + double getLongitude() const { return longitude(); } // Returns degrees - double getLatitude() const { return _location.getLatitudeDeg(); } + double getLatitude() const { return latitude(); } // Returns ft - double getElevation() const { return _location.getElevationFt(); } + double getElevation() const { return elevation(); } bool getMetar() const { return _has_metar; } - bool isAirport() const { return _is_airport; } - bool isSeaport() const { return _is_seaport; } - bool isHeliport() const { return _is_heliport; } + bool isAirport() const; + bool isSeaport() const; + bool isHeliport() const; + + virtual const std::string& name() const + { return _name; } const SGGeod& getTowerLocation() const { return _tower_location; } - void setId(const std::string& id) { _id = id; } void setMetar(bool value) { _has_metar = value; } FGRunway* getActiveRunwayForUsage() const; @@ -95,115 +85,123 @@ public: FGRunway* getRunwayByIdent(const std::string& aIdent) const; FGRunway* findBestRunwayForHeading(double aHeading) const; + /** + * Useful predicate for FMS/GPS/NAV displays and similar - check if this + * aiport has a hard-surfaced runway of at least the specified length. + */ + bool hasHardRunwayOfLengthFt(double aLengthFt) const; + unsigned int numTaxiways() const; - FGRunway* getTaxiwayByIndex(unsigned int aIndex) const; + FGTaxiway* getTaxiwayByIndex(unsigned int aIndex) const; + + unsigned int numPavements() const; + FGPavement* getPavementByIndex(unsigned int aIndex) const; + + void setRunwaysAndTaxiways(std::vector& rwys, + std::vector& txwys, + std::vector& pvts); - void addRunway(FGRunway* aRunway); + class AirportFilter : public Filter + { + public: + virtual bool pass(FGPositioned* aPos) const { + return passAirport(static_cast(aPos)); + } + + virtual Type minType() const { + return AIRPORT; + } + + virtual Type maxType() const { + return SEAPORT; + } + + virtual bool passAirport(FGAirport* aApt) const { + return true; + } + }; + + class HardSurfaceFilter : public AirportFilter + { + public: + HardSurfaceFilter(double minLengthFt); + + virtual bool passAirport(FGAirport* aApt) const; + + virtual Type maxType() const { + return AIRPORT; + } + private: + double mMinLengthFt; + }; + + /** + * Syntactic wrapper around FGPositioned::findClosest - find the closest + * match for filter, and return it cast to FGAirport. The default filter + * passes all airports, including seaports and heliports. + */ + static FGAirport* findClosest(const SGGeod& aPos, double aCuttofNm, Filter* filter = NULL); + + /** + * Helper to look up an FGAirport instance by unique ident. Throws an + * exception if the airport could not be found - so callers can assume + * the result is non-NULL. + */ + static FGAirport* getByIdent(const std::string& aIdent); + + /** + * Helper to look up an FGAirport instance by unique ident. Returns NULL + * if the airport could not be found. + */ + static FGAirport* findByIdent(const std::string& aIdent); + + /** + * Specialised helper to implement the AirportList dialog. Performs a + * case-insensitive search on airport names and ICAO codes, and returns + * matches in a format suitable for use by a puaList. + */ + static char** searchNamesAndIdents(const std::string& aFilter); private: typedef std::vector::const_iterator Runway_iterator; - /** * Helper to locate a runway by ident */ Runway_iterator getIteratorForRunwayIdent(const std::string& aIdent) const; + // disable these FGAirport operator=(FGAirport &other); FGAirport(const FGAirport&); - - std::vector mRunways; - std::vector mTaxiways; -}; - - -class FGAirportSearchFilter { -public: - virtual ~FGAirportSearchFilter() {} - // all airports pass the filter by default - virtual bool pass(FGAirport*) { return true; } -}; - -class FGIdentOrdering { -public: - virtual ~FGIdentOrdering() - { ; } - virtual bool compare(const std::string& aA, const std::string& aB) const - { return aA < aB; } -}; - -typedef std::map < std::string, FGAirport* > airport_map; -typedef airport_map::iterator airport_map_iterator; -typedef airport_map::const_iterator const_airport_map_iterator; - -typedef std::vector < FGAirport * > airport_list; -typedef airport_list::iterator airport_list_iterator; -typedef airport_list::const_iterator const_airport_list_iterator; - - - -class FGAirportList { -private: - - airport_map airports_by_id; - airport_list airports_array; - -public: - // Constructor (new) - FGAirportList(); - - // Destructor - ~FGAirportList(); - - // add an entry to the list - FGAirport* add( const std::string& id, const SGGeod& location, const SGGeod& tower, - const std::string& name, bool has_metar, bool is_airport, - bool is_seaport, bool is_heliport ); - - // search for the specified id. - // Returns NULL if unsucessfull. - FGAirport* search( const std::string& id ); - - // Search for the next airport in ASCII sequence to the supplied id. - // eg. id = "KDC" or "KDCA" would both return "KDCA". - // NOTE: Numbers come prior to A-Z in ASCII sequence so id = "LD" would return "LD57", not "LDDP" - // optional ordering can make letters come before numbers - // Implementation assumes airport codes are unique. - // Returns NULL if unsucessfull. - const FGAirport* findFirstById(const std::string& aIdent, FGIdentOrdering* aOrder = NULL); - - // search for the airport closest to the specified position - // (currently a linear inefficient search so it's probably not - // best to use this at runtime.) An FGAirportSearchFilter class - // can be used to restrict the possible choices to a subtype. - // max_range limits search - specified as an arc distance, in degrees - FGAirport* search( double lon_deg, double lat_deg, double max_range ); - FGAirport* search( double lon_deg, double lat_deg, double max_range, FGAirportSearchFilter& ); - - /** - * Return the number of airports in the list. - */ - int size() const; - - /** - * Return a specific airport, by position. - */ - const FGAirport *getAirport( unsigned int index ) const; - /** - * Return a pointer to the raw airport list + * helper to read airport data from the scenery XML files. */ - inline const airport_list* getAirportList() { return (&airports_array); } - + void loadSceneryDefintions() const; + /** - * Mark the specified airport record as not having metar + * Helpers to process property data loaded from an ICAO.threshold.xml file */ - void no_metar( const std::string &id ); - + void readThresholdData(SGPropertyNode* aRoot); + void processThreshold(SGPropertyNode* aThreshold); + /** - * Mark the specified airport record as (yes) having metar + * Helper to parse property data loaded from an ICAO.twr.xml filke */ - void has_metar( const std::string &id ); + void readTowerData(SGPropertyNode* aRoot); + + SGGeod _tower_location; + std::string _name; + bool _has_metar; + FGAirportDynamics *_dynamics; + void loadRunways() const; + void loadTaxiways() const; + + mutable bool mRunwaysLoaded; + mutable bool mTaxiwaysLoaded; + + std::vector mRunways; + std::vector mTaxiways; + std::vector mPavements; }; // find basic airport location info from airport database @@ -212,9 +210,6 @@ const FGAirport *fgFindAirportID( const std::string& id); // get airport elevation double fgGetAirportElev( const std::string& id ); -// get airport position -Point3D fgGetAirportPos( const std::string& id ); - #endif // _FG_SIMPLE_HXX