Da qualche giorno sono entrato a far parte di Mediterranea Airlines, una compagnia di volo virtuale.
Scopo? Divertirsi e imparare a volare
Con cosa? Con MS Flight Simulator
Come? Il proprio responsabile assegna di volta in volta dei piani di volo (partenza da, arrivo a, seguendo questi waypoints) che vanno effettuati quando si vuole e quando si ha tempo (comunque nell'arco di un mese). Alla fine, bisogna compilare un report (rotta reale seguita, consumi di carburante, tempi, vento, situazione climatica, etc.) che bisogna rispedire al responsabile, che lo approva, lo pubblica on-line e incrementa le ore di volo.
Il piano di volo assegnato, nonchè il report da compilare, è un file di testo normalissimo, ma piuttosto noioso e scomodo da guardare, quindi ho cominciato a scrivere un piccolo software in VB.NET. In pratica, si tratta di un viewer che deve estrapolare info da un file simile a questo. Il file è piuttosto complesso, riporta moltissime informazioni come: arrivo e destinazione, waypoint da seguire con le relative frequenze, heading, distanze, tempi e altitudini da rispettare, etc. etc.
Ho scritto una classe che mi è servita per estrapolare tutti i dati e presentarli su un windows form più user-friendly rispetto al blocco note di Windows. La funzione scheletro è questa:
Private Sub ReadBriefingFile(ByVal NomeFileBriefing As String)
'Apro il file
Dim sw As New StreamReader(NomeFileBriefing, System.Text.Encoding.ASCII)
Dim Lettura As String
ContentFile = New ArrayList
Do While sw.Peek >= 0
Lettura = sw.ReadLine
ContentFile.Add(Lettura)
Loop
sw.Close()
sw = Nothing
End Sub
Dato un nome di file, riempio ContentFile che è un ArrayList di stringhe. Avrei potuto usare un semplice Array, ma ho preferito ArrayList perchè trovo comodissima la cosa di poter fare .Add senza sapere a priori di quanti elementi avrò bisogno. Al termine della Sub, quindi, dentro ContentFile ho tutte le righe del file (ContentFile(0) è la 1° riga, ContentFile(1) è la 2° riga e così via). In questo modo, mantengo in memoria tutto, senza bisogno di riaprire il file in fasi successiva. Ok, adesso posso estrapolare i valori che mi servono. Ho scritto la funzione:
Private Function GetValueField(ByVal Riga As Integer, ByVal Colonna As Integer, ByVal Larghezza As Integer) As String
Dim Lettura As String
If Riga > 0 Then
Lettura = ContentFile(Riga - 1)
If Larghezza > 0 Then
Lettura = Lettura.Substring(Colonna - 1, Larghezza).TrimEnd
End If
Return (Lettura)
End If
End Function
In pratica, dico: quale riga mi serve, quale colonna e la larghezza della stringa. Eventualmente posso prelevare l'intera riga indicando 0 (zero) nel parametro Larghezza. Funziona bene, però ho già scritto la release 2.0 (beta) che mi consente di estrapolare un dato indicando la parola_prima e la parola_dopo. Mi spiego meglio: una riga del file è questa:
Runway heading 1°, altitude 479 ft
In pratica, esprimono l'heading esatto della pista, e l'altitudine della pista in piedi. Da questa riga dovrei estrapolare il valore 1 (heading) e 479 (altitude). Usando la function di prima, potrei scrivere qualcosa tipo:
Dim Heading As Double = Convert.ToDouble(GetValueField (10, 16, 1))
Dim Altitude As Double = Convert.ToDouble(GetValueField (10, 30, 3))
Niente di più semplice. ma cosa succede se l'heading è 11°, oppure 110°? Il codice sballa, giusto? Allora sto scrivendo una function simile alla precedente, però il cui prototipo potrebbe essere:
Private Function GetValueField(ByVal Riga As Integer, ByVal ParolaPrima As String, ByVal ParolaDopo As String) As String
e potrebbe essere richiamata così:
Dim Heading As Double = Convert.ToDouble(GetValueField (10, "heading", ","))
Insomma, oggi VB.NET & Framework applicato all'aeronautica!
:-)