Re: JSL 関数の可変動作gzmorgan、洞察をありがとう。 現在の window() ソリューションは、最も単純なソリューションのように見えましたが、私にはうまくいきませんでした...少なくとも、私がコーディングしようとした方法ではありません。 ほとんどの変数で eval sub() コマンドを使用しようとしましたが、これは機能しますが、nw (新しいウィンドウ変数) または現在のウィンドウの _cw では機能しません。 私はおそらく何かを逃しただけですが、大丈夫です。
私は、ビンスが以前に提案した他の提案、ウィンドウの名前空間に戻ることになりました。 これまでのところ、問題はありません。
アプリビルダについては、知っていましたが使ったことはありませんでした。 私は通常、独自の GUI と関数をコーディングし、アドインを手動で作成します。 set 関数と this (または self) と、何が何を呼び出しているのかを理解するのに苦労しましたが、今では理解できたと思います... 詳しく見ていきます。
ご意見ありがとうございます。 さまざまなアプローチ/提案に本当に感謝しています。 私のスクリプトは一連の関連パラメータを取り、それらをいくつかの異なる方法でプロットしますが、設定してパラメータを手動でクリックしてエクスポートするには数分かかります。 これらの更新とマスター ファイルからのループにより、GUI の代わりに別の呼び出しスクリプトからスクリプトを呼び出して、1 セットのプロットではなく N 個のプロットを生成させることができます。 以前は数時間かかっていましたが、今では 10 秒です。もちろん、ここにたどり着くまでに長い時間がかかりましたが、これは何年も再利用できます。
Re: JSL 関数の可変動作おっとっと!「this」とウィンドウの名前空間の代わりに、現在のウィンドウを参照することもできます。代替スクリプトを添付しました。
Re: JSL 関数の可変動作良い提案であるウィンドウ名前空間を使用することを提案するつもりでした。通常、UI ウィンドウの関数は使用しません。ローカル オブジェクトを参照するもう 1 つの方法は、Set 関数を使用してハンドルを取得することです。 スクリプトは以下です。より単純な print ステートメントを使用しました。Application Builder を使用して探索することをお勧めします。その仕組みを学ぶには少し投資が必要ですが、便利な場合があります。
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
<<SET function=""></SET>Re: JSL 関数の可変動作ありがとうヴィンス。 ウィンドウの名前空間について知りませんでした。 それはうまくいくかもしれません、私はそれを試してみます。
現在、GUI 部分を 1 つのファイルにまとめており、メイン関数と呼ぶものに変数を渡すつもりです。 アドイン ツールバーから GUI を呼び出すか、N 回ループする小さなカスタム スクリプトを実行して、N セットの入力パラメータのメイン スクリプトを呼び出します。 ここでは再利用性が問題になる可能性がありますが、変数の上書きは問題にならない場合があります... どうなるか見てみます。 ご協力いただきありがとうございます。
Re: JSL 関数の可変動作グローバルまたはグローバル名前空間でそれを行う場合の問題は、再利用性です (気にしないかもしれません)。
2 つの異なるボタンを使用して myFun を 2 回実行した場合 (ウィンドウをサンドボックス化し、その 2 つのインスタンスを実行できるようにしたいとします)。衝突が発生し、2 番目の呼び出しが最初の呼び出しをオーバーライドします。
下記参照。
names default to here(1);
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
x = [2,3];
y ="string";
test:myFun(x,y);
test:myFun([12, 14], "something else");
名前空間を使用している場合は、window 名前空間を使用することをお勧めします。 ウィンドウがなくなると自動的に削除され、2 つの同一のウィンドウが衝突することはありません。
names default to here(1);
myFun = Function({A1, Z1},{DEFAULT LOCAL},
A = A1;
Z = Z1;
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
//::g_b = b;
//::g_z = z;
nw = new window("test",
window:B = B; //uses the builtin window namespace
window:Z = Z; //works because this is a glue statement that returns the last thing
window:box = vlistbox( //which in this case is the vlistbox
textbox(window:Z),
textbox(char(window:B)),
buttonbox("Show array B (works)",
show(window:B)
),
buttonbox("Show string Z (works)",
show(window:Z)
),
buttonbox("show and close (works)",
show(window:Z, window:B); window:box << closewindow())
)
);
);
x = [2,3];
y ="string";
myFun(x,y);
myFun([12, 14], "something else");Re: JSL 関数の可変動作ありがとうヴィンス。 私は eval(substitute(expr())) を考えていませんでした。 私のより複雑なスクリプトの一部では、何がどこで置き換えられたかを追跡するのが難しすぎると思います。 私のコードは正確に整理されておらず、デバッグは困難です。Re: JSL 関数の可変動作ありがとう、あなたのグローバルなアイデアは私に別のアイデアを与えてくれました。変数がグローバルであることはあまり気にしませんが、変数がグローバルである必要がある場合は、含まれている名前空間にスコープを設定したいと思います。
clear globals() コマンドがここで私を噛むとは思いませんが、リコール関数が得られました (私のグローバル リコール変数は、clear globals() を使用する別のスクリプトによってクリアされました)。JMP に電子メールを送信したところ、2 つの選択肢が提案されました。グローバル変数をロックするか、独自の名前空間に配置して保護することです。 名前空間は、堅牢性の点で実際にはより単純でした。
とにかく、以下の更新されたコードは問題なく動作するようです。 欠点は、変数を参照するたびに余分な「test:」と入力することです。 スクリプトですべての変数を使用するために必要ではないかもしれませんが、一方で、それはおそらく良い習慣であり、この特定の使用はグローバル名前空間であるため、カーソルを変数名の上に置くと変数の内容を確認できます。
A1 と Z1 の使用に注意してください。 test:A と test:Z に割り当てることができませんでした。
エラー: 'Function' のアクセスまたは評価では、引数はリストでなければなりません。 Function/*####*/({test:A, test:Z}, .....
これが複数のファイルで機能するかどうかを確認します。
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
test:x = [2,3];
test:y ="string";
test:myFun(x,y);Re: JSL 関数の可変動作これを機能させるには、グローバル変数を設定する必要がありました。ダイアログ ボックスのコードが変数を正しく認識していないようです。これは、関数内にローカル変数を持つという目的を無効にするため、優れた解決策ではありません。
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
::g_b = b;
::g_z = z;
::g_nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(::g_B)
),
buttonbox("Show string Z (does not work)",
show(::g_Z)
),
buttonbox("show and close (does not work)",
show(::g_Z, ::g_B); ::g_nw << closewindow())
)
)
);
x = [2,3];
y ="string";
myFun(x,y);Re: JSL 関数の可変動作Bは私にとってもうまくいきませんでした。
これは通常、私が GUI を行う方法です。あなたが与えた例は非常に複雑ですが、いくつかの異なる方法を示していると思います。
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
Eval(
Substitute(
Expr(
nw = new window("test",
vlistbox(
textbox(char(DV_Z)),
textbox(char(DV_B)),
buttonbox("Show array B (works)",
show([]||DV_B); //otherwise you run into an invalid matrix token
),
buttonbox("Show string Z (does not work)",
//show([]||DV_Z); //shouldn't work, you can't make a string a matrix
show(DV_Z);
//or
show(list(DV_Z));
),
buttonbox("show and close (does not work)",
<<SET function=""></SET>JSL関数における変数の動作
私のスクリプトには通常 2 つの主要コンポーネントがあります。メイン関数とそれに続く GUI コードで、すべて同じファイル内にあります。 通常、Here 名前空間内に含まれる変数を使用し、ユーザー入力から変数を取得し、「OK」ボタン ボックスから main 関数を呼び出します。 main 関数には変数を渡さず、「OK」ボタン ボックス スクリプトで割り当てられた変数だけを使用します。 少なくとも 1 つのスクリプトを変更して、GUI を含む 1 つのファイルと main 関数を含む 2 つ目のファイルを作成することを検討しています。 その前に、1 つの JSL ファイル内でそれがどのように機能するかを確認します。 以下は必要最小限の例で、GUI をバイパスし、関数の定義後、関数が呼び出される前に変数を定義するだけです。
私が気づいたことの 1 つは、x と y の上にマウスを置くとウィンドウの下部にあるステータス バーの内容が表示されるため、スクリプトの実行後のデバッグが難しくなることです。 しかし、ローカル変数 A、B、Z、nw についてはそうではありません。 誰かがこれについてヒントを持っているのだろうか。
また、ボタン ボックス スクリプトから変数の内容にアクセスする方法もわかりません。 以下のコードを実行すると、A、B、Z が予想どおり (新しいウィンドウが作成される直前から) ログに表示され、B と Z も新しいウィンドウのテキスト ボックスに表示されることがわかりますが、ボタンbox スクリプトはこれらの変数に直接アクセスできません。 eval(parse(eval insert())) を使用して配列 B を取得することはできましたが、文字列 Z を取得できませんでした。これを機能させるためのより直接的な方法はありますか?
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(parse(Eval(Parse(Eval Insert(
"\[^"char(B)"^]\"
)))))
),
buttonbox("Show string Z (does not work)",
show(Eval(Parse(Eval Insert(
"\[^"char(Z)"^]\"
))))
),
buttonbox("show and close (does not work)", show(Z, B); nw << closewindow())
)
)
);
x = [2,3];
y="string";
myFun(x,y);
ありがとう、
マイク
自動化とスクリプト作成品質およびプロセスエンジニアリング