Finalmente ho raggiunto una versione mediamente stabile del mio piccolo MedViewer.
Med sta per Mediterranea Airlines
Viewer sta per...beh, per viewer
Uno screenshot l'ho pubblicato su http://www.igordamiani.it/Immagini/med_viewer_1.jpg
L'obiettivo (raggiunto) è quello di aver creato un bel visualizzatore dei piani di volo di Mediterranea. Cos'è un piano di volo? E' un file TXT come questo che riporta aeroporto di decollo e di arrivo, i punti intermedi, più tutta una serie di dati/informazioni importanti per il volo (carburante richiesto, distanze, tempi e rotta da rispettare, note, etc.). Non mi piace leggere un TXT di questo tipo con il blocco note (troppo strutturato, troppo ricco di informazioni per essere lasciato come semplice testo), perciò mi sono costruito un software che estrapola le informazioni e le impagina sul Windows Form di prima. Inoltre, è piuttosto interattivo: permette di ricalcolare distanze e tempi di salita/discesa, tempi di percorrenza, etc. etc.
Il punto forte è la visualizzazione grafica del percorso, mostrando: partenza, arrivo, waypoint, distanze in scala. Mi sono divertito dando la possibilità di ruotare, di fare il pan della mappa, di zoomare, etc. Mi chiedo perchè non venga usato un bel XML al suo posto, sarebbe una chicca, e renderebbe il mio lavoro quasi inutile!
Qualche chicca tecnica? Sviluppato in VB.NET, senza alcun blocco Try-Catch
Mi è piaciuto come ho giocato con le proprietà Dock e Anchor della Windows Forms. Ho usato molto TimeSpan, Font, Brush, l'oggetto Graphics (GDI). La fase successiva è quella di interfacciarmi con i files di Flight Simulator (se possibile), così da poter ricavare tutta una serie di informazioni piuttosto utili e rendere ancora più fruibile il tutto.
Qui sotto riporto un po' di pezzi di codice VB.NET sul namespace System.Drawing. Non fate copy&paste, sicuramente così com'è non funziona di sicuro. Però magari può servire come spunto per qualcuno!
'Il codice non è funzionante così com'è
'Ho estrapolato le linee di codice più interessanti
'riguardanti GDI
Dim gr As Graphics
gr = Me.picMap.CreateGraphics
'Cancello
gr.Clear(Color.LightGoldenrodYellow)
'Zoom e rotazione sull'oggetto gr
If Me.barZoom.Value > 0 Then
gr.ScaleTransform(Me.barZoom.Value, Me.barZoom.Value)
End If
gr.RotateTransform(Me.barRotate.Value)
'Pan in base alla scrollbar orizzontale e verticale
If Translate Then
gr.TranslateTransform(Me.ClientSize.Width / 2 - Me.srcOriz.Value, Me.ClientSize.Height / 2 - Me.srcVert.Value)
End If
'esempio: in base a tutti i checkbox messi sul Windows Form,
'disegno gli elementi che vuole l'utente
'Fly è un oggetto FlyPoint (classe scritta da me)
Private myBrush As New SolidBrush(Color.Black)
Private myFontDist As New Font("Tahoma", 10, FontStyle.Italic, GraphicsUnit.Pixel)
If Me.chkDistance.Checked = True Then
'distanza
gr.DrawString(Fly.Distance.ToString & " NM", myFontDist, myBrush, (x + prec.X) / 2 - 20, (y + prec.Y) / 2 - 20)
'disegno un ellisse nel punto centrale
x2 = ((x + prec.X) / 2) - 1
y2 = ((y + prec.Y) / 2) - 1
gr.DrawEllipse(New Pen(Color.Beige), x2, y2, 2, 2)
End If
'linea tra un waypoint e l'altro
'con checkbox ON/OFF
If Me.chkDrawRoute.Checked = True Then
'gr.DrawLine(New Pen(COLOR_ROUTE), 0, 0, x, y)
gr.DrawLine(New Pen(COLOR_ROUTE, WIDTH_LINE), x, y, prec.X, prec.Y)
End If
'Sub che disegna una griglia sul Windows Form
Private Sub DrawGrid()
Dim blackPen As New Pen(COLOR_GRID, 1)
Dim var As Integer
For var = 10 To Me.Width Step 50
'Disegno le linee verticali
gr.DrawLine(blackPen, var, gr.RenderingOrigin.X, var, Me.Height)
Next
For var = 10 To Me.Height Step 50
'Disegno le linee orizzontali
gr.DrawLine(blackPen, gr.RenderingOrigin.Y, var, Me.Width, var)
Next
End Sub