# See: http://wiki.flightgear.org/MapStructure # Class things: var name = 'RWY'; var parents = [DotSym]; var __self__ = caller(0)[0]; DotSym.makeinstance( name, __self__ ); SymbolLayer.get(name).df_style = { surface_color: canvas.SURFACECOLORS, text_alignment: "center-center", text_bgcolor: [0,0,0,0], text_color: [0,0.6,0.85], text_mode: canvas.Text.TEXT, text_padding: 0, text_size: 14, text_font: "LiberationFonts/LiberationSans-Regular.ttf", show_labels: 0, }; var element_type = "group"; # we want a group, becomes "me.element" var rwys = nil; var SURFACECOLORS = { 1 : { type: "asphalt", r:0.2, g:0.2, b:0.2 }, 2 : { type: "concrete", r:0.3, g:0.3, b:0.3 }, 3 : { type: "turf", r:0.2, g:0.5, b:0.2 }, 4 : { type: "dirt", r:0.4, g:0.3, b:0.3 }, 5 : { type: "gravel", r:0.35, g:0.3, b:0.3 }, # Helipads 6 : { type: "asphalt", r:0.2, g:0.2, b:0.2 }, 7 : { type: "concrete", r:0.3, g:0.3, b:0.3 }, 8 : { type: "turf", r:0.2, g:0.5, b:0.2 }, 9 : { type: "dirt", r:0.4, g:0.3, b:0.3 }, 0 : { type: "gravel", r:0.35, g:0.3, b:0.3 }, }; var init = func { var apt=airportinfo(me.model.id); var rwys = apt.runwaysWithoutReciprocals(); foreach (var rw1; rwys) { var clr = me.style.surface_color[rw1.surface]; if (clr == nil) { clr = SURFACECOLORS[rw1.surface]}; if (clr == nil) { clr = SURFACECOLORS[0]}; var icon_rw = me.element.createChild("path", "runway-" ~ rw1.id) .setStrokeLineWidth(0.5) .setColor(1.0,1.0,1.0) .setColorFill(clr.r, clr.g, clr.b); var rwy1 = Runway.new(rw1); var beg_thr = rwy1.pointOffCenterline(rw1.threshold); var beg_thr1 = rwy1.pointOffCenterline(rw1.threshold, 0.5 * rw1.width); var beg_thr2 = rwy1.pointOffCenterline(rw1.threshold, -0.5 * rw1.width); var beg1 = rwy1.pointOffCenterline(0, 0.5 * rw1.width); var beg2 = rwy1.pointOffCenterline(0, -0.5 * rw1.width); var rw2 = rw1.reciprocal; var rwy2 = Runway.new(rw2); var end_thr = rwy2.pointOffCenterline(rw2.threshold); var end_thr1 = rwy2.pointOffCenterline(rw2.threshold, 0.5 * rw2.width); var end_thr2 = rwy2.pointOffCenterline(rw2.threshold, -0.5 * rw2.width); var end1 = rwy2.pointOffCenterline(0, 0.5 * rw2.width); var end2 = rwy2.pointOffCenterline(0, -0.5 * rw2.width); icon_rw.setDataGeo ( [ canvas.Path.VG_MOVE_TO, canvas.Path.VG_LINE_TO, canvas.Path.VG_LINE_TO, canvas.Path.VG_LINE_TO, canvas.Path.VG_CLOSE_PATH ], [ beg1[0], beg1[1], beg2[0], beg2[1], end1[0], end1[1], end2[0], end2[1] ] ); var icon_cl = me.element.createChild("path", "centerline") .setStrokeLineWidth(0.5) .setColor(1,1,1) .setStrokeDashArray([15, 10]); icon_cl.setDataGeo ( [ canvas.Path.VG_MOVE_TO, canvas.Path.VG_LINE_TO ], [ beg_thr[0], beg_thr[1], end_thr[0], end_thr[1] ] ); var icon_thr = me.element.createChild("path", "threshold") .setStrokeLineWidth(1.5) .setColor(1,1,1); icon_thr.setDataGeo ( [ canvas.Path.VG_MOVE_TO, canvas.Path.VG_LINE_TO, canvas.Path.VG_MOVE_TO, canvas.Path.VG_LINE_TO ], [ beg_thr1[0], beg_thr1[1], beg_thr2[0], beg_thr2[1], end_thr1[0], end_thr1[1], end_thr2[0], end_thr2[1] ] ); if (me.style.show_labels == 1) { var coord1 = geo.Coord.new(); coord1.set_latlon(rw1.lat, rw1.lon); coord1.apply_course_distance(rw1.heading, - 50.0); var coord2 = geo.Coord.new(); coord2.set_latlon(rw2.lat, rw2.lon); coord2.apply_course_distance(rw2.heading, - 50.0); var txt1 = me.element.createChild("text", "rwy1label") .setText(rw1.id) .setGeoPosition(coord1.lat(), coord1.lon()) .setFont(me.style.text_font) .setFontSize(me.style.text_size) .setAlignment(me.style.text_alignment) .setPadding(me.style.text_padding) .setDrawMode(me.style.text_mode) .setColor(me.style.text_color) .setColorFill(me.style.text_bgcolor); var txt1 = me.element.createChild("text", "rwy2label") .setText(rw2.id) .setGeoPosition(coord2.lat(), coord2.lon()) .setFont(me.style.text_font) .setFontSize(me.style.text_size) .setAlignment(me.style.text_alignment) .setPadding(me.style.text_padding) .setDrawMode(me.style.text_mode) .setColor(me.style.text_color) .setColorFill(me.style.text_bgcolor); } } #draw helipads foreach(var hp; keys(apt.helipads)) { var hp = apt.runway(hp); var clr = me.style.surface_color[hp.surface]; if (clr == nil) { clr = SURFACECOLORS[hp.surface]}; if (clr == nil) { clr = SURFACECOLORS[0]}; var icon_hp = me.element.createChild("path", "helipad-" ~ hp.id) .setStrokeLineWidth(0.5) .setColor(1.0,1.0,1.0) .setColorFill(clr.r, clr.g, clr.b); var heli = Runway.new(hp); var p1 = heli.pointOffCenterline(0.5 * hp.length, 0.5 * hp.width); var p2 = heli.pointOffCenterline(0.5 * hp.length, -0.5 * hp.width); var p3 = heli.pointOffCenterline(-0.5 * hp.length, -0.5 * hp.width); var p4 = heli.pointOffCenterline(-0.5 * hp.length, 0.5 * hp.width); icon_hp.setDataGeo ( [ canvas.Path.VG_MOVE_TO, canvas.Path.VG_LINE_TO, canvas.Path.VG_LINE_TO, canvas.Path.VG_LINE_TO, canvas.Path.VG_CLOSE_PATH ], [ p1[0], p1[1], p2[0], p2[1], p3[0], p3[1], p4[0], p4[1] ] ); if (me.style.show_labels == 1) { var coord1 = geo.Coord.new(); coord1.set_latlon(rw1.lat, rw1.lon); coord1.apply_course_distance(rw1.heading, - 50.0); var txt1 = me.element.createChild("text", "hplabel") .setText(hp.id) .setGeoPosition(coord1.lat(), coord1.lon()) .setFont(me.style.text_font) .setFontSize(me.style.text_size) .setAlignment(me.style.text_alignment) .setPadding(me.style.text_padding) .setDrawMode(me.style.text_mode) .setColor(me.style.text_color) .setColorFill(me.style.text_bgcolor); } } }; var draw = func;