計算の各段階を互いに独立したコードで実行することは、一般的に優れたプログラミング手法です。この記事では、ZPL マクロを他のマクロから呼び出す方法と、それらのマクロ間でデータを受け渡す方法について説明します。
著者 Sanjay Gangadhara
Downloads
Introduction
一般的に、多くのステップを実行する ZPL マクロを作成する場合、各ステップを互いに独立したコードで実行することが優れたプログラミング手法です。
この手法は、GOSUB、SUB、RETURN、END
の各キーワードを使用した ZPL のサブルーチンで実現できます。
しかし、各ステップを互いに独立したマクロで実行するようにして、これらの「子」マクロをメインの「親」マクロから呼び出す方が容易な場合もあります。
たとえば、同じ計算を多数のさまざまなマクロで実行する場合は、この計算を 1 つの子マクロで実行するようにして、各種の親マクロからその子マクロを順次呼び出した方が効率的です。
OpticStudio でキーワード CALLMACRO
を使用することで、このような動作を実現できます。
マクロからのマクロの呼び出し
キーワード CALLMACRO
の説明とその実装方法は、ヘルプ システムの「[プログラミング] (Programming) タブ」→「ZPL について」→「マクロからのマクロの呼び出し」を参照してください。
2 つの独立した子マクロを呼び出す親マクロの例が、この記事に添付された .ZIP ファイルにあります。
これらのマクロは {Zemax}\Macros ディレクトリに保存する必要があり、{Zemax}\Samples\Objectives ディレクトリに保存されたファイル "Cooke 40 degree field.zmx" とともに使用することを想定しています。
親マクロ (CALLMACRO_TEST_PARENT.ZPL) は、子マクロから返されるデータを保持する配列の定義で始まります。
つづいて、キーワード CALLSETDBL
で数値、CALLSETSTR
で文字列値をマスター マクロ バッファに取り込みます。これらの処理を以下に示します。
n_vals = 49
DECLARE x, DOUBLE, 1, n_vals # Variables to store OPD data
DECLARE y, DOUBLE, 1, n_vals
FOR i, 1, n_vals, 1
CALLSETDBL i, 2*i # Test values to demonstrate use of CALLSETDBL, CALLSETSTR keywords
A$ = call_str$ + $STR(i)
CALLSETSTR i, A$
NEXT i
この例の数値と文字列値は、親マクロと子マクロとの間でデータを受け渡す方法を示すテストのための値にすぎません。
つづいて、キーワード CALLMACRO
を使用して最初の子マクロ (CALLMACRO_TEST_CHILD1.ZPL) を親マクロから呼び出します。
この子マクロでは、次のようにCALD
関数と $CALLSTR
関数を使用して、マクロ バッファに保存された値を出力ウィンドウに表示します。
! Print values passed from parent macro
n_vals = 49
FOR i, 1, n_vals, 1
FORMAT 6.4
PRINT "Doule precision value = ", CALD(i)
FORMAT 2 INT
A$ = $CALLSTR(i)
PRINT A$
NEXT i
次に、サジタル方向の瞳座標を固定値 (Px = 0)、視野座標も固定値 (Hx = Hy =0) として、キーワード RAYTRACE
と関数 OPDC
により、タンジェンシャル方向のさまざまな瞳座標 (Py) に対する光路差を計算します。
! Calculate OPD
DECLARE x, DOUBLE, 1, n_vals # Variables to store OPD data
DECLARE y, DOUBLE, 1, n_vals
FOR i, 1, n_vals, 1
py = 0.04166*i-1.04166
RAYTRACE 0, 0, 0, py, 1
x(i) = py
y(i) = OPDC()
NEXT i
この子マクロでは、次のように、CALLSETDBL
を使用して、配列 x に保存した瞳座標値を親マクロに戻しています。
! Reset values to normalized pupil coordinates and pass them back to parent macro
call_str$ = "This is the string for variable number "
FOR i, 1, n_vals, 1
CALLSETDBL i, x(i)
A$ = call_str$ + $STR(i+50)
CALLSETSTR i, A$
NEXT i
新しい文字列値が親マクロに戻されていることを確認するために、その文字列データもマクロ バッファに格納しています。
子マクロの実行が終了すると、OpticStudio は親マクロに戻り、マクロ バッファの瞳座標値が適切な配列に格納されます。
CALLMACRO CALLMACRO_TEST_CHILD1.ZPL
! Save values passed back from child macro 1
FOR i, 1, n_vals, 1
x(i) = CALD(i)
A$ = $CALLSTR(i)
PRINT A$
NEXT i
つづいて、2 番目の子マクロ (CALLMACRO_TEST_CHILD2.ZPL) を親マクロから呼び出します。
このマクロは、親マクロに戻すデータが瞳座標ではなく、配列 y に保存した OPD のデータであることを除けば、最初の子マクロと同じです。
! Print values passed from parent macro
n_vals = 49
FOR i, 1, n_vals, 1
FORMAT 6.4
PRINT "Doule precision value = ", CALD(i)
FORMAT 2 INT
A$ = $CALLSTR(i)
PRINT A$
NEXT i
! Calculate OPD
DECLARE x, DOUBLE, 1, n_vals # Variables to store OPD data
DECLARE y, DOUBLE, 1, n_vals
FOR i, 1, n_vals, 1
py = 0.04166*i-1.04166
RAYTRACE 0, 0, 0, py, 1
x(i) = py
y(i) = OPDC()
NEXT i
! Reset values to OPD results and pass them back to parent macro
call_str$ = "This is the string for variable number "
FOR i, 1, n_vals, 1
CALLSETDBL i, y(i)
A$ = call_str$ + $STR(i+100)
CALLSETSTR i, A$
NEXT i
この場合も、新しい文字列値が親マクロに戻されていることを確認するために、その文字列データをマクロ バッファに格納しています。
つづいて、親マクロによって OPD の数値データが配列に格納されます。
CALLMACRO CALLMACRO_TEST_CHILD2.ZPL
! Save values passed back from child macro 2
FOR i, 1, n_vals, 1
y(i) = CALD(i)
A$ = $CALLSTR(i)
PRINT A$
NEXT i
最後に、キーワード PLOT
を使用して、瞳座標に対する OPD のデータを親マクロでプロットします。
! Plot data
PLOT NEW
PLOT TITLE, "OPD FOR FIELD POINT 1, WAVELENGTH 1"
PLOT TITLEX, "NORMALIZED PUPIL COORDINATE"
PLOT TITLEY, "OPTICAL PATH DIFFERENCE (WAVES)"
PLOT RANGEX, -1.0, 1.0
PLOT RANGEY, -1.0, 1.0
PLOT DATA, x, y, n_vals, 1, 1, 1
PLOT GO
このキーワードの詳細は、ヘルプ システムの「[プログラミング] (Programming) タブ」→「ZPL について」→「キーワード (ZPL について)」と、ナレッジベースの記事「ZPL で PLOT キーワードを使用する方法」を参照してください。
KA-01473
コメント
サインインしてコメントを残してください。