]> git.mxchange.org Git - flightgear.git/blobdiff - src/Airports/airport.cxx
Interim windows build fix
[flightgear.git] / src / Airports / airport.cxx
index 750ccac8221613bfc756e41eeb2042ca9845635a..f284fb55ad50bc38874416311814665192ba10df 100644 (file)
@@ -46,8 +46,9 @@
 #include <Main/fg_props.hxx>
 #include <Airports/runways.hxx>
 #include <Airports/pavement.hxx>
-#include <Airports/dynamics.hxx>
 #include <Airports/xmlloader.hxx>
+#include <Airports/dynamics.hxx>
+#include <Airports/airportdynamicsmanager.hxx>
 #include <Navaids/procedure.hxx>
 #include <Navaids/waypoint.hxx>
 #include <ATC/CommStation.hxx>
@@ -74,8 +75,8 @@ FGAirport::FGAirport( PositionedID aGuid,
     FGPositioned(aGuid, aType, id, location),
     _name(name),
     _has_metar(has_metar),
-    _dynamics(0),
     mTowerDataLoaded(false),
+    mHasTower(false),
     mRunwaysLoaded(false),
     mHelipadsLoaded(false),
     mTaxiwaysLoaded(false),
@@ -83,12 +84,12 @@ FGAirport::FGAirport( PositionedID aGuid,
     mThresholdDataLoaded(false),
     mILSDataLoaded(false)
 {
+    mIsClosed = (name.find("[x]") != std::string::npos);
 }
 
 
 FGAirport::~FGAirport()
 {
-    delete _dynamics;
 }
 
 bool FGAirport::isAirport() const
@@ -115,23 +116,6 @@ bool FGAirport::isAirportType(FGPositioned* pos)
     return (pos->type() >= AIRPORT) && (pos->type() <= SEAPORT);
 }
 
-FGAirportDynamics * FGAirport::getDynamics()
-{
-    if (_dynamics) {
-        return _dynamics;
-    }
-    
-    _dynamics = new FGAirportDynamics(this);
-    XMLLoader::load(_dynamics);
-    _dynamics->init();
-  
-    FGRunwayPreference rwyPrefs(this);
-    XMLLoader::load(&rwyPrefs);
-    _dynamics->setRwyUse(rwyPrefs);
-    
-    return _dynamics;
-}
-
 //------------------------------------------------------------------------------
 unsigned int FGAirport::numRunways() const
 {
@@ -314,6 +298,28 @@ bool FGAirport::hasHardRunwayOfLengthFt(double aLengthFt) const
   return false;
 }
 
+FGRunwayRef FGAirport::longestRunway() const
+{
+    FGRunwayRef r;
+    loadRunways();
+
+    BOOST_FOREACH(FGRunwayRef rwy, mRunways) {
+        if (!r || (r->lengthFt() < rwy->lengthFt())) {
+             r = rwy;
+        }
+    } // of runways iteration
+
+    return r;
+}
+
+//------------------------------------------------------------------------------
+FGRunwayList FGAirport::getRunways() const
+{
+  loadRunways();
+
+  return mRunways;
+}
+
 //------------------------------------------------------------------------------
 FGRunwayList FGAirport::getRunwaysWithoutReciprocals() const
 {
@@ -655,13 +661,25 @@ void FGAirport::validateTowerData() const
   NavDataCache* cache = NavDataCache::instance();
   PositionedIDVec towers = cache->airportItemsOfType(guid(), FGPositioned::TOWER);
   if (towers.empty()) {
-    SG_LOG(SG_GENERAL, SG_ALERT, "No towers defined for:" <<ident());
+    mHasTower = false;
     mTowerPosition = geod(); // use airport position
+
+    // offset the tower position away from the runway centerline, if
+    // airport has a single runway. Offset by eight times the runway width,
+    // an entirely guessed figure.
+    int runwayCount = numRunways();
+    if ((runwayCount > 0) && (runwayCount <= 2)) {
+        FGRunway* runway = getRunwayByIndex(0);
+        double hdg = runway->headingDeg() + 90;
+        mTowerPosition = SGGeodesy::direct(geod(), hdg, runway->widthM() * 8);
+    }
+
     // increase tower elevation by 20 metres above the field elevation
     mTowerPosition.setElevationM(geod().getElevationM() + 20.0);
   } else {
     FGPositionedRef tower = cache->loadById(towers.front());
     mTowerPosition = tower->geod();
+    mHasTower = true;
   }
   
   SGPath path;
@@ -673,6 +691,7 @@ void FGAirport::validateTowerData() const
     SGPropertyNode_ptr rootNode = new SGPropertyNode;
     readProperties(path.str(), rootNode);
     const_cast<FGAirport*>(this)->readTowerData(rootNode);
+    mHasTower = true;
   } catch (sg_exception& e){
     SG_LOG(SG_NAVAID, SG_WARN, ident() << "loading twr XML failed:" << e.getFormattedMessage());
   }
@@ -715,6 +734,12 @@ void FGAirport::validateILSData()
   }
 }
 
+bool FGAirport::hasTower() const
+{
+    validateTowerData();
+    return mHasTower;
+}
+
 void FGAirport::readILSData(SGPropertyNode* aRoot)
 {  
   NavDataCache* cache = NavDataCache::instance();
@@ -939,6 +964,11 @@ void FGAirport::sortBySize(FGPositionedList& airportList)
     }
 }
 
+FGAirportDynamicsRef FGAirport::getDynamics() const
+{
+    return flightgear::AirportDynamicsManager::find(const_cast<FGAirport*>(this));
+}
+
 // get airport elevation
 double fgGetAirportElev( const std::string& id )
 {