この記事では、ZPL を使用してユーザー定義ソルブを作成する方法を、2 つの例を引いて紹介します。第 1 の例では、シーケンシャル ファイルの像面が持つ曲率半径が、光学系のペッツヴァール曲率と等価になるようにする ZPL ソルブを作成します。第 2 の例では、ノンシーケンシャル コンポーネント エディタで、他のオブジェクトのパラメータに基づいてオブジェクトの位置を制約する方法について説明します。
著者 Nam-Hyong Kim, updated by Alessandra Croce
ダウンロード
序論
ソルブとは、レンズ データ エディタやノンシーケンシャル コンポーネント エディタなどのエディタで、特定の値を動的に調整する機能です。 たとえば、面の曲率半径、コーニック定数、TCE などにソルブを適用できます。ソルブを配置するセルのソルブ ボックスをクリックすることでソルブを設定します。OpticStudio には、デフォルトのソルブ タイプが数多く用意されていますが、独自のソルブを作成することもできます。Zemax プログラミング言語 (ZPL) を使用することで、このような独自のソルブを実現できます。
ZPL マクロ ソルブは、すべてのエディタで、ほぼすべてのセル (曲率半径、厚み、パラメータ、マルチコンフィグレーションなど) に対して使用できます。他のあらゆるソルブと同様に、エディタでパラメータ セルの右側にある小さいボックスをクリックすることで、ZPL マクロ ソルブにアクセスできます。
ZPL マクロ ソルブでは、ZPL マクロを実行してソルブの値が決まります。この値は、キーワード SOLVERETURN によってエディタに返されます。ソルブを記述したマクロを作成し、<Documents>\Zemax\Macros ディレクトリに保存すると、次のように、ソルブ ウィンドウの [マクロ] (Macro) 設定に、そのマクロの名前を入力できます。
ソルブ ウィンドウで入力するマクロ名では大文字と小文字が区別されないこと、拡張子 (.ZPL) は不要であることに注意します。
マクロ ソルブで目的の機能を実現するには、いくつかのルールに従う必要があります。詳細は、「ヒントと注意事項」を参照してください。
ペッツヴァール曲率のソルブの例
像面の曲率半径を自動的にペッツヴァール曲率と等価な値に設定するソルブが必要であるとします。マクロを作成する前に、そのような目的を達成できる既存のソルブがないか確認する必要があることはいうまでもありません。
ファイル <Documents>\Zemax\Samples\Sequential\Objectives\Petzval.zmx を読み込みます。
作成するマクロ ソルブでは、光学系のペッツヴァール曲率を計算し、その値を OpticStudio に返す必要があります。光学系のペッツヴァール曲率は、最適化オペランド PETC を使用して取得できます。このオペランドは、OPEV() 関数と OCOD() 関数を使用してマクロから直接呼び出すことができます。
- OCOD() は、最適化オペランド タイプに対応する一意の数値コードを取得します。
- OPEV() は、オペランドの値を計算します。この関数の最初の引数には、OCOD() で取得した一意のコードを指定し、それに続いて最適化オペランドの引数を指定します。
今回の例では次のようになります。
キーワード SOLVERETURN を使用してエディタに値を戻していることに注目します。Macros フォルダに、このマクロを PETC.zpl として保存します。曲率のソルブでは、値を曲率半径 (R) ではなく曲率 (1/R) で返す必要があります。その他のソルブは、各値がそのまま返されます。
マクロを適用するには、像面の曲率半径のセルでソルブ ボックスをクリックし、表示されたダイアログの [ソルブ タイプ] (Solve Type) で [ZPL マクロ] (ZPL Macro) を選択します。セルにはマクロ名を入力します。
これで設定は完成です。OpticStudio では、ソルブが自動的に更新され、ZPL マクロ ソルブが有効であることを示す「Z」文字がソルブ タイプのボックスに表示されます。
オブジェクト位置のソルブの例
第 2 の例として、ノンシーケンシャル オブジェクトの終端から 10 mm 後方に別のノンシーケンシャル オブジェクトを配置する必要があるとします。この配置を実現するには、前方のオブジェクトの長さを計算し、この値を使用して後方のオブジェクトを配置する必要があります。
記事の添付資料のノンシーケンシャル ファイルでは、前方のオブジェクトとして矩形複合放物面集光器 (CPC) を使用しています。このオブジェクトに対しては、ノンシーケンシャル コンポーネント エディタ (NSCE) で、最大長がパラメータとして定義されています。このオブジェクト長が必ずこの最大長になるようにすれば、オフセットを設定したピックアップ ソルブを使用するだけでオブジェクト 2 (後方のオブジェクト) を配置できます。しかし、実際の長さは最大長のパラメータ値よりも小さくなる可能性があるので、実際の長さを計算し、その値を使用する必要があります。また、このオブジェクトが矩形 CPC であることから、XZ 断面上と YZ 断面上とで実際の長さが異なることも考えられます。その場合は、2 つの値のうち、小さい方を選ぶ必要があります。これは、マクロ ソルブに最適の問題です。
CPC の長さ "L" は次の式で表すことができます。この式は、ヘルプ ファイルの「[設定] (Setup) タブ」→「[エディタ] (Editors) グループ ([設定] (Setup) タブ)」→「[ノンシーケンシャル コンポーネント エディタ] (Non-sequential Component Editor)」→「ノンシーケンシャル形状オブジェクト」→「複合放物面集光器 (CPC)」に記述されています。
この矩形 CPC オブジェクトでは、長さとして XZ 断面上の値と YZ 断面上の値の 2 つがあります。OpticStudio では CPC の長さとして、2 つの長さの小さい方を取ります。ただし、その長さが [長さ] (Length) パラメータより長い場合を除きます。その場合は、[長さ] (Length) パラメータの値を使用します。したがって、このマクロでは、上式を使用して CPC オブジェクトの XZ 断面上長さと YZ 断面上長さを計算し、2 つの値のうち小さい方を選択します。つづいて、その値に 10 mm のオフセットを加算した値を、矩形オブジェクトの Z 位置パラメータとして返す必要があります。2 つの値の小さい方を選んでも、それが [長さ] (Length) パラメータよりも大きい場合は、[長さ] (Length) パラメータの値に 10 mm のオフセットを加算した値を返します。
ここまで説明した動作を実行するマクロ REC_CPC.ZPL (下図) が、この記事の添付資料に付属しています。
先の例と同様に、キーワード SOLVERETURN を使用して、目的の値を NSCE に戻しています。<Documents>\Zemax\Macros フォルダにマクロを保存し、メイン メニューの [マクロ] (Macro) → [マクロ リストの更新] (Refresh Macro List) をクリックします。
オブジェクト 2 (矩形オブジェクト) の Z 位置パラメータのソルブ ボックスで、[ZPL マクロ] (ZPL Macro) を選択し、マクロ ソルブの名前を入力します。
先の例と同様に、NSCE では、ZPL ソルブが設定されていることを示す「Z」文字がこのパラメータの隣に表示されます。
ファイルに定義された 2 つのコンフィグレーションを切り替える Ctrl+A キーを押すとどのような動作になるかを確認します。矩形 CPC オブジェクトの Y 方向角度パラメータが 20 度と 40 度の間で切り替わり、それに伴ってこのオブジェクトの長さが変化します。このように長さが変化すると、オブジェクト 2 の Z 位置に適用されている ZPL ソルブにより、CPC オブジェクトの後端から必ず 10mm 後方に矩形オブジェクトが配置されるように、矩形オブジェクトの Z 位置が自動的に変化し、目的の動作が得られます。
ヒントと注意事項
マクロ ソルブは汎用性が高く、ほぼあらゆる計算を使用してソルブの値を求めることができます。ZPL でサポートしているすべての関数とキーワードをマクロ ソルブで使用できます。マクロ メニューから実行する ZPL マクロと、ソルブとして実行する ZPL マクロの間には何の違いもありません。ただし、ZPL ソルブを作成する際は、次の点に注意が必要です。
- ZPL のキーワードの多くと一部の関数は、マクロ ソルブでの使用をお勧めできません。たとえば、UPDATE をソルブから呼び出すと、すべてのソルブが更新され、マクロが再び起動するので無限ループに陥ります。他にも、INPUT などのキーワードでは、ソルブが呼び出されるたびにデータ入力が求められるので、実用的ではないことが考えられます。
- ソルブを適用するセルのみが更新されるようにします。マクロで他のセルを更新しないようにします。他のセルを更新すると、光学系が変更される結果になります (たとえば、最適化は実行しないようにします)。
- マクロ ソルブが、エディタの中でそのソルブに続くデータに依存しないようにします。最初にソルブが呼び出された後、それに続く別のソルブによって、最初のソルブの元データが変更されるような場合も、誤ったデータが生成されることがあるからです。
- マクロ ソルブを絞り面より前に設定できるのは、そのマクロによる計算でどの光線データも使用していない場合のみです。詳細は、ヘルプ ファイルの「[プログラミング] (Programming) タブ」→「ZPL について」→「キーワード (ZPL について)」→「SOLVEBEFORESTOP」を参照してください。
- 信頼性と汎用性に優れたソルブにするために、面を参照する必要がある場合は SURC() 関数と SOSO() 関数を使用することをお勧めします。
- SURC() では、面に設定された一意のコメント文字列を使用して、その面を参照します。
- SOSO() では、ソルブが配置されている面やオブジェクトの番号を取得します。
- レンズ データ エディタで [曲率半径] (Radius) のセルに ZPL マクロを使用すると、このパラメータに対するすべてのソルブでは、曲率半径 (R) ではなく、曲率 (1/R) が計算される点に注意が必要です。つまり、曲率半径のパラメータに適用するソルブでは、返される値を曲率半径そのものではなく、その逆数とする必要があります。
- マクロから返されるデータのエラー チェックは、ユーザー側で実施する必要があります。たとえば、マクロで RAYTRACE を呼び出して光線パラメータを評価する場合は、RAYE() を使用して、ビネッティングや TIR などのエラーが発生していないことの確認をお勧めします。エラーが発生した場合はセルに値が返されないように、SOLVERETURN を呼び出さずにマクロが終了するようにします。最適化では、この点が特に重要です。次のコードは、エラー検証の方法を示す例です。
- 一般的に、マクロ ソルブは短く簡潔なものにとどめ、長い計算は避けることをお勧めします。
- 最後に、OpticStudio では、ソルブ マクロの適格性や妥当性が検証されない点に注意が必要です。
KA-01388
コメント
サインインしてコメントを残してください。