インプットボックスによる画像変更とコマンド処理 – FlyWithLua

2023年7月22日

インプットボックスはうまくいった。コマンドも実行される。
インプットボックスのテキストパスを変更する。その後SETボタンをクリックすると、変更したパスの画像に変更される。SET下のテキストがその状態をテキストで表している。
SAVEボタンでファイルに書き出すことで、保存され再度起動しても保存ファイルが読み込まれ、画像とインプットボックスのテキスト保持される。

image_A_1 = float_wnd_load_image(SCRIPT_DIRECTORY .. image_path_A_1)
これを入れている2箇所が、27行目と57行目、27行目はこの位置じゃないとだめ。

local image_path_A_1 = "/tab_img/A-1.png" --初期設定
local command_txt_A_1 = "sim/view/linear_spot"
-------------------------------------------------------------------------------------------
--書き込み用のファイルを開く(フィアルには初期設定の文字が記述してある必要がある)
save_file = io.open(SCRIPT_DIRECTORY .. "save.txt", "r")
if save_file ~= nil then --もしバックアップファイルが(nil)でない場合、つまり存在する場合。
    save_file:lines()    -- バックアップファイルに1行ずつ記述していく

    --以下の設定をするとテキストファイルにちゃんと記述されていないとウインドウ内のコンテンツが表示されなくる。
    bucontent = save_file:lines() -- バックアップファイルに1行ずつ記述していく
    Fctr = 0                      -- 初期設定
    image_path_A_1 = bucontent(0) --1行目にcom1のテキストを記
    command_txt_A_1 = bucontent(1)

    Fctr = 2 -- 合計2行になる?

    save_file:close()
end
-------------------------------------------------------------------------------------------
-- ウインドウの作成
wnd = float_wnd_create(300, 350, 1, true)
float_wnd_set_title(wnd, "ボタンの基本")     --wnd変数をセット
float_wnd_set_imgui_builder(wnd, "image_on_build") --関数を読み込みセットする
------------------------------------------------------------------------

-- 読み込んだ後に、image_path_A_1へ入れるために、画像パスはこの場所に設置する必要がある。
local image_A_1 = float_wnd_load_image(SCRIPT_DIRECTORY .. image_path_A_1)

--メインウインドウをビルドしてその内容を実行する
function image_on_build(wnd, x, y)
    imgui.TextUnformatted(image_path_A_1) --書き出しには "" を入れないこと。

    -- 画像ボタン----------------------------------------------------
    -- コマンドを実行するには直接パスを入れてはだめ、このように変数をいれないと何故か実行されない。
    if imgui.ImageButton(image_A_1, 120, 65) then
        command_once(command_txt_A_1)
    end
    -------------------------------------------------------------------------------
    -- インプットボックス、変更できるようにするためにはこれがワンセット。
    changed, image_path_A_1_new = imgui.InputText("Image A-1", image_path_A_1, 18)
    if changed then
        image_path_A_1 = image_path_A_1_new --ここで新しいパスににリアルタイム変更される。
    end
    --imgui.TextUnformatted(temporary_txt_A_1)
    imgui.TextUnformatted(image_path_A_1_new)
    --コマンド設定用インプットボックス
    changed, command_txt_A_1_new = imgui.InputText("Command A-1", command_txt_A_1, 30)
    if changed then
        command_txt_A_1 = command_txt_A_1_new --ここで新しいパスににリアルタイム変更され
    end
    -- ここで画像のパスの場合、パスの変更中にパスが切れるとエラーになるので、すぐにパスを渡さないでSETボタンクリックで渡すようにしている。。
    -------------------------------------------------------------------------------
    if imgui.Button("SET") then
        if changed then
            image_path_A_1 = image_path_A_1                                  --ここで新しいパスににリアルタイム変更される。セットボタンクリックで「image_path_A_1 」に反映されるようにする。
        end
        image_A_1 = float_wnd_load_image(SCRIPT_DIRECTORY .. image_path_A_1) --画像を入れ替えるためにここにも必要。
    end

    imgui.TextUnformatted(image_path_A_1) -- ここでSETボタンを押したときの、テキストの動きを見ることができる。
    imgui.TextUnformatted(command_txt_A_1)
    ------------------------------------------------------------------------------
    --SAVEボタンの作成と実行
    if imgui.Button("SAVE", 60, 30) then
        write_file = io.open(SCRIPT_DIRECTORY .. "save.txt", "w")
        write_file:write(image_path_A_1 .. "\n") -- 1行目の1テキストを書き込む、改行
        write_file:write(command_txt_A_1 .. "\n")

        write_file:close()
    end
end

コンポボックスによる画像処理とコマンド

以下はコンポボックス、うまくいっていない。画像の変更はいいが、保持ができない。

local image_path_A_1 = "/tab_img/A-1.png"
local image_path_A_2 = "/tab_img/A-2.png"

image_A_1 = float_wnd_load_image(SCRIPT_DIRECTORY .. image_path_A_1)
image_A_2 = float_wnd_load_image(SCRIPT_DIRECTORY .. image_path_A_2)

choice = 1 --これ重要、コンポボックス用として忘れずに入れる。

-------------------------------------------------------------------------------------------
--ファルの読み込みが必要

-------------------------------------------------------------------------------------------
-- datarefの初期設定(最初はこれをアクティブにする)
ComChoice = 1 --datarefの最初の分を指定、2が2番目、最後の方に指定を記述されている。
-------------------------------------------------------------------------------------------
-- 初期設定(最初にluaファイルを読み込んだときこれが表示される)
com1_text = "COM "
com1_mhz = "118.40"
-------------------------------------------------------------------------------------------
--書き込み用のファイルを開く(フィアルには文字が記述してある必要がある)
backupfile = io.open(SCRIPT_DIRECTORY .. "ExtendedStack.save", "r") --バックアップファイル"ExtendedStack.save"を開く
if backupfile ~= nil then                                           --もしバックアップファイルが(nil)でない場合、つまり存在する場合。
    backupfile:lines()                                              -- バックアップファイルに1行ずつ記述していく

    --以下の設定をするとテキストファイルにちゃんと記述されていないとウインドウ内のコンテンツが表示されなくる。
    bucontent = backupfile:lines() -- バックアップファイルに1行ずつ記述していく
    Fctr = 0                   -- 初期設定
    com1_text = bucontent(0)   --1行目にcom1のテキストを記述
    com1_mhz = bucontent(1)    --2行目にcom1の周波数を記述
    Fctr = 2                   -- 合計2行になる?

    backupfile:close()
end
-------------------------------------------------------------------------------------------
-- ウインドウの作成
wnd = float_wnd_create(300, 350, 1, true)
float_wnd_set_title(wnd, "ボタンの基本")  --wnd変数をセット
float_wnd_set_imgui_builder(wnd, "im_on_build") --関数を読み込みセットする
------------------------------------------------------------------------
--メインウインドウをビルドしてその内容を実行する
function im_on_build(wnd, x, y)

    imgui.TextUnformatted(" ")
    -- テキスト入力のバーの描画
    -- キャプション、最後の数字は入力できる文字数

    -- 画像ボタン----------------------------------------------------
    -- image_path_A_1 はコンポボックスで選択したテキストが入る。だからここに「image_path_A_1」
    if imgui.ImageButton(image_A_1, 120, 65) then
        command_once("sim/view/linear_spot")
    end

    -- コンポボックス----------------------------------------------------
    local choices = { "/tab_img/A-1.png", "/tab_img/A-2.png" } --3つの選択肢を作成
    --local choices = {"Choice 1", "Choice 2", "Choice 3"}    --3つの選択肢を作成

    -- BeginCombo はコンボ ボックスを作成します。 最初のパラメータはラベルで、2 番目のパラメータは現在選択されている選択肢のテキストです。
    if imgui.BeginCombo("Image_A-1", choices[choice]) then
        -- hoicesすべての選択肢をループする
        for i = 1, #choices do
            -- Selectable 関数は、コンボボックスに選択肢を追加します。
            -- 最初のパラメータはラベルで、2 番目のパラメータはラベルです
            -- この選択肢が現在選択されている場合は true になります。
            if imgui.Selectable(choices[i], choice == i) then
                -- Selectable は、新しい選択肢が選択されたときに true を返します。その選択肢を選択変数にコピーします。
                choice = i --何番を選んだかがchoiceに入る(1,2,3)
                if choice == 1 then
                    image_A_1 = float_wnd_load_image(SCRIPT_DIRECTORY .. image_path_A_1)--変数は必ず画像ボタンと同じでないといけない。
                end
                if choice == 2 then
                    image_A_1 = float_wnd_load_image(SCRIPT_DIRECTORY .. image_path_A_2) --変数は必ず画像ボタンと同じでないといけない。
                end
            end
        end
        -- _BeginCombo が true を返す場合に限り、_Must_ を呼び出す必要があります。
        -- コンボボックスが現在開いているとき
        imgui.EndCombo()
    end
    -------------------------------------------------------------------------------
    -- Com1のNameのインプットバーの作成(テキスト)、変更できるようにするためにはこれがワンセット。
    local changed, com1_text_new = imgui.InputText("Name ", com1_text, 18) -- com1_textが初期設定テキスト"COM"がバーの中に入る
    if changed then
        com1_text = com1_text_new
    end
    -------------------------------------------------------------------------------
    -- Com1のMhzのインプットバーの作成(周波数)
    -- com1_mhzに周波数が入る
    local changed, com1_mhz_new = imgui.InputText("Mhz ", com1_mhz, 18)--最後は入力制限数
    if changed then
        com1_mhz = com1_mhz_new --com1_mhzはセットボタンでcom1_mhz_newに変わる
    end
    -------------------------------------------------------------------------------
    -------------------------------------------------------------------------------
    -- 最初に作成した com1_text = "COM " がここにも入るテスト
    imgui.TextUnformatted("")
    imgui.TextUnformatted(com1_text)
    -- com1_mhz = "118.40"もここに入れて見る(数値も同じ方法)
    imgui.TextUnformatted(com1_mhz)
    -------------------------------------------------------------------------------

    -------------------------------
    imgui.TextUnformatted(" ")
    --SAVEボタンの作成と実行
    imgui.SetWindowFontScale(1.2)
    -- もしSAVEボタンが押されたら以下を実行
    if imgui.Button("SAVE", 60, 30) then
        WriteSaveToDisk() -- ここでWriteSaveToDisk関数を実行する
    end
end
-------------------------------------------------------------------------------------------
-- この関数は上で「SET」ボタンを押したときにX-Planeの周波数の変更を実行。
-- 周波数のセット、SetComHz関数、(freq)は引数でプログラムや関数に渡す値(入力)のこと
-- ここでは(freq)は変更するdataref周波数の値になる。
function SetComHz(freq)
    freqrt = freq         -- 周波数をfreqrtに変える(freqrtが本当の値になる)
    freq = tostring(freq) --tostringは文字列に変換(ここではfreqに変換されることになる?)
    freq = freq:gsub("%.", "") --118.50と数値を書き込むときに「.」を入れる
    --------------------------------------
    -- 等しくない場合はエラーを入れる
    if string.len(freq) ~= 5 then --文字列freqの長さを返します。つまり5文字でない場合エラー(「.」は数えない)。
        return "ERR"          --戻り値(出力)、 "ERR"を返す、"ERRAR"とすると5文字になるのでできない
    end
    --------------------------------------
    freq = tonumber(freq) --tonumberは「stringをnumber」数値に変換
    --------------------------------------
    -- これは上の5文字制限があるので要らないのでは?
    -- 入力したテキストが空の場合はエラーを返す
    if freq == nil then --freqが空の場合はエラーを返す
        return "ERR"
    end
    --------------------------------------
    -- これを入れないと、X-Planeの表示が「011850」となってしまうため「118500」としたいので
    freq = freq .. "0"
    --------------------------------------
    -- COM1 Avtiveを選択した場合はCOMM1のdatarefを選択して周波数を書き込み、音を鳴らす
    if ComChoice == 1 then
        COMM1 = freq --play_sound(extclick) --ここには周波数と音の2つの要素が入っている
    end
    --------------------------------------
    -- COM2 Standbyを選択した場合はCOMM1stdbyのdatarefを選択して周波数を書き込み、音を鳴らす
    if ComChoice == 2 then
        COMM1stdby = freq --play_sound(extclick)
    end
    --------------------------------------
    return freqrt --最後にfreqrtの値を返すのがこの関数の役目
end

-------------------------------------------------------------------------------------------
--  "ExtendedStack.save"ファイルを開いて書き込む
function WriteSaveToDisk()
    --local file = io.open(SCRIPT_DIRECTORY .. "KF-Select View.txt", "w")
    fileES = io.open(SCRIPT_DIRECTORY .. "ExtendedStack.save", "w") -- "ExtendedStack.save"ファイルを開き書き込み可能にする
    fileES:write(com1_text .. "\n")                             -- Com1テキストを書き込む、改行
    fileES:write(com1_mhz .. "\n")                              -- Com1テキストを書き込む、改行
    -------------------------------------
    fileES:close()
end