Skip to main content
Known Participant
October 19, 2023
Answered

メモ用に作ったテキスト入力用スクリプトの内容が更新されない場合がある(パネルドッキング時)

  • October 19, 2023
  • 2 replies
  • 327 views

AfterEffects内にメモ入力欄がほしくて、テキスト入力欄を表示するスクリプトを作って、入力した内容が常に保存されるようなものを作っています。(タブで3つの入力フィールドあり)

あまり知識がなくコードの読み書きもできないので、ChatGPTに聞きながら作ってみた所、以下のコードで一応、できました。

 

ただ、なぜかこのパネルをワークスペースにドッキングした状態の場合は、パネルを一度開き直さないと、テキストの更新(テキストの内容変更、削除、追加)が次回パネルやAepを開いたときに反映されません。

ドッキングしていない場合は、パネルを開き直さなくても次回にパネルまたはAepを開いたときに反映されます。

 

そのため、

・ドッキングしている状態

・Aepを開いてパネルを開き直さずにテキスト入力欄の内容を変更・削除・追加した場合

 

のみ、何かのキックが走らないためか、この条件下ではテキストの更新がされません。

この問題の解決方法について何か良い方法はないでしょうか?

 

※Aepファイルを保存してるかしていないかは全く関係ありませんでした。どのようなAepでも、パネルをワークスペースにドッキングしていない場合は普通に保存されますし、ドッキングしている場合は必ず一度パネルを開き直さないと保存がされない状況です。

 

そもそも、app.settingsやonChangeの構文が正しいのか、あまり使わないものなのかとかもよくわかっていないので、この問題が解決するなら構文の書き方にこだわりはないです。

 

 

var mainScriptName = "MyScript";

 

// テキストの保存関数
function saveText(tabNumber, text) {
app.settings.saveSetting(mainScriptName, "tabText" + tabNumber, text);
}

 

// 保存されたテキストの取得関数
function getSavedText(tabNumber) {
return app.settings.haveSetting(mainScriptName, "tabText" + tabNumber) ? app.settings.getSetting(mainScriptName, "tabText" + tabNumber) : "";
}

var mainPanel = (this instanceof Panel) ? this : new Window("palette", "メモパネル", undefined);
mainPanel.orientation = "column";

 

// タブパネルの追加
var tabbedPanel = mainPanel.add("tabbedpanel");
tabbedPanel.alignment = ["fill", "fill"];

var tabs = [];
for (var i = 1; i <= 3; i++) {
tabs.push(tabbedPanel.add("tab", undefined, "T" + i));
}

var inputFields = [];
for (var i = 1; i <= 3; i++) {
inputFields.push(tabs[i - 1].add("edittext", undefined, getSavedText(i), {multiline: true, wantReturn: true }));
inputFields[i - 1].alignment = ["fill", "fill"];
(function(index) {
inputFields[index - 1].onChange = function() { //テキストを常に保存する
saveText(index, this.text);
};
})(i);
}

if (mainPanel instanceof Window) {
mainPanel.center();
mainPanel.show();
} else {
mainPanel.layout.layout(true);
}

This topic has been closed for replies.
Correct answer stunning_Sunflower16B7

自分の環境では書かれていたスクリプトでちゃんと動作しているような感じでした。
Windows10, AE2023(23.1.0)

 

ちょっといろいろ試してみた感じだと、for文の中で定義しているonChangeに渡そうとするindex変数が
あやしい感じがするので、自分が書くとしたらこんな風に書くといったものを投稿されたものを元に書いてみました。

 

(function(parent) { // 即時関数にする


var mainScriptName = "MyScript";

 

// テキストの保存関数
function saveText(tabNumber, text) {
app.settings.saveSetting(mainScriptName, "tabText" + tabNumber, File.encode(text));
}

 

// 保存されたテキストの取得関数
function getSavedText(tabNumber) {
return app.settings.haveSetting(mainScriptName, "tabText" + tabNumber) ?
File.decode(app.settings.getSetting(mainScriptName, "tabText" + tabNumber)) :
"";
}

 

var mainPanel = (parent instanceof Panel) ?
parent :
new Window("palette", "メモパネル", undefined, {
resizeable: true, //リサイズさせるならtrue。ドッキングパネル対応にするならリサイズするようにしておいたほうがよいかも
});

 

// タブパネルの追加
var tabbedPanel = mainPanel.add("tabbedpanel");
tabbedPanel.alignment = ["fill", "fill"];

 

// 第四引数のオブジェクトに任意の値を入れておくと
// 値を保持できるので自分的には便利でよく使用してます。
for (var i = 0; i < 3; ++i) {
var tabNumber = i + 1;
var tab = tabbedPanel.add("tab", undefined, "T" + tabNumber);
var inputField = tab.add("edittext", undefined, getSavedText(tabNumber), {
multiline: true,
tabNumber: tabNumber, // edittextにタブの番号を保持させる
});

inputField.alignment = ["fill", "fill"];
inputField.onChange = function() {
saveText(this.properties.tabNumber, // edittextからタブの番号を取得する
this.text);
};
}

 

// GUIを作ったらドッキング可能かどうかに関係なくlayout.layout()を実行する(trueはいらない)
mainPanel.layout.layout();

 

// リサイズのイベントを定義しておく
mainPanel.onResize = function() {
mainPanel.layout.resize();
}

 

// スクリプトをScriptUI Panelsフォルダに配置してもScriptsフォルダに配置しても
// きちんと表示するようにしておく
if (mainPanel instanceof Window) {
mainPanel.center();
mainPanel.show();
}

})(this);

2 replies

Participating Frequently
October 20, 2023

自分の環境では書かれていたスクリプトでちゃんと動作しているような感じでした。
Windows10, AE2023(23.1.0)

 

ちょっといろいろ試してみた感じだと、for文の中で定義しているonChangeに渡そうとするindex変数が
あやしい感じがするので、自分が書くとしたらこんな風に書くといったものを投稿されたものを元に書いてみました。

 

(function(parent) { // 即時関数にする


var mainScriptName = "MyScript";

 

// テキストの保存関数
function saveText(tabNumber, text) {
app.settings.saveSetting(mainScriptName, "tabText" + tabNumber, File.encode(text));
}

 

// 保存されたテキストの取得関数
function getSavedText(tabNumber) {
return app.settings.haveSetting(mainScriptName, "tabText" + tabNumber) ?
File.decode(app.settings.getSetting(mainScriptName, "tabText" + tabNumber)) :
"";
}

 

var mainPanel = (parent instanceof Panel) ?
parent :
new Window("palette", "メモパネル", undefined, {
resizeable: true, //リサイズさせるならtrue。ドッキングパネル対応にするならリサイズするようにしておいたほうがよいかも
});

 

// タブパネルの追加
var tabbedPanel = mainPanel.add("tabbedpanel");
tabbedPanel.alignment = ["fill", "fill"];

 

// 第四引数のオブジェクトに任意の値を入れておくと
// 値を保持できるので自分的には便利でよく使用してます。
for (var i = 0; i < 3; ++i) {
var tabNumber = i + 1;
var tab = tabbedPanel.add("tab", undefined, "T" + tabNumber);
var inputField = tab.add("edittext", undefined, getSavedText(tabNumber), {
multiline: true,
tabNumber: tabNumber, // edittextにタブの番号を保持させる
});

inputField.alignment = ["fill", "fill"];
inputField.onChange = function() {
saveText(this.properties.tabNumber, // edittextからタブの番号を取得する
this.text);
};
}

 

// GUIを作ったらドッキング可能かどうかに関係なくlayout.layout()を実行する(trueはいらない)
mainPanel.layout.layout();

 

// リサイズのイベントを定義しておく
mainPanel.onResize = function() {
mainPanel.layout.resize();
}

 

// スクリプトをScriptUI Panelsフォルダに配置してもScriptsフォルダに配置しても
// きちんと表示するようにしておく
if (mainPanel instanceof Window) {
mainPanel.center();
mainPanel.show();
}

})(this);

hoshi999Author
Known Participant
October 20, 2023

ありがとうございます!自分の環境は2024なので、もしかしたら24から変なバグが起きちゃったのかもですね・・・。そして具体的事例までありがとうございます。大変助かります。一応、外部ファイルに出力して保存する形式にしたら問題が発生しなくなったので、自己解決できてよかったです。でもいただいたものも今後の参考にさせていただきます!

hoshi999Author
Known Participant
October 20, 2023

すみませんこちら自分で解決できました!