インプットボックスはうまくいった。コマンドも実行される。
インプットボックスのテキストパスを変更する。その後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