136 lines
3.9 KiB
Text
136 lines
3.9 KiB
Text
|
# See: http://wiki.flightgear.org/MapStructure
|
||
|
# Class things:
|
||
|
var name = 'WPT-airbus';
|
||
|
var parents = [canvas.SymbolLayer.Controller];
|
||
|
var __self__ = caller(0)[0];
|
||
|
|
||
|
canvas.SymbolLayer.Controller.add(name, __self__);
|
||
|
canvas.SymbolLayer.add(name, {
|
||
|
parents: [canvas.MultiSymbolLayer],
|
||
|
type: name, # Symbol type
|
||
|
df_controller: __self__, # controller to use by default -- this one
|
||
|
df_options: { # default configuration options
|
||
|
fix_symbol: func(group){
|
||
|
group.createChild('path')
|
||
|
.moveTo(-10,0)
|
||
|
.lineTo(0,-17)
|
||
|
.lineTo(10,0)
|
||
|
.lineTo(0,17)
|
||
|
.close()
|
||
|
.setStrokeLineWidth(3)
|
||
|
.setColor(1,1,1)
|
||
|
.setScale(1);
|
||
|
},
|
||
|
vor_symbol: get_local_path('res/airbus_vor.svg'),
|
||
|
airport_symbol: get_local_path('res/airbus_airport.svg'),
|
||
|
ndb_symbol: func(group){
|
||
|
group.createChild('path')
|
||
|
.moveTo(-15,15)
|
||
|
.lineTo(0,-15)
|
||
|
.lineTo(15,15)
|
||
|
.close()
|
||
|
.setStrokeLineWidth(3)
|
||
|
#.setColor(0.69,0,0.39)
|
||
|
.setScale(1,1);
|
||
|
}
|
||
|
},
|
||
|
df_style: {
|
||
|
active_wp_color: [0.4,0.7,0.4],
|
||
|
current_wp_color: [1,1,1],
|
||
|
translation: {
|
||
|
'airport': [-24,-24],
|
||
|
'vor': [-24,-24]
|
||
|
}
|
||
|
},
|
||
|
toggle_cstr: 0
|
||
|
});
|
||
|
|
||
|
var new = func(layer) {
|
||
|
var m = {
|
||
|
parents: [__self__],
|
||
|
layer: layer,
|
||
|
map: layer.map,
|
||
|
listeners: [],
|
||
|
};
|
||
|
layer.searcher._equals = func(a,b) a.equals(b);
|
||
|
var driver = opt_member(m.layer.options, 'route_driver');
|
||
|
if(driver == nil){
|
||
|
driver = RouteDriver.new();
|
||
|
}
|
||
|
var driver_listeners = driver.getListeners();
|
||
|
foreach(var listener; driver_listeners){
|
||
|
append(m.listeners, setlistener(listener, func m.layer.update()));
|
||
|
}
|
||
|
m.route_driver = driver;
|
||
|
return m;
|
||
|
};
|
||
|
|
||
|
var del = func() {
|
||
|
foreach (var l; me.listeners)
|
||
|
removelistener(l);
|
||
|
};
|
||
|
|
||
|
var WPTModel = {
|
||
|
new: func(fp, idx) {
|
||
|
var m = { parents:[WPTModel] };
|
||
|
var wp = fp.getWP(idx);
|
||
|
|
||
|
m.id = wp.id;
|
||
|
m.name = wp.wp_name;
|
||
|
m.alt = wp.alt_cstr;
|
||
|
m.spd = wp.speed_cstr;
|
||
|
m.type = wp.wp_type;
|
||
|
(m.lat,m.lon) = (wp.wp_lat,wp.wp_lon);
|
||
|
var is_rwy = (m.type == 'runway');
|
||
|
var id_len = size(m.id);
|
||
|
if(!is_rwy and id_len < 5){
|
||
|
if(id_len == 4 and airportinfo(m.id) != nil)
|
||
|
m.navtype = 'airport';
|
||
|
else {
|
||
|
var navaid = nil;
|
||
|
foreach(var t; ['vor', 'ndb']){
|
||
|
navaid = navinfo(m.lat, m.lon, t, m.id);
|
||
|
if(navaid != nil and size(navaid)){
|
||
|
m.navtype = t;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if(navaid == nil or !size(navaid)) m.navtype = 'fix';
|
||
|
}
|
||
|
} else {
|
||
|
m.navtype = (is_rwy ? 'rwy' : 'fix');
|
||
|
}
|
||
|
|
||
|
m.wp = wp;
|
||
|
idx = wp.index;
|
||
|
m.idx = idx;
|
||
|
m.is_departure = (idx == 0 and is_rwy);
|
||
|
m.is_destination = (idx > 0 and is_rwy);
|
||
|
return m;
|
||
|
},
|
||
|
equals: func(other) {
|
||
|
# this is set on symbol init, so use this for equality...
|
||
|
me.name == other.name and me.alt == other.alt and
|
||
|
me.type == other.type and me.idx == other.idx and
|
||
|
me.navtype == other.navtype
|
||
|
},
|
||
|
};
|
||
|
|
||
|
var searchCmd = func {
|
||
|
var driver = me.route_driver;
|
||
|
if(!driver.shouldUpdate()) return [];
|
||
|
driver.update();
|
||
|
var result = [];
|
||
|
var planCount = driver.getNumberOfFlightPlans();
|
||
|
for(var idx = 0; idx < planCount; idx += 1){
|
||
|
var fp = driver.getFlightPlan(idx);
|
||
|
if(fp == nil) continue;
|
||
|
var fpSize = fp.getPlanSize(idx);
|
||
|
for (var i = 0; i < fpSize; i+=1){
|
||
|
if(!driver.shouldUpdate()) return[];
|
||
|
append(result, WPTModel.new(fp, i));
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
}
|