1
0
Fork 0

Remove one dependence on MetaKit.

This commit is contained in:
curt 2003-08-28 20:53:08 +00:00
parent b23183f018
commit 6665d7d609
8 changed files with 81 additions and 278 deletions

View file

@ -266,23 +266,23 @@ double GetAngleDiff_deg( const double &a1, const double &a2) {
// in fg_init.cxx, and are just here temporarily until some rationalisation occurs.
// find basic airport location info from airport database
bool dclFindAirportID( const string& id, FGAirport *a ) {
if ( id.length() ) {
SGPath path( globals->get_fg_root() );
path.append( "Airports" );
path.append( "simple.mk4" );
FGAirports airports( path.c_str() );
FGAirport result;
if ( id.length() ) {
SG_LOG( SG_GENERAL, SG_INFO, "Searching for airport code = " << id );
if ( ! airports.search( id, a ) ) {
result = globals->get_airports()->search( id );
if ( result.id.empty() ) {
SG_LOG( SG_GENERAL, SG_ALERT,
"Failed to find " << id << " in " << path.str() );
"Failed to find " << id << " in simple.apt.gz" );
return false;
}
} else {
return false;
}
*a = result;
SG_LOG( SG_GENERAL, SG_INFO,
"Position for " << id << " is ("
<< a->longitude << ", "

View file

@ -1,14 +1,11 @@
noinst_LIBRARIES = libAirports.a
noinst_PROGRAMS = gensimple genrunways calc_loc
noinst_PROGRAMS = genrunways calc_loc
libAirports_a_SOURCES = \
runways.cxx runways.hxx \
simple.cxx simple.hxx
gensimple_SOURCES = gensimple.cxx
gensimple_LDADD = libAirports.a -lsgdebug -lsgmisc -lsgxml -lmk4 -lz
genrunways_SOURCES = genrunways.cxx
genrunways_LDADD = libAirports.a -lsgdebug -lsgmisc -lsgxml -lmk4 -lz

View file

@ -35,230 +35,56 @@
#include STL_STRING
#include STL_FUNCTIONAL
#include STL_ALGORITHM
#include STL_IOSTREAM
#include "simple.hxx"
SG_USING_NAMESPACE(std);
#ifndef _MSC_VER
# define NDEBUG // she don't work without it.
#endif
#include <mk4.h>
#include <mk4str.h>
#ifndef _MSC_VER
# undef NDEBUG
#endif
#ifdef SG_HAVE_STD_INCLUDES
# include <istream>
#elif defined( __BORLANDC__ ) || defined (__APPLE__)
# include <iostream>
#else
# include <istream.h>
#endif
SG_USING_STD(istream);
inline istream&
operator >> ( istream& in, FGAirport& a )
{
return in >> a.id >> a.latitude >> a.longitude >> a.elevation;
string junk;
in >> junk >> a.id >> a.latitude >> a.longitude >> a.elevation
>> a.code;
char name[256]; // should never be longer than this, right? :-)
in.getline( name, 256 );
a.name = name;
return in;
}
FGAirports::FGAirports( const string& file ) {
// open the specified database readonly
storage = new c4_Storage( file.c_str(), false );
if ( !storage->Strategy().IsValid() ) {
SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file );
exit(-1);
}
vAirport = new c4_View;
*vAirport =
storage->GetAs("airport[ID:S,Longitude:F,Latitude:F,Elevation:F]");
}
// search for the specified id
bool
FGAirports::search( const string& id, FGAirport* a ) const
{
c4_StringProp pID ("ID");
c4_FloatProp pLon ("Longitude");
c4_FloatProp pLat ("Latitude");
c4_FloatProp pElev ("Elevation");
int idx = vAirport->Find(pID[id.c_str()]);
SG_LOG( SG_TERRAIN, SG_INFO, "idx = " << idx );
if ( idx == -1 ) {
return false;
}
c4_RowRef r = vAirport->GetAt(idx);
a->id = (const char *) pID(r); /// NHV fix wrong case crash
a->longitude = (double) pLon(r);
a->latitude = (double) pLat(r);
a->elevation = (double) pElev(r);
return true;
}
FGAirport
FGAirports::search( const string& id ) const
{
FGAirport a;
search( id, &a );
return a;
}
// Destructor
FGAirports::~FGAirports( void ) {
delete storage;
}
// Constructor
FGAirportsUtil::FGAirportsUtil() {
}
// load the data
int FGAirportsUtil::load( const string& file ) {
FGAirport a;
airports.erase( airports.begin(), airports.end() );
FGAirportList::FGAirportList( const string& file ) {
SG_LOG( SG_GENERAL, SG_DEBUG, "Reading simple airport list: " << file );
// open the specified file for reading
sg_gzifstream in( file );
if ( !in.is_open() ) {
SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file );
exit(-1);
} else {
SG_LOG( SG_GENERAL, SG_ALERT, "opened: " << file );
}
// skip first line of file
char tmp[2048];
in.getline( tmp, 2048 );
// skip header line
in >> skipeol;
// read in each line of the file
#ifdef __MWERKS__
in >> ::skipws;
char c = 0;
while ( in.get(c) && c != '\0' ) {
if ( c == 'A' ) {
while ( in ) {
FGAirport a;
in >> a;
SG_LOG( SG_GENERAL, SG_INFO, a.id );
in >> skipeol;
airports.insert(a);
} else if ( c == 'R' ) {
in >> skipeol;
} else {
in >> skipeol;
airports[a.id] = a;
}
in >> ::skipws;
}
#else
in >> ::skipws;
string token;
while ( ! in.eof() ) {
in >> token;
if ( token == "A" ) {
in >> a;
SG_LOG( SG_GENERAL, SG_INFO, "in <- " << a.id );
in >> skipeol;
airports.insert(a);
} else if ( token == "R" ) {
in >> skipeol;
} else {
in >> skipeol;
}
in >> ::skipws;
}
#endif
return 1;
}
// save the data in gdbm format
bool FGAirportsUtil::dump_mk4( const string& file ) {
// open database for writing
c4_Storage storage( file.c_str(), true );
// need to do something about error handling here!
// define the properties
c4_StringProp pID ("ID");
c4_FloatProp pLon ("Longitude");
c4_FloatProp pLat ("Latitude");
c4_FloatProp pElev ("Elevation");
// Start with an empty view of the proper structure.
c4_View vAirport =
storage.GetAs("airport[ID:S,Longitude:F,Latitude:F,Elevation:F]");
c4_Row row;
const_iterator current = airports.begin();
const_iterator end = airports.end();
while ( current != end ) {
// add each airport record
SG_LOG( SG_TERRAIN, SG_BULK, "out -> " << current->id );
pID (row) = current->id.c_str();
pLon (row) = current->longitude;
pLat (row) = current->latitude;
pElev (row) = current->elevation;
vAirport.Add(row);
++current;
}
// commit our changes
storage.Commit();
return true;
}
// search for the specified id
bool
FGAirportsUtil::search( const string& id, FGAirport* a ) const
{
const_iterator it = airports.find( FGAirport(id) );
if ( it != airports.end() )
{
*a = *it;
return true;
}
else
{
return false;
}
}
FGAirport
FGAirportsUtil::search( const string& id ) const
{
FGAirport a;
this->search( id, &a );
return a;
FGAirport FGAirportList::search( const string& id) {
return airports[id];
}
// Destructor
FGAirportsUtil::~FGAirportsUtil( void ) {
FGAirportList::~FGAirportList( void ) {
}

View file

@ -23,8 +23,8 @@
// $Id$
#ifndef _SIMPLE_HXX
#define _SIMPLE_HXX
#ifndef _FG_SIMPLE_HXX
#define _FG_SIMPLE_HXX
#ifndef __cplusplus
@ -39,17 +39,23 @@
#include <simgear/compiler.h>
#include STL_STRING
#include <set>
// Forward declarations.
class c4_Storage;
class c4_View;
#include <map>
SG_USING_STD(string);
SG_USING_STD(set);
SG_USING_STD(map);
class FGAirport {
public:
string id;
double longitude;
double latitude;
double elevation;
string code;
string name;
public:
FGAirport( const string& name = "",
@ -62,76 +68,35 @@ public:
return id < a.id;
}
public:
string id;
double longitude;
double latitude;
double elevation;
};
typedef map < string, FGAirport > airport_map;
typedef airport_map::iterator airport_map_iterator;
typedef airport_map::const_iterator const_airport_map_iterator;
class FGAirports {
class FGAirportList {
private:
c4_Storage *storage;
c4_View *vAirport;
airport_map airports;
public:
// Constructor
FGAirports( const string& file );
FGAirportList( const string& file );
// Destructor
~FGAirports();
~FGAirportList();
// search for the specified id.
// Returns true if successful, otherwise returns false.
// On success, airport data is returned thru "airport" pointer.
// "airport" is not changed if "apt" is not found.
bool search( const string& id, FGAirport* airport ) const;
FGAirport search( const string& id ) const;
FGAirport search( const string& id );
};
class FGAirportsUtil {
public:
#ifdef SG_NO_DEFAULT_TEMPLATE_ARGS
typedef set< FGAirport, less< FGAirport > > container;
#else
typedef set< FGAirport > container;
#endif
typedef container::iterator iterator;
typedef container::const_iterator const_iterator;
private:
container airports;
public:
// Constructor
FGAirportsUtil();
// Destructor
~FGAirportsUtil();
// load the data
int load( const string& file );
// save the data in metakit format
bool dump_mk4( const string& file );
// search for the specified id.
// Returns true if successful, otherwise returns false.
// On success, airport data is returned thru "airport" pointer.
// "airport" is not changed if "id" is not found.
bool search( const string& id, FGAirport* airport ) const;
FGAirport search( const string& id ) const;
};
#endif // _SIMPLE_HXX
#endif // _FG_SIMPLE_HXX

View file

@ -99,7 +99,7 @@ fgfs_LDADD = \
$(top_builddir)/src/Systems/libSystems.a \
$(top_builddir)/src/Time/libTime.a \
$(WEATHER_LIBS) \
-lsgroute -lsgsky -lsgsound -lsgephem -lsgmaterial -lsgtgdb -lsgmodel \
-lsgroute -lsgclouds3d -lsgsky -lsgsound -lsgephem -lsgmaterial -lsgtgdb -lsgmodel \
-lsgtiming -lsgio -lsgscreen -lsgmath -lsgbucket -lsgprops -lsgdebug \
-lsgmagvar -lsgmisc -lsgxml -lsgsound -lsgserial $(CLOUD3D_LIBS) \
$(THREAD_LIBS) \

View file

@ -556,23 +556,23 @@ bool fgInitConfig ( int argc, char **argv ) {
// find basic airport location info from airport database
bool fgFindAirportID( const string& id, FGAirport *a ) {
FGAirport result;
if ( id.length() ) {
SGPath path( globals->get_fg_root() );
path.append( "Airports" );
path.append( "simple.mk4" );
FGAirports airports( path.c_str() );
SG_LOG( SG_GENERAL, SG_INFO, "Searching for airport code = " << id );
if ( ! airports.search( id, a ) ) {
result = globals->get_airports()->search( id );
if ( result.id.empty() ) {
SG_LOG( SG_GENERAL, SG_ALERT,
"Failed to find " << id << " in " << path.str() );
"Failed to find " << id << " in simple.apt.gz" );
return false;
}
} else {
return false;
}
*a = result;
SG_LOG( SG_GENERAL, SG_INFO,
"Position for " << id << " is ("
<< a->longitude << ", "
@ -943,11 +943,18 @@ static bool fgSetPosFromFix( const string& id ) {
/**
* Initialize vor/ndb/ils/fix list management and query systems
* Initialize vor/ndb/ils/fix list management and query systems (as
* well as simple airport db list)
*/
bool
fgInitNav ()
{
SG_LOG(SG_GENERAL, SG_INFO, "Loading Simple Airport List");
SGPath p_simple( globals->get_fg_root() );
p_simple.append( "Airports/simple.apt" );
FGAirportList *airports = new FGAirportList( p_simple.str() );
globals->set_airports( airports );
SG_LOG(SG_GENERAL, SG_INFO, "Loading Navaids");
SG_LOG(SG_GENERAL, SG_INFO, " VOR/NDB");

View file

@ -57,6 +57,7 @@ FGGlobals::FGGlobals() :
route( NULL ),
current_panel( NULL ),
soundmgr( NULL ),
airports( NULL ),
ATC_mgr( NULL ),
ATC_display( NULL ),
AI_mgr( NULL ),

View file

@ -59,6 +59,7 @@ class SGRoute;
class SGTime;
class SGSoundMgr;
class FGAirportList;
class FGAIMgr;
class FGATCMgr;
class FGATCDisplay;
@ -134,6 +135,9 @@ private:
// sound manager
SGSoundMgr *soundmgr;
// Simple Airport List
FGAirportList *airports;
// ATC manager
FGATCMgr *ATC_mgr;
@ -240,6 +244,9 @@ public:
inline SGRoute *get_route() const { return route; }
inline void set_route( SGRoute *r ) { route = r; }
inline FGAirportList *get_airports() const { return airports; }
inline void set_airports( FGAirportList *a ) {airports = a; }
inline FGATCMgr *get_ATC_mgr() const { return ATC_mgr; }
inline void set_ATC_mgr( FGATCMgr *a ) {ATC_mgr = a; }