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