imgui テキストをファイルに書き込む – FlyWithLua

2023年2月18日

指定の場所にテキストを書き出すことができる。最後に”W”が付く。

書き込みオプション

io.open (“filename”, “オプション”)

この関数は、文字列モードで指定されたモードでファイルを開きます。 新しいファイルハンドルを返します。エラーの場合は、nilとエラーメッセージを返します。

モード文字列は、次のいずれかになります。

  • “r”:読み取りモード(デフォルト)。
  • “w”:書き込みモード。
  • “a”:追加モード。
  • “r+”:更新モード。以前のすべてのデータが保持されます。(書き込みができない)
  • “w+”:更新モード。以前のデータはすべて消去されます。(前のデータを消して書き直される)
  • “a+”:更新モードを追加します。以前のデータは保持され、書き込みはファイルの最後でのみ許可されます。(前のデータを残して、その後に書き込まれる)

モード文字列の最後に「b」を付けることもできます。これは、一部のシステムでファイルをバイナリモードで開くために必要です。

ファイルの書き出し先の指定

X-Planeの最初のディレクトリに「TestWriteToFile.txt」ファイルが作成される。

file = io.open(“TestWriteToFile.txt”, “w”)

現在使用している機体のディレクトリに「TestWriteToFile.txt」ファイルが作成される。

file = io.open(AIRCRAFT_PATH..”TestWriteToFile.txt”, “w”)

X-Planeの中へのパスを自由に作成「TestWriteToFile.txt」ファイルが作成される。

local file = io.open (“/X-Plane 11/Resources/plugins/FlyWithLua/Scripts/missions.ini”,”W”)

Resourcesにluaファイルがあった場合のパスに「Tmissions.ini」ファイルが作成される。

local file = io.open (“./Resources/plugins/FlyWithLua/Scripts/missions.ini”,”W”)

luaファイルがあった場所からのパスに「missions.ini」ファイルが作成される。

local file = io.open (SCRIPT_DIRECTORY .. “/missions.ini”,”W”)

Windowsの場合のパスの書き方

“Resources\plugins\FlyWithLua\Scripts\”

全てのファイルを書き込む

下のようにTest.txtファイルを自動で作成して、テキストを書き込む作業になる。ファイルはFlyWithLuaのscriptディレクトリに出力されて書き込まれる。

いかのファイル、不安定。書き込みがあったり、なかったり。
type別に書き込むことができるようだが….

local Array1 = {
{"Numbers",1,2,3,4,5},
{"Strings","a","b","c","d","e"},
{"Booleans", true, false},
"1234567890abcdefgh",
99,
true
}
 
local NewArray = { }
local write = true
 
function ArrayTest()
 
if write then
 
local file = io.open(SCRIPT_DIRECTORY.."Test.txt", "w") --Test.txtファイルを書き出す。
  --上のArray1をこのテキストに書き込む
    for i=1,#Array1 do
        if type(Array1[i]) == "table" then
            file:write("{") --このカッコも書き込む
            for l=1,#Array1[i] do --配列内にある行の数だけ書き込む
                if type(Array1[i][l]) == "number" then file:write(Array1[i][l]) end
                if type(Array1[i][l]) == "string" then file:write('"'..Array1[i][l]..'"') end
                if type(Array1[i][l]) == "boolean" then file:write(tostring(Array1[i][l])) end
                if l < #Array1[i] then file:write(",") end
            end
            file:write("}\n") --改行する
        else
            for name,val in ipairs(Array1) do
                file:write(name," = ",val)
                if i < #Array1 then file:write("\n") end
            end
        end
    end
file:close()
write = false
 
end
end
do_often("ArrayTest()")

上のコードの26行目ぐらいまでは理解できるが、その後の部分がわからない。

ここで重要なのは、名前を格納できないため、配列に名前を付けないことです。 代わりに、この配列が格納するものに関する識別子は、サブ配列の最初の値として保存されます。 したがって、「Numbers = {1,2,3,4,5}」の代わりに、「{“Numbers”,1,2,3,4,5}」と書く必要があります。 保存ファイルのどこにどの値が保存されているかが正確にわかっている場合、これは実際には必要ありませんが、デバッグに役立ちます。

ファイルから配列をロードするには、読み取りプロセス中に各行を分析する必要があります。配列の開始区切り文字として「{」、値区切り文字として各「,」、終了区切り文字として「}」を使用します。

機体の名前を書き出す

機体のフォルダー内に「Mysave.txt」ファイルが書き出され、機体の名前がその仲に記述され保存される。

function writetofile()
        file = io.open(AIRCRAFT_PATH.."Mysave.txt", "w")
        file:write("-- File for: "..AIRCRAFT_FILENAME.." --\n") -- Write file header

        io.close(file)
end

do_often("writetofile()")

単純にテキストを書き込む(基本形)

X-Planeの最初のディレクトリに自動的にtextファイルを作成して、datarefの値をその中に書き込む。

単純にテキストを指定して書き込む。

1、2行目のテキストが書き込まれる。

data_1 = "ABCD"
data_2 = "123457851"

function data_test()
    file = io.open("dataTest.txt", "w") --X-Planeの最初のディレクトリに自動的にファイルが作成され書き込まれて保存される。

    file:write(data_1, "\n")
    file:write(data_2, "\n")

    file:close()
end

do_every_frame("data_test()")

datarefの数値を取得して書き込む

-- open files
dataref("FMC01L", "sim/cockpit2/radios/actuators/nav1_frequency_Mhz")
dataref("FMC01S", "sim/cockpit2/radios/actuators/nav2_right_frequency_hz")

function PetlaFMC()
    file = io.open("DaneDoFMC.txt", "w") --X-Planeの最初のディレクトリに自動的にファイルが作成され書き込まれて保存される。

    file:write(FMC01L, "\n")
    file:write(FMC01S, "\n")

    file:close()
end

do_every_frame("PetlaFMC()")

条件付きファイルで、自動的に飛行機がロードされるようにする

おなじくdatarefを扱うが、機体を指定して書き出すファイル名を機体のファイル名にして出力する。
以下はC172を指定している。

-- dataref  Variablen
local ap_altitude    = dataref_table("sim/cockpit/autopilot/altitude", "writable")
local baro_setting   = dataref_table("sim/cockpit/misc/barometer_setting", "writable")
local baro_setting2  = dataref_table("sim/cockpit/misc/barometer_setting2", "writable")
local hobbs_time     = dataref_table("sim/time/hobbs_time", "writable")

-- 機体ごとに異なるファイルを作成する
local planeref       = "C172"
--Windowsの場合
local hobbs_filename = "Resources\\plugins\\FlyWithLua\\Scripts\\" .. planeref .. "_settings.txt"
--Macの場合
local hobbs_filename = "Resources/plugins/FlyWithLua/Scripts/" .. planeref .. "_settings.txt" --planerefの中に機体名が入る

-- 目的の値でファイルを作成する関数
function save_hobbstime()
    local hobbsfile = io.open(hobbs_filename, "w+")

    if (hobbsfile == nil) then                   --ファイルが空なら
        print("write error in save_hobbstime()") --Logファイルに出力さっる。save_hobbstime() での書き込みエラー
        return
    end

    hobbsfile:write(hobbs_time[0], "\n")
    hobbsfile:write(baro_setting[0], "\n")
    hobbsfile:write(baro_setting2[0], "\n")
    hobbsfile:write(ap_altitude[0], "\n")
    hobbsfile:close()
end

-- 上の関数を呼び出す
save_hobbstime()

imgui.InputTextでの入力テキストを書き込む

InputTextを使ってテキストを入力して書き出す。
問題なくリアルタイムに書き出されるが、このままではX-Planeを再起動したり、FlyWithLuaを読み込み治すとテキストは消えてしまう。これは読み込みの機能が無いからである。

demo_wnd = float_wnd_create(200, 100, 1, true)
float_wnd_set_title(demo_wnd, "imgui Demo")
float_wnd_set_imgui_builder(demo_wnd, "build_demo")
float_wnd_set_onclose(demo_wnd, "closed_demo")

local data_1 = ""
local data_2 = ""

function build_demo(demo_wnd, x, y)
    file = io.open("dataTest.txt", "w") --X-Planeの最初のディレクトリに自動的にファイルが作成され書き込まれて保存される。

    file:write(data_1, "\n")
    file:write(data_2, "\n")

    file:close()

    -- ユーザーがテキストを入力できるようにする。1行のみ。
    local changed, newText_1 = imgui.InputText("Text-1", data_1, 255)
    -- Parameters: ラベル、現在のテキスト、許可される最大文字数
    if changed then
        data_1 = newText_1
    end
    local changed, newText_2 = imgui.InputText("Text-2", data_2, 255)
    -- Parameters: ラベル、現在のテキスト、許可される最大文字数
    if changed then
        data_2 = newText_2
    end
end

function closed_demo(demo_wnd)
    -- Tこの関数は、ユーザーがウィンドウを閉じるときに呼び出されます。
    -- ウィンドウが既に破棄されているため、この関数では imgui 関数の描画または呼び出しは許可されない。
end