ログイン    検索  



新しいトピックを投稿する トピックへ返信する  [ 6 件の記事 ] 
作成者 メッセージ
 記事の件名: C によるエクステンションの作成方法
 投稿記事 Posted: 2009年5月22日(金) 16:13 
管理人

登録日時: 2008年8月01日(金) 16:43
記事: 136
はじめに
ZEMAXは他のWindowsプログラムがZEMAXとコミュニケーションリンクを確立し、そのプログラムがZEMAXからレンズに関するデータを取得することのできる非常に強力な機能を提供しています。これはエクステンションと呼ばれます。概念としては光学系の作成やその光線追跡にはZEMAXを使い、そのデータを他のプログラムに送り、更なる解析や計算を行うということです。

アプリケーションとZEMAX間のコミュニケーションはDynamic Data Exchange (DDE)を使っておこなわれます。DDEはプログラム間でのデータの共有のために定義されているWindowsオペレーティングシステムで定義されているプロトコル(手順)です。二つのプログラムがDDEリンクを確立でき、一つのプログラムが“サーバー“として、他方が”クライアント“として動作します。クライアントは通常サーバーから特定のデータを要求し、サーバーはデータをクライアントに返します。ZEMAXはサーバーとなり、あらゆるWindowsプログラムは的確な修正によりクライアントとなることができます。

WindowsのDDEプログラミングが苦手な方には向かないことは明らかです。なぜなら、DDEプログラミングにはかなり高度なプログラミングスキルとメッセージループ、DDE、ポインター、アトム、そしてグローバルハンドルにかなり精通していなければなりません。しかしZEMAXとの通信に使用されるほとんどのコードはあらゆるDDEクライアントプログラムに共通の標準"boiler plate(ボイラープレート)"コードです。このコードの全ては既に書きこまれており、ZCLIENTという単一ソースコードモジュールプログラムに集約されています。ZCLIENTはソースコード形式でZEMAXと共に提供され、(著作権が維持される限り)自由にコピーして新たなエクステンションの中で使用することができます。

ZCLIENTはZEMAXとの全ての通信を透過的に取り扱います。ZCLIENTに埋め込まれているのは"UserFunction"という名前の単一関数への呼び出しです。この関数はユーザーが用意する別のCプログラムで挿入され、ZCLIANTと共にコンパイルされてエクステンション実行ファイルを形成します。

このトピックはZCLIANTを使ってユーザー記述のCプログラムをZEMAXにリンクする簡単な"hello world"プログラムの作成法を説明します。このプログラムはZEMAXからひとつの情報(現在ロードされているファイルの名前)を取り出し、そのファイルにひとつの変更を加えて(フィールド点3番に(x=20, y=20)の値をもたせる)情報の受信とコマンドの送信をデモンストレーションします。

重要点:作成するアプリケーションプログラムはZEMAXのグラフィカルインタフェースに表示されているのと異なるファイルに作用させることができます。もしそのプログラムがレンズデータを変更し、その変更されたデータをグラフィックインタフェースで観察したい場合、アプリケーションが作用するレンズデータをZEMAXの正規ユーザーインタフェースに“Push”する必要があります。その方法はこのトピックに説明があります。しかしながらこれを可能にするためFile -> Preferences -> Editors での設定が必ず必要です:
添付ファイル:
Hello0[1].gif
Hello0[1].gif [ 13.57 KiB | 表示回数: 968 回 ]


アプリケーションで、現在開かれているZEMAXセッションのエディタや解析ウインドウのデータを変更したい場合、“Allow Extensions To Push Lenses”をチェックしなくてはなりません。
このコントロールはエクステンションプログラムによる現在のユーザーインタフェースのデータの偶発的な消去を避けるために提供されています。


トップへ 
   
 
 記事の件名: DDEは会話
 投稿記事 Posted: 2009年5月22日(金) 16:18 
管理人

登録日時: 2008年8月01日(金) 16:43
記事: 136
DDEは会話
作成したプログラム(このトピックではクライアントと呼びます)とZEMAX(このトピックではサーバーと呼びます)との間のコミュニケーションを理解する最も簡単な方法はこれを二つのプログラムの会話とみなすことです。クライアントはサーバーに文字列を送り、サーバーはその文字列の内容によって他の文字列を返します。

クライアントによって送られる文字列はデータアイテムと呼ばれます。データアイテムの例はZEMAXに現在のファイル名を取得するように指示する文字列“GetName”です。たとえばサンプルファイル{zemaxroot}/samples/sequential/objectives/Cooke 40 degree field.zmxをロードするとそのファイルが、タイトル“A simple cooke triplet”を持つことがわかります:
添付ファイル:
general.gif
general.gif [ 10.84 KiB | 表示回数: 966 回 ]


ZEMAXには“Command Line Interface”という名称のサンプルエクステンションプログラムが付属し、“Extensions”メニューに保存されています。このプログラムを実行してGetNameとタイプすると次のような出力を観察することができます:
添付ファイル:
cli.gif
cli.gif [ 9.23 KiB | 表示回数: 971 回 ]


コマンドラインインタフェースプログラムはVisualBasicで書かれた簡単なユーティリティです。{zemaxroot}/extend/Visual Basicフォルダに全ソースコードが提供されています。しかしながら原理は簡単で:プログラムがコマンド(データアイテム)を送信し、ZEMAXが回答します。ZEMAXマニュアルのExtensions章にデータアイテムとそれらに対する回答の全詳細が説明されています。


トップへ 
   
 
 記事の件名: Hello World
 投稿記事 Posted: 2009年5月22日(金) 16:25 
管理人

登録日時: 2008年8月01日(金) 16:43
記事: 136
Hello World
このトピックの最後でファイル Hello World.c をダウンロードできます。これは単純なCプログラムです。以下はこのプログラムのヘッダーです:
添付ファイル:
inside1[1].gif
inside1[1].gif [ 28.39 KiB | 表示回数: 960 回 ]


このコードは提供されているエクステンション サンプル ファイルからそのままコピーしたもので、ZEMAXと通信するために作成する全てのCプログラムに含まれなくてはなりません。プログラムの残りの部分は大変シンプルです:
添付ファイル:
inside2[1].gif
inside2[1].gif [ 23.93 KiB | 表示回数: 959 回 ]


関数はUserFunctionという名称でなくてはなりません。通信は関数PostRequestMessageによって実行され、データアイテムがZEMAXに伝えられ、ZEMAXからの回答を含む文字列変数szBufferを受け取ります。通信の管理に必要な作業はZEMAXと共に提供される{zemaxroot}/Extend フォルダにあるZCLIENT.cで実行されます。

ZCLIENTはZEMAXとの全ての通信を透過的に取り扱います。ZCLIENTに埋め込まれているのはUserFunctionという名称の単一関数の呼び出しです。この関数はユーザーが提供する別のCプログラムで、ZCLIENTと共にコンパイルされ、エクステンション実行ファイルを生成します。ZEMAXがエクステンションを呼び出すと、実行はZCLIENT内でなされます。ZCLIENTはDDEコミュニケーションを確立してUserFunctionを呼び出し:これが作成プログラムがUserFunctionという名称の関数を含んでいなければならない理由です。

この特定のプログラム内では、データアイテムをPostRequestMessage によってZEMAXに送信し、ZEMAXからの回答を表示するためにWindows Message Box を開きます。


トップへ 
   
 
 記事の件名: プログラムのコンパイル
 投稿記事 Posted: 2009年5月22日(金) 16:36 
管理人

登録日時: 2008年8月01日(金) 16:43
記事: 136
プログラムのコンパイル方法
Microsoft Visual C++ version 6 でこのプログラムをコンパイルしてみましょう。コンパイラの使用方法の説明は Microsoft Visual Studio 2005 を使用したエクステンションのコンパイル方法のトピックを参照してください。http://www.prolinx.co.jp/zemaxforum/viewtopic.php?f=23&t=485&sid=069770c0bcf2240c9435943aad0a9534
他のコンパイラも同様に動作するはずですが、ZEMAX Developmemt社で特定のコンパイラに関するテクニカルサポートを提供することはできませんので、予めご了承ください。

Visual C++を開き、File...Newをクリックします:
添付ファイル:
Hello1[1].gif
Hello1[1].gif [ 13.59 KiB | 表示回数: 947 回 ]


Projects listから“Win32 Application”を開き、プロジェクトに名前を付けます。ここでは“Hello World”としています。OKを押し、empty projectを選択します:
添付ファイル:
Hello2[1].gif
Hello2[1].gif [ 10.93 KiB | 表示回数: 948 回 ]


Project Explorer を FileView に変更し、Source Files上で右クリックし、Add Files to Folder...を選択します
添付ファイル:
Hello3[1].gif
Hello3[1].gif [ 18.49 KiB | 表示回数: 950 回 ]


プロジェクトにファイルhello world.c とzclient.c を加えます。Hello World.c はこのトピックの最後からダウンロードでき、zclient.cは{zemaxroot}/Extendにあります。
添付ファイル:
Hello4[1].gif
Hello4[1].gif [ 13.9 KiB | 表示回数: 947 回 ]


プログラムをコンパイルするため、Build -> Build Hello World.exeをクリックします。エラーや警告無しにコンパイルするはずです。
添付ファイル:
Hello5[1].gif
Hello5[1].gif [ 28.16 KiB | 表示回数: 951 回 ]


ZEMAXが実行されていること、エクステンションがレンズをプッシュすることを許可していること(このトピックの最初のページをご参照ください)を確認します。サンプルファイル{zemaxroot}/samples/sequential/objectives/Cooke 40 degrees field.zmx をロードします。プロジェクトフォルダにコンパイルされたworld.exe があり、これを単にダブルクリックすれば実行されます(またはVisual C++ではcntl-F5を押します)。次のメッセージボックスが現れるはずです。:
添付ファイル:
Hello6[1].gif
Hello6[1].gif [ 4.09 KiB | 表示回数: 948 回 ]

添付ファイル:
Hello7[1].gif
Hello7[1].gif [ 5.87 KiB | 表示回数: 948 回 ]

添付ファイル:
Hello8[1].gif
Hello8[1].gif [ 3.63 KiB | 表示回数: 945 回 ]


これで作成したエクステンションがZEMAXとの会話に成功しました。


トップへ 
   
 
 記事の件名: 何がおきているか
 投稿記事 Posted: 2009年5月22日(金) 16:52 
管理人

登録日時: 2008年8月01日(金) 16:43
記事: 136
何がおきているか
再びプログラムに戻ります:
添付ファイル:
inside2[1].gif
inside2[1].gif [ 23.93 KiB | 表示回数: 936 回 ]


データアイテムであるGetNameを送信するためにPostRequestMessageを使っています。(注:データアイテムは大文字小文字を区別して認識します。)ZEMAXの回答は文字列szBufferに保存されます。そしてszBufferをWindowsの標準メッセージボックスに印字しています:
添付ファイル:
Hello6[1].gif
Hello6[1].gif [ 4.09 KiB | 表示回数: 938 回 ]


これでZEMAXからデータの取得に成功しました。次にデータアイテムSetFieldを送信し、フィールドポイント3をx= 20, y=20, weight=1, vignetting factors = 0に変更します。この場合、ZEMAXは更新されたフィールドポイント3の設定で応答し、うまく実行されたことを示します。:
添付ファイル:
Hello7[1].gif
Hello7[1].gif [ 5.87 KiB | 表示回数: 935 回 ]


しかしこの変更はレンズファイルのコピーに対しておこなわれます。 この変更を、ユーザーインタフェースを通して観察するため、更新されたファイルをユーザーインタフェースに“push”する必要があります。これは3つめのコマンドPushLens, 1 で行います(1は、開いている全ての解析ウインドウの更新も行います)。結果として今度は、フィールドダイアログは次のように表示されます:
添付ファイル:
Hello9[1].gif
Hello9[1].gif [ 17.56 KiB | 表示回数: 936 回 ]


したがって、ZEMAXに動作の実行を指示させるためには単に関連するデータアイテムを送るだけですみますが、そのアクションの結果を通常のインタフェースで観察するためには、PushLensコマンドも送る必要があります。


トップへ 
   
 
 記事の件名: よくある問題
 投稿記事 Posted: 2009年5月22日(金) 16:59 
管理人

登録日時: 2008年8月01日(金) 16:43
記事: 136
よくある問題
エクステンション作成でよく犯す間違いは、エクステンションにレンズの“Push”の許可を与え忘れることです:
添付ファイル:
Hello0[1].gif
Hello0[1].gif [ 13.57 KiB | 表示回数: 937 回 ]


他のよくある間違いはエクステンションがエディタにロードされているファイルのコピーを参照することと、したがって現在ロードされているファイルだけに限定される理由がないことを忘れることです:LoadFileデータアイテムでユーザーインタフェースで何が編集されているかにかかわらず任意のファイルをロードするのに使用できます。事実、任意の数のDDEクライアントがいつでもZEMAXと通信でき、その間ユーザーは通常のキーボードとマウスグラフィックインタフェースでZEMAXを使っていることができます。エクステンションプログラムの結果を観察したいときだけPushLensコマンドを送信する必要があります。

よく見落とされるエクステンションの能力に、zclientへの単一の呼び出しを使うことによって、ZEMAXで既にサポートされている解析機能からテキストとグラフィックデータファイルを作成できるという項目があります。たとえばスポットダイアグラムのテキストリストを作成するには以下のコマンドを使用します。

PostRequestMessage("GetTextFile, \”C:\\OUTPUT.TXT\”, Spt, , O", szBuffer);

スポットダイアグラムデータは指定されたディレクトリの“OUTPUT.TXT”に置かれます。詳細についてはマニュアルのExtention章にある“GetTextFile””GetMetaFile”をご覧ください。しかしそのような計算にどれくらい時間がかかるものかを事前に知る手立てはありません。前述したようにDDEは会話をモデリングしていて、もしサーバーがある時間(タイムアウト期間)内にクライアントの要求に応答しない場合、DDEコマンドは失敗したとみなされます。ZCLIENT内の32行目で、タイムアウト期間がデフォルトで5000ミリ秒と設定されています:

#define DDE_TIMEOUT 5000

これは容易に希望の値に変更して再コンパイルすることができます。


添付ファイル:
hello_world.c [1.97 KiB]
ダウンロード回数: 55 回
トップへ 
   
 
期間内表示:  ソート  
 
新しいトピックを投稿する トピックへ返信する  [ 6 件の記事 ] 


 
トピック投稿: 不可
返信投稿: 不可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
cron