kopia lustrzana https://github.com/dl2alf/AirScout
V1.3.3.6
rodzic
f46e8efd92
commit
6fa8277f34
|
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
|
||||
// indem Sie "*" wie unten gezeigt eingeben:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.3.3.0")]
|
||||
[assembly: AssemblyFileVersion("1.3.3.0")]
|
||||
[assembly: AssemblyVersion("1.3.3.1")]
|
||||
[assembly: AssemblyFileVersion("1.3.3.1")]
|
||||
|
|
|
@ -43,6 +43,97 @@ namespace System.Net
|
|||
return clientExtensions;
|
||||
}
|
||||
|
||||
private static bool ReadContent(Stream stream, int contentlength, int timeout, ref string response)
|
||||
{
|
||||
// set stop watch as timout
|
||||
Stopwatch st = new Stopwatch();
|
||||
st.Start();
|
||||
string resp = "";
|
||||
int count = 0;
|
||||
// assign buffer
|
||||
byte[] buff = new byte[1];
|
||||
int bytesread = 0;
|
||||
// read content bytewise
|
||||
while (bytesread < contentlength)
|
||||
{
|
||||
bytesread += stream.Read(buff, 0, buff.Length);
|
||||
// add it to response
|
||||
resp += Encoding.ASCII.GetString(buff, 0, buff.Length);
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection timed out.");
|
||||
}
|
||||
string trailer = "";
|
||||
// reassign buffer
|
||||
buff = new byte[1];
|
||||
// read stream bytewise until CRLFCRLF is detected, should be the next two bytes
|
||||
do
|
||||
{
|
||||
count = stream.Read(buff, 0, buff.Length);
|
||||
trailer += Encoding.ASCII.GetString(buff, 0, buff.Length);
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection timed out.");
|
||||
}
|
||||
while (!trailer.Contains("\r\n"));
|
||||
Console.WriteLine("Reading content [" + contentlength.ToString() + " bytes]: " + resp);
|
||||
response += resp;
|
||||
return true;
|
||||
}
|
||||
|
||||
private static bool ReadChunkedContent(Stream stream, int timeout, ref string response)
|
||||
{
|
||||
// set stop watch as timout
|
||||
Stopwatch st = new Stopwatch();
|
||||
st.Start();
|
||||
string resp = "";
|
||||
byte[] buff = new byte[1];
|
||||
int count = 0;
|
||||
string strcontentlength = "";
|
||||
int contentlength = 0;
|
||||
// chunked transfer, first line should contain content length
|
||||
// read stream bytewise until CRLF is detected
|
||||
do
|
||||
{
|
||||
count = stream.Read(buff, 0, buff.Length);
|
||||
strcontentlength += Encoding.ASCII.GetString(buff, 0, buff.Length);
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection timed out.");
|
||||
}
|
||||
while (!strcontentlength.Contains("\r\n"));
|
||||
strcontentlength = strcontentlength.Replace("\r\n", "");
|
||||
contentlength = int.Parse(strcontentlength, System.Globalization.NumberStyles.HexNumber);
|
||||
// finished reading all chunks
|
||||
if (contentlength == 0)
|
||||
{
|
||||
Console.WriteLine("Reading chunked content finished");
|
||||
return true;
|
||||
}
|
||||
int bytesread = 0;
|
||||
// read content bytewise
|
||||
while (bytesread < contentlength)
|
||||
{
|
||||
bytesread += stream.Read(buff, 0, buff.Length);
|
||||
// add it to response
|
||||
resp += Encoding.ASCII.GetString(buff, 0, buff.Length);
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection timed out.");
|
||||
}
|
||||
string trailer = "";
|
||||
// reassign buffer
|
||||
buff = new byte[1];
|
||||
// read stream bytewise until CRLFCRLF is detected, should be the next two bytes
|
||||
do
|
||||
{
|
||||
count = stream.Read(buff, 0, buff.Length);
|
||||
trailer += Encoding.ASCII.GetString(buff, 0, buff.Length);
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection timed out.");
|
||||
}
|
||||
while (!trailer.Contains("\r\n"));
|
||||
Console.WriteLine("Reading chunked content [" + contentlength.ToString() + " bytes]: " + resp);
|
||||
response += resp;
|
||||
return false;
|
||||
}
|
||||
|
||||
public static string DownloadFile(string url, int timeout)
|
||||
{
|
||||
string response = "";
|
||||
|
@ -76,13 +167,15 @@ namespace System.Net
|
|||
var dataToSend = Encoding.ASCII.GetBytes(hdr.ToString());
|
||||
|
||||
stream.Write(dataToSend, 0, dataToSend.Length);
|
||||
|
||||
byte[] buff;
|
||||
// set stop watch as timout
|
||||
Stopwatch st = new Stopwatch();
|
||||
st.Start();
|
||||
//read header bytewise
|
||||
string header = "";
|
||||
int totalRead = 0;
|
||||
byte[] buff = new byte[1];
|
||||
buff = new byte[1];
|
||||
do
|
||||
{
|
||||
totalRead = stream.Read(buff, 0, buff.Length);
|
||||
|
@ -91,47 +184,20 @@ namespace System.Net
|
|||
throw new TimeoutException("Connection to " + url + " timed out.");
|
||||
}
|
||||
while (!header.Contains("\r\n\r\n"));
|
||||
Console.Write(header);
|
||||
int contentlength = 0;
|
||||
if (header.Contains("Transfer-Encoding: chunked"))
|
||||
{
|
||||
// chunked transfer, first line should contain content length
|
||||
string strcontentlength = "";
|
||||
do
|
||||
{
|
||||
totalRead = stream.Read(buff, 0, buff.Length);
|
||||
strcontentlength += Encoding.ASCII.GetString(buff, 0, buff.Length);
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection to " + url + " timed out.");
|
||||
}
|
||||
while (!strcontentlength.Contains("\r\n"));
|
||||
strcontentlength = strcontentlength.Replace("\r\n", "");
|
||||
contentlength = int.Parse(strcontentlength, System.Globalization.NumberStyles.HexNumber);
|
||||
// chunked transfer, read all chunks until complete
|
||||
while (!ReadChunkedContent(stream, timeout, ref response))
|
||||
{ }
|
||||
}
|
||||
else
|
||||
{
|
||||
// get content length from header
|
||||
Regex strcontentlength = new Regex("(?<=Content-Length:\\s)\\d+", RegexOptions.IgnoreCase);
|
||||
contentlength = int.Parse(strcontentlength.Match(header).Value);
|
||||
}
|
||||
// re-assign buffer
|
||||
// read response
|
||||
buff = new byte[1000];
|
||||
totalRead = 0;
|
||||
do
|
||||
{
|
||||
int bytesRead = stream.Read(buff, 0, buff.Length);
|
||||
string part = Encoding.UTF8.GetString(buff, 0, bytesRead);
|
||||
Console.WriteLine(part);
|
||||
response += part;
|
||||
totalRead += bytesRead;
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection to " + url + " timed out.");
|
||||
}
|
||||
while (totalRead < contentlength);
|
||||
// cut response at the end
|
||||
if (response.Contains("\r\n"))
|
||||
{
|
||||
response = response.Substring(0, response.IndexOf("\r\n"));
|
||||
Regex rcontentlength = new Regex("(?<=Content-Length:\\s)\\d+", RegexOptions.IgnoreCase);
|
||||
contentlength = int.Parse(rcontentlength.Match(header).Value);
|
||||
ReadContent(stream, contentlength, timeout, ref response);
|
||||
}
|
||||
st.Stop();
|
||||
}
|
||||
|
|
|
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
|
||||
// indem Sie "*" wie unten gezeigt eingeben:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.3.3.0")]
|
||||
[assembly: AssemblyFileVersion("1.3.3.0")]
|
||||
[assembly: AssemblyVersion("1.3.3.1")]
|
||||
[assembly: AssemblyFileVersion("1.3.3.1")]
|
||||
|
|
|
@ -4,11 +4,13 @@ using System;
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
|
||||
namespace System.Net
|
||||
{
|
||||
|
@ -41,6 +43,97 @@ namespace System.Net
|
|||
return clientExtensions;
|
||||
}
|
||||
|
||||
private static bool ReadContent(Stream stream, int contentlength, int timeout, ref string response)
|
||||
{
|
||||
// set stop watch as timout
|
||||
Stopwatch st = new Stopwatch();
|
||||
st.Start();
|
||||
string resp = "";
|
||||
int count = 0;
|
||||
// assign buffer
|
||||
byte[] buff = new byte[1];
|
||||
int bytesread = 0;
|
||||
// read content bytewise
|
||||
while (bytesread < contentlength)
|
||||
{
|
||||
bytesread += stream.Read(buff, 0, buff.Length);
|
||||
// add it to response
|
||||
resp += Encoding.ASCII.GetString(buff, 0, buff.Length);
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection timed out.");
|
||||
}
|
||||
string trailer = "";
|
||||
// reassign buffer
|
||||
buff = new byte[1];
|
||||
// read stream bytewise until CRLFCRLF is detected, should be the next two bytes
|
||||
do
|
||||
{
|
||||
count = stream.Read(buff, 0, buff.Length);
|
||||
trailer += Encoding.ASCII.GetString(buff, 0, buff.Length);
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection timed out.");
|
||||
}
|
||||
while (!trailer.Contains("\r\n"));
|
||||
Console.WriteLine("Reading content [" + contentlength.ToString() + " bytes]: " + resp);
|
||||
response += resp;
|
||||
return true;
|
||||
}
|
||||
|
||||
private static bool ReadChunkedContent(Stream stream, int timeout, ref string response)
|
||||
{
|
||||
// set stop watch as timout
|
||||
Stopwatch st = new Stopwatch();
|
||||
st.Start();
|
||||
string resp = "";
|
||||
byte[] buff = new byte[1];
|
||||
int count = 0;
|
||||
string strcontentlength = "";
|
||||
int contentlength = 0;
|
||||
// chunked transfer, first line should contain content length
|
||||
// read stream bytewise until CRLF is detected
|
||||
do
|
||||
{
|
||||
count = stream.Read(buff, 0, buff.Length);
|
||||
strcontentlength += Encoding.ASCII.GetString(buff, 0, buff.Length);
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection timed out.");
|
||||
}
|
||||
while (!strcontentlength.Contains("\r\n"));
|
||||
strcontentlength = strcontentlength.Replace("\r\n", "");
|
||||
contentlength = int.Parse(strcontentlength, System.Globalization.NumberStyles.HexNumber);
|
||||
// finished reading all chunks
|
||||
if (contentlength == 0)
|
||||
{
|
||||
Console.WriteLine("Reading chunked content finished");
|
||||
return true;
|
||||
}
|
||||
int bytesread = 0;
|
||||
// read content bytewise
|
||||
while (bytesread < contentlength)
|
||||
{
|
||||
bytesread += stream.Read(buff, 0, buff.Length);
|
||||
// add it to response
|
||||
resp += Encoding.ASCII.GetString(buff, 0, buff.Length);
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection timed out.");
|
||||
}
|
||||
string trailer = "";
|
||||
// reassign buffer
|
||||
buff = new byte[1];
|
||||
// read stream bytewise until CRLFCRLF is detected, should be the next two bytes
|
||||
do
|
||||
{
|
||||
count = stream.Read(buff, 0, buff.Length);
|
||||
trailer += Encoding.ASCII.GetString(buff, 0, buff.Length);
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection timed out.");
|
||||
}
|
||||
while (!trailer.Contains("\r\n"));
|
||||
Console.WriteLine("Reading chunked content [" + contentlength.ToString() + " bytes]: " + resp);
|
||||
response += resp;
|
||||
return false;
|
||||
}
|
||||
|
||||
public static string DownloadFile (string url, int timeout, string apikey)
|
||||
{
|
||||
string response = "";
|
||||
|
@ -75,13 +168,15 @@ namespace System.Net
|
|||
var dataToSend = Encoding.ASCII.GetBytes(hdr.ToString());
|
||||
|
||||
stream.Write(dataToSend, 0, dataToSend.Length);
|
||||
|
||||
byte[] buff;
|
||||
// set stop watch as timout
|
||||
Stopwatch st = new Stopwatch();
|
||||
st.Start();
|
||||
//read header bytewise
|
||||
string header = "";
|
||||
int totalRead = 0;
|
||||
byte[] buff = new byte[1];
|
||||
buff = new byte[1];
|
||||
do
|
||||
{
|
||||
totalRead = stream.Read(buff, 0, buff.Length);
|
||||
|
@ -90,47 +185,20 @@ namespace System.Net
|
|||
throw new TimeoutException("Connection to " + url + " timed out.");
|
||||
}
|
||||
while (!header.Contains("\r\n\r\n"));
|
||||
Console.Write(header);
|
||||
int contentlength = 0;
|
||||
if (header.Contains("Transfer-Encoding: chunked"))
|
||||
{
|
||||
// chunked transfer, first line should contain content length
|
||||
string strcontentlength = "";
|
||||
do
|
||||
{
|
||||
totalRead = stream.Read(buff, 0, buff.Length);
|
||||
strcontentlength += Encoding.ASCII.GetString(buff, 0, buff.Length);
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection to " + url + " timed out.");
|
||||
}
|
||||
while (!strcontentlength.Contains("\r\n"));
|
||||
strcontentlength = strcontentlength.Replace("\r\n", "");
|
||||
contentlength = int.Parse(strcontentlength, System.Globalization.NumberStyles.HexNumber);
|
||||
// chunked transfer, read all chunks until complete
|
||||
while (!ReadChunkedContent(stream, timeout, ref response))
|
||||
{ }
|
||||
}
|
||||
else
|
||||
{
|
||||
// get content length from header
|
||||
Regex strcontentlength = new Regex("(?<=Content-Length:\\s)\\d+", RegexOptions.IgnoreCase);
|
||||
contentlength = int.Parse(strcontentlength.Match(header).Value);
|
||||
}
|
||||
// re-assign buffer
|
||||
// read response
|
||||
buff = new byte[1000];
|
||||
totalRead = 0;
|
||||
do
|
||||
{
|
||||
int bytesRead = stream.Read(buff, 0, buff.Length);
|
||||
string part = Encoding.UTF8.GetString(buff, 0, bytesRead);
|
||||
Console.WriteLine(part);
|
||||
response += part;
|
||||
totalRead += bytesRead;
|
||||
if (st.ElapsedMilliseconds > timeout)
|
||||
throw new TimeoutException("Connection to " + url + " timed out.");
|
||||
}
|
||||
while (totalRead < contentlength);
|
||||
// cut response at the end
|
||||
if (response.Contains("\r\n"))
|
||||
{
|
||||
response = response.Substring(0, response.IndexOf("\r\n"));
|
||||
Regex rcontentlength = new Regex("(?<=Content-Length:\\s)\\d+", RegexOptions.IgnoreCase);
|
||||
contentlength = int.Parse(rcontentlength.Match(header).Value);
|
||||
ReadContent(stream, contentlength, timeout, ref response);
|
||||
}
|
||||
st.Stop();
|
||||
}
|
||||
|
|
|
@ -368,7 +368,6 @@ namespace AirScout.PlaneFeeds.Plugin.VirtualRadarServer
|
|||
Console.WriteLine("[" + this.GetType().Name + "]: Analyzing data");
|
||||
// JavaScriptSerializer js = new JavaScriptSerializer();
|
||||
// dynamic root = js.Deserialize<dynamic>(json);
|
||||
dynamic root = JsonConvert.DeserializeObject(json);
|
||||
// 2017-07-23: workaround for "jumping planes" due to incorrect time stamps
|
||||
// try to get the server time to adjust the time stamps in plane positions
|
||||
// --> compare server time with local time and calculate offset
|
||||
|
@ -376,6 +375,9 @@ namespace AirScout.PlaneFeeds.Plugin.VirtualRadarServer
|
|||
long toffset = 0;
|
||||
try
|
||||
{
|
||||
// deserialize JSON
|
||||
dynamic root = JsonConvert.DeserializeObject(json);
|
||||
|
||||
// get local time of request in milliseconds
|
||||
DateTime lt = DateTime.UtcNow;
|
||||
long ltime = (long)(lt - new DateTime(1970, 1, 1)).TotalMilliseconds;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.29609.76
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.0.31903.59
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AirScout", "AirScout\AirScout.csproj", "{17498590-2CFF-4D24-BFB8-549D14BD2545}"
|
||||
EndProject
|
||||
|
|
|
@ -136,6 +136,12 @@
|
|||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="DeleteSingleStationDlg.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="DeleteSingleStationDlg.Designer.cs">
|
||||
<DependentUpon>DeleteSingleStationDlg.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="MapPreloader.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
|
@ -314,6 +320,7 @@
|
|||
<None Include="Resources\AirScout_Marker.png" />
|
||||
<None Include="Resources\AirScout_Watchlist.png" />
|
||||
<None Include="Resources\Settings.png" />
|
||||
<Content Include="Requirements.txt" />
|
||||
<Content Include="VersionHistory.txt">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
|
@ -329,6 +336,9 @@
|
|||
<EmbeddedResource Include="DatabaseMaintenanceDlg.resx">
|
||||
<DependentUpon>DatabaseMaintenanceDlg.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="DeleteSingleStationDlg.resx">
|
||||
<DependentUpon>DeleteSingleStationDlg.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="ElevationCopyrightDlg.resx">
|
||||
<DependentUpon>ElevationCopyrightDlg.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
|
|
|
@ -36,19 +36,19 @@
|
|||
this.ss_Main = new System.Windows.Forms.StatusStrip();
|
||||
this.tsl_Main = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.panel1 = new System.Windows.Forms.Panel();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.ud_Analysis_AmbiguousGap = new System.Windows.Forms.NumericUpDown();
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel = new System.Windows.Forms.CheckBox();
|
||||
this.btn_History_Export = new System.Windows.Forms.Button();
|
||||
this.btn_History_Cancel = new System.Windows.Forms.Button();
|
||||
this.btn_History_Calculate = new System.Windows.Forms.Button();
|
||||
this.tt_Crossing_History = new System.Windows.Forms.ToolTip(this.components);
|
||||
this.ch_Crossing_History = new System.Windows.Forms.DataVisualization.Charting.Chart();
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel = new System.Windows.Forms.CheckBox();
|
||||
this.ud_Analysis_AmbiguousGap = new System.Windows.Forms.NumericUpDown();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.ss_Main.SuspendLayout();
|
||||
this.panel1.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ch_Crossing_History)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ud_Analysis_AmbiguousGap)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ch_Crossing_History)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// bw_History
|
||||
|
@ -90,6 +90,45 @@
|
|||
this.panel1.Size = new System.Drawing.Size(893, 100);
|
||||
this.panel1.TabIndex = 2;
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(393, 51);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(32, 13);
|
||||
this.label2.TabIndex = 6;
|
||||
this.label2.Text = "secs.";
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(9, 51);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(276, 13);
|
||||
this.label1.TabIndex = 5;
|
||||
this.label1.Text = "Timespan within two crossings considered as ambiguous:";
|
||||
//
|
||||
// ud_Analysis_AmbiguousGap
|
||||
//
|
||||
this.ud_Analysis_AmbiguousGap.DataBindings.Add(new System.Windows.Forms.Binding("Value", global::AirScout.Properties.Settings.Default, "Analysis_CrossingHistory_AmbigousGap", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.ud_Analysis_AmbiguousGap.Location = new System.Drawing.Point(318, 49);
|
||||
this.ud_Analysis_AmbiguousGap.Name = "ud_Analysis_AmbiguousGap";
|
||||
this.ud_Analysis_AmbiguousGap.Size = new System.Drawing.Size(60, 20);
|
||||
this.ud_Analysis_AmbiguousGap.TabIndex = 4;
|
||||
this.ud_Analysis_AmbiguousGap.Value = global::AirScout.Properties.Settings.Default.Analysis_CrossingHistory_AmbigousGap;
|
||||
//
|
||||
// cb_Analysis_CrossingHistory_WithSignlaLevel
|
||||
//
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.AutoSize = true;
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Checked = global::AirScout.Properties.Settings.Default.Analysis_CrossingHistory_WithSignalLevel;
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::AirScout.Properties.Settings.Default, "Analysis_CrossingHistory_WithSignalLevel", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Location = new System.Drawing.Point(12, 21);
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Name = "cb_Analysis_CrossingHistory_WithSignlaLevel";
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Size = new System.Drawing.Size(258, 17);
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.TabIndex = 3;
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Text = "Consider crossings with recorded signal level only";
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// btn_History_Export
|
||||
//
|
||||
this.btn_History_Export.Location = new System.Drawing.Point(697, 41);
|
||||
|
@ -151,45 +190,6 @@
|
|||
this.ch_Crossing_History.TabIndex = 5;
|
||||
this.ch_Crossing_History.Text = "History";
|
||||
//
|
||||
// cb_Analysis_CrossingHistory_WithSignlaLevel
|
||||
//
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.AutoSize = true;
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Checked = global::AirScout.Properties.Settings.Default.Analysis_CrossingHistory_WithSignalLevel;
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::AirScout.Properties.Settings.Default, "Analysis_CrossingHistory_WithSignalLevel", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Location = new System.Drawing.Point(12, 21);
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Name = "cb_Analysis_CrossingHistory_WithSignlaLevel";
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Size = new System.Drawing.Size(258, 17);
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.TabIndex = 3;
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Text = "Consider crossings with recorded signal level only";
|
||||
this.cb_Analysis_CrossingHistory_WithSignlaLevel.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// ud_Analysis_AmbiguousGap
|
||||
//
|
||||
this.ud_Analysis_AmbiguousGap.DataBindings.Add(new System.Windows.Forms.Binding("Value", global::AirScout.Properties.Settings.Default, "Analysis_CrossingHistory_AmbiguousGap", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.ud_Analysis_AmbiguousGap.Location = new System.Drawing.Point(318, 49);
|
||||
this.ud_Analysis_AmbiguousGap.Name = "ud_Analysis_AmbiguousGap";
|
||||
this.ud_Analysis_AmbiguousGap.Size = new System.Drawing.Size(60, 20);
|
||||
this.ud_Analysis_AmbiguousGap.TabIndex = 4;
|
||||
this.ud_Analysis_AmbiguousGap.Value = global::AirScout.Properties.Settings.Default.Analysis_CrossingHistory_AmbigousGap;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(9, 51);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(276, 13);
|
||||
this.label1.TabIndex = 5;
|
||||
this.label1.Text = "Timespan within two crossings considered as ambiguous:";
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(393, 51);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(32, 13);
|
||||
this.label2.TabIndex = 6;
|
||||
this.label2.Text = "secs.";
|
||||
//
|
||||
// CrossingHistoryDlg
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
|
@ -206,8 +206,8 @@
|
|||
this.ss_Main.PerformLayout();
|
||||
this.panel1.ResumeLayout(false);
|
||||
this.panel1.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ch_Crossing_History)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ud_Analysis_AmbiguousGap)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.ch_Crossing_History)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
|
|
|
@ -0,0 +1,140 @@
|
|||
namespace AirScout
|
||||
{
|
||||
partial class DeleteSingleStationDlg
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DeleteSingleStationDlg));
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.cb_Call = new System.Windows.Forms.ComboBox();
|
||||
this.cb_Locator = new System.Windows.Forms.ComboBox();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.btn_Delete = new System.Windows.Forms.Button();
|
||||
this.btn_Cancel = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label1.Location = new System.Drawing.Point(12, 19);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(464, 92);
|
||||
this.label1.TabIndex = 0;
|
||||
this.label1.Text = resources.GetString("label1.Text");
|
||||
//
|
||||
// cb_Call
|
||||
//
|
||||
this.cb_Call.FormattingEnabled = true;
|
||||
this.cb_Call.Location = new System.Drawing.Point(55, 132);
|
||||
this.cb_Call.Name = "cb_Call";
|
||||
this.cb_Call.Size = new System.Drawing.Size(121, 21);
|
||||
this.cb_Call.TabIndex = 1;
|
||||
this.cb_Call.DropDown += new System.EventHandler(this.cb_Call_DropDown);
|
||||
this.cb_Call.SelectedIndexChanged += new System.EventHandler(this.cb_Call_SelectedIndexChanged);
|
||||
this.cb_Call.TextChanged += new System.EventHandler(this.cb_Call_TextChanged);
|
||||
this.cb_Call.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.cb_Call_KeyPress);
|
||||
//
|
||||
// cb_Locator
|
||||
//
|
||||
this.cb_Locator.FormattingEnabled = true;
|
||||
this.cb_Locator.Location = new System.Drawing.Point(279, 132);
|
||||
this.cb_Locator.Name = "cb_Locator";
|
||||
this.cb_Locator.Size = new System.Drawing.Size(121, 21);
|
||||
this.cb_Locator.TabIndex = 2;
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(22, 135);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(27, 13);
|
||||
this.label2.TabIndex = 3;
|
||||
this.label2.Text = "Call:";
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Location = new System.Drawing.Point(223, 135);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(46, 13);
|
||||
this.label3.TabIndex = 4;
|
||||
this.label3.Text = "Locator:";
|
||||
//
|
||||
// btn_Delete
|
||||
//
|
||||
this.btn_Delete.BackColor = System.Drawing.Color.Tomato;
|
||||
this.btn_Delete.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.btn_Delete.ForeColor = System.Drawing.Color.White;
|
||||
this.btn_Delete.Location = new System.Drawing.Point(55, 173);
|
||||
this.btn_Delete.Name = "btn_Delete";
|
||||
this.btn_Delete.Size = new System.Drawing.Size(121, 35);
|
||||
this.btn_Delete.TabIndex = 5;
|
||||
this.btn_Delete.Text = "Delete";
|
||||
this.btn_Delete.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// btn_Cancel
|
||||
//
|
||||
this.btn_Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.btn_Cancel.Location = new System.Drawing.Point(279, 173);
|
||||
this.btn_Cancel.Name = "btn_Cancel";
|
||||
this.btn_Cancel.Size = new System.Drawing.Size(121, 35);
|
||||
this.btn_Cancel.TabIndex = 6;
|
||||
this.btn_Cancel.Text = "Cancel";
|
||||
this.btn_Cancel.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// DeleteSingleStationDlg
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.CancelButton = this.btn_Cancel;
|
||||
this.ClientSize = new System.Drawing.Size(485, 220);
|
||||
this.Controls.Add(this.btn_Cancel);
|
||||
this.Controls.Add(this.btn_Delete);
|
||||
this.Controls.Add(this.label3);
|
||||
this.Controls.Add(this.label2);
|
||||
this.Controls.Add(this.cb_Locator);
|
||||
this.Controls.Add(this.cb_Call);
|
||||
this.Controls.Add(this.label1);
|
||||
this.Name = "DeleteSingleStationDlg";
|
||||
this.Text = "Delete Single Station";
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.ComboBox cb_Call;
|
||||
private System.Windows.Forms.ComboBox cb_Locator;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.Button btn_Delete;
|
||||
private System.Windows.Forms.Button btn_Cancel;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
using ScoutBase.Stations;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AirScout
|
||||
{
|
||||
public partial class DeleteSingleStationDlg : Form
|
||||
{
|
||||
bool SelectionChanged = false;
|
||||
|
||||
public DeleteSingleStationDlg()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void cb_Call_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (!SelectionChanged)
|
||||
{
|
||||
int start = cb_Call.SelectionStart;
|
||||
int len = cb_Call.SelectionLength;
|
||||
string text = cb_Call.Text.ToUpper().Trim();
|
||||
if (cb_Call.Text != text)
|
||||
cb_Call.Text = text;
|
||||
cb_Call.SelectionStart = start;
|
||||
cb_Call.SelectionLength = len;
|
||||
}
|
||||
SelectionChanged = false;
|
||||
}
|
||||
|
||||
private void cb_Call_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
// suppress handling on text input
|
||||
if (!cb_Call.DroppedDown)
|
||||
return;
|
||||
if (cb_Call.SelectedItem != null)
|
||||
{
|
||||
SelectionChanged = true;
|
||||
cb_Call.Text = (string)cb_Call.SelectedItem;
|
||||
}
|
||||
}
|
||||
|
||||
private void cb_Call_KeyPress(object sender, KeyPressEventArgs e)
|
||||
{
|
||||
}
|
||||
|
||||
private void cb_Call_DropDown(object sender, EventArgs e)
|
||||
{
|
||||
if (!cb_Call.DroppedDown && (cb_Call.Text.Length >= 2))
|
||||
{
|
||||
List<LocationDesignator> l = StationData.Database.LocationGetAll("%" + cb_Call.Text + "%");
|
||||
if (l != null)
|
||||
{
|
||||
cb_Call.Items.Clear();
|
||||
cb_Locator.Items.Clear();
|
||||
foreach (LocationDesignator ld in l)
|
||||
{
|
||||
cb_Call.Items.Add(ld.Call);
|
||||
cb_Locator.Items.Add(ld.Loc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,124 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="label1.Text" xml:space="preserve">
|
||||
<value>Use this dialog to find and remove a single station/locator combination from the local station database.
|
||||
CAUTION: You can only remove own entries permanently. If a station/locator combination is part of the global database it would be re-inserted on next update.</value>
|
||||
</data>
|
||||
</root>
|
|
@ -40,7 +40,6 @@
|
|||
this.label8 = new System.Windows.Forms.Label();
|
||||
this.gm_Callsign = new GMap.NET.WindowsForms.GMapControl();
|
||||
this.tb_Callsign = new ScoutBase.Core.CallsignTextBox();
|
||||
this.tb_Locator = new ScoutBase.Core.LocatorTextBox();
|
||||
this.tb_Longitude = new ScoutBase.Core.DoubleTextBox();
|
||||
this.tb_Latitude = new ScoutBase.Core.DoubleTextBox();
|
||||
this.btn_Cancel = new System.Windows.Forms.Button();
|
||||
|
@ -48,6 +47,13 @@
|
|||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.tb_Elevation = new ScoutBase.Core.DoubleTextBox();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.ss_Main = new System.Windows.Forms.StatusStrip();
|
||||
this.tsl_Status = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.bw_Elevationgrid = new System.ComponentModel.BackgroundWorker();
|
||||
this.tb_Locator = new ScoutBase.Core.LocatorTextBox();
|
||||
this.cb_Options_StationsMap_OverlayElevation = new System.Windows.Forms.CheckBox();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.ss_Main.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// label19
|
||||
|
@ -153,7 +159,7 @@
|
|||
this.gm_Callsign.RoutesEnabled = true;
|
||||
this.gm_Callsign.SelectedAreaFillColor = System.Drawing.Color.FromArgb(((int)(((byte)(33)))), ((int)(((byte)(65)))), ((int)(((byte)(105)))), ((int)(((byte)(225)))));
|
||||
this.gm_Callsign.ShowTileGridLines = false;
|
||||
this.gm_Callsign.Size = new System.Drawing.Size(760, 621);
|
||||
this.gm_Callsign.Size = new System.Drawing.Size(760, 617);
|
||||
this.gm_Callsign.TabIndex = 29;
|
||||
this.gm_Callsign.Zoom = 0D;
|
||||
this.gm_Callsign.OnMarkerEnter += new GMap.NET.WindowsForms.MarkerEnter(this.gm_Callsign_OnMarkerEnter);
|
||||
|
@ -176,19 +182,6 @@
|
|||
this.tb_Callsign.Size = new System.Drawing.Size(107, 21);
|
||||
this.tb_Callsign.TabIndex = 30;
|
||||
//
|
||||
// tb_Locator
|
||||
//
|
||||
this.tb_Locator.DataBindings.Add(new System.Windows.Forms.Binding("SmallLettersForSubsquares", global::AirScout.Properties.Settings.Default, "Locator_SmallLettersForSubsquares", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.tb_Locator.ErrorBackColor = System.Drawing.Color.Red;
|
||||
this.tb_Locator.ErrorForeColor = System.Drawing.Color.White;
|
||||
this.tb_Locator.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.tb_Locator.Location = new System.Drawing.Point(875, 140);
|
||||
this.tb_Locator.Name = "tb_Locator";
|
||||
this.tb_Locator.Size = new System.Drawing.Size(107, 21);
|
||||
this.tb_Locator.SmallLettersForSubsquares = global::AirScout.Properties.Settings.Default.Locator_SmallLettersForSubsquares;
|
||||
this.tb_Locator.TabIndex = 35;
|
||||
this.tb_Locator.TextChanged += new System.EventHandler(this.tb_Locator_TextChanged);
|
||||
//
|
||||
// tb_Longitude
|
||||
//
|
||||
this.tb_Longitude.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
|
@ -199,7 +192,7 @@
|
|||
this.tb_Longitude.Name = "tb_Longitude";
|
||||
this.tb_Longitude.Size = new System.Drawing.Size(107, 21);
|
||||
this.tb_Longitude.TabIndex = 33;
|
||||
this.tb_Longitude.Text = "10.68327000";
|
||||
this.tb_Longitude.Text = "10.68327";
|
||||
this.tb_Longitude.Value = 10.68327D;
|
||||
this.tb_Longitude.TextChanged += new System.EventHandler(this.tb_Longitude_TextChanged);
|
||||
//
|
||||
|
@ -213,14 +206,14 @@
|
|||
this.tb_Latitude.Name = "tb_Latitude";
|
||||
this.tb_Latitude.Size = new System.Drawing.Size(107, 21);
|
||||
this.tb_Latitude.TabIndex = 32;
|
||||
this.tb_Latitude.Text = "50.93706700";
|
||||
this.tb_Latitude.Text = "50.937067";
|
||||
this.tb_Latitude.Value = 50.937067D;
|
||||
this.tb_Latitude.TextChanged += new System.EventHandler(this.tb_Latitude_TextChanged);
|
||||
//
|
||||
// btn_Cancel
|
||||
//
|
||||
this.btn_Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.btn_Cancel.Location = new System.Drawing.Point(806, 685);
|
||||
this.btn_Cancel.Location = new System.Drawing.Point(804, 665);
|
||||
this.btn_Cancel.Name = "btn_Cancel";
|
||||
this.btn_Cancel.Size = new System.Drawing.Size(75, 23);
|
||||
this.btn_Cancel.TabIndex = 44;
|
||||
|
@ -231,7 +224,7 @@
|
|||
// btn_OK
|
||||
//
|
||||
this.btn_OK.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.btn_OK.Location = new System.Drawing.Point(907, 685);
|
||||
this.btn_OK.Location = new System.Drawing.Point(907, 665);
|
||||
this.btn_OK.Name = "btn_OK";
|
||||
this.btn_OK.Size = new System.Drawing.Size(75, 23);
|
||||
this.btn_OK.TabIndex = 45;
|
||||
|
@ -271,6 +264,63 @@
|
|||
this.label2.TabIndex = 49;
|
||||
this.label2.Text = "m asl";
|
||||
//
|
||||
// ss_Main
|
||||
//
|
||||
this.ss_Main.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.tsl_Status});
|
||||
this.ss_Main.Location = new System.Drawing.Point(0, 707);
|
||||
this.ss_Main.Name = "ss_Main";
|
||||
this.ss_Main.Size = new System.Drawing.Size(1008, 22);
|
||||
this.ss_Main.TabIndex = 50;
|
||||
this.ss_Main.Text = "statusStrip1";
|
||||
//
|
||||
// tsl_Status
|
||||
//
|
||||
this.tsl_Status.Name = "tsl_Status";
|
||||
this.tsl_Status.Size = new System.Drawing.Size(39, 17);
|
||||
this.tsl_Status.Text = "Status";
|
||||
//
|
||||
// bw_Elevationgrid
|
||||
//
|
||||
this.bw_Elevationgrid.WorkerReportsProgress = true;
|
||||
this.bw_Elevationgrid.WorkerSupportsCancellation = true;
|
||||
this.bw_Elevationgrid.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bw_Elevationgrid_DoWork);
|
||||
this.bw_Elevationgrid.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bw_Elevationgrid_ProgressChanged);
|
||||
this.bw_Elevationgrid.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.bw_Elevationgrid_RunWorkerCompleted);
|
||||
//
|
||||
// tb_Locator
|
||||
//
|
||||
this.tb_Locator.DataBindings.Add(new System.Windows.Forms.Binding("SmallLettersForSubsquares", global::AirScout.Properties.Settings.Default, "Locator_SmallLettersForSubsquares", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.tb_Locator.ErrorBackColor = System.Drawing.Color.Red;
|
||||
this.tb_Locator.ErrorForeColor = System.Drawing.Color.White;
|
||||
this.tb_Locator.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.tb_Locator.Location = new System.Drawing.Point(875, 140);
|
||||
this.tb_Locator.Name = "tb_Locator";
|
||||
this.tb_Locator.Size = new System.Drawing.Size(107, 21);
|
||||
this.tb_Locator.SmallLettersForSubsquares = global::AirScout.Properties.Settings.Default.Locator_SmallLettersForSubsquares;
|
||||
this.tb_Locator.TabIndex = 35;
|
||||
this.tb_Locator.TextChanged += new System.EventHandler(this.tb_Locator_TextChanged);
|
||||
//
|
||||
// cb_Options_StationsMap_OverlayElevation
|
||||
//
|
||||
this.cb_Options_StationsMap_OverlayElevation.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
this.cb_Options_StationsMap_OverlayElevation.Checked = global::AirScout.Properties.Settings.Default.StationsMap_OverlayElevation;
|
||||
this.cb_Options_StationsMap_OverlayElevation.Location = new System.Drawing.Point(804, 267);
|
||||
this.cb_Options_StationsMap_OverlayElevation.Name = "cb_Options_StationsMap_OverlayElevation";
|
||||
this.cb_Options_StationsMap_OverlayElevation.Size = new System.Drawing.Size(178, 46);
|
||||
this.cb_Options_StationsMap_OverlayElevation.TabIndex = 51;
|
||||
this.cb_Options_StationsMap_OverlayElevation.Text = "Overlay Elevation Grid \r\n(on zom levels >= 17)";
|
||||
this.cb_Options_StationsMap_OverlayElevation.UseVisualStyleBackColor = true;
|
||||
this.cb_Options_StationsMap_OverlayElevation.CheckedChanged += new System.EventHandler(this.cb_Options_StationsMap_OverlayElevation_CheckedChanged);
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Location = new System.Drawing.Point(813, 434);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(0, 13);
|
||||
this.label3.TabIndex = 52;
|
||||
//
|
||||
// MapStationDlg
|
||||
//
|
||||
this.AcceptButton = this.btn_OK;
|
||||
|
@ -278,6 +328,9 @@
|
|||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.CancelButton = this.btn_Cancel;
|
||||
this.ClientSize = new System.Drawing.Size(1008, 729);
|
||||
this.Controls.Add(this.label3);
|
||||
this.Controls.Add(this.cb_Options_StationsMap_OverlayElevation);
|
||||
this.Controls.Add(this.ss_Main);
|
||||
this.Controls.Add(this.label2);
|
||||
this.Controls.Add(this.tb_Elevation);
|
||||
this.Controls.Add(this.label1);
|
||||
|
@ -302,6 +355,9 @@
|
|||
this.MinimizeBox = false;
|
||||
this.Name = "MapStationDlg";
|
||||
this.Text = "MapStationDlg";
|
||||
this.Load += new System.EventHandler(this.MapStationDlg_Load);
|
||||
this.ss_Main.ResumeLayout(false);
|
||||
this.ss_Main.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
|
@ -328,5 +384,10 @@
|
|||
private System.Windows.Forms.Label label1;
|
||||
private ScoutBase.Core.DoubleTextBox tb_Elevation;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.StatusStrip ss_Main;
|
||||
private System.Windows.Forms.ToolStripStatusLabel tsl_Status;
|
||||
private System.ComponentModel.BackgroundWorker bw_Elevationgrid;
|
||||
private System.Windows.Forms.CheckBox cb_Options_StationsMap_OverlayElevation;
|
||||
private System.Windows.Forms.Label label3;
|
||||
}
|
||||
}
|
|
@ -21,6 +21,7 @@ namespace AirScout
|
|||
|
||||
GMapOverlay Callsignpolygons = new GMapOverlay("Callsignpolygons");
|
||||
GMapOverlay Callsignspositions = new GMapOverlay("Callsignpositions");
|
||||
GMapOverlay Elevationgrid = new GMapOverlay("Elevationgrid");
|
||||
|
||||
GMarkerGoogle UserPos = new GMarkerGoogle(new PointLatLng(0.0, 0.0), GMarkerGoogleType.red_dot);
|
||||
|
||||
|
@ -48,6 +49,7 @@ namespace AirScout
|
|||
gm_Callsign.MapScaleInfoEnabled = true;
|
||||
gm_Callsign.Overlays.Add(Callsignpolygons);
|
||||
gm_Callsign.Overlays.Add(Callsignspositions);
|
||||
gm_Callsign.Overlays.Add(Elevationgrid);
|
||||
Callsignspositions.Markers.Add(UserPos);
|
||||
// initially set textboxes
|
||||
tb_Callsign.SilentText = StationLocation.Call;
|
||||
|
@ -56,11 +58,15 @@ namespace AirScout
|
|||
tb_Locator.SilentText = MaidenheadLocator.LocFromLatLon(StationLocation.Lat, StationLocation.Lon, Properties.Settings.Default.Locator_SmallLettersForSubsquares, (int)Properties.Settings.Default.Locator_MaxLength / 2, Properties.Settings.Default.Locator_AutoLength);
|
||||
tb_Elevation.SilentValue = GetElevation(StationLocation.Lat, StationLocation.Lon);
|
||||
ValidateDetails();
|
||||
// show initial zoom level in text box
|
||||
gm_Callsign_OnMapZoomChanged();
|
||||
|
||||
}
|
||||
|
||||
private void MapStationDlg_Load(object sender, EventArgs e)
|
||||
{
|
||||
// initialen Zoomlevel anzeigen
|
||||
gm_Callsign_OnMapZoomChanged();
|
||||
}
|
||||
|
||||
private void btn_Cancel_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
|
@ -264,6 +270,166 @@ namespace AirScout
|
|||
{
|
||||
// maintain zoom level
|
||||
tb_Zoom.Text = gm_Callsign.Zoom.ToString();
|
||||
ShowElevationGrid();
|
||||
}
|
||||
|
||||
private void ShowElevationGrid()
|
||||
{
|
||||
while (bw_Elevationgrid.IsBusy)
|
||||
{
|
||||
bw_Elevationgrid.CancelAsync();
|
||||
Application.DoEvents();
|
||||
}
|
||||
Elevationgrid.Polygons.Clear();
|
||||
if (cb_Options_StationsMap_OverlayElevation.Checked && (gm_Callsign.Zoom >= 17))
|
||||
{
|
||||
bw_Elevationgrid.RunWorkerAsync();
|
||||
}
|
||||
}
|
||||
|
||||
private void bw_Elevationgrid_DoWork(object sender, DoWorkEventArgs e)
|
||||
{
|
||||
// fill elevation grid
|
||||
bw_Elevationgrid.ReportProgress(0, "Calculating elevation grid...");
|
||||
Elevationgrid.Polygons.Clear();
|
||||
// convert view bounds to the beginning/end of Maidenhead locators
|
||||
string loc = MaidenheadLocator.LocFromLatLon(gm_Callsign.ViewArea.Lat - gm_Callsign.ViewArea.HeightLat, gm_Callsign.ViewArea.Lng,false,3);
|
||||
double minlat = MaidenheadLocator.LatFromLoc(loc, PositionInRectangle.BottomLeft);
|
||||
double minlon = MaidenheadLocator.LonFromLoc(loc, PositionInRectangle.BottomLeft);
|
||||
loc = MaidenheadLocator.LocFromLatLon(gm_Callsign.ViewArea.Lat, gm_Callsign.ViewArea.Lng + gm_Callsign.ViewArea.WidthLng, false, 3);
|
||||
double maxlat = MaidenheadLocator.LatFromLoc(loc, PositionInRectangle.TopRight);
|
||||
double maxlon = MaidenheadLocator.LonFromLoc(loc, PositionInRectangle.TopRight);
|
||||
double lat = minlat;
|
||||
double lon = minlon;
|
||||
double stepwidthlat = 5.5555555555555555555555555555556e-4 / 2;
|
||||
double stepwidthlon = 5.5555555555555555555555555555556e-4;
|
||||
List<ElevationTile> elvs = new List<ElevationTile>();
|
||||
double elvmin = short.MaxValue;
|
||||
double elvmax = short.MinValue;
|
||||
while (!bw_Elevationgrid.CancellationPending && (lat < maxlat))
|
||||
{
|
||||
lon = minlon;
|
||||
while (!bw_Elevationgrid.CancellationPending && (lon < maxlon))
|
||||
{
|
||||
double elv = 0;
|
||||
if ((lat + stepwidthlat >= gm_Callsign.ViewArea.Lat - gm_Callsign.ViewArea.HeightLat) &&
|
||||
(lat <= gm_Callsign.ViewArea.Lat) &&
|
||||
(lon + stepwidthlon >= gm_Callsign.ViewArea.Lng) &&
|
||||
(lon <= gm_Callsign.ViewArea.Lng + gm_Callsign.ViewArea.WidthLng))
|
||||
{
|
||||
elv = ElevationData.Database[lat, lon, Properties.Settings.Default.ElevationModel];
|
||||
ElevationTile t = new ElevationTile();
|
||||
t.Lat = lat;
|
||||
t.Lon = lon;
|
||||
t.Elv = elv;
|
||||
elvs.Add(t);
|
||||
if (elv < elvmin)
|
||||
elvmin = elv;
|
||||
if (elv > elvmax)
|
||||
elvmax = elv;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
lon += stepwidthlon;
|
||||
}
|
||||
lat += stepwidthlat;
|
||||
}
|
||||
foreach (ElevationTile t in elvs)
|
||||
{
|
||||
List<PointLatLng> l = new List<PointLatLng>();
|
||||
l.Add(new PointLatLng((decimal)t.Lat, (decimal)t.Lon));
|
||||
l.Add(new PointLatLng((decimal)(t.Lat + stepwidthlat), (decimal)t.Lon));
|
||||
l.Add(new PointLatLng((decimal)(t.Lat + stepwidthlat), (decimal)(t.Lon + stepwidthlon)));
|
||||
l.Add(new PointLatLng((decimal)t.Lat, (decimal)(t.Lon + stepwidthlon)));
|
||||
GMapTextPolygon p = new GMapTextPolygon(l, t.Elv + " m");
|
||||
Color c = Color.FromArgb(100, ElevationData.Database.GetElevationColor((t.Elv - elvmin) / (elvmax - elvmin) * 10000.0));
|
||||
p.Stroke = new Pen(c);
|
||||
p.Fill = new SolidBrush(c);
|
||||
Font f = new Font("Courier New", 8, GraphicsUnit.Pixel);
|
||||
bw_Elevationgrid.ReportProgress(1, p);
|
||||
if (bw_Elevationgrid.CancellationPending)
|
||||
break;
|
||||
}
|
||||
bw_Elevationgrid.ReportProgress(100, "Calculating elevation grid finished.");
|
||||
}
|
||||
|
||||
private void bw_Elevationgrid_ProgressChanged(object sender, ProgressChangedEventArgs e)
|
||||
{
|
||||
if (e.ProgressPercentage < 0)
|
||||
{
|
||||
tsl_Status.Text = (string)e.UserState;
|
||||
ss_Main.Refresh();
|
||||
}
|
||||
if (e.ProgressPercentage == 0)
|
||||
{
|
||||
Elevationgrid.Polygons.Clear();
|
||||
tsl_Status.Text = (string)e.UserState;
|
||||
ss_Main.Refresh();
|
||||
}
|
||||
else if (e.ProgressPercentage == 1)
|
||||
{
|
||||
GMapPolygon p = (GMapPolygon)e.UserState;
|
||||
Elevationgrid.Polygons.Add(p);
|
||||
tsl_Status.Text = "Adding elevation tile " + p.Name;
|
||||
ss_Main.Refresh();
|
||||
}
|
||||
else if (e.ProgressPercentage == 100)
|
||||
{
|
||||
tsl_Status.Text = (string)e.UserState;
|
||||
ss_Main.Refresh();
|
||||
}
|
||||
}
|
||||
|
||||
private void bw_Elevationgrid_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void cb_Options_StationsMap_OverlayElevation_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
ShowElevationGrid();
|
||||
}
|
||||
}
|
||||
|
||||
public class GMapTextPolygon : GMapPolygon
|
||||
{
|
||||
public GMapTextPolygon(List<PointLatLng> points, string name) : base(points, name)
|
||||
{
|
||||
}
|
||||
|
||||
public override void OnRender(Graphics g)
|
||||
{
|
||||
base.OnRender(g);
|
||||
StringFormat format = new StringFormat();
|
||||
format.LineAlignment = StringAlignment.Center;
|
||||
format.Alignment = StringAlignment.Center;
|
||||
long minx = long.MaxValue;
|
||||
long maxx = long.MinValue;
|
||||
long miny = long.MaxValue;
|
||||
long maxy = long.MinValue;
|
||||
for (int i = 0; i < this.LocalPoints.Count; i++)
|
||||
{
|
||||
if (this.LocalPoints[i].X < minx)
|
||||
minx = this.LocalPoints[i].X;
|
||||
if (this.LocalPoints[i].X > maxx)
|
||||
maxx = this.LocalPoints[i].X;
|
||||
if (this.LocalPoints[i].Y < miny)
|
||||
miny = this.LocalPoints[i].Y;
|
||||
if (this.LocalPoints[i].Y > maxy)
|
||||
maxy = this.LocalPoints[i].Y;
|
||||
}
|
||||
RectangleF f = new RectangleF(minx, miny, maxx - minx, maxy - miny);
|
||||
g.DrawString(this.Name, SystemFonts.DefaultFont, Brushes.Black, f, format);
|
||||
}
|
||||
}
|
||||
|
||||
public class ElevationTile
|
||||
{
|
||||
public double Lat = 0;
|
||||
public double Lon = 0;
|
||||
public double Elv = 0;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -122,4 +122,10 @@
|
|||
Use the lat/lon textboxes for numeric input or enter a valid Maidenhead Locator.
|
||||
Drag the needle on the map for exact location. Use mouse wheel or +/- buttons to zoom in and out.</value>
|
||||
</data>
|
||||
<metadata name="ss_Main.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<metadata name="bw_Elevationgrid.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>111, 17</value>
|
||||
</metadata>
|
||||
</root>
|
|
@ -451,6 +451,7 @@
|
|||
this.bw_SRTM1_MapUpdater = new System.ComponentModel.BackgroundWorker();
|
||||
this.bw_GLOBE_MapUpdater = new System.ComponentModel.BackgroundWorker();
|
||||
this.bw_StationDataUpdater = new System.ComponentModel.BackgroundWorker();
|
||||
this.btn_DeleteSingleStation = new System.Windows.Forms.Button();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pb_Donate)).BeginInit();
|
||||
this.tab_Options_Planes.SuspendLayout();
|
||||
this.groupBox48.SuspendLayout();
|
||||
|
@ -3644,6 +3645,7 @@
|
|||
//
|
||||
// groupBox47
|
||||
//
|
||||
this.groupBox47.Controls.Add(this.btn_DeleteSingleStation);
|
||||
this.groupBox47.Controls.Add(this.btn_DeleteAllMapTiles);
|
||||
this.groupBox47.Controls.Add(this.btn_Options_DeleteAllPropagationPaths);
|
||||
this.groupBox47.Controls.Add(this.btn_Options_DeleteAllElevationPaths);
|
||||
|
@ -5757,6 +5759,18 @@
|
|||
this.bw_StationDataUpdater.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bw_StationDataUpdater_ProgressChanged);
|
||||
this.bw_StationDataUpdater.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.bw_StationDataUpdater_RunWorkerCompleted);
|
||||
//
|
||||
// btn_DeleteSingleStation
|
||||
//
|
||||
this.btn_DeleteSingleStation.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.btn_DeleteSingleStation.Location = new System.Drawing.Point(165, 48);
|
||||
this.btn_DeleteSingleStation.Name = "btn_DeleteSingleStation";
|
||||
this.btn_DeleteSingleStation.Size = new System.Drawing.Size(122, 23);
|
||||
this.btn_DeleteSingleStation.TabIndex = 3;
|
||||
this.btn_DeleteSingleStation.Text = "Delete Single Station";
|
||||
this.tt_Options.SetToolTip(this.btn_DeleteSingleStation, "Deletes all cached map tiles from database");
|
||||
this.btn_DeleteSingleStation.UseVisualStyleBackColor = true;
|
||||
this.btn_DeleteSingleStation.Click += new System.EventHandler(this.btn_DeleteSingleStation_Click);
|
||||
//
|
||||
// OptionsDlg
|
||||
//
|
||||
this.AcceptButton = this.btn_Options_OK;
|
||||
|
@ -6329,5 +6343,6 @@
|
|||
private System.Windows.Forms.Label label105;
|
||||
private System.Windows.Forms.Label label145;
|
||||
private System.Windows.Forms.Button btn_Options_Path_Export;
|
||||
private System.Windows.Forms.Button btn_DeleteSingleStation;
|
||||
}
|
||||
}
|
|
@ -359,6 +359,12 @@ namespace AirScout
|
|||
MapData.Database.TileDeleteAll();
|
||||
}
|
||||
|
||||
private void btn_DeleteSingleStation_Click(object sender, EventArgs e)
|
||||
{
|
||||
DeleteSingleStationDlg Dlg = new DeleteSingleStationDlg();
|
||||
Dlg.ShowDialog();
|
||||
}
|
||||
|
||||
private void btn_Options_ScoutBase_Database_Maintenance_Click(object sender, EventArgs e)
|
||||
{
|
||||
DatabaseMaintenanceDlg Dlg = new DatabaseMaintenanceDlg(StationData.Database);
|
||||
|
|
|
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
|
||||
// übernehmen, indem Sie "*" eingeben:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.3.3.4")]
|
||||
[assembly: AssemblyFileVersion("1.3.3.4")]
|
||||
[assembly: AssemblyVersion("1.3.3.6")]
|
||||
[assembly: AssemblyFileVersion("1.3.3.6")]
|
||||
|
|
|
@ -2304,5 +2304,17 @@ Digital data base on the World Wide Web (URL: http://www.ngdc.noaa.gov/mgg/topo/
|
|||
this["Map_Preloader_MaxZoom"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
public bool StationsMap_OverlayElevation {
|
||||
get {
|
||||
return ((bool)(this["StationsMap_OverlayElevation"]));
|
||||
}
|
||||
set {
|
||||
this["StationsMap_OverlayElevation"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -604,5 +604,8 @@ MEaSUREs data and products are available at no charge from the LP DAAC.See https
|
|||
<Setting Name="Map_Preloader_MaxZoom" Type="System.Decimal" Scope="User">
|
||||
<Value Profile="(Default)">11</Value>
|
||||
</Setting>
|
||||
<Setting Name="StationsMap_OverlayElevation" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
|
@ -0,0 +1,12 @@
|
|||
***************** AirScout Requirements **************************
|
||||
|
||||
- GreatCircle, distance and locator layer on map (DJ5AR)
|
||||
- Snooze button for alarm on main window, clickable in PLAY mode ()
|
||||
- Calculate Doppler
|
||||
|
||||
* watch list
|
||||
- Add/remove call sign from Multi View tab over UDP command
|
||||
- add stations to watchlist based on DXCC, Loc, QTF range from QTF1 to QTF2
|
||||
|
||||
|
||||
|
|
@ -1,4 +1,18 @@
|
|||
2020-04-25: V1.3.3.4
|
||||
2021-12-23: V1.3.3.6
|
||||
====================
|
||||
|
||||
- Feature: Elevation grid overlay on "Optionms/Stations/Map" to better understand elevation resolution issues and local situation (for zoom levels >= 17)
|
||||
- Bugfix: AirScout crashes when opening Crossing History Dialog window --> fixed (tnx PU34HAG)
|
||||
- Bugfix: Near field suppression did not work correctly, showing strange local obstructions under some circumstances --> fixed
|
||||
- Bugfix: No more planes visible (Exception messages shown in status bar and log file) with some language settings (at least Turkish) --> fixed (tnx TA2NC)
|
||||
|
||||
2020-04-25: V1.3.3.5
|
||||
====================
|
||||
|
||||
- Bugfix: Chunked transport of web content failed while fetching plane feeds (OpenSky, Virtual Radar Server) --> fixed
|
||||
- Bugfix: Drawing map throws an exception under some circumstances --> fixed, added some error handling (tnx SM7LCB)
|
||||
|
||||
2020-04-25: V1.3.3.4
|
||||
====================
|
||||
|
||||
- Bugfix: AirScout always reverts to default call signs (DL2ALF <> GB3MHZ) when area of interest is set outside Europe --> fixed (tnx VK3VG)
|
||||
|
|
|
@ -603,6 +603,9 @@ MEaSUREs data and products are available at no charge from the LP DAAC.See https
|
|||
<setting name="Map_Preloader_MaxZoom" serializeAs="String">
|
||||
<value>11</value>
|
||||
</setting>
|
||||
<setting name="StationsMap_OverlayElevation" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
</AirScout.Properties.Settings>
|
||||
</userSettings>
|
||||
<startup>
|
||||
|
|
|
@ -656,6 +656,8 @@ namespace GMap.NET.WindowsForms
|
|||
// render tile
|
||||
{
|
||||
foreach(WindowsFormsImage img in t.Overlays)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (img != null && img.Img != null)
|
||||
{
|
||||
|
@ -682,6 +684,11 @@ namespace GMap.NET.WindowsForms
|
|||
#endif
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("GMapControl: Error while drwing Image: " + ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#if !PocketPC
|
||||
|
|
|
@ -102,13 +102,13 @@ namespace System.Data.SQLite
|
|||
if (index < 0)
|
||||
index = i;
|
||||
// Console.WriteLine("[" + T.Name + ".FillFromRow] DataColumn not found: " + p.Name);
|
||||
if (p.PropertyType.Name.ToUpper() == "STRING")
|
||||
p.SetValue(this, (row[index].GetType().Name != "DBNull") ? row[index] : null, null);
|
||||
else if ((p.PropertyType.Name.ToUpper() == "FLOAT") || (p.PropertyType.Name.ToUpper() == "DOUBLE"))
|
||||
p.SetValue(this, (row[index].GetType().Name != "DBNull") ? row[index] : null, null);
|
||||
else if (p.PropertyType.Name.ToUpper() == "INT32")
|
||||
p.SetValue(this, (row[index].GetType().Name != "DBNull") ? row[index] : null, null);
|
||||
else if (p.PropertyType.Name.ToUpper() == "DATETIME")
|
||||
if (p.PropertyType == typeof(string))
|
||||
p.SetValue(this, (row[index].GetType() != typeof(DBNull)) ? row[index] : null, null);
|
||||
else if ((p.PropertyType == typeof(float)) || (p.PropertyType == typeof(double)))
|
||||
p.SetValue(this, (row[index].GetType() !=typeof(DBNull)) ? row[index] : null, null);
|
||||
else if (p.PropertyType == typeof(int))
|
||||
p.SetValue(this, (row[index].GetType() != typeof(DBNull)) ? row[index] : null, null);
|
||||
else if (p.PropertyType == typeof(DateTime))
|
||||
{
|
||||
|
||||
if ((row[index].GetType() == typeof(int)) || (row[index].GetType() == typeof(long)))
|
||||
|
@ -118,7 +118,7 @@ namespace System.Data.SQLite
|
|||
else
|
||||
p.SetValue(this, row[index], null);
|
||||
}
|
||||
else if (p.PropertyType.BaseType.Name.ToUpper() == "ENUM")
|
||||
else if (p.PropertyType.BaseType == typeof(Enum))
|
||||
p.SetValue(this, System.Convert.ToInt32(row[index]), null);
|
||||
else
|
||||
p.SetValue(this, ByteArrayToObject((byte[])row[index]), null);
|
||||
|
@ -154,13 +154,13 @@ namespace System.Data.SQLite
|
|||
if (index < 0)
|
||||
index = i;
|
||||
// Console.WriteLine("[" + T.Name + ".FillFromRow] DataColumn not found: " + p.Name);
|
||||
if (p.PropertyType.Name.ToUpper() == "STRING")
|
||||
p.SetValue(this, (record[index].GetType().Name != "DBNull") ? record[index] : null, null);
|
||||
else if ((p.PropertyType.Name.ToUpper() == "FLOAT") || (p.PropertyType.Name.ToUpper() == "DOUBLE"))
|
||||
p.SetValue(this, (record[index].GetType().Name != "DBNull") ? record[index] : null, null);
|
||||
else if (p.PropertyType.Name.ToUpper() == "INT32")
|
||||
p.SetValue(this, (record[index].GetType().Name != "DBNull") ? record[index] : null, null);
|
||||
else if (p.PropertyType.Name.ToUpper() == "DATETIME")
|
||||
if (p.PropertyType == typeof(string))
|
||||
p.SetValue(this, (record[index].GetType() != typeof (DBNull)) ? record[index] : null, null);
|
||||
else if ((p.PropertyType == typeof(float)) || (p.PropertyType == typeof(double)))
|
||||
p.SetValue(this, (record[index].GetType() != typeof(DBNull)) ? record[index] : null, null);
|
||||
else if (p.PropertyType == typeof(int))
|
||||
p.SetValue(this, (record[index].GetType() != typeof(DBNull)) ? record[index] : null, null);
|
||||
else if (p.PropertyType == typeof(DateTime))
|
||||
{
|
||||
|
||||
if ((record[index].GetType() == typeof(int)) || (record[index].GetType() == typeof(long)))
|
||||
|
@ -170,7 +170,7 @@ namespace System.Data.SQLite
|
|||
else
|
||||
p.SetValue(this, record[index], null);
|
||||
}
|
||||
else if (p.PropertyType.BaseType.Name.ToUpper() == "ENUM")
|
||||
else if (p.PropertyType.BaseType == typeof(Enum))
|
||||
p.SetValue(this, System.Convert.ToInt32(record[index]), null);
|
||||
else
|
||||
p.SetValue(this, ByteArrayToObject((byte[])record[index]), null);
|
||||
|
|
|
@ -428,6 +428,18 @@ namespace ScoutBase.Elevation
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public Color GetElevationColor(double elv)
|
||||
{
|
||||
DEMColorPalette palette = new DEMColorPalette();
|
||||
double e = (double)(elv) / 100.0;
|
||||
if (e < 0)
|
||||
e = 0;
|
||||
if (e > 100)
|
||||
e = 100;
|
||||
return palette.GetColor(e);
|
||||
}
|
||||
|
||||
public Bitmap DrawElevationBitmap(double minlat, double minlon, double maxlat, double maxlon, int width, int height, ELEVATIONMODEL model)
|
||||
{
|
||||
int minelv = 0;
|
||||
|
@ -1714,7 +1726,7 @@ namespace ScoutBase.Elevation
|
|||
for (int j = 0; j < bm.Height; j++)
|
||||
bm.SetPixel(i, j, c);
|
||||
}
|
||||
bm.Save("DEMPalette.bmp");
|
||||
// bm.Save("DEMPalette.bmp");
|
||||
}
|
||||
|
||||
public Color GetColor(double percentage)
|
||||
|
|
|
@ -162,8 +162,8 @@ namespace ScoutBase.Elevation
|
|||
/// <returns>The elevation. ElvMissingFlag if not found.</returns>
|
||||
public short GetElevation (double lat, double lon)
|
||||
{
|
||||
int i = (int)((lat - BaseLat) / StepWidthLat);
|
||||
int j = (int)((lon - BaseLon) / StepWidthLon);
|
||||
int i = (int)(((lat - BaseLat) / StepWidthLat));
|
||||
int j = (int)(((lon - BaseLon) / StepWidthLon));
|
||||
try
|
||||
{
|
||||
return Elv[j,i];
|
||||
|
|
|
@ -470,17 +470,17 @@ namespace ScoutBase.Propagation
|
|||
double eps1;
|
||||
double eps2;
|
||||
if (dist1 > nf)
|
||||
{
|
||||
eps1 = ScoutBase.Core.Propagation.EpsilonFromHeights(h1, dist1, ep.Path[i] + f1c1, radius);
|
||||
else
|
||||
eps1 = ScoutBase.Core.Propagation.EpsilonFromHeights(h1, nf, ep.Path[i] + f1c1, radius);
|
||||
if (eps1 > eps1_min)
|
||||
eps1_min = eps1;
|
||||
}
|
||||
if (dist2 > nf)
|
||||
{
|
||||
eps2 = ScoutBase.Core.Propagation.EpsilonFromHeights(h2, dist2, ep.Path[i] + f1c2, radius);
|
||||
else
|
||||
eps2 = ScoutBase.Core.Propagation.EpsilonFromHeights(h2, nf, ep.Path[i] + f1c2, radius);
|
||||
if (eps2 > eps2_min)
|
||||
eps2_min = eps2;
|
||||
}
|
||||
if (caller != null)
|
||||
{
|
||||
// abort calculation if cancellation pending
|
||||
|
|
|
@ -211,8 +211,10 @@ namespace ScoutBase.Stations
|
|||
|
||||
public List<LocationDesignator> LocationFindAll(string call)
|
||||
{
|
||||
LocationDesignator ld = new LocationDesignator(call);
|
||||
List<LocationDesignator> l = new List<LocationDesignator>();
|
||||
if (String.IsNullOrEmpty(call))
|
||||
return l;
|
||||
LocationDesignator ld = new LocationDesignator(call);
|
||||
lock (db.DBCommand)
|
||||
{
|
||||
// Loc is empty --> search for last recent location for this call
|
||||
|
@ -235,6 +237,8 @@ namespace ScoutBase.Stations
|
|||
public LocationDesignator LocationFindLastRecent(string call)
|
||||
{
|
||||
LocationDesignator ld = new LocationDesignator(call);
|
||||
if (String.IsNullOrEmpty(call))
|
||||
return null;
|
||||
lock (db.DBCommand)
|
||||
{
|
||||
// Loc is empty --> search for last recent location for this call
|
||||
|
@ -251,6 +255,8 @@ namespace ScoutBase.Stations
|
|||
public LocationDesignator LocationFindMostHit(string call)
|
||||
{
|
||||
LocationDesignator ld = new LocationDesignator(call);
|
||||
if (String.IsNullOrEmpty(call))
|
||||
return null;
|
||||
lock (db.DBCommand)
|
||||
{
|
||||
// Loc is empty --> search for last recent location for this call
|
||||
|
@ -266,11 +272,15 @@ namespace ScoutBase.Stations
|
|||
|
||||
public LocationDesignator LocationFind(string call)
|
||||
{
|
||||
if (String.IsNullOrEmpty(call))
|
||||
return null;
|
||||
return LocationFindLastRecent(call);
|
||||
}
|
||||
|
||||
public LocationDesignator LocationFind(string call, string loc)
|
||||
{
|
||||
if (String.IsNullOrEmpty(call) || String.IsNullOrEmpty(loc))
|
||||
return null;
|
||||
LocationDesignator ld = new LocationDesignator(call, loc);
|
||||
return LocationFind(ld);
|
||||
}
|
||||
|
@ -300,6 +310,8 @@ namespace ScoutBase.Stations
|
|||
|
||||
public LocationDesignator LocationFindOrUpdateOrCreate(string call, double lat, double lon)
|
||||
{
|
||||
if (String.IsNullOrEmpty(call))
|
||||
return null;
|
||||
LocationDesignator ld = new LocationDesignator(call, MaidenheadLocator.LocFromLatLon(lat, lon, false, 3));
|
||||
// try to find entry with call & loc matching
|
||||
ld = LocationFind(ld);
|
||||
|
@ -326,6 +338,8 @@ namespace ScoutBase.Stations
|
|||
|
||||
public LocationDesignator LocationFindOrCreate(string call, string loc)
|
||||
{
|
||||
if (String.IsNullOrEmpty(call) || String.IsNullOrEmpty(loc))
|
||||
return null;
|
||||
LocationDesignator ld = this.LocationFind(call, loc);
|
||||
if (ld == null)
|
||||
{
|
||||
|
@ -539,6 +553,18 @@ namespace ScoutBase.Stations
|
|||
|
||||
}
|
||||
|
||||
public List<LocationDesignator> LocationGetAll(string call)
|
||||
{
|
||||
List<LocationDesignator> l = new List<LocationDesignator>();
|
||||
DataTable Result = db.Select("SELECT * FROM " + LocationDesignator.TableName + " WHERE CALL LIKE '" + call + "' ORDER BY Call ASC");
|
||||
if ((Result == null) || (Result.Rows.Count == 0))
|
||||
return l;
|
||||
foreach (DataRow row in Result.Rows)
|
||||
l.Add(new LocationDesignator(row));
|
||||
return l;
|
||||
|
||||
}
|
||||
|
||||
public List<LocationDesignator> LocationGetAll(BackgroundWorker caller)
|
||||
{
|
||||
// gets all locations from database
|
||||
|
|
Ładowanie…
Reference in New Issue