Expose heliports to Nasal for future use in maps
This commit is contained in:
parent
3ea69785d9
commit
8588eb2e4b
3 changed files with 46 additions and 4 deletions
|
@ -158,6 +158,11 @@ bool FGAirport::hasRunwayWithIdent(const string& aIdent) const
|
|||
return flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::RUNWAY, aIdent) != 0;
|
||||
}
|
||||
|
||||
bool FGAirport::hasHelipadWithIdent(const string& aIdent) const
|
||||
{
|
||||
return flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::HELIPAD, aIdent) != 0;
|
||||
}
|
||||
|
||||
FGRunway* FGAirport::getRunwayByIdent(const string& aIdent) const
|
||||
{
|
||||
PositionedID id = flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::RUNWAY, aIdent);
|
||||
|
@ -169,6 +174,17 @@ FGRunway* FGAirport::getRunwayByIdent(const string& aIdent) const
|
|||
return (FGRunway*) flightgear::NavDataCache::instance()->loadById(id);
|
||||
}
|
||||
|
||||
FGHelipad* FGAirport::getHelipadByIdent(const string& aIdent) const
|
||||
{
|
||||
PositionedID id = flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::HELIPAD, aIdent);
|
||||
if (id == 0) {
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "no such helipad '" << aIdent << "' at airport " << ident());
|
||||
throw sg_range_exception("unknown helipad " + aIdent + " at airport:" + ident(), "FGAirport::getRunwayByIdent");
|
||||
}
|
||||
|
||||
return (FGHelipad*) flightgear::NavDataCache::instance()->loadById(id);
|
||||
}
|
||||
|
||||
|
||||
FGRunway* FGAirport::findBestRunwayForHeading(double aHeading) const
|
||||
{
|
||||
|
|
|
@ -108,7 +108,9 @@ public:
|
|||
FGHelipad* getHelipadByIndex(unsigned int aIndex) const;
|
||||
|
||||
bool hasRunwayWithIdent(const std::string& aIdent) const;
|
||||
bool hasHelipadWithIdent(const std::string& aIdent) const;
|
||||
FGRunway* getRunwayByIdent(const std::string& aIdent) const;
|
||||
FGHelipad* getHelipadByIdent(const std::string& aIdent) const;
|
||||
FGRunway* findBestRunwayForHeading(double aHeading) const;
|
||||
|
||||
/**
|
||||
|
|
|
@ -73,6 +73,7 @@ naGhostType NavaidGhostType = { positionedGhostDestroy, "navaid", navaidGhostGet
|
|||
|
||||
static const char* runwayGhostGetMember(naContext c, void* g, naRef field, naRef* out);
|
||||
naGhostType RunwayGhostType = { positionedGhostDestroy, "runway", runwayGhostGetMember, 0 };
|
||||
naGhostType HelipadGhostType = { positionedGhostDestroy, "helipad", runwayGhostGetMember, 0 };
|
||||
naGhostType TaxiwayGhostType = { positionedGhostDestroy, "taxiway", runwayGhostGetMember, 0 };
|
||||
|
||||
static const char* fixGhostGetMember(naContext c, void* g, naRef field, naRef* out);
|
||||
|
@ -289,6 +290,16 @@ naRef ghostForRunway(naContext c, const FGRunway* r)
|
|||
return naNewGhost2(c, &RunwayGhostType, (void*) r);
|
||||
}
|
||||
|
||||
naRef ghostForHelipad(naContext c, const FGHelipad* r)
|
||||
{
|
||||
if (!r) {
|
||||
return naNil();
|
||||
}
|
||||
|
||||
FGPositioned::get(r); // take a ref
|
||||
return naNewGhost2(c, &HelipadGhostType, (void*) r);
|
||||
}
|
||||
|
||||
naRef ghostForTaxiway(naContext c, const FGTaxiway* r)
|
||||
{
|
||||
if (!r) {
|
||||
|
@ -378,6 +389,16 @@ static const char* airportGhostGetMember(naContext c, void* g, naRef field, naRe
|
|||
naRef rwydata = ghostForRunway(c, rwy);
|
||||
naHash_set(*out, rwyid, rwydata);
|
||||
}
|
||||
} else if (!strcmp(fieldName, "helipads")) {
|
||||
*out = naNewHash(c);
|
||||
|
||||
for(unsigned int r=0; r<apt->numHelipads(); ++r) {
|
||||
FGHelipad* hp(apt->getHelipadByIndex(r));
|
||||
|
||||
naRef rwyid = stringToNasal(c, hp->ident());
|
||||
naRef rwydata = ghostForHelipad(c, hp);
|
||||
naHash_set(*out, rwyid, rwydata);
|
||||
}
|
||||
|
||||
} else if (!strcmp(fieldName, "taxiways")) {
|
||||
*out = naNewVector(c);
|
||||
|
@ -1167,11 +1188,13 @@ static naRef f_airport_runway(naContext c, naRef me, int argc, naRef* args)
|
|||
|
||||
std::string ident(naStr_data(args[0]));
|
||||
boost::to_upper(ident);
|
||||
if (!apt->hasRunwayWithIdent(ident)) {
|
||||
return naNil();
|
||||
|
||||
if (apt->hasRunwayWithIdent(ident)) {
|
||||
return ghostForRunway(c, apt->getRunwayByIdent(ident));
|
||||
} else if (apt->hasHelipadWithIdent(ident)) {
|
||||
return ghostForHelipad(c, apt->getHelipadByIdent(ident));
|
||||
}
|
||||
|
||||
return ghostForRunway(c, apt->getRunwayByIdent(ident));
|
||||
return naNil();
|
||||
}
|
||||
|
||||
static naRef f_airport_taxiway(naContext c, naRef me, int argc, naRef* args)
|
||||
|
@ -2389,6 +2412,7 @@ naRef initNasalPositioned(naRef globals, naContext c, naRef gcSave)
|
|||
hashset(c, gcSave, "airportProto", airportPrototype);
|
||||
|
||||
hashset(c, airportPrototype, "runway", naNewFunc(c, naNewCCode(c, f_airport_runway)));
|
||||
hashset(c, airportPrototype, "helipad", naNewFunc(c, naNewCCode(c, f_airport_runway)));
|
||||
hashset(c, airportPrototype, "taxiway", naNewFunc(c, naNewCCode(c, f_airport_taxiway)));
|
||||
hashset(c, airportPrototype, "tower", naNewFunc(c, naNewCCode(c, f_airport_tower)));
|
||||
hashset(c, airportPrototype, "comms", naNewFunc(c, naNewCCode(c, f_airport_comms)));
|
||||
|
|
Loading…
Add table
Reference in a new issue