FG1000 Nearest Airports page
- DTO MapStructure layer to provide a DTO line to a lat/lon - Support for scrolling lists in the PFD/GroupElement - Support MAP (NavigationMap) and ENGINE (EIS) soft-keys from other pages.
This commit is contained in:
parent
cc152b67ad
commit
9eb91171b4
13 changed files with 834 additions and 480 deletions
|
@ -67,7 +67,7 @@
|
|||
inkscape:label="NavigationMapGroup"
|
||||
style="display:inline">
|
||||
<g
|
||||
id="NavigationMapGroupFull"
|
||||
id="NavigationMapGroup"
|
||||
inkscape:label="#g4869">
|
||||
<rect
|
||||
y="718.50403"
|
||||
|
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
|
@ -23,9 +23,9 @@
|
|||
borderopacity="0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.2863052"
|
||||
inkscape:cx="796.08532"
|
||||
inkscape:cy="344.63751"
|
||||
inkscape:zoom="2.5726105"
|
||||
inkscape:cx="963.17786"
|
||||
inkscape:cy="88.847167"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="NearestAirportsGroup"
|
||||
showgrid="true"
|
||||
|
@ -71,211 +71,226 @@
|
|||
id="NearestAirportsGroup">
|
||||
<rect
|
||||
inkscape:label="#rect8921"
|
||||
y="58.493786"
|
||||
x="705.49377"
|
||||
height="684.51239"
|
||||
width="319.51242"
|
||||
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:0.987571;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
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="78.004555"
|
||||
x="710.41968"
|
||||
height="134.48459"
|
||||
width="309.66068"
|
||||
y="77.483986"
|
||||
x="730.48395"
|
||||
height="135.00078"
|
||||
width="289.03204"
|
||||
id="rect9743"
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00844526;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
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
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.72408265;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99796617;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect9745"
|
||||
width="309.94263"
|
||||
height="69.270592"
|
||||
x="711.26178"
|
||||
y="336.62552" />
|
||||
width="289.00204"
|
||||
height="69.002037"
|
||||
x="730.49902"
|
||||
y="350.49896" />
|
||||
<rect
|
||||
y="421.24216"
|
||||
x="711.34943"
|
||||
height="107.3051"
|
||||
width="309.76727"
|
||||
y="445.16284"
|
||||
x="730.50055"
|
||||
height="111.33662"
|
||||
width="288.99896"
|
||||
id="rect9747"
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.90095061;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00104749;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<rect
|
||||
y="68.142975"
|
||||
x="720.14301"
|
||||
height="19.714043"
|
||||
width="134.21402"
|
||||
y="67.488281"
|
||||
x="745.48828"
|
||||
height="20.02342"
|
||||
width="126.02343"
|
||||
id="rect9753"
|
||||
style="opacity:1;fill:#1a3030;fill-opacity:1;fill-rule:nonzero;stroke:#fffcfa;stroke-width:1.28595793;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
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="83"
|
||||
x="725"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;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:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"><tspan
|
||||
y="83"
|
||||
x="725"
|
||||
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'">NEAREST AIRPORTS</tspan></text>
|
||||
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 AIRPORTS</tspan></text>
|
||||
<rect
|
||||
style="opacity:1;fill:#1a3030;fill-opacity:1;fill-rule:nonzero;stroke:#fffcfa;stroke-width:0.96605152;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
style="opacity:1;fill:#1a3030;fill-opacity:1;fill-rule:nonzero;stroke:#fffcfa;stroke-width:0.99874961;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4150"
|
||||
width="74.533928"
|
||||
height="20.033949"
|
||||
x="720.98303"
|
||||
y="325.59775" />
|
||||
width="67.001251"
|
||||
height="20.001251"
|
||||
x="745.49939"
|
||||
y="340.49939" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:15px;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:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="726"
|
||||
y="340.61472"
|
||||
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.60754"
|
||||
y="344.45227"
|
||||
id="text4152"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96767669,1.033403)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4154"
|
||||
x="726"
|
||||
y="340.61472">RUNWAYS</tspan></text>
|
||||
x="775.60754"
|
||||
y="344.45227"
|
||||
style="stroke-width:0.967722px">RUNWAYS</tspan></text>
|
||||
<rect
|
||||
y="411.81696"
|
||||
x="721.05579"
|
||||
height="19.888502"
|
||||
width="99.388496"
|
||||
y="435.50052"
|
||||
x="745.51575"
|
||||
height="19.93354"
|
||||
width="93.06028"
|
||||
id="rect4156"
|
||||
style="opacity:1;fill:#1a3030;fill-opacity:1;fill-rule:nonzero;stroke:#fffcfa;stroke-width:1.11149907;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
style="opacity:1;fill:#1a3030;fill-opacity:1;fill-rule:nonzero;stroke:#fffcfa;stroke-width:1.00104749;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="text4158"
|
||||
y="426.7612"
|
||||
x="726"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:15px;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:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"><tspan
|
||||
y="426.7612"
|
||||
x="726"
|
||||
y="435.40878"
|
||||
x="776.46429"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.53103542px;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.96873569px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"
|
||||
transform="scale(0.96654693,1.0346109)"><tspan
|
||||
y="435.40878"
|
||||
x="776.46429"
|
||||
sodipodi:role="line"
|
||||
id="tspan4162">FREQUENCIES</tspan></text>
|
||||
id="tspan4162"
|
||||
style="stroke-width:0.96873569px">FREQUENCIES</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4232"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;line-height:125%;font-family:'Liberation Sans Narrow';-inkscape-font-specification:'Liberation Sans Narrow Condensed';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="770.69727"
|
||||
y="371.42072"
|
||||
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:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="807.53778"
|
||||
y="374.26392"
|
||||
id="NearestAirportsRunwayID"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96767669,1.033403)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4238"
|
||||
x="770.69727"
|
||||
y="371.42072">17-35</tspan></text>
|
||||
x="807.53778"
|
||||
y="374.26392">17-35</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsID0"
|
||||
y="106.96484"
|
||||
x="746.10352"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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"
|
||||
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"><tspan
|
||||
y="106.96484"
|
||||
x="746.10352"
|
||||
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:20px;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="1009.6523"
|
||||
y="370.22604"
|
||||
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: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="1038.7799"
|
||||
y="373.10779"
|
||||
id="NearestAirportsRunwaySurface"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96767669,1.033403)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4246"
|
||||
x="1009.6523"
|
||||
y="370.22604">HARD SURFACE</tspan></text>
|
||||
x="1038.7799"
|
||||
y="373.10779">HARD SURFACE</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsRunwayDimensions"
|
||||
y="395.22604"
|
||||
x="729.65234"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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"
|
||||
y="397.30084"
|
||||
x="767.81775"
|
||||
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="395.22604"
|
||||
x="729.65234"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96767669,1.033403)"><tspan
|
||||
y="397.30084"
|
||||
x="767.81775"
|
||||
id="tspan4250"
|
||||
sodipodi:role="line">PCL FREQUENCY - 122.90</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsFreqLabel0"
|
||||
y="460.59219"
|
||||
x="724.98047"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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"
|
||||
y="468.18204"
|
||||
x="764.1405"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.3747139px;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="460.59219"
|
||||
x="724.98047"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96654693,1.0346109)"><tspan
|
||||
y="468.18204"
|
||||
x="764.1405"
|
||||
id="tspan4254"
|
||||
sodipodi:role="line">TOWER</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4232"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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="999.7793"
|
||||
y="460.59219"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.3747139px;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="1030.3479"
|
||||
y="468.18204"
|
||||
id="NearestAirportsFreq0"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96654693,1.0346109)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4258"
|
||||
x="999.7793"
|
||||
y="460.59219">119.875</tspan></text>
|
||||
x="1030.3479"
|
||||
y="468.18204">119.875</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4232"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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="724.98047"
|
||||
y="484.8779"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.3747139px;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="764.1405"
|
||||
y="491.70847"
|
||||
id="NearestAirportsFreqLabel1"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96654693,1.0346109)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4262"
|
||||
x="724.98047"
|
||||
y="484.8779">TOWER</tspan></text>
|
||||
x="764.1405"
|
||||
y="491.70847">TOWER</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsFreq1"
|
||||
y="484.8779"
|
||||
x="999.7793"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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"
|
||||
y="491.70847"
|
||||
x="1030.3479"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.3747139px;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"><tspan
|
||||
y="484.8779"
|
||||
x="999.7793"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96654693,1.0346109)"><tspan
|
||||
y="491.70847"
|
||||
x="1030.3479"
|
||||
id="tspan4266"
|
||||
sodipodi:role="line">119.875</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsFreqLabel2"
|
||||
y="509.16367"
|
||||
x="724.98047"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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"
|
||||
y="515.23486"
|
||||
x="764.1405"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.3747139px;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="509.16367"
|
||||
x="724.98047"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96654693,1.0346109)"><tspan
|
||||
y="515.23486"
|
||||
x="764.1405"
|
||||
id="tspan4270"
|
||||
sodipodi:role="line">TOWER</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4232"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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="999.7793"
|
||||
y="509.16367"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.3747139px;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="1030.3479"
|
||||
y="515.23486"
|
||||
id="NearestAirportsFreq2"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96654693,1.0346109)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4274"
|
||||
x="999.7793"
|
||||
y="509.16367">119.875</tspan></text>
|
||||
x="1030.3479"
|
||||
y="515.23486">119.875</tspan></text>
|
||||
<path
|
||||
style="fill:#404040;fill-opacity:1;fill-rule:evenodd;stroke:#404040;stroke-width:0.88437384px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 735.55778,360.09923 0,9.08226 -4.41338,-4.48437 z"
|
||||
style="fill:#404040;fill-opacity:1;fill-rule:evenodd;stroke:#404040;stroke-width:0.85582805px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 748.52946,375.44339 0,9.08269 -4.13287,-4.48458 z"
|
||||
id="NearestAirportsRunwayIDLeft"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccc"
|
||||
|
@ -285,35 +300,37 @@
|
|||
sodipodi:nodetypes="cccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="NearestAirportsRunwayIDRight"
|
||||
d="m 805.96996,360.09923 0,9.08226 4.41338,-4.48437 z"
|
||||
style="fill:#404040;fill-opacity:1;fill-rule:evenodd;stroke:#404040;stroke-width:0.88437384px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
d="m 814.46639,375.44339 0,9.08269 4.13287,-4.48458 z"
|
||||
style="fill:#404040;fill-opacity:1;fill-rule:evenodd;stroke:#404040;stroke-width:0.85582805px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<text
|
||||
inkscape:label="#text4232"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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="863.65973"
|
||||
y="106.96484"
|
||||
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="NearestAirportsCRS0"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4253"
|
||||
x="863.65973"
|
||||
y="106.96484">359</tspan></text>
|
||||
x="908.79016"
|
||||
y="103.49844">359</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsDST0"
|
||||
y="107.79551"
|
||||
x="996.14514"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.94000101px;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;text-anchor:end;fill:#80ffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
|
||||
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"><tspan
|
||||
y="107.79551"
|
||||
x="996.14514"
|
||||
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.90505791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 717.38253,98.051495 0,4.061885 10.08314,0 0,4.06188 9.26683,-6.06161 -9.26683,-6.124022 0,4.061867 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"
|
||||
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="NearestAirportsArrow0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccc"
|
||||
|
@ -321,85 +338,91 @@
|
|||
<text
|
||||
inkscape:label="#text4232"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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="746.10352"
|
||||
y="130.9248"
|
||||
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="126.68501"
|
||||
id="NearestAirportsID1"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4263"
|
||||
x="746.10352"
|
||||
y="130.9248">KSFO</tspan></text>
|
||||
x="794.41644"
|
||||
y="126.68501">KSFO</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsCRS1"
|
||||
y="130.9248"
|
||||
x="863.65973"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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"
|
||||
y="126.68501"
|
||||
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="130.9248"
|
||||
x="863.65973"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
y="126.68501"
|
||||
x="908.79016"
|
||||
id="tspan4267"
|
||||
sodipodi:role="line">359</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4232"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.94000053px;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="996.14514"
|
||||
y="131.24841"
|
||||
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="126.99815"
|
||||
id="NearestAirportsDST1"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4271"
|
||||
x="996.14514"
|
||||
y="131.24841">200nm</tspan></text>
|
||||
x="1031.7998"
|
||||
y="126.99815">200nm</tspan></text>
|
||||
<path
|
||||
inkscape:label="#path4259"
|
||||
sodipodi:nodetypes="cccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="NearestAirportsArrow1"
|
||||
d="m 717.38253,122.01146 0,4.06188 10.08314,0 0,4.06188 9.26683,-6.06161 -9.26683,-6.12402 0,4.06187 z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.90505791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
d="m 740.43792,122.00295 0,4.06207 9.44228,0 0,4.06207 8.67785,-6.0619 -8.67785,-6.1243 0,4.06206 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="NearestAirportsID2"
|
||||
y="154.88477"
|
||||
x="746.10352"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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"
|
||||
y="149.87158"
|
||||
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"><tspan
|
||||
y="154.88477"
|
||||
x="746.10352"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
y="149.87158"
|
||||
x="794.41644"
|
||||
id="tspan4277"
|
||||
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:20px;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="863.65973"
|
||||
y="154.88477"
|
||||
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="149.87158"
|
||||
id="NearestAirportsCRS2"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4281"
|
||||
x="863.65973"
|
||||
y="154.88477">359</tspan></text>
|
||||
x="908.79016"
|
||||
y="149.87158">359</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsDST2"
|
||||
y="155.20837"
|
||||
x="996.14514"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.94000053px;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"
|
||||
y="150.18474"
|
||||
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"><tspan
|
||||
y="155.20837"
|
||||
x="996.14514"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
y="150.18474"
|
||||
x="1031.7998"
|
||||
id="tspan4285"
|
||||
sodipodi:role="line">200nm</tspan></text>
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.90505791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 717.38253,145.97142 0,4.06188 10.08314,0 0,4.06188 9.26683,-6.06161 -9.26683,-6.12402 0,4.06187 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"
|
||||
d="m 740.43792,145.96403 0,4.06207 9.44228,0 0,4.06207 8.67785,-6.06189 -8.67785,-6.12431 0,4.06206 z"
|
||||
id="NearestAirportsArrow2"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccc"
|
||||
|
@ -407,210 +430,274 @@
|
|||
<text
|
||||
inkscape:label="#text4232"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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="746.10352"
|
||||
y="178.84473"
|
||||
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="173.05815"
|
||||
id="NearestAirportsID3"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4291"
|
||||
x="746.10352"
|
||||
y="178.84473">KSFO</tspan></text>
|
||||
x="794.41644"
|
||||
y="173.05815">KSFO</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsCRS3"
|
||||
y="178.84473"
|
||||
x="863.65973"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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"
|
||||
y="173.05815"
|
||||
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="178.84473"
|
||||
x="863.65973"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
y="173.05815"
|
||||
x="908.79016"
|
||||
id="tspan4295"
|
||||
sodipodi:role="line">359</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4232"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.94000053px;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="996.14514"
|
||||
y="177.62126"
|
||||
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="171.87416"
|
||||
id="NearestAirportsDST3"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4299"
|
||||
x="996.14514"
|
||||
y="177.62126">200nm</tspan></text>
|
||||
x="1031.7998"
|
||||
y="171.87416">200nm</tspan></text>
|
||||
<path
|
||||
inkscape:label="#path4259"
|
||||
sodipodi:nodetypes="cccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="NearestAirportsArrow3"
|
||||
d="m 717.38253,169.93138 0,4.06188 10.08314,0 0,4.06188 9.26683,-6.06161 -9.26683,-6.12402 0,4.06187 z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.90505791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
d="m 740.43792,169.92511 0,4.06207 9.44228,0 0,4.06207 8.67785,-6.06189 -8.67785,-6.12431 0,4.06206 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="NearestAirportsID4"
|
||||
y="202.80469"
|
||||
x="746.10352"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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"
|
||||
y="196.24472"
|
||||
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"><tspan
|
||||
y="202.80469"
|
||||
x="746.10352"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
y="196.24472"
|
||||
x="794.41644"
|
||||
id="tspan4319"
|
||||
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:20px;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="863.65973"
|
||||
y="202.80469"
|
||||
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="196.24472"
|
||||
id="NearestAirportsCRS4"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4323"
|
||||
x="863.65973"
|
||||
y="202.80469">359</tspan></text>
|
||||
x="908.79016"
|
||||
y="196.24472">359</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsDST4"
|
||||
y="203.1283"
|
||||
x="996.14514"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20.94000053px;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"
|
||||
y="196.55789"
|
||||
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"><tspan
|
||||
y="203.1283"
|
||||
x="996.14514"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96767632,1.0334034)"><tspan
|
||||
y="196.55789"
|
||||
x="1031.7998"
|
||||
id="tspan4327"
|
||||
sodipodi:role="line">200nm</tspan></text>
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.90505791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 717.38253,193.89134 0,4.06188 10.08314,0 0,4.06188 9.26683,-6.06161 -9.26683,-6.12402 0,4.06187 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"
|
||||
d="m 740.43792,193.88619 0,4.06207 9.44228,0 0,4.06207 8.67785,-6.06189 -8.67785,-6.12431 0,4.06206 z"
|
||||
id="NearestAirportsArrow4"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccc"
|
||||
inkscape:label="#path4259" />
|
||||
<rect
|
||||
y="234.54692"
|
||||
x="710.80701"
|
||||
height="84.196045"
|
||||
width="309.86914"
|
||||
y="240.49937"
|
||||
x="730.49939"
|
||||
height="84.001251"
|
||||
width="289.00125"
|
||||
id="rect4331"
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.79819334;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
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" />
|
||||
<rect
|
||||
y="223.54343"
|
||||
x="720.54346"
|
||||
height="19.913141"
|
||||
width="94.913132"
|
||||
y="228.5"
|
||||
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.08685863;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
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="238.49998"
|
||||
x="725.5"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:15px;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:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"><tspan
|
||||
y="238.49998"
|
||||
x="725.5"
|
||||
y="236.45425"
|
||||
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="236.45425"
|
||||
x="775.05835"
|
||||
id="tspan4337"
|
||||
sodipodi:role="line">INFORMATION</tspan></text>
|
||||
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:20px;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="715"
|
||||
y="258"
|
||||
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%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96767669,1.033403)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4357"
|
||||
x="715"
|
||||
y="258" /></text>
|
||||
x="753.573"
|
||||
y="249.65851" /></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsName"
|
||||
y="263.95117"
|
||||
x="719.25781"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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"
|
||||
y="261.08392"
|
||||
x="757.69336"
|
||||
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="263.95117"
|
||||
x="719.25781"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96767669,1.033403)"><tspan
|
||||
y="261.08392"
|
||||
x="757.69336"
|
||||
id="tspan4361"
|
||||
sodipodi:role="line">SAN FRANCISCO INTERNATIONAL</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsAlt"
|
||||
y="313.61914"
|
||||
x="1016.127"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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"
|
||||
y="309.14871"
|
||||
x="1044.9802"
|
||||
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: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"><tspan
|
||||
y="313.61914"
|
||||
x="1016.127"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96767669,1.033403)"><tspan
|
||||
y="309.14871"
|
||||
x="1044.9802"
|
||||
id="tspan4375"
|
||||
sodipodi:role="line">123ft</tspan></text>
|
||||
<rect
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.88014376;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00069809;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4377"
|
||||
width="309.78793"
|
||||
height="102.39922"
|
||||
x="711.33911"
|
||||
y="545.15997" />
|
||||
width="288.9993"
|
||||
height="111.25876"
|
||||
x="730.50037"
|
||||
y="580.24091" />
|
||||
<rect
|
||||
style="opacity:1;fill:#1a3030;fill-opacity:1;fill-rule:nonzero;stroke:#fffcfa;stroke-width:1.11149907;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
style="opacity:1;fill:#1a3030;fill-opacity:1;fill-rule:nonzero;stroke:#fffcfa;stroke-width:1.00069809;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4379"
|
||||
width="99.388496"
|
||||
height="19.888502"
|
||||
x="721.05579"
|
||||
y="535.74377" />
|
||||
width="87.522202"
|
||||
height="19.949141"
|
||||
x="745.51562"
|
||||
y="572.50037" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:15px;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:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="726"
|
||||
y="550.68799"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:14.52596188px;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.9683975px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="776.19214"
|
||||
y="568.02856"
|
||||
id="text4381"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96688562,1.0342485)"><tspan
|
||||
id="tspan4383"
|
||||
sodipodi:role="line"
|
||||
x="726"
|
||||
y="550.68799">APPROACHES</tspan></text>
|
||||
x="776.19214"
|
||||
y="568.02856"
|
||||
style="stroke-width:0.9683975px">APPROACHES</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4232"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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="724.98047"
|
||||
y="584.51898"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.36795044px;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="763.87268"
|
||||
y="600.79041"
|
||||
id="NearestAirportsApproach0"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96688562,1.0342485)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4387"
|
||||
x="724.98047"
|
||||
y="584.51898">TOWER</tspan></text>
|
||||
x="763.87268"
|
||||
y="600.79041">TOWER</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="NearestAirportsApproach1"
|
||||
y="608.80469"
|
||||
x="724.98047"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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"
|
||||
y="624.30859"
|
||||
x="763.87268"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.36795044px;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="608.80469"
|
||||
x="724.98047"
|
||||
inkscape:label="#text4232"
|
||||
transform="scale(0.96688562,1.0342485)"><tspan
|
||||
y="624.30859"
|
||||
x="763.87268"
|
||||
id="tspan4395"
|
||||
sodipodi:role="line">TOWER</tspan></text>
|
||||
<text
|
||||
inkscape:label="#text4232"
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:20px;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="724.98047"
|
||||
y="633.09045"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:19.36795044px;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="763.87268"
|
||||
y="647.8269"
|
||||
id="NearestAirportsApproach2"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.96688562,1.0342485)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4403"
|
||||
x="724.98047"
|
||||
y="633.09045">TOWER</tspan></text>
|
||||
x="763.87268"
|
||||
y="647.8269">TOWER</tspan></text>
|
||||
<rect
|
||||
style="opacity:1;fill:#c0c0c0;fill-opacity:1;fill-rule:nonzero;stroke:#c0c0c0;stroke-width:0.99568439;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="NearestAirportsAirportScrollBar"
|
||||
width="4.9967451"
|
||||
height="124.00414"
|
||||
x="1010.4977"
|
||||
y="83.498024"
|
||||
inkscape:label="#rect4231" />
|
||||
<rect
|
||||
inkscape:label="#rect4231"
|
||||
y="83.236771"
|
||||
x="1010.2327"
|
||||
height="24.534019"
|
||||
width="5.5263038"
|
||||
id="NearestAirportsAirportScroll"
|
||||
style="opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:0.46575949;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<rect
|
||||
inkscape:label="#rect4231"
|
||||
y="452.17084"
|
||||
x="1010.4186"
|
||||
height="99.325096"
|
||||
width="4.7759156"
|
||||
id="NearestAirportsFreqScrollBar"
|
||||
style="opacity:1;fill:#c0c0c0;fill-opacity:1;fill-rule:nonzero;stroke:#c0c0c0;stroke-width:0.87119991;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<rect
|
||||
style="opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:0.45150775;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="NearestAirportsFreqScroll"
|
||||
width="5.1815677"
|
||||
height="24.589478"
|
||||
x="1010.2089"
|
||||
y="451.95374"
|
||||
inkscape:label="#rect4231" />
|
||||
<rect
|
||||
style="opacity:1;fill:#c0c0c0;fill-opacity:1;fill-rule:nonzero;stroke:#c0c0c0;stroke-width:0.8708958;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="NearestAirportsApproachScrollBar"
|
||||
width="4.7759213"
|
||||
height="99.255646"
|
||||
x="1010.4187"
|
||||
y="585.24091"
|
||||
inkscape:label="#rect4231" />
|
||||
<rect
|
||||
inkscape:label="#rect4231"
|
||||
y="585.02399"
|
||||
x="1010.209"
|
||||
height="24.572283"
|
||||
width="5.1815743"
|
||||
id="NearestAirportsApproachScroll"
|
||||
style="opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:0.45135012;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 39 KiB |
|
@ -163,7 +163,7 @@ var AirportInfo =
|
|||
# runways displayed twice.
|
||||
var rwys = [];
|
||||
var recips = {};
|
||||
foreach(var rwy; keys(apt_info.runways)) {
|
||||
foreach(var rwy; sort(keys(apt_info.runways), string.icmp)) {
|
||||
var rwy_info = apt_info.runways[rwy];
|
||||
if (recips[rwy_info.id] == nil) {
|
||||
var lbl = rwy_info.id ~ "-" ~ rwy_info.reciprocal.id;
|
||||
|
|
|
@ -140,7 +140,58 @@ var EIS =
|
|||
foreach(var se; me._rotationElements) {
|
||||
se.update(me._EISDriver);
|
||||
}
|
||||
},
|
||||
|
||||
}
|
||||
# Menu tree . engineMenu is referenced from most pages as softkey 0:
|
||||
# pg.addMenuItem(0, "ENGINE", pg, pg.mfd.EIS.engineMenu);
|
||||
|
||||
engineMenu : func(device, pg, menuitem) {
|
||||
pg.clearMenu();
|
||||
pg.resetMenuColors();
|
||||
pg.addMenuItem(0, "ENGINE", pg, pg.mfd.EIS.engineMenu);
|
||||
pg.addMenuItem(1, "LEAN", pg, pg.mfd.EIS.leanMenu);
|
||||
pg.addMenuItem(2, "SYSTEM", pg, pg.mfd.EIS.systemMenu);
|
||||
pg.addMenuItem(8, "BACK", pg, pg.topMenu);
|
||||
device.updateMenus();
|
||||
},
|
||||
|
||||
leanMenu : func(device, pg, menuitem) {
|
||||
pg.clearMenu();
|
||||
pg.resetMenuColors();
|
||||
pg.addMenuItem(0, "ENGINE", pg, pg.mfd.EIS.engineMenu);
|
||||
pg.addMenuItem(1, "LEAN", pg, pg.mfd.EIS.leanMenu);
|
||||
pg.addMenuItem(2, "SYSTEM", pg, pg.mfd.EIS.systemMenu);
|
||||
pg.addMenuItem(3, "CYL SELECT", pg);
|
||||
pg.addMenuItem(4, "ASSIST", pg);
|
||||
pg.addMenuItem(9, "BACK", pg, pg.mfd.EIS.engineMenu);
|
||||
device.updateMenus();
|
||||
},
|
||||
|
||||
systemMenu : func(device, pg, menuitem) {
|
||||
pg.clearMenu();
|
||||
pg.resetMenuColors();
|
||||
pg.addMenuItem(0, "ENGINE", pg, pg.mfd.EIS.engineMenu);
|
||||
pg.addMenuItem(1, "LEAN", pg, pg.mfd.EIS.leanMenu);
|
||||
pg.addMenuItem(2, "SYSTEM", pg, pg.mfd.EIS.systemMenu);
|
||||
pg.addMenuItem(3, "RST FUEL", pg);
|
||||
pg.addMenuItem(4, "GAL REM", pg, pg.mfd.EIS.galRemMenu);
|
||||
pg.addMenuItem(5, "BACK", pg, pg.mfd.EIS.engineMenu);
|
||||
device.updateMenus();
|
||||
},
|
||||
|
||||
galRemMenu : func(device, pg, menuitem) {
|
||||
pg.clearMenu();
|
||||
pg.resetMenuColors();
|
||||
pg.addMenuItem(0, "ENGINE", pg, pg.mfd.EIS.engineMenu);
|
||||
pg.addMenuItem(1, "LEAN", pg, pg.mfd.EIS.leanMenu);
|
||||
pg.addMenuItem(2, "SYSTEM", pg, pg.mfd.EIS.systemMenu);
|
||||
pg.addMenuItem(3, "-10 GAL", pg);
|
||||
pg.addMenuItem(4, "-1 GAL", pg);
|
||||
pg.addMenuItem(5, "+1 GAL", pg);
|
||||
pg.addMenuItem(6, "+10 GAL", pg);
|
||||
pg.addMenuItem(7, "44 GAL", pg);
|
||||
pg.addMenuItem(8, "BACK", pg, pg.mfd.EIS.engineMenu);
|
||||
device.updateMenus();
|
||||
},
|
||||
|
||||
};
|
||||
|
|
|
@ -66,7 +66,13 @@ var MFD =
|
|||
{
|
||||
new : func (myCanvas)
|
||||
{
|
||||
var obj = { parents : [ MFD ] };
|
||||
var obj = {
|
||||
parents : [ MFD ],
|
||||
EIS : nil,
|
||||
NavigationMap: nil,
|
||||
|
||||
|
||||
};
|
||||
|
||||
obj._svg = myCanvas.createGroup("softkeys");
|
||||
|
||||
|
@ -99,20 +105,23 @@ var MFD =
|
|||
|
||||
# Engine Information System
|
||||
obj._eisDriver = fg1000.EISDriver.new();
|
||||
obj._eis = fg1000.EIS.new(myCanvas, obj._eisDriver);
|
||||
obj.EIS = fg1000.EIS.new(myCanvas, obj._eisDriver);
|
||||
|
||||
# Controller for the display on the bottom left which allows selection
|
||||
# of page groups and individual pages using the FMS controller.
|
||||
obj._pageGroupController = fg1000.PageGroupController.new(myCanvas, obj._svg, obj._MFDDevice);
|
||||
|
||||
foreach (var page; MFDPages) {
|
||||
var code = "obj._pageGroupController.addPage(\"" ~ page ~ "\", fg1000." ~ page ~ ".new(obj, myCanvas, obj._MFDDevice, obj._svg));";
|
||||
var addPageFn = compile(code);
|
||||
addPageFn();
|
||||
}
|
||||
|
||||
# The NavigationMap page is a special case, as it is displayed with the Nearest... pages as an overlay
|
||||
obj.NavigationMap = obj._pageGroupController.getPage("NavigationMap");
|
||||
obj.NavigationMap = obj._pageGroupController.addPage("NavigationMap", fg1000.NavigationMap.new(obj, myCanvas, obj._MFDDevice, obj._svg));
|
||||
obj.NavigationMap.topMenu(obj._MFDDevice, obj.NavigationMap, nil);
|
||||
|
||||
foreach (var page; MFDPages) {
|
||||
if (page != "NavigationMap") {
|
||||
var code = "obj._pageGroupController.addPage(\"" ~ page ~ "\", fg1000." ~ page ~ ".new(obj, myCanvas, obj._MFDDevice, obj._svg));";
|
||||
var addPageFn = compile(code);
|
||||
addPageFn();
|
||||
}
|
||||
}
|
||||
|
||||
# Display the NavMap and the appropriate top level on startup.
|
||||
obj._MFDDevice.selectPage(obj.NavigationMap);
|
||||
|
@ -129,7 +138,7 @@ var MFD =
|
|||
|
||||
var updateTimer = func() {
|
||||
obj._eisDriver.update();
|
||||
obj._eis.update();
|
||||
obj.EIS.update();
|
||||
settimer(updateTimer, 0.1);
|
||||
};
|
||||
|
||||
|
|
|
@ -63,6 +63,15 @@ setTextElement : func(symbolName, value) {
|
|||
assert(sym != nil, "Unknown text element " ~ symbolName ~ " (check your addTextElements call?)");
|
||||
if (value == nil ) value = "";
|
||||
sym.setValue(value);
|
||||
}
|
||||
},
|
||||
|
||||
# Function to undo any colors set by display_toggle when loading a new menu
|
||||
resetMenuColors : func() {
|
||||
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);
|
||||
}
|
||||
},
|
||||
|
||||
};
|
||||
|
|
|
@ -18,8 +18,8 @@ var NavigationMap =
|
|||
obj.addTextElements(["RangeDisplay", "Orientation"]);
|
||||
obj.addTextElements(["RangeDisplayPartial", "OrientationPartial"]);
|
||||
|
||||
obj._labelsFull = svg.getElementById("NavigationMapGroupFull");
|
||||
assert(obj._labelsFull != nil, "Unable to find NavigationMapGroupFull");
|
||||
obj._labelsFull = svg.getElementById("NavigationMapGroup");
|
||||
assert(obj._labelsFull != nil, "Unable to find NavigationMapGroup");
|
||||
|
||||
obj._labelsPartial = svg.getElementById("NavigationMapGroupPartial");
|
||||
assert(obj._labelsPartial != nil, "Unable to find NavigationMapGroupPartial");
|
||||
|
@ -54,7 +54,7 @@ var NavigationMap =
|
|||
|
||||
var r = func(name,vis=1,zindex=nil) return caller(0)[0];
|
||||
# TODO: we'll need some z-indexing here, right now it's just random
|
||||
foreach(var type; [r('GRID'),r('TFC',0),r('APT'),r('DME'),r('VOR'),r('NDB'),r('FIX',0),r('RTE'),r('WPT'),r('FLT'),r('WXR',0),r('APS')] ) {
|
||||
foreach(var type; [r('GRID'),r('DTO',0),r('TFC',0),r('APT'),r('DME'),r('VOR'),r('NDB'),r('FIX',0),r('RTE'),r('WPT'),r('FLT'),r('WXR',0),r('APS')] ) {
|
||||
obj.MFDMap.addLayer(factory: canvas.SymbolLayer, type_arg: type.name,
|
||||
visible: type.vis, priority: 4,
|
||||
style: obj.Styles.getStyle(type.name),
|
||||
|
@ -68,121 +68,7 @@ var NavigationMap =
|
|||
options: obj.Options.getOption(type.name) );
|
||||
}
|
||||
|
||||
var topMenu = func(device, pg, menuitem) {
|
||||
pg.clearMenu();
|
||||
resetMenuColors(device);
|
||||
pg.addMenuItem(0, "ENGINE", pg, engineMenu);
|
||||
pg.addMenuItem(2, "MAP", pg, mapMenu);
|
||||
pg.addMenuItem(8, "DCLTR", pg, func(dev, pg, mi) { obj.controller.incrDCLTR(dev, mi); } );
|
||||
#pg.addMenuItem(9, "SHW CHRT", pg); # Optional
|
||||
#pg.addMenuItem(10, "CHKLIST", pg); # Optional
|
||||
device.updateMenus();
|
||||
};
|
||||
|
||||
var engineMenu = func(device, pg, menuitem) {
|
||||
pg.clearMenu();
|
||||
resetMenuColors(device);
|
||||
pg.addMenuItem(0, "ENGINE", pg, engineMenu);
|
||||
pg.addMenuItem(1, "LEAN", pg, leanMenu);
|
||||
pg.addMenuItem(2, "SYSTEM", pg, systemMenu);
|
||||
pg.addMenuItem(8, "BACK", pg, topMenu);
|
||||
device.updateMenus();
|
||||
};
|
||||
|
||||
|
||||
# Display map toggle softkeys which change color depending
|
||||
# on whether a particular layer is enabled or not.
|
||||
var display_toggle = func(device, svg, mi, layer) {
|
||||
var bg_name = sprintf("SoftKey%d-bg",mi.menu_id);
|
||||
if (obj.controller.isEnabled(layer)) {
|
||||
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
|
||||
};
|
||||
|
||||
# Function to undo any colors set by display_toggle when loading a new menu
|
||||
var resetMenuColors = func(device) {
|
||||
for(var i = 0; i < 12; i +=1) {
|
||||
var name = sprintf("SoftKey%d",i);
|
||||
device.svg.getElementById(name ~ "-bg").setColorFill(0.0,0.0,0.0);
|
||||
device.svg.getElementById(name).setColor(1.0,1.0,1.0);
|
||||
}
|
||||
}
|
||||
|
||||
var mapMenu = func(device, pg, menuitem) {
|
||||
pg.clearMenu();
|
||||
resetMenuColors(device);
|
||||
pg.addMenuItem(0, "TRAFFIC", pg,
|
||||
func(dev, pg, mi) { obj.controller.toggleLayer("TFC"); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { display_toggle(device, svg, mi, "TFC"); }
|
||||
);
|
||||
|
||||
pg.addMenuItem(1, "PROFILE", pg);
|
||||
pg.addMenuItem(2, "TOPO", pg,
|
||||
func(dev, pg, mi) { obj.controller.toggleLayer("STAMEN"); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { display_toggle(device, svg, mi, "STAMEN"); }
|
||||
);
|
||||
|
||||
pg.addMenuItem(3, "TERRAIN", pg,
|
||||
func(dev, pg, mi) { obj.controller.toggleLayer("STAMEN_terrain"); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { display_toggle(device, svg, mi, "STAMEN_terrain"); }
|
||||
);
|
||||
|
||||
pg.addMenuItem(4, "AIRWAYS", pg, func(dev, pg, mi) { obj.controller.incrAIRWAYS(dev, mi); } );
|
||||
#pg.addMenuItem(5, "STRMSCP", pg); Optional
|
||||
#pg.addMenuItem(6, "PRECIP", pg); Optional, or NEXRAD
|
||||
#pg.addMenuItem(7, "XM LTNG", pg); Optional, or DL LTNG
|
||||
#pg.addMenuItem(8, "METAR", pg);
|
||||
#pg.addMenuItem(9, "LEGEND", pg); Optional - only available with NEXRAD/XM LTNG/METAR/PROFILE selected
|
||||
pg.addMenuItem(10, "BACK", pg, topMenu); # Or should this just be the next button?
|
||||
device.updateMenus();
|
||||
};
|
||||
|
||||
var leanMenu = func(device, pg, menuitem) {
|
||||
pg.clearMenu();
|
||||
resetMenuColors(device);
|
||||
pg.addMenuItem(0, "ENGINE", pg, engineMenu);
|
||||
pg.addMenuItem(1, "LEAN", pg, leanMenu);
|
||||
pg.addMenuItem(2, "SYSTEM", pg, systemMenu);
|
||||
pg.addMenuItem(3, "CYL SELECT", pg);
|
||||
pg.addMenuItem(4, "ASSIST", pg);
|
||||
pg.addMenuItem(9, "BACK", pg, engineMenu);
|
||||
device.updateMenus();
|
||||
};
|
||||
|
||||
var systemMenu = func(device, pg, menuitem) {
|
||||
pg.clearMenu();
|
||||
resetMenuColors(device);
|
||||
pg.addMenuItem(0, "ENGINE", pg, engineMenu);
|
||||
pg.addMenuItem(1, "LEAN", pg, leanMenu);
|
||||
pg.addMenuItem(2, "SYSTEM", pg, systemMenu);
|
||||
pg.addMenuItem(3, "RST FUEL", pg);
|
||||
pg.addMenuItem(4, "GAL REM", pg, galRemMenu);
|
||||
pg.addMenuItem(5, "BACK", pg, engineMenu);
|
||||
device.updateMenus();
|
||||
};
|
||||
|
||||
var galRemMenu = func(device, pg, menuitem) {
|
||||
pg.clearMenu();
|
||||
resetMenuColors(device);
|
||||
pg.addMenuItem(0, "ENGINE", pg, engineMenu);
|
||||
pg.addMenuItem(1, "LEAN", pg, leanMenu);
|
||||
pg.addMenuItem(2, "SYSTEM", pg, systemMenu);
|
||||
pg.addMenuItem(3, "-10 GAL", pg);
|
||||
pg.addMenuItem(4, "-1 GAL", pg);
|
||||
pg.addMenuItem(5, "+1 GAL", pg);
|
||||
pg.addMenuItem(6, "+10 GAL", pg);
|
||||
pg.addMenuItem(7, "44 GAL", pg);
|
||||
pg.addMenuItem(8, "BACK", pg, engineMenu);
|
||||
device.updateMenus();
|
||||
};
|
||||
|
||||
topMenu(device, obj, nil);
|
||||
#obj.topMenu(device, obj, nil);
|
||||
|
||||
obj.controller = fg1000.NavigationMapController.new(obj, svg);
|
||||
|
||||
|
@ -252,4 +138,67 @@ var NavigationMap =
|
|||
me._group.setVisible(0);
|
||||
me.controller.offdisplayPartial();
|
||||
},
|
||||
|
||||
# Softkey assigments. For some pages (notably the NEAREST pages)
|
||||
# the MAP softkey is available as key 2:
|
||||
# pg.addMenuItem(2, "MAP", pg, pg.mfd.NavigationMap.mapMenu);
|
||||
|
||||
|
||||
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);
|
||||
pg.addMenuItem(8, "DCLTR", pg, func(dev, pg, mi) { pg.mfd.NavigationMap.controller.incrDCLTR(dev, mi); } );
|
||||
#pg.addMenuItem(9, "SHW CHRT", pg); # Optional
|
||||
#pg.addMenuItem(10, "CHKLIST", pg); # Optional
|
||||
device.updateMenus();
|
||||
},
|
||||
|
||||
mapMenu : func(device, pg, menuitem) {
|
||||
pg.clearMenu();
|
||||
pg.resetMenuColors();
|
||||
pg.addMenuItem(0, "TRAFFIC", pg,
|
||||
func(dev, pg, mi) { pg.mfd.NavigationMap.controller.toggleLayer("TFC"); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { pg.mfd.NavigationMap.display_toggle(device, svg, mi, "TFC"); }
|
||||
);
|
||||
|
||||
pg.addMenuItem(1, "PROFILE", pg);
|
||||
pg.addMenuItem(2, "TOPO", pg,
|
||||
func(dev, pg, mi) { pg.mfd.NavigationMap.controller.toggleLayer("STAMEN"); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { pg.mfd.NavigationMap.display_toggle(device, svg, mi, "STAMEN"); }
|
||||
);
|
||||
|
||||
pg.addMenuItem(3, "TERRAIN", pg,
|
||||
func(dev, pg, mi) { pg.mfd.NavigationMap.controller.toggleLayer("STAMEN_terrain"); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { pg.mfd.NavigationMap.display_toggle(device, svg, mi, "STAMEN_terrain"); }
|
||||
);
|
||||
|
||||
pg.addMenuItem(4, "AIRWAYS", pg, func(dev, pg, mi) { pg.mfd.NavigationMap.controller.incrAIRWAYS(dev, mi); } );
|
||||
#pg.addMenuItem(5, "STRMSCP", pg); Optional
|
||||
#pg.addMenuItem(6, "PRECIP", pg); Optional, or NEXRAD
|
||||
#pg.addMenuItem(7, "XM LTNG", pg); Optional, or DL LTNG
|
||||
#pg.addMenuItem(8, "METAR", pg);
|
||||
#pg.addMenuItem(9, "LEGEND", pg); Optional - only available with NEXRAD/XM LTNG/METAR/PROFILE selected
|
||||
pg.addMenuItem(10, "BACK", pg, pg.topMenu); # Or should this just be the next button?
|
||||
device.updateMenus();
|
||||
},
|
||||
|
||||
# Display map toggle softkeys which change color depending
|
||||
# on whether a particular layer is enabled or not.
|
||||
display_toggle : func(device, svg, mi, layer) {
|
||||
var bg_name = sprintf("SoftKey%d-bg",mi.menu_id);
|
||||
if (me.controller.isEnabled(layer)) {
|
||||
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
|
||||
},
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
|
|
@ -47,6 +47,8 @@ var NavigationMapController =
|
|||
# range - the maximum range this layer is visible (configured by user)
|
||||
# max_range - the maximum range value that a user can configure for this layer.
|
||||
LAYER_RANGES : {
|
||||
DTO : { enabled: 0, declutter: 3, range: 2000, max_range: 2000 },
|
||||
|
||||
GRID : { enabled: 0, declutter: 1, range: 20, max_range: 2000 },
|
||||
DME : { enabled: 1, declutter: 1, range: 150, max_range: 300 },
|
||||
VOR : { enabled: 1, declutter: 1, range: 150, max_range: 300 },
|
||||
|
@ -162,6 +164,16 @@ var NavigationMapController =
|
|||
device.updateMenus();
|
||||
me.updateVisibility();
|
||||
},
|
||||
|
||||
# Set the DTO line target
|
||||
setDTOLineTarget : func(lat, lon) {
|
||||
me.page.MFDMap.getLayer("DTO").controller.setTarget(lat,lon);
|
||||
},
|
||||
enableDTO : func(enable) {
|
||||
me.LAYER_RANGES["DTO"].enabled = enable;
|
||||
me.updateVisibility();
|
||||
},
|
||||
|
||||
handleFMSInner : func(value) {
|
||||
# This page has no use for the FMS knob, so we pass all such
|
||||
# events to the pageGroupController which displays the page menu in the
|
||||
|
|
|
@ -27,7 +27,10 @@ var NearestAirports =
|
|||
[ "Arrow", "ID", "CRS", "DST"],
|
||||
5,
|
||||
"Arrow",
|
||||
1
|
||||
1,
|
||||
"AirportScrollBar",
|
||||
"AirportScroll",
|
||||
100
|
||||
);
|
||||
|
||||
obj.runwaySelect = PFD.ScrollElement.new(obj.pageName, svg, "RunwayID", [36,18]); # Dummy values
|
||||
|
@ -37,7 +40,11 @@ var NearestAirports =
|
|||
svg,
|
||||
["FreqLabel", "Freq"],
|
||||
3,
|
||||
"Freq"
|
||||
"Freq",
|
||||
0,
|
||||
"FreqScrollBar",
|
||||
"FreqScroll",
|
||||
75
|
||||
);
|
||||
|
||||
obj.approachSelect = PFD.GroupElement.new(
|
||||
|
@ -45,40 +52,17 @@ var NearestAirports =
|
|||
svg,
|
||||
["Approach"],
|
||||
3,
|
||||
"Approach"
|
||||
"Approach",
|
||||
0,
|
||||
"ApproachScrollBar",
|
||||
"ApproachScroll",
|
||||
75
|
||||
);
|
||||
|
||||
# Other dynamic text elements
|
||||
obj.addTextElements(["Name", "Alt", "RunwaySurface", "RunwayDimensions"]);
|
||||
|
||||
var topMenu = func(device, pg, menuitem) {
|
||||
pg.clearMenu();
|
||||
pg.resetMenuColors(device);
|
||||
pg.addMenuItem(4, "APT", pg,
|
||||
func(dev, pg, mi) { pg.controller.selectAirports(); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { pg.display_toggle(device, svg, mi, NearestAirportsController.UIGROUP.APT); }
|
||||
);
|
||||
|
||||
pg.addMenuItem(5, "RNWY", pg,
|
||||
func(dev, pg, mi) { pg.controller.selectRunways(); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { pg.display_toggle(device, svg, mi, NearestAirportsController.UIGROUP.RNWY); }
|
||||
);
|
||||
|
||||
pg.addMenuItem(6, "FREQ", pg,
|
||||
func(dev, pg, mi) { pg.controller.selectFrequencies(); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { pg.display_toggle(device, svg, mi, NearestAirportsController.UIGROUP.FREQ); }
|
||||
);
|
||||
|
||||
pg.addMenuItem(7, "APR", pg,
|
||||
func(dev, pg, mi) { pg.controller.selectApproaches(); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { pg.display_toggle(device, svg, mi, NearestAirportsController.UIGROUP.APR); }
|
||||
);
|
||||
|
||||
device.updateMenus();
|
||||
};
|
||||
|
||||
|
||||
topMenu(device, obj, nil);
|
||||
obj.topMenu(device, obj, nil);
|
||||
|
||||
return obj;
|
||||
},
|
||||
|
@ -100,7 +84,7 @@ var NearestAirports =
|
|||
# Function to highlight the APT softkey - used when CRSR is pressed to indicate
|
||||
# that we're editing the airports selection.
|
||||
selectAirports : func() {
|
||||
me.resetMenuColors(me.device);
|
||||
me.resetMenuColors();
|
||||
var bg_name = sprintf("SoftKey%d-bg",4);
|
||||
var tname = sprintf("SoftKey%d",4);
|
||||
me.device.svg.getElementById(bg_name).setColorFill(0.5,0.5,0.5);
|
||||
|
@ -112,16 +96,7 @@ var NearestAirports =
|
|||
me.runwaySelect.unhighlightElement();
|
||||
me.freqSelect.hideCRSR();
|
||||
me.approachSelect.hideCRSR();
|
||||
me.resetMenuColors(me.device);
|
||||
},
|
||||
|
||||
# Function to undo any colors set by display_toggle when loading a new menu
|
||||
resetMenuColors : func(device) {
|
||||
for(var i = 0; i < 12; i +=1) {
|
||||
var name = sprintf("SoftKey%d",i);
|
||||
device.svg.getElementById(name ~ "-bg").setColorFill(0.0,0.0,0.0);
|
||||
device.svg.getElementById(name).setColor(1.0,1.0,1.0);
|
||||
}
|
||||
me.resetMenuColors();
|
||||
},
|
||||
|
||||
offdisplay : func() {
|
||||
|
@ -130,7 +105,7 @@ var NearestAirports =
|
|||
|
||||
# Reset the menu colours. Shouldn't have to do this here, but
|
||||
# there's not currently an obvious other location to do so.
|
||||
me.resetMenuColors(me.device);
|
||||
me.resetMenuColors();
|
||||
|
||||
me.controller.offdisplay();
|
||||
},
|
||||
|
@ -141,7 +116,6 @@ var NearestAirports =
|
|||
me.mfd.NavigationMap.ondisplayPartial();
|
||||
|
||||
me.mfd.setPageTitle(me.title);
|
||||
|
||||
},
|
||||
updateAirports : func(apts) {
|
||||
|
||||
|
@ -149,7 +123,10 @@ var NearestAirports =
|
|||
for (var i = 0; i < size(apts); i = i + 1) {
|
||||
var apt = apts[i];
|
||||
var crsAndDst = courseAndDistance(apt);
|
||||
var crs = sprintf("%i", crsAndDst[0]);
|
||||
|
||||
# Display the cours 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.
|
||||
|
@ -176,11 +153,22 @@ var NearestAirports =
|
|||
me.setTextElement("Name", apt.name);
|
||||
me.setTextElement("Alt", sprintf("%ift", M2FT * apt.elevation));
|
||||
|
||||
var runwaylist = keys(apt.runways);
|
||||
# Set up the runways list, but ignoring reciprocals so we don't get
|
||||
# runways displayed twice.
|
||||
var rwys = [];
|
||||
var recips = {};
|
||||
foreach(var rwy; sort(keys(apt.runways), string.icmp)) {
|
||||
var rwy_info = apt.runways[rwy];
|
||||
if (recips[rwy_info.id] == nil) {
|
||||
var lbl = rwy_info.id ~ "-" ~ rwy_info.reciprocal.id;
|
||||
append(rwys, lbl);
|
||||
recips[rwy_info.reciprocal.id] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (size(runwaylist) > 0) {
|
||||
me.runwaySelect.setValues(runwaylist);
|
||||
me.updateRunwayInfo(apt.runways[runwaylist[0]]);
|
||||
if (size(rwys) > 0) {
|
||||
me.runwaySelect.setValues(rwys);
|
||||
me.updateRunwayInfo(apt.runways[keys(apt.runways)[0]]);
|
||||
} else {
|
||||
me.runwaySelect.setValues([""]);
|
||||
me.updateRunwayInfo(nil);
|
||||
|
@ -205,6 +193,9 @@ var NearestAirports =
|
|||
# Approaches
|
||||
var approachList = apt.getApproachList();
|
||||
me.approachSelect.setValues(approachList);
|
||||
|
||||
# Display the DTO line to the airport
|
||||
me.mfd.NavigationMap.controller.setDTOLineTarget(apt.lat, apt.lon);
|
||||
},
|
||||
updateRunwayInfo : func(rwy_info) {
|
||||
if (rwy_info != nil ) {
|
||||
|
@ -228,4 +219,32 @@ var NearestAirports =
|
|||
getSelectedApproach : func() {
|
||||
return me.approachSelect.getValue();
|
||||
},
|
||||
|
||||
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);
|
||||
pg.addMenuItem(4, "APT", pg,
|
||||
func(dev, pg, mi) { pg.controller.selectAirports(); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { pg.display_toggle(device, svg, mi, NearestAirportsController.UIGROUP.APT); }
|
||||
);
|
||||
|
||||
pg.addMenuItem(5, "RNWY", pg,
|
||||
func(dev, pg, mi) { pg.controller.selectRunways(); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { pg.display_toggle(device, svg, mi, NearestAirportsController.UIGROUP.RNWY); }
|
||||
);
|
||||
|
||||
pg.addMenuItem(6, "FREQ", pg,
|
||||
func(dev, pg, mi) { pg.controller.selectFrequencies(); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { pg.display_toggle(device, svg, mi, NearestAirportsController.UIGROUP.FREQ); }
|
||||
);
|
||||
|
||||
pg.addMenuItem(7, "APR", pg,
|
||||
func(dev, pg, mi) { pg.controller.selectApproaches(); device.updateMenus(); }, # callback
|
||||
func(svg, mi) { pg.display_toggle(device, svg, mi, NearestAirportsController.UIGROUP.APR); }
|
||||
);
|
||||
|
||||
device.updateMenus();
|
||||
},
|
||||
};
|
||||
|
|
|
@ -99,8 +99,15 @@ var NearestAirportsController =
|
|||
|
||||
if ((rwy != nil) and (rwy != "")) {
|
||||
var apt_info = airportinfo(apt_id);
|
||||
var rwy_info = apt_info.runways[rwy];
|
||||
me.page.updateRunwayInfo(rwy_info);
|
||||
|
||||
# Names in the runway selection are of the form "NNN-MMM", e.g. 11R-29L
|
||||
# We just want the first of these.
|
||||
var idx = find("-", rwy);
|
||||
if (idx != -1) {
|
||||
rwy = substr(rwy, 0, idx);
|
||||
var rwy_info = apt_info.runways[rwy];
|
||||
me.page.updateRunwayInfo(rwy_info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -203,8 +210,10 @@ var NearestAirportsController =
|
|||
me._currentGroup = NearestAirportsController.UIGROUP.NONE;
|
||||
me.RegisterWithEmesary();
|
||||
me.getAirports();
|
||||
me.page.mfd.NavigationMap.controller.enableDTO(1);
|
||||
},
|
||||
offdisplay : func() {
|
||||
me.page.mfd.NavigationMap.controller.enableDTO(0);
|
||||
me.DeRegisterWithEmesary();
|
||||
},
|
||||
};
|
||||
|
|
|
@ -2,13 +2,16 @@
|
|||
var GroupElement =
|
||||
{
|
||||
|
||||
new : func (pageName, svg, elementNames, size, highlightElement, arrow=0, style=nil)
|
||||
new : func (pageName, svg, elementNames, size, highlightElement, arrow=0, scrollTroughElement=nil, scrollThumbElement=nil, scrollHeight=0, style=nil)
|
||||
{
|
||||
var obj = {
|
||||
parents : [ GroupElement ],
|
||||
_pageName : pageName,
|
||||
_svg : svg,
|
||||
_style : style,
|
||||
_scrollTroughElement : nil,
|
||||
_scrollThumbElement : nil,
|
||||
_scrollBaseTransform : nil,
|
||||
|
||||
# A hash mapping keys to the element name prefix of an SVG element
|
||||
_elementNames : elementNames,
|
||||
|
@ -27,10 +30,39 @@ new : func (pageName, svg, elementNames, size, highlightElement, arrow=0, style=
|
|||
# hidden/shown for highlighting purposes.
|
||||
_arrow : arrow,
|
||||
|
||||
# Length of the scroll bar.
|
||||
_scrollHeight : scrollHeight,
|
||||
|
||||
# List of values to display
|
||||
_values : [],
|
||||
|
||||
# List of SVG elements to display the values
|
||||
_elements : [],
|
||||
_crsrIndex : -1, # Cursor index into the elements array
|
||||
|
||||
# Cursor index into the elements array
|
||||
_crsrIndex : -1,
|
||||
|
||||
# Page index
|
||||
_pageIndex : 0,
|
||||
};
|
||||
|
||||
# Optional scroll bar elements, consisting of the Thumb and the Trough *,
|
||||
# which will be used to display the scroll position.
|
||||
# * Yes, these are the terms of art for the elements.
|
||||
assert(((scrollTroughElement == nil) and (scrollThumbElement == nil)) or
|
||||
((scrollTroughElement != nil) and (scrollThumbElement != nil)),
|
||||
"Both the scroll trough element and the scroll thumb element must be defined, or neither");
|
||||
|
||||
if (scrollTroughElement != nil) {
|
||||
obj._scrollTroughElement = svg.getElementById(pageName ~ scrollTroughElement);
|
||||
assert(obj._scrollTroughElement != nil, "Unable to find scroll element " ~ pageName ~ scrollTroughElement);
|
||||
}
|
||||
if (scrollThumbElement != nil) {
|
||||
obj._scrollThumbElement = svg.getElementById(pageName ~ scrollThumbElement);
|
||||
assert(obj._scrollThumbElement != nil, "Unable to find scroll element " ~ pageName ~ scrollThumbElement);
|
||||
obj._scrollBaseTransform = obj._scrollThumbElement.getTranslation();
|
||||
}
|
||||
|
||||
if (style == nil) obj._style = PFD.DefaultStyle;
|
||||
|
||||
for (var i = 0; i < size; i = i + 1) {
|
||||
|
@ -47,22 +79,61 @@ new : func (pageName, svg, elementNames, size, highlightElement, arrow=0, style=
|
|||
# Set the values of the group. values_array is an array of hashes, each of which
|
||||
# has keys that match those of ._elementNames
|
||||
setValues : func (values_array) {
|
||||
me._values = values_array;
|
||||
me._pageIndex = 0;
|
||||
me._crsrIndex = 0;
|
||||
|
||||
# Determine how many of these we display
|
||||
me._currentSize = math.min(me._size, size(values_array));
|
||||
if (size(me._values) > me._size) {
|
||||
# Number of elements exceeds our ability to display them, so enable
|
||||
# the scroll bar.
|
||||
me._scrollThumbElement.setVisible(1);
|
||||
me._scrollTroughElement.setVisible(1);
|
||||
} else {
|
||||
# There is no scrolling to do, so hide the scrollbar.
|
||||
me._scrollThumbElement.setVisible(0);
|
||||
me._scrollTroughElement.setVisible(0);
|
||||
}
|
||||
|
||||
me.displayPage();
|
||||
},
|
||||
|
||||
nextPage : func() {
|
||||
if (size(me._values) > ((me._pageIndex +1) * me._size)) {
|
||||
me._pageIndex = me._pageIndex + 1;
|
||||
me._crsrIndex = 0;
|
||||
me.displayPage();
|
||||
} else {
|
||||
me._crsrIndex = me._currentSize -1;
|
||||
}
|
||||
},
|
||||
|
||||
previousPage : func() {
|
||||
if (me._pageIndex > 0) {
|
||||
me._pageIndex = me._pageIndex - 1;
|
||||
me._crsrIndex = me._size -1;
|
||||
me.displayPage();
|
||||
} else {
|
||||
me._crsrIndex = 0;
|
||||
}
|
||||
},
|
||||
|
||||
displayPage : func () {
|
||||
# Determine how many elements to display in this page
|
||||
me._currentSize = math.min(me._size, size(me._values) - me._size * me._pageIndex);
|
||||
|
||||
for (var i = 0; i < me._currentSize; i = i + 1) {
|
||||
var values = values_array[i];
|
||||
foreach (var k; keys(values)) {
|
||||
var value = me._values[i + me._size * me._pageIndex];
|
||||
foreach (var k; keys(value)) {
|
||||
if (k == me._highlightElement) {
|
||||
me._elements[i].setVisible(1);
|
||||
me._elements[i].unhighlightElement();
|
||||
me._elements[i].setValue(values[k]);
|
||||
me._elements[i].setValue(value[k]);
|
||||
} else {
|
||||
var name = me._pageName ~ k ~ i;
|
||||
var element = me._svg.getElementById(name);
|
||||
assert(element != nil, "Unable to find element " ~ name);
|
||||
element.setVisible(1);
|
||||
element.setText(values[k]);
|
||||
element.setText(value[k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -73,14 +144,27 @@ setValues : func (values_array) {
|
|||
foreach (var k; me._elementNames) {
|
||||
if (k == me._highlightElement) {
|
||||
me._elements[i].setVisible(0);
|
||||
me._elements[i].setValue("");
|
||||
} else {
|
||||
me._svg.getElementById(k ~ i).setVisible(0);
|
||||
var name = me._pageName ~ k ~ i;
|
||||
var element = me._svg.getElementById(name);
|
||||
assert(element != nil, "Unable to find element " ~ name);
|
||||
element.setVisible(0);
|
||||
element.setText("");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
if ((me._scrollThumbElement != nil) and (me._size < size(me._values))) {
|
||||
# Shift the scrollbar if it's relevant
|
||||
var numScrollPositions = math.ceil(size(me._values) / me._size) -1;
|
||||
me._scrollThumbElement.setTranslation([
|
||||
me._scrollBaseTransform[0],
|
||||
me._scrollBaseTransform[1] + me._scrollHeight * (me._pageIndex / numScrollPositions)
|
||||
]);
|
||||
}
|
||||
},
|
||||
|
||||
# Methods to add dynamic elements to the group. Must be called in the
|
||||
# scroll order, as they are simply appended to the end of the list of elements!
|
||||
|
@ -126,6 +210,7 @@ clearElement : func() {
|
|||
},
|
||||
incrSmall : func(value) {
|
||||
if (me._crsrIndex == -1) return;
|
||||
|
||||
var incr_or_decr = (value > 0) ? 1 : -1;
|
||||
if (me._elements[me._crsrIndex].isInEdit()) {
|
||||
# We're editing, so pass to the element.
|
||||
|
@ -134,7 +219,12 @@ incrSmall : func(value) {
|
|||
} else {
|
||||
# Move to next selection element
|
||||
me._elements[me._crsrIndex].unhighlightElement();
|
||||
me._crsrIndex = math.mod(me._crsrIndex + incr_or_decr, me._currentSize);
|
||||
|
||||
me._crsrIndex = me._crsrIndex + incr_or_decr;
|
||||
|
||||
if (me._crsrIndex < 0 ) me.previousPage();
|
||||
if (me._crsrIndex == me._currentSize) me.nextPage();
|
||||
|
||||
me._elements[me._crsrIndex].highlightElement();
|
||||
}
|
||||
},
|
||||
|
@ -148,7 +238,12 @@ incrLarge : func(val) {
|
|||
} else {
|
||||
# Move to next selection element
|
||||
me._elements[me._crsrIndex].unhighlightElement();
|
||||
me._crsrIndex = math.mod(me._crsrIndex + incr_or_decr, me._currentSize);
|
||||
|
||||
me._crsrIndex = me._crsrIndex + incr_or_decr;
|
||||
|
||||
if (me._crsrIndex < 0 ) me.previousPage();
|
||||
if (me._crsrIndex == me._currentSize) me.nextPage();
|
||||
|
||||
me._elements[me._crsrIndex].highlightElement();
|
||||
}
|
||||
},
|
||||
|
|
59
Nasal/canvas/map/DTO.lcontroller
Normal file
59
Nasal/canvas/map/DTO.lcontroller
Normal file
|
@ -0,0 +1,59 @@
|
|||
# See: http://wiki.flightgear.org/MapStructure
|
||||
# Direct TO line. Displays line from current position to a given Lat/Lon
|
||||
|
||||
# Class things:
|
||||
var name = 'DTO';
|
||||
var parents = [SymbolLayer.Controller];
|
||||
var __self__ = caller(0)[0];
|
||||
SymbolLayer.Controller.add(name, __self__);
|
||||
SymbolLayer.add(name, {
|
||||
parents: [MultiSymbolLayer],
|
||||
type: name, # Symbol type
|
||||
df_controller: __self__, # controller to use by default -- this one
|
||||
df_options: { # default configuration options
|
||||
}
|
||||
});
|
||||
var new = func(layer) {
|
||||
var m = {
|
||||
parents: [__self__],
|
||||
layer: layer,
|
||||
map: layer.map,
|
||||
listeners: [],
|
||||
target_lat: -999,
|
||||
target_lon: -999,
|
||||
target_alt: -999,
|
||||
last_result: [],
|
||||
};
|
||||
layer.searcher._equals = func(l,r) 0; # TODO: create model objects instead?
|
||||
|
||||
m.addVisibilityListener();
|
||||
return m;
|
||||
};
|
||||
var del = func() {
|
||||
foreach (var l; me.listeners)
|
||||
removelistener(l);
|
||||
};
|
||||
var setTarget = func(lat, lon, alt=0) {
|
||||
me.target_lat = lat;
|
||||
me.target_lon = lon;
|
||||
me.target_alt = alt;
|
||||
me.layer.update();
|
||||
};
|
||||
|
||||
var searchCmd = func() {
|
||||
var coords = [];
|
||||
append(coords, {lon: me.target_lon, lat: me.target_lat, alt: me.target_alt});
|
||||
|
||||
var lines = [];
|
||||
|
||||
append(lines, {
|
||||
id: me.target_lat ~ " " ~ me.target_lon,
|
||||
type: "lon",
|
||||
path: coords,
|
||||
equals: func(o){
|
||||
return (me.path == o.path and me.type == o.type);
|
||||
}
|
||||
});
|
||||
|
||||
return lines;
|
||||
};
|
55
Nasal/canvas/map/DTO.symbol
Normal file
55
Nasal/canvas/map/DTO.symbol
Normal file
|
@ -0,0 +1,55 @@
|
|||
# See: http://wiki.flightgear.org/MapStructure
|
||||
#
|
||||
# Direct TO line. Displays line from current position to a given Lat/Lon
|
||||
|
||||
# Class things:
|
||||
var name = 'DTO';
|
||||
var parents = [LineSymbol];
|
||||
var __self__ = caller(0)[0];
|
||||
LineSymbol.makeinstance( name, __self__ );
|
||||
|
||||
SymbolLayer.get(name).df_style = { # style to use by default
|
||||
line_width: 2,
|
||||
color: [1.0,1.0,1.0],
|
||||
dash_array: [5,5,5,5],
|
||||
};
|
||||
|
||||
var init = func {
|
||||
me.element.setColor(me.layer.style.color)
|
||||
.setStrokeLineWidth(me.layer.style.line_width)
|
||||
.setStrokeDashArray(me.layer.style.dash_array);
|
||||
};
|
||||
|
||||
var draw = func() {
|
||||
me.callback('draw_before');
|
||||
printlog(_MP_dbg_lvl, "redrawing a LineSymbol "~me.layer.type);
|
||||
me.element.reset();
|
||||
var cmds = [];
|
||||
var coords = [];
|
||||
var cmd = canvas.Path.VG_LINE_TO;
|
||||
|
||||
append(coords,"N"~me.layer.map.getLat());
|
||||
append(coords,"E"~me.layer.map.getLon());
|
||||
append(cmds,canvas.Path.VG_MOVE_TO);
|
||||
|
||||
var path = me.model;
|
||||
if(typeof(path) == 'hash'){
|
||||
path = me.model.path;
|
||||
if(path == nil)
|
||||
__die("LineSymbol model requires a 'path' member (vector)");
|
||||
}
|
||||
foreach (var m; path) {
|
||||
if(size(keys(m)) >= 2){
|
||||
var (lat,lon) = me.controller.getpos(m);
|
||||
append(coords,"N"~lat);
|
||||
append(coords,"E"~lon);
|
||||
append(cmds,cmd);
|
||||
cmd = canvas.Path.VG_LINE_TO;
|
||||
} else {
|
||||
cmd = canvas.Path.VG_MOVE_TO;
|
||||
}
|
||||
}
|
||||
me.element.setDataGeo(cmds, coords);
|
||||
me.element.update(); # this doesn't help with flickering, it seems
|
||||
me.callback('draw_after');
|
||||
};
|
Loading…
Add table
Reference in a new issue