P3D 用の緯度経度変換プログラム(圧縮ファイルには暗号がかけてありません)

Prepar 3D のローケル問題対策用にファイル中の経度緯度を31°50′22″とかから31.なんチャラに変換するプログラムです。
フォルダを指定してあげれば、それ以下のところから fxml ファイルを探し出します。
変換したいファイルにチェックをつけて変換してください。
プログラムフォルダは直接書き換えできません。
シナリオフォルダをどこぞにコピーして、書き換えたら戻してください。
元ファイルは、元の場所に順次 .org -> .org1 みたいな感じで100個まで保存されます。
100個以上あった場合は中止します。
(南と西は-をつけて吐きます)
動作環境、 .net 4.6

Version 1.0.4
テキストボックスに入力したフォルダをデフォルトで検索します
ユーザーフォルダボタンを押すと、テキストボックスにデフォルトシナリオ保存フォルダの位置を入力します
Setup_ChangeLatLng_1.0.4

ソースコード
フォームは勝手に作ってください
フォルダ名表示のテキストボックス = txtSearchFolder
検索ボタン = btnSearch
ファイル名表示用のチェックドリストボックス = clbFiles
変換ボタン = btnTrans
終了ボタン = btnExit

vb

Imports System.Text.RegularExpressions
Public Class fMain
    Private TargetFiles As List(Of String)
    Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
        Dim fbd As New FolderBrowserDialog
        fbd.Description = "フォルダを指定してください。"
        fbd.RootFolder = Environment.SpecialFolder.Desktop
        fbd.SelectedPath = My.Settings.SearchFolderName
        fbd.ShowNewFolderButton = False
        If fbd.ShowDialog(Me) = DialogResult.OK Then
            txtSearchFolder.Text = fbd.SelectedPath
            Dim files As String() = System.IO.Directory.GetFiles(fbd.SelectedPath, "*.fxml", System.IO.SearchOption.AllDirectories)
            If Not IsNothing(files) AndAlso files.Count > 0 Then
                My.Settings.SearchFolderName = fbd.SelectedPath
                clbFiles.Items.AddRange(files)
                TargetFiles = New List(Of String)
                For n As Integer = 0 To files.Count - 1
                    TargetFiles.Add(files(n))
                Next
            End If
        End If
    End Sub

    Private Sub btnTrans_Click(sender As Object, e As EventArgs) Handles btnTrans.Click
        If clbFiles.SelectedItems.Count = 0 Then Exit Sub
        For Each TargetFile As String In clbFiles.SelectedItems
            If System.IO.File.Exists(TargetFile) Then
                Dim sr As New System.IO.StreamReader(TargetFile, System.Text.Encoding.GetEncoding("UTF-8"))
                Dim stringTargetFile As String = sr.ReadToEnd()
                sr.Close()
                Dim SearchStringLat As String = ""
                Dim rLat As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(SearchStringLat, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
                Dim mLat As System.Text.RegularExpressions.Match = rLat.Match(stringTargetFile)
                While mLat.Success
                    Dim TargetText As String = mLat.Value.Replace("", "").Replace("°", ",").Replace("'", ",")
                    Dim strArrayTmp() As String = TargetText.Split(","c)
                    If strArrayTmp.Count > 0 Then
                        Dim headString As String = Mid(strArrayTmp(0), 1, 1)
                        strArrayTmp(0) = Mid(strArrayTmp(0), 2)
                        Dim dbldeg As Double = 0
                        Dim TransNumber As Integer = 1
                        For n As Integer = 0 To strArrayTmp.Count - 1
                            If n > 0 Then
                                TransNumber = TransNumber * 60
                            End If
                            dbldeg = dbldeg + (CDbl(strArrayTmp(n)) / TransNumber)
                        Next
                        If headString = "S" Then
                            dbldeg = dbldeg * -1
                        End If
                        Dim NewTextLat As String = ""
                        stringTargetFile = stringTargetFile.Replace(mLat.Value, NewTextLat)
                    End If
                    mLat = rLat.Match(stringTargetFile)
                End While
                Dim SearchStringLng As String = ""
                Dim rLng As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(SearchStringLng, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
                Dim mLng As System.Text.RegularExpressions.Match = rLng.Match(stringTargetFile)
                While mLng.Success
                    Dim TargetText As String = mLng.Value.Replace("", "").Replace("°", ",").Replace("'", ",")
                    Dim strArrayTmp() As String = TargetText.Split(","c)
                    If strArrayTmp.Count > 0 Then
                        Dim headString As String = Mid(strArrayTmp(0), 1, 1)
                        strArrayTmp(0) = Mid(strArrayTmp(0), 2)
                        Dim dbldeg As Double = 0
                        Dim TransNumber As Integer = 1
                        For n As Integer = 0 To strArrayTmp.Count - 1
                            If n > 0 Then
                                TransNumber = TransNumber * 60
                            End If
                            dbldeg = dbldeg + (CDbl(strArrayTmp(n)) / TransNumber)
                        Next
                        If headString = "W" Then
                            dbldeg = dbldeg * -1
                        End If
                        Dim NewTextLat As String = ""
                        stringTargetFile = stringTargetFile.Replace(mLng.Value, NewTextLat)
                    End If
                    mLng = rLng.Match(stringTargetFile)
                End While
                Dim newFileName As String = TargetFile & ".org"
                If System.IO.File.Exists(TargetFile & ".org") Then
                    Dim n As Integer = 1
                    newFileName = TargetFile & ".org" & CStr(n)
                    While System.IO.File.Exists(newFileName) OrElse n < 100
                        n += 1
                        newFileName = TargetFile & ".org" & CStr(n)
                    End While
                    If System.IO.File.Exists(newFileName) Then
                        MsgBox("バックアップファイルが多すぎるので中止します")
                        Exit Sub
                    End If
                End If
                System.IO.File.Move(TargetFile, newFileName)
                Dim sw As New System.IO.StreamWriter(TargetFile, False, System.Text.Encoding.GetEncoding("UTF-8"))
                sw.Write(stringTargetFile)
                sw.Close()
            End If
        Next
    End Sub

    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
        Me.Close()
    End Sub

End Class

c# (Code Converter で自動変換)

Imports System.Text.RegularExpressions
Public Class fMain
    Private TargetFiles As List(Of String)
    Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
        Dim fbd As New FolderBrowserDialog
        fbd.Description = "フォルダを指定してください。"
        fbd.RootFolder = Environment.SpecialFolder.Desktop
        fbd.SelectedPath = My.Settings.SearchFolderName
        fbd.ShowNewFolderButton = False

        If fbd.ShowDialog(Me) = DialogResult.OK Then
            txtSearchFolder.Text = fbd.SelectedPath
            Dim files As String() = System.IO.Directory.GetFiles(fbd.SelectedPath, "*.fxml", System.IO.SearchOption.AllDirectories)
            If Not IsNothing(files) AndAlso files.Count > 0 Then
                My.Settings.SearchFolderName = fbd.SelectedPath
                clbFiles.Items.AddRange(files)
                TargetFiles = New List(Of String)
                For n As Integer = 0 To files.Count - 1
                    TargetFiles.Add(files(n))
                Next
            End If
        End If
    End Sub

    Private Sub btnTrans_Click(sender As Object, e As EventArgs) Handles btnTrans.Click
        If clbFiles.SelectedItems.Count = 0 Then Exit Sub
        For Each TargetFile As String In clbFiles.SelectedItems
            If System.IO.File.Exists(TargetFile) Then
                Dim sr As New System.IO.StreamReader(TargetFile, System.Text.Encoding.GetEncoding("UTF-8"))
                Dim stringTargetFile As String = sr.ReadToEnd()
                sr.Close()
                Dim SearchStringLat As String = ""
                Dim rLat As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(SearchStringLat, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
                Dim mLat As System.Text.RegularExpressions.Match = rLat.Match(stringTargetFile)
                While mLat.Success
                    Dim TargetText As String = mLat.Value.Replace("", "").Replace("°", ",").Replace("'", ",")
                    Dim strArrayTmp() As String = TargetText.Split(","c)
                    If strArrayTmp.Count > 0 Then
                        Dim headString As String = Mid(strArrayTmp(0), 1, 1)
                        strArrayTmp(0) = Mid(strArrayTmp(0), 2)
                        Dim dbldeg As Double = 0
                        Dim TransNumber As Integer = 1
                        For n As Integer = 0 To strArrayTmp.Count - 1
                            If n > 0 Then
                                TransNumber = TransNumber * 60
                            End If
                            dbldeg = dbldeg + (CDbl(strArrayTmp(n)) / TransNumber)
                        Next
                        If headString = "S" Then
                            dbldeg = dbldeg * -1
                        End If
                        Dim NewTextLat As String = ""
                        stringTargetFile = stringTargetFile.Replace(mLat.Value, NewTextLat)
                    End If
                    mLat = rLat.Match(stringTargetFile)
                End While
                Dim SearchStringLng As String = ""
                Dim rLng As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(SearchStringLng, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
                Dim mLng As System.Text.RegularExpressions.Match = rLng.Match(stringTargetFile)
                While mLng.Success
                    Dim TargetText As String = mLng.Value.Replace("", "").Replace("°", ",").Replace("'", ",")
                    Dim strArrayTmp() As String = TargetText.Split(","c)
                    If strArrayTmp.Count > 0 Then
                        Dim headString As String = Mid(strArrayTmp(0), 1, 1)
                        strArrayTmp(0) = Mid(strArrayTmp(0), 2)
                        Dim dbldeg As Double = 0
                        Dim TransNumber As Integer = 1
                        For n As Integer = 0 To strArrayTmp.Count - 1
                            If n > 0 Then
                                TransNumber = TransNumber * 60
                            End If
                            dbldeg = dbldeg + (CDbl(strArrayTmp(n)) / TransNumber)
                        Next
                        If headString = "W" Then
                            dbldeg = dbldeg * -1
                        End If
                        Dim NewTextLat As String = ""
                        stringTargetFile = stringTargetFile.Replace(mLng.Value, NewTextLat)
                    End If
                    mLng = rLng.Match(stringTargetFile)
                End While
                Dim newFileName As String = TargetFile & ".org"
                If System.IO.File.Exists(TargetFile & ".org") Then
                    Dim n As Integer = 1
                    newFileName = TargetFile & ".org" & CStr(n)
                    While System.IO.File.Exists(newFileName) OrElse n < 100
                        n += 1
                        newFileName = TargetFile & ".org" & CStr(n)
                    End While
                    If System.IO.File.Exists(newFileName) Then
                        MsgBox("バックアップファイルが多すぎるので中止します")
                        Exit Sub
                    End If
                End If
                System.IO.File.Move(TargetFile, newFileName)
                Dim sw As New System.IO.StreamWriter(TargetFile, False, System.Text.Encoding.GetEncoding("UTF-8"))
                sw.Write(stringTargetFile)
                '閉じる
                sw.Close()
            End If
        Next
    End Sub

    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
        Me.Close()
    End Sub

End Class

 

コメントを残す