From 4c3c5cde632cc041fcc4e82940860d95571c6a9b Mon Sep 17 00:00:00 2001 From: Stuart Buchanan <stuart_d_buchanan@yahoo.co.uk> Date: Wed, 31 Jan 2018 22:47:35 +0000 Subject: [PATCH] Implement Nearest Intersections page. --- .../FG1000/Models/NearestIntersections.svg | 790 ++++++++++++++++++ .../Nasal/Interfaces/NavDataInterface.nas | 24 + .../NavigationMap/NavigationMapStyles.nas | 10 +- .../Nasal/NearestAirports/NearestAirports.nas | 2 +- .../NearestIntersections.nas | 133 ++- .../NearestIntersectionsController.nas | 109 ++- 6 files changed, 1040 insertions(+), 28 deletions(-) create mode 100644 Aircraft/Instruments-3d/FG1000/Models/NearestIntersections.svg diff --git a/Aircraft/Instruments-3d/FG1000/Models/NearestIntersections.svg b/Aircraft/Instruments-3d/FG1000/Models/NearestIntersections.svg new file mode 100644 index 000000000..f2c705ca0 --- /dev/null +++ b/Aircraft/Instruments-3d/FG1000/Models/NearestIntersections.svg @@ -0,0 +1,790 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="1024px" + height="768px" + viewBox="0 0 1024 768" + version="1.1" + id="SVGRoot" + inkscape:version="0.91 r13725" + sodipodi:docname="NearestIntersections.svg"> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#ffffff" + borderopacity="0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.5726105" + inkscape:cx="935.29615" + inkscape:cy="433.27197" + inkscape:document-units="px" + inkscape:current-layer="NearestIntersectionsGroup" + showgrid="true" + inkscape:window-width="2495" + inkscape:window-height="1416" + inkscape:window-x="65" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:snap-global="true" + inkscape:snap-grids="true" + inkscape:snap-bbox="true" + inkscape:snap-others="true" + inkscape:snap-to-guides="true" + inkscape:bbox-paths="false" + inkscape:snap-nodes="true" + inkscape:snap-page="true" + inkscape:bbox-nodes="true" + showguides="false"> + <inkscape:grid + type="xygrid" + id="grid4269" /> + </sodipodi:namedview> + <defs + id="defs7962" /> + <metadata + id="metadata7965"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:groupmode="layer" + id="layer3" + inkscape:label="NearestIntersectionsLayer"> + <g + inkscape:label="#g4237" + id="NearestIntersectionsGroup"> + <rect + inkscape:label="#rect8921" + y="53.505371" + x="724.50537" + height="688.98926" + width="309.98926" + id="Background" + style="opacity:1;fill:#1a3030;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.01074231;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <rect + y="77.683525" + x="730.68347" + height="264.61694" + width="288.63297" + id="rect9743" + style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.39907384;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <rect + y="67.398781" + x="745.3988" + height="20.202429" + width="84.190727" + id="rect9753" + style="opacity:1;fill:#1a3030;fill-opacity:1;fill-rule:nonzero;stroke:#fffcfa;stroke-width:1;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text9749" + y="80.307159" + x="774.57446" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.51583004px;line-height:125%;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#fffcfa;stroke-width:0.967722px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + transform="scale(0.96767669,1.033403)"><tspan + y="80.307159" + x="774.57446" + id="tspan9751" + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';stroke-width:0.967722px">NEAREST INT</tspan><tspan + y="98.45195" + x="774.57446" + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';stroke-width:0.967722px" + id="tspan4878" /></text> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsID0" + y="103.49844" + x="794.41644" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767632,1.0334034)"><tspan + y="103.49844" + x="794.41644" + id="tspan4242" + sodipodi:role="line">KSFO</tspan></text> + <text + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="908.79016" + y="103.49844" + id="NearestIntersectionsCRS0" + sodipodi:linespacing="125%" + transform="scale(0.96767632,1.0334034)"><tspan + sodipodi:role="line" + id="tspan4253" + x="908.79016" + y="103.49844">359</tspan></text> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsDST0" + y="104.30227" + x="1031.7998" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.26409912px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow, Condensed';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767632,1.0334034)"><tspan + y="104.30227" + x="1031.7998" + id="tspan4257" + sodipodi:role="line">200nm</tspan></text> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.87584442px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 740.43792,98.041859 0,4.062081 9.44228,0 0,4.06207 8.67785,-6.0619 -8.67785,-6.124308 0,4.062057 z" + id="NearestIntersectionsArrow0" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccc" + inkscape:label="#path4259" /> + <rect + y="365.05319" + x="730.44775" + height="67.499069" + width="289.10455" + id="rect4331" + style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <rect + y="353.10547" + x="745.5" + height="20.02869" + width="89.028687" + id="rect4333" + style="opacity:1;fill:#1a3030;fill-opacity:1;fill-rule:nonzero;stroke:#fffcfa;stroke-width:1;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="text4335" + y="357.03204" + x="775.05835" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.51583004px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#fffcfa;stroke-width:0.967722px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + transform="scale(0.96767669,1.033403)"><tspan + y="357.03204" + x="775.05835" + id="tspan4337" + sodipodi:role="line" + style="stroke-width:0.967722px">INFORMATION</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:19.35444069px;line-height:125%;font-family:Sans;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="753.573" + y="249.65851" + id="text4355" + sodipodi:linespacing="125%" + transform="scale(0.96767669,1.033403)"><tspan + sodipodi:role="line" + id="tspan4357" + x="753.573" + y="249.65851" /></text> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsLat" + y="381.66174" + x="760.81995" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767669,1.033403)"><tspan + y="381.66174" + x="760.81995" + id="tspan4361" + sodipodi:role="line">N 56 45.29</tspan></text> + <rect + style="opacity:1;fill:#c0c0c0;fill-opacity:1;fill-rule:nonzero;stroke:#c0c0c0;stroke-width:1.35785162;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="NearestIntersectionsScrollTrough" + width="4.6345778" + height="248.64197" + x="1010.6788" + y="83.679108" + inkscape:label="#rect4231" /> + <rect + inkscape:label="#rect4231" + y="83.481094" + x="1010.4811" + height="115.03781" + width="5.0298772" + id="NearestIntersectionsScrollThumb" + style="opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:0.96218586;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + <flowRoot + xml:space="preserve" + id="flowRoot5077" + style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:20px;line-height:125%;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:Sans;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr"><flowRegion + id="flowRegion5079"><rect + id="rect5081" + width="365" + height="275" + x="695" + y="93" /></flowRegion><flowPara + id="flowPara5083"></flowPara></flowRoot> <text + transform="scale(0.96767632,1.0334034)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="794.41644" + y="124.86945" + id="NearestIntersectionsID1" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5087" + x="794.41644" + y="124.86945">KSFO</tspan></text> + <text + transform="scale(0.96767632,1.0334034)" + sodipodi:linespacing="125%" + id="NearestIntersectionsCRS1" + y="124.86945" + x="908.79016" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232"><tspan + y="124.86945" + x="908.79016" + id="tspan5091" + sodipodi:role="line">359</tspan></text> + <text + transform="scale(0.96767632,1.0334034)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.26409912px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow, Condensed';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="1031.7998" + y="125.67334" + id="NearestIntersectionsDST1" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5095" + x="1031.7998" + y="125.67334">200nm</tspan></text> + <path + inkscape:label="#path4259" + sodipodi:nodetypes="cccccccc" + inkscape:connector-curvature="0" + id="NearestIntersectionsArrow1" + d="m 740.43792,120.12679 0,4.06208 9.44228,0 0,4.06207 8.67785,-6.0619 -8.67785,-6.1243 0,4.06205 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.87584442px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsID2" + y="146.24054" + x="794.41644" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767632,1.0334034)"><tspan + y="146.24054" + x="794.41644" + id="tspan5101" + sodipodi:role="line">KSFO</tspan></text> + <text + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="908.79016" + y="146.24054" + id="NearestIntersectionsCRS2" + sodipodi:linespacing="125%" + transform="scale(0.96767632,1.0334034)"><tspan + sodipodi:role="line" + id="tspan5105" + x="908.79016" + y="146.24054">359</tspan></text> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsDST2" + y="147.04431" + x="1031.7998" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.26409912px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow, Condensed';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767632,1.0334034)"><tspan + y="147.04431" + x="1031.7998" + id="tspan5109" + sodipodi:role="line">200nm</tspan></text> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.87584442px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 740.43792,142.21169 0,4.06208 9.44228,0 0,4.06207 8.67785,-6.0619 -8.67785,-6.1243 0,4.06205 z" + id="NearestIntersectionsArrow2" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccc" + inkscape:label="#path4259" /> + <text + transform="scale(0.96767632,1.0334034)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="794.41644" + y="167.61153" + id="NearestIntersectionsID3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5115" + x="794.41644" + y="167.61153">KSFO</tspan></text> + <text + transform="scale(0.96767632,1.0334034)" + sodipodi:linespacing="125%" + id="NearestIntersectionsCRS3" + y="167.61153" + x="908.79016" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232"><tspan + y="167.61153" + x="908.79016" + id="tspan5119" + sodipodi:role="line">359</tspan></text> + <text + transform="scale(0.96767632,1.0334034)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.26409912px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow, Condensed';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="1031.7998" + y="168.41536" + id="NearestIntersectionsDST3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5123" + x="1031.7998" + y="168.41536">200nm</tspan></text> + <path + inkscape:label="#path4259" + sodipodi:nodetypes="cccccccc" + inkscape:connector-curvature="0" + id="NearestIntersectionsArrow3" + d="m 740.43792,164.29659 0,4.06208 9.44228,0 0,4.06207 8.67785,-6.0619 -8.67785,-6.1243 0,4.06205 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.87584442px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsID4" + y="188.9826" + x="795.09454" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767632,1.0334034)"><tspan + y="188.9826" + x="795.09454" + id="tspan5129" + sodipodi:role="line">KSFO</tspan></text> + <text + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="909.46826" + y="188.9826" + id="NearestIntersectionsCRS4" + sodipodi:linespacing="125%" + transform="scale(0.96767632,1.0334034)"><tspan + sodipodi:role="line" + id="tspan5133" + x="909.46826" + y="188.9826">359</tspan></text> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsDST4" + y="189.78644" + x="1032.4779" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.26409912px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow, Condensed';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767632,1.0334034)"><tspan + y="189.78644" + x="1032.4779" + id="tspan5137" + sodipodi:role="line">200nm</tspan></text> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.87584442px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 741.0941,186.38149 0,4.06208 9.44228,0 0,4.06207 8.67785,-6.0619 -8.67785,-6.1243 0,4.06205 z" + id="NearestIntersectionsArrow4" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccc" + inkscape:label="#path4259" /> + <text + transform="scale(0.96767632,1.0334034)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="795.09454" + y="210.35364" + id="NearestIntersectionsID5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5143" + x="795.09454" + y="210.35364">KSFO</tspan></text> + <text + transform="scale(0.96767632,1.0334034)" + sodipodi:linespacing="125%" + id="NearestIntersectionsCRS5" + y="210.35364" + x="909.46826" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232"><tspan + y="210.35364" + x="909.46826" + id="tspan5147" + sodipodi:role="line">359</tspan></text> + <text + transform="scale(0.96767632,1.0334034)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.26409912px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow, Condensed';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="1032.4779" + y="211.15747" + id="NearestIntersectionsDST5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5151" + x="1032.4779" + y="211.15747">200nm</tspan></text> + <path + inkscape:label="#path4259" + sodipodi:nodetypes="cccccccc" + inkscape:connector-curvature="0" + id="NearestIntersectionsArrow5" + d="m 741.0941,208.4664 0,4.06208 9.44228,0 0,4.06207 8.67785,-6.0619 -8.67785,-6.1243 0,4.06205 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.87584442px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsID6" + y="231.72469" + x="795.09454" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767632,1.0334034)"><tspan + y="231.72469" + x="795.09454" + id="tspan5157" + sodipodi:role="line">KSFO</tspan></text> + <text + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="909.46826" + y="231.72469" + id="NearestIntersectionsCRS6" + sodipodi:linespacing="125%" + transform="scale(0.96767632,1.0334034)"><tspan + sodipodi:role="line" + id="tspan5161" + x="909.46826" + y="231.72469">359</tspan></text> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsDST6" + y="232.52846" + x="1032.4779" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.26409912px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow, Condensed';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767632,1.0334034)"><tspan + y="232.52846" + x="1032.4779" + id="tspan5165" + sodipodi:role="line">200nm</tspan></text> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.87584442px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 741.0941,230.55131 0,4.06208 9.44228,0 0,4.06207 8.67785,-6.0619 -8.67785,-6.1243 0,4.06205 z" + id="NearestIntersectionsArrow6" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccc" + inkscape:label="#path4259" /> + <text + transform="scale(0.96767632,1.0334034)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="795.09454" + y="253.09572" + id="NearestIntersectionsID7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5171" + x="795.09454" + y="253.09572">KSFO</tspan></text> + <text + transform="scale(0.96767632,1.0334034)" + sodipodi:linespacing="125%" + id="NearestIntersectionsCRS7" + y="253.09572" + x="909.46826" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232"><tspan + y="253.09572" + x="909.46826" + id="tspan5175" + sodipodi:role="line">359</tspan></text> + <text + transform="scale(0.96767632,1.0334034)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.26409912px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow, Condensed';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="1032.4779" + y="253.89952" + id="NearestIntersectionsDST7" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5179" + x="1032.4779" + y="253.89952">200nm</tspan></text> + <path + inkscape:label="#path4259" + sodipodi:nodetypes="cccccccc" + inkscape:connector-curvature="0" + id="NearestIntersectionsArrow7" + d="m 741.0941,252.63622 0,4.06208 9.44228,0 0,4.06207 8.67785,-6.0619 -8.67785,-6.1243 0,4.06205 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.87584442px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsID8" + y="274.46677" + x="795.09454" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767632,1.0334034)"><tspan + y="274.46677" + x="795.09454" + id="tspan5227" + sodipodi:role="line">KSFO</tspan></text> + <text + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="909.46826" + y="274.46677" + id="NearestIntersectionsCRS8" + sodipodi:linespacing="125%" + transform="scale(0.96767632,1.0334034)"><tspan + sodipodi:role="line" + id="tspan5231" + x="909.46826" + y="274.46677">359</tspan></text> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsDST8" + y="275.2706" + x="1032.4779" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.26409912px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow, Condensed';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767632,1.0334034)"><tspan + y="275.2706" + x="1032.4779" + id="tspan5235" + sodipodi:role="line">200nm</tspan></text> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.87584442px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 741.0941,274.72112 0,4.06208 9.44228,0 0,4.06207 8.67785,-6.0619 -8.67785,-6.1243 0,4.06205 z" + id="NearestIntersectionsArrow8" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccc" + inkscape:label="#path4259" /> + <text + transform="scale(0.96767632,1.0334034)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="795.09454" + y="295.83777" + id="NearestIntersectionsID9" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5241" + x="795.09454" + y="295.83777">KSFO</tspan></text> + <text + transform="scale(0.96767632,1.0334034)" + sodipodi:linespacing="125%" + id="NearestIntersectionsCRS9" + y="295.83777" + x="909.46826" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232"><tspan + y="295.83777" + x="909.46826" + id="tspan5245" + sodipodi:role="line">359</tspan></text> + <text + transform="scale(0.96767632,1.0334034)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.26409912px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow, Condensed';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="1032.4779" + y="296.6416" + id="NearestIntersectionsDST9" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5249" + x="1032.4779" + y="296.6416">200nm</tspan></text> + <path + inkscape:label="#path4259" + sodipodi:nodetypes="cccccccc" + inkscape:connector-curvature="0" + id="NearestIntersectionsArrow9" + d="m 741.0941,296.80602 0,4.06208 9.44228,0 0,4.06207 8.67785,-6.0619 -8.67785,-6.1243 0,4.06205 z" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.87584442px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsID10" + y="317.20883" + x="795.09454" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767632,1.0334034)"><tspan + y="317.20883" + x="795.09454" + id="tspan5255" + sodipodi:role="line">KSFO</tspan></text> + <text + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="909.46826" + y="317.20883" + id="NearestIntersectionsCRS10" + sodipodi:linespacing="125%" + transform="scale(0.96767632,1.0334034)"><tspan + sodipodi:role="line" + id="tspan5259" + x="909.46826" + y="317.20883">359</tspan></text> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsDST10" + y="318.01266" + x="1032.4779" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.26409912px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow, Condensed';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767632,1.0334034)"><tspan + y="318.01266" + x="1032.4779" + id="tspan5263" + sodipodi:role="line">200nm</tspan></text> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.87584442px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 741.0941,318.89093 0,4.06208 9.44228,0 0,4.06207 8.67785,-6.0619 -8.67785,-6.1243 0,4.06205 z" + id="NearestIntersectionsArrow10" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccc" + inkscape:label="#path4259" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99875104;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect5267" + width="289.00125" + height="84.001251" + x="730.4707" + y="465.49939" /> + <rect + style="opacity:1;fill:#1a3030;fill-opacity:1;fill-rule:nonzero;stroke:#fffcfa;stroke-width:1;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect5269" + width="108.92543" + height="19.925432" + x="745.52295" + y="453.55164" /> + <text + transform="scale(0.96767669,1.033403)" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.51583004px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#fffcfa;stroke-width:0.967722px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="775.02869" + y="454.18149" + id="text5271" + sodipodi:linespacing="125%"><tspan + style="stroke-width:0.967722px" + sodipodi:role="line" + id="tspan5273" + x="775.02869" + y="454.18149">REFERENCE VOR</tspan></text> + <text + transform="scale(0.96767669,1.033403)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="762.05792" + y="476.87561" + id="NearestIntersectionsVORID" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="762.05792" + y="476.87561" + id="tspan5287">VOR</tspan></text> + <text + transform="scale(0.96767669,1.033403)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="760.81995" + y="404.29984" + id="NearestIntersectionsLon" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5285" + x="760.81995" + y="404.29984">E 56 45.78</tspan></text> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsVORFreq" + y="478.81119" + x="937.73645" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767669,1.033403)"><tspan + id="tspan5293" + y="478.81119" + x="937.73645" + sodipodi:role="line">116.650</tspan></text> + <text + sodipodi:linespacing="125%" + id="NearestIntersectionsVORCRS" + y="515.58264" + x="781.37463" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve" + inkscape:label="#text4232" + transform="scale(0.96767669,1.033403)"><tspan + id="tspan5301" + y="515.58264" + x="781.37463" + sodipodi:role="line">123</tspan></text> + <text + transform="scale(0.96767669,1.033403)" + inkscape:label="#text4232" + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.35444069px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="889.88196" + y="515.58264" + id="NearestIntersectionsVORDST" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="889.88196" + y="515.58264" + id="tspan5305">23nm</tspan></text> + </g> + </g> +</svg> diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/Interfaces/NavDataInterface.nas b/Aircraft/Instruments-3d/FG1000/Nasal/Interfaces/NavDataInterface.nas index 721747a98..685fd5ad5 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/Interfaces/NavDataInterface.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/Interfaces/NavDataInterface.nas @@ -41,6 +41,26 @@ getNearestAirports : func() return apts; }, +# Find the nearest nav aids of a given type within 200nm, to a maximum of 25. +getNavDataWithinRange: func(type) +{ + # To make this more efficient for areas with a high density of fixes, we'll try + # a small radius first and expand until we have reached 200nm or have 25 nav aids. + var radius = 0; + var navdata = []; + + while ((radius <= 200) and (size(navdata) < 25)) { + radius = radius + 50; + navdata = findNavaidsWithinRange(radius, type); + } + + if (size(navdata) > 25) { + navdata = subvec(navdata, 0, 25); + } + + return navdata; +}, + # Find a specific airport by ID. Return an array of airport objects getAirportById : func(id) { @@ -209,6 +229,10 @@ RegisterWithEmesary : func() notification.EventParameter.Value = controller.getNavDataById(notification.EventParameter.Value); return emesary.Transmitter.ReceiptStatus_Finished; } + if (id == "NavDataWithinRange") { + notification.EventParameter.Value = controller.getNavDataWithinRange(notification.EventParameter.Value); + return emesary.Transmitter.ReceiptStatus_Finished; + } if (id == "Flightplan") { notification.EventParameter.Value = controller.getFlightplan(); return emesary.Transmitter.ReceiptStatus_Finished; diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/NavigationMap/NavigationMapStyles.nas b/Aircraft/Instruments-3d/FG1000/Nasal/NavigationMap/NavigationMapStyles.nas index 2c72fa045..280db8d97 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/NavigationMap/NavigationMapStyles.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/NavigationMap/NavigationMapStyles.nas @@ -47,9 +47,17 @@ var NavigationMapStyles = me.Styles.FLT.line_width = 3; me.Styles.FIX = {}; - me.Styles.FIX.color = [1,0,0]; + me.Styles.FIX.color = [0,0,0]; # White outline + me.Styles.FIX.fill_color = [1,1,1,1]; # Black fill me.Styles.FIX.scale_factor = 0.4; # 40% + me.Styles.FIX.text_offset = [0, -12]; + me.Styles.FIX.text_color = [0,0,0,1]; # Black text ... + me.Styles.FIX.text_bgcolor = [1,1,1,1]; # ... on a white background + me.Styles.FIX.text_mode = canvas.Text.TEXT + canvas.Text.FILLEDBOUNDINGBOX; + me.Styles.FIX.text_padding = 2; + me.Styles.FIX.text_alignment = 'center-bottom'; + me.Styles.VOR = {}; me.Styles.VOR.range_line_width = 2; me.Styles.VOR.radial_line_width = 1; diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/NearestAirports/NearestAirports.nas b/Aircraft/Instruments-3d/FG1000/Nasal/NearestAirports/NearestAirports.nas index 20c32ed83..dc4784635 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/NearestAirports/NearestAirports.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/NearestAirports/NearestAirports.nas @@ -126,7 +126,7 @@ var NearestAirports = var apt = apts[i]; var crsAndDst = courseAndDistance(apt); - # Display the cours and distance in NM . + # Display the course and distance in NM . # 248 is the extended ASCII code for the degree symbol var crs = sprintf("%i%c", crsAndDst[0], 248); var dst = sprintf("%.1fnm", crsAndDst[1]); diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/NearestIntersections/NearestIntersections.nas b/Aircraft/Instruments-3d/FG1000/Nasal/NearestIntersections/NearestIntersections.nas index 048a23e73..7d390cece 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/NearestIntersections/NearestIntersections.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/NearestIntersections/NearestIntersections.nas @@ -10,34 +10,143 @@ var NearestIntersections = ], }; - obj.topMenu(device, obj, nil); - obj.setController(fg1000.NearestIntersectionsController.new(obj, svg)); + # Dynamic elements. There is a single dynamic element containing the list of + # the 25 nearest intersections. + obj.select = PFD.GroupElement.new( + obj.pageName, + svg, + [ "Arrow", "ID", "CRS", "DST"], + 11, + "Arrow", + 1, + "ScrollTrough", + "ScrollThumb", + 250 - 116 + ); + + # Other dynamic text elements + obj.addTextElements(["Lat", "Lon", "VORID", "VORFreq", "VORCRS", "VORDST"]); + + obj.topMenu(device, obj, nil); + return obj; }, + + # Indicate which group is selected by colour of the softkeys + display_toggle : func(device, svg, mi, group) { + var bg_name = sprintf("SoftKey%d-bg",mi.menu_id); + if (me.getController().getSelectedGroup() == group) { + device.svg.getElementById(bg_name).setColorFill(0.5,0.5,0.5); + svg.setColor(0.0,0.0,0.0); + } else { + device.svg.getElementById(bg_name).setColorFill(0.0,0.0,0.0); + svg.setColor(1.0,1.0,1.0); + } + svg.setText(mi.title); + svg.setVisible(1); # display function + }, + offdisplay : func() { - me._group.setVisible(0); + # The Nearest... pages use the underlying navigation map. + me.mfd.NavigationMap.offdisplayPartial(); # Reset the menu colours. Shouldn't have to do this here, but # there's not currently an obvious other location to do so. - for(var i = 0; i < 12; i +=1) { - var name = sprintf("SoftKey%d",i); - me.device.svg.getElementById(name ~ "-bg").setColorFill(0.0,0.0,0.0); - me.device.svg.getElementById(name).setColor(1.0,1.0,1.0); - } + me.resetMenuColors(); + me.getController().offdisplay(); }, ondisplay : func() { - me._group.setVisible(1); - me.mfd.setPageTitle(me.title); me.getController().ondisplay(); + + # The Nearest... pages use the underlying navigation map. + me.mfd.NavigationMap.ondisplayPartial(); + + me.mfd.setPageTitle(me.title); }, + updateNavData : func(navdata) { + + if ((navdata == nil) or (size(navdata) == 0)) return; + + var navDataList = []; + for (var i = 0; i < size(navdata); i = i + 1) { + var nav = navdata[i]; + var crsAndDst = courseAndDistance(nav); + + # Display the course and distance in NM . + # 248 is the extended ASCII code for the degree symbol + var crs = sprintf("%i%c", crsAndDst[0], 248); + var dst = sprintf("%.1fnm", crsAndDst[1]); + + # Convert into something we can pass straight to the UIGroup. + append(navDataList, { + Arrow : nav.id, + ID: nav.id, + CRS: crs, + DST: dst, + }); + } + + me.select.setValues(navDataList); + + if (size(navDataList) > 0) { + me.updateNavDataItem(navdata[0]); + me.select.showCRSR(); + } else { + me.select.hideCRSR(); + me.setTextElement("Lat", "NONE WITHIN 200NM"); + me.setTextElement("VORID", ""); + me.setTextElement("VORFreq", ""); + me.setTextElement("VORCRS", ""); + me.setTextElement("VORDST", ""); + } + }, + updateNavDataItem : func(nav) { + + if (nav == nil) return; + + if (nav.lat < 0.0) { + me.setTextElement("Lat", sprintf("S %.4f", -nav.lat)); + } else { + me.setTextElement("Lat", sprintf("N %.4f", nav.lat)); + } + + if (nav.lon < 0.0) { + me.setTextElement("Lon", sprintf("W%3.4f", -nav.lon)); + } else { + me.setTextElement("Lon", sprintf("E%3.4f", nav.lon)); + } + + # Determine the nearest VOR, and the bearing and distance TO the VOR, + var vordata = me.getController().getNearestNavData("vor"); + + if ((vordata != nil ) and (size(vordata) > 0)) { + var crsAndDst = courseAndDistance(nav, vordata[0]); + var crs = sprintf("%i%c", crsAndDst[0], 248); + var dst = sprintf("%.1fnm", crsAndDst[1]); + me.setTextElement("VORID", vordata[0].id); + me.setTextElement("VORFreq", sprintf("%.2f", vordata[0].frequency / 100.0)); + me.setTextElement("VORCRS", crs); + me.setTextElement("VORDST", dst); + } else { + me.setTextElement("VORID", ""); + me.setTextElement("VORFreq", ""); + me.setTextElement("VORCRS", ""); + me.setTextElement("VORDST", ""); + } + + # Display the DTO line to the airport + me.mfd.NavigationMap.getController().setDTOLineTarget(nav.lat, nav.lon); + }, + topMenu : func(device, pg, menuitem) { pg.clearMenu(); pg.resetMenuColors(); + pg.addMenuItem(0, "ENGINE", pg, pg.mfd.EIS.engineMenu); + pg.addMenuItem(2, "MAP", pg, pg.mfd.NavigationMap.mapMenu); + device.updateMenus(); }, - - }; diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/NearestIntersections/NearestIntersectionsController.nas b/Aircraft/Instruments-3d/FG1000/Nasal/NearestIntersections/NearestIntersectionsController.nas index 8d73e13bf..34f7138de 100644 --- a/Aircraft/Instruments-3d/FG1000/Nasal/NearestIntersections/NearestIntersectionsController.nas +++ b/Aircraft/Instruments-3d/FG1000/Nasal/NearestIntersections/NearestIntersectionsController.nas @@ -1,59 +1,140 @@ # NearestIntersections Controller var NearestIntersectionsController = { + UIGROUP : { + NONE : 0, # No group currently selected, + APT : 1, + RNWY : 2, + FREQ : 3, + APR : 4, + }, + new : func (page, svg) { - var obj = { - parents : [ NearestIntersectionsController, MFDPageController.new(page) ], - _crsrToggle : 0, - _recipient : nil, - _page : page, - }; + var obj = { parents : [ NearestIntersectionsController, MFDPageController.new(page) ] }; + + # Current active UI group. + obj.page = page; + obj._crsrToggle = 0; return obj; }, + selectAirports : func() { + me.selectGroup(NearestAirportsController.UIGROUP.APT) + }, + selectRunways : func() { + me.selectGroup(NearestAirportsController.UIGROUP.RNWY); + }, + selectFrequencies : func() { + me.selectGroup(NearestAirportsController.UIGROUP.FREQ); + }, + selectApproaches : func() { + me.selectGroup(NearestAirportsController.UIGROUP.APR); + }, + getSelectedGroup : func() { + return me._currentGroup; + }, + selectGroup : func(grp) { + me._currentGroup = grp; + # The current Airport is always highlighted - we're either changing it directly, + # or viewing the selected airport. + if (grp == NearestAirportsController.UIGROUP.RNWY) me.page.runwaySelect.highlightElement() else me.page.runwaySelect.unhighlightElement(); + if (grp == NearestAirportsController.UIGROUP.FREQ) me.page.freqSelect.showCRSR() else me.page.freqSelect.hideCRSR(); + if (grp == NearestAirportsController.UIGROUP.APR) me.page.approachSelect.showCRSR() else me.page.approachSelect.hideCRSR(); + me._crsrToggle = 1; + }, # Input Handling handleCRSR : func() { me._crsrToggle = (! me._crsrToggle); - if (me._crsrToggle) { - } else { - me._page.hideCRSR(); - } return emesary.Transmitter.ReceiptStatus_Finished; }, handleFMSInner : func(value) { if (me._crsrToggle == 1) { # Scroll through whatever is the current list + me.page.select.incrSmall(value); + var id = me.page.select.getValue(); + var data = me.getNavDataItem(id); + if ((data != nil) and (size(data) >0)) me.page.updateNavDataItem(data[0]); return emesary.Transmitter.ReceiptStatus_Finished; } else { - # Pass to the page group controller to display and scroll through the page group menu - return me._page.mfd.SurroundController.handleFMSInner(value); + return me.page.mfd.SurroundController.handleFMSInner(value); } }, handleFMSOuter : func(value) { if (me._crsrToggle == 1) { + # Scroll through whatever is the current list + me.page.select.incrSmall(value); + var id = me.page.select.getValue(); + var data = me.getNavDataItem(id); + if ((data != nil) and (size(data) >0)) me.page.updateNavDataItem(data[0]); return emesary.Transmitter.ReceiptStatus_Finished; } else { - # Pass to the page group controller to display and scroll through the page group menu - return me._page.mfd.SurroundController.handleFMSOuter(value); + return me.page.mfd.SurroundController.handleFMSOuter(value); } }, handleEnter : func(value) { if (me._crsrToggle == 1) { + me.page.select.incrSmall(value); + var id = me.page.select.getValue(); + var data = me.getNavDataItem(id); + if ((data != nil) and (size(data) >0)) me.page.updateNavDataItem(data[0]); return emesary.Transmitter.ReceiptStatus_Finished; } else { return emesary.Transmitter.ReceiptStatus_NotProcessed; } }, + handleRange : func(val) + { + # Pass any range entries to the NavMapController + me.page.mfd.NavigationMap.getController().handleRange(val); + }, + + # Reset controller if required when the page is displayed or hidden ondisplay : func() { me.RegisterWithEmesary(); + var fixes = me.getNearestNavData("fix"); + me.page.updateNavData(fixes); + me.page.mfd.NavigationMap.getController().enableDTO(1); }, offdisplay : func() { + me.page.mfd.NavigationMap.getController().enableDTO(0); me.DeRegisterWithEmesary(); }, + getNearestNavData : func(type) { + var notification = notifications.PFDEventNotification.new( + "MFD", + 1, + notifications.PFDEventNotification.NavData, + {Id: "NavDataWithinRange", Value: type}); + + var response = me._transmitter.NotifyAll(notification); + + if (! me._transmitter.IsFailed(response)) { + return notification.EventParameter.Value; + } else { + return nil; + } + }, + + getNavDataItem : func(id) { + # Use Emesary to get the airport + var notification = notifications.PFDEventNotification.new( + "MFD", + 1, + notifications.PFDEventNotification.NavData, + {Id: "NavDataByID", Value: id}); + + var response = me._transmitter.NotifyAll(notification); + + if (! me._transmitter.IsFailed(response)) { + return notification.EventParameter.Value; + } else { + return nil; + } + }, };