コプトン光学設計(ロゴ)

レンズ設計・製作、技術・ノウハウ移転サポート

コプトン光学設計コプトン光学設計




設計者コラム

#006 ZEMAXマクロの作成(01)

前回の更新から随分日数が経過してしまいました。
ご覧いただいている方から、『全然更新してない』とのご意見を頂いたこともあり、心機一転頑張って更新していきたいと思います。

さて今回は私が光学設計に使用しているZEMAX OpticStdioというソフトについてお話ししたいと思います。
ZEMAXには標準的に使われる機能が満載で、いまだに使ったことのない機能も沢山あります。
その反面、何か特定の目的の設計や評価を行う際には標準機能では不足する面もあります。
それを埋める一つの方法がマクロと呼ばれている機能で、ユーザーがZEMAX用のマクロ言語を使用して何かの機能を実現するプログラムを書くわけです。

マクロ、と一括りに呼ばれることも多いのですが大まかに、

①バッチ処理
②設計指標
③ソルブ

の三つが実現可能です。
①は手間のかかる計算を一気に行います。
例えばZEMAXで求められる色々な数値をあちらこちらから求め、それを元に計算する作業を繰り返すことを想像してみてください。
面倒くさいし、間違いが入り込む可能性もあります。
バッチ処理はこのような定型作業を行うのにうってつけの機能です。

②はメリットファンクションに記入できるオペランドのようなモノです。
標準で色々なオペランドが用意されていて、大抵はこれを組み合わせることで設計を進めることが可能ですが、何もオペランドが用意されていないような何かを指標に設計を進めるとなると結構面倒ですよね。
そのような場合はある程度最適化を進めて、その指標を確認し、また最適化を繰り返すという面倒なことになりがちです。
もし通常のオペランドのようにメリットファンクションに記述が可能であれば普通に最適化を進めることが可能になるので便利ですよね。
例えばZEMAX標準で用意されていない、社内で独自に定義している何かの指標を使って最適化するといったケースに適用可能です。

今回は①バッチ処理のお話をすることにします。
ZEMAXマクロ言語は他のコンピューター言語をかじったことのある方でしたら割に簡単だと思います。
但し、

・構造体やポインタといった高度な変数はありません。
・変数は使用宣言なしで使用可能です。
・配列の添え字は1から始まります。

といった制限?があるので要注意です。
特にポインタ変数が使用できないのは文字列操作が難しくなるため結構厄介です。

マクロの作成には普通のテキストエディタがあればOKです。
私はサクラエディタやMeryといったテキストエディタを使用しています。
マクロのファイルを保存する場合には文字コードに注意してください。『Unicode』や『UTF-16LE』を選択する必要があります。
また保存場所も決まっていて、

C:\Users\”ユーザ名”\Documents\Zemax\Macros

に拡張子zplで保存する決まりになっています。
上記パスの”ユーザ名”の部分はログイン名に置き換えて下さいね。

一旦、マクロファイルを保存してしまえばZEMAXを再起動するかメニューの『マクロ』から『マクロリストの更新』を選択すれば今保存したマクロファイルが選択できるようになります。
macro_menu

それでは実際にマクロファイルを書いていきましょう。
今回は本当に簡単ですけど、レンズ系の焦点距離とFナンバーを表示するマクロを作ります。

焦点距離、Fナンバー共に"getsystemdata"というコマンドで取得することが可能です。
getsystemdataは他にも色々なデータを取得することが可能ですが詳細はマニュアルをご覧ください。
またgetsystemdataは呼び出しを受けると、ベクターと呼ばれるZEMAXの内部配列変数に自動的にデータを格納します。
焦点距離は配列添え字7、Fナンバーは配列添え字8に自動的に数値が格納されます。
これをprint文で表示して終了です。以上の流れをマクロ言語に置き換えると以下のようになります。

====== ここから ======
# 焦点距離とFナンバー
# システム情報取得
getsystemdata 2
# 焦点距離
fl  = vec2(7)
# Fナンバー
fno = vec2(8)
print “焦点距離=“, fl
print “Fナンバー= “, fno
====== ここまで ======

# で始まる行はコメント行なので何を書いても自由です。プログラムの流れには影響しません。
getsystemdata 2
は内部配列vec2に諸々のデータを格納せよ、という命令です。

上で説明したように配列添え字7には焦点距離、8にはFナンバーが入っていますので
fl   = vec2(7)
fno = vec2(8)
はそれぞれflという変数とfnoという変数に焦点距離とFナンバーの値を代入しています。

最後の、
print “焦点距離=“, fl
print “Fナンバー= “, fno
の部分はprint文で数値の表示を行っています。

如何でしょうか?
結構簡単だな、と思われたのではないでしょうか。
今回のマクロは簡単なこともあり、簡単に標準機能で計算・表示が可能な指標ですのでわざわざマクロにする必要もない事例ですがマクロ作成の雰囲気は感じて頂けたと思います。
次回以降、他の事例もご紹介していきたいと思います。