この記事では、ZPL で文字列とそれに関連する機能を使用する方法を紹介します。
著者 Andrew Locke
Introduction
Zemax プログラミング言語 (ZPL) は、OpticStudio の標準搭載機能を大幅に強化できる、汎用性に優れたスクリプト言語です。そこに用意されている機能として、文字列変数を対象とした次のような処理があります。
- ガラス、コーティング、コメントなど、数値以外の面データの処理
- ファイル名の変更
- ファイルで使用されているレンズ ユニットの判別
- マクロに文字を繰り返し入力する作業の削減
- データ解析のサマリやプロットに使用するラベルのカスタマイズ
- その他多数の機能
この記事では、ZPL の文字列変数、文字列演算、文字列論理演算子、文字列関数について解説します。
文字列変数
概念上、ZPL の文字列変数は数値変数とほぼ同じです。
主な違いは、数値変数に保存するデータは数値データであり、文字列変数に保存するデータは英数字のテキスト データ (アルファベット文字と数字またはそのいずれか) であることです。文字列変数には、二重引用符を除き、ASCII の記号文字もすべて保存できます。各文字列変数には、最大で 260 文字を保持できます。
文字列変数は、数値変数とまったく同様に宣言できますが、重要な相違点が 1 つだけあります。それは、すべての文字列変数は、その名前の末尾に $ (ドル) 記号を付加する必要があるということです。
たとえば、テキスト "The optimized spot size at surface 9" を文字列変数に代入するとします。この処理を実行するマクロ コマンドは次のようになります。
A$ = "The optimized spot size at surface 9"
リテラル文字列を文字列変数に代入する場合は、その文字列を二重引用符で囲む必要がある点に注意が必要です。
文字列演算と PRINT キーワード
+ (プラス) 演算子を使用して複数の文字列を連結できます。この演算子を使用して、複数の文字列変数、複数のリテラル文字列、これらが混在した複数の文字列を連結できます。リテラル文字列は二重引用符で囲む点に注意します。
以下に、文字列変数とリテラル文字列を連結して、別の文字列変数に代入する例を示します。
units$ = "millimeters"
B$ = "The optimized spot size at surface 9 in " + units$
次のように PRINT キーワードを追加すると、連結した文字列を出力するマクロ コードになります。
units$ = "millimeters"
B$ = "The optimized spot size at surface 9 in " + units$
PRINT B$
これにより下図の出力が得られます。
PRINT キーワードを使用して、文字列変数とリテラル文字列を直接連結することもできます。PRINT コマンドで連結する文字列は、"," (コンマ) で区切ります。PRINT ステートメントでは、文字列の直接連結に "+" 演算子を使用できません。以下に例を示します。
units$ = "millimeters"
PRINT "The optimized spot size at surface 9 in ", units$
このコードの場合も、下図の出力が得られます。
文字列論理演算子
ZPL では、数値変数と同じような方法で文字列変数も評価できます。文字列を比較する論理演算子でも同様です。
注意 : 文字列論理演算子の名前は、すべて先頭が $ (ドル記号) です。
使用可能な論理演算には次の種類があります。
- A$ $== B$ (文字列 A$ と B$ が同じ値である場合に 1 (TRUE) を返します)
- A$ $> B$ (A$ が B$ よりも大きい値である場合に 1 を返します)
- A$ $< B$ (A$ が B$ よりも小さい値である場合に 1 を返します)
- A$ $>= B$ (A$ が B$ 以上の値である場合に 1 を返します)
- A$ $<= B$ (A$ が B$ 以下の値である場合に 1 を返します)
- A$ $!= B$ (A$ が B$ に等しい値ではない場合に 1 を返します)
- A$ $== B$ (returns 1 (true) if the A$ and B$ strings are identical)
2 つの文字列が同じかどうかという比較はわかりやすい判断です。たとえば、テキスト "ABC" の文字列とテキスト "DEF" の文字列があるとします。次のマクロで見るように、これらの文字列が等価でないことは明らかです。
A$ = "abc"
B$ = "def"
PRINT "A = ", A$
PRINT "B = ", B$
IF (A$ $== B$) THEN PRINT "A is identical to B"
IF (A$ $!= B$) THEN PRINT "A is not identical to B"
実行結果は次のとおりです。
一方、比較する 2 つの文字列が同じ場合のマクロは次のようになります。
A$ = "abc"
B$ = "abc"
PRINT "A = ", A$
PRINT "B = ", B$
IF (A$ $== B$) THEN PRINT "A is identical to B"
IF (A$ $!= B$) THEN PRINT "A is not identical to B"
この場合の実行結果は次のとおりです。
大小関係を比較する文字列論理演算子で適用される比較の規則は、実質的に ASCII コードの順番です。"A" は "Z" より小さく、"Z" は "a" より小さく、"a" は "z" より小さい、という規則で続きます。この関係は、以下のマクロからわかります。
A$ = "z"
B$ = "a"
PRINT "A = ", A$
PRINT "B = ", B$
IF (A$ $<= B$) THEN PRINT "A is less than or identical to B"
IF (A$ $>= B$) THEN PRINT "A is greater than or identical to B"
実行結果は次のとおりです。
この比較で重要な点は、2 つの文字列がアルファベット順でどこに位置するかということであり、文字数は無関係です。この点は、次のマクロを実行するとわかります。
A$ = "D"
B$ = "AAAAAAA"
PRINT "A = ", A$
PRINT "B = ", B$
IF (A$ $<= B$) THEN PRINT "A is less than or identical to B"
IF (A$ $>= B$) THEN PRINT "A is greater than or identical to B"
次のような結果が得られます。
文字列関数
文字列関数は、OpticStudio の数値関数に似ています。どちらの種類の関数もデータを返します。基本的な違いは、数値関数は数値データを返し、文字列関数は英数字のデータを返すという点です。数値関数と同様に、各文字列関数では、名前の後ろに開き括弧と閉じ括弧を記述する必要があります。文字列関数によっては、これら 2 つの括弧の中に 1 つ以上の引数を必要とするものがあります。
注意 : 文字列関数の名前は、すべて先頭が $ (ドル記号) です。
文字列関数の多くは、現在読み込まれているレンズ ファイルに関する情報を返すために使用します。文字列関数の中には、その呼び出し元マクロで保存される文字列変数を解析できるものもあります。ZPL で使用可能なすべての文字列関数は、OpticStudio ヘルプ ファイルの「[プログラミング] (Programming) タブ」→「ZPL について」→「文字列関数」で参照できます。
現在読み込まれているレンズ ファイルに関する情報を返す文字列関数の例として $GLASS(i) 関数があります。この関数は、i 番目の面のガラス名を返します。
マクロでは次のように使用します。
A$ = $GLASS(3)
PRINT "The glass on surface 3 is ", A$, "."
OpticStudio のサンプル ファイル {Zemax}\Samples\Sequential\Objectives\Cooke 40 degree field.zmx を読み込み、このマクロを実行すると次のような出力が得られます。
下図のとおり、この出力は、レンズ データ エディタに表示される値と一致しています。
LEFTSTRING(A, n) は、文字列変数データの解析に使用できる文字列関数の好例です。この関数は、文字列の左端から n 個の文字を返します(同様に、文字列の右端から n 個の文字を返す RIGHTSTRING(A, n) もあります)。たとえば、マクロでは次のように使用します。
A$ = "programming"
B$ = $LEFTSTRING(A$,4)
PRINT A$, " becomes ", B$
これにより下図の出力が得られます。
KA-01469
コメント
サインインしてコメントを残してください。