■DocFileオブジェクトの例■
例1:: 演算の例
以下の例は、データファイルを開き、その最初のフレームを2倍した値を持つ画像を表示します。なお、VBScriptでは動作しません(後述)。
Dim theFrame As Variant ' Array that holds the image
Dim dx As New WINX32Lib.DocFile
Dim theFrame2 As Variant ' Array that holds the image
Dim dx2 As New WINX32Lib.DocFile
Dim bRes As Integer
' 最初に計算用のデータを開く
dx.Open "D:\temp\sample.spe"
Xdim = dx.GetParam(DM_XDIM) ' get the document x dimension
Ydim = dx.GetParam(DM_YDIM) ' get the document y dimension
' 1 フレーム目を取得
dx.GetFrame 1, theFrame ' retrieve 1 image
' 計算用のイメージを開く
dx2.Open "", Xdim, Ydim, 1, 4, "temp" ' double floating type
' 1 フレーム目を取得
dx2.GetFrame 1, theFrame2 ' retrieve 1 image
'****************************************
' 実際の計算部分
'****************************************
For i = 0 To (Ydim - 1) 'Loop through y dim
For j = 0 To (Xdim - 1) ' Loop through x dim
theFrame2(j, i) = theFrame(j, i) * 2
Next j
Next i
dx2.PutFrame 1, theFrame2
dx2.Update
拡張子をbasとしてセーブし実行します。同様な事はVBScriptでも可能で、以下に例を示します。Option Explicit 'Strict
Dim dx1
Set dx1 = CreateObject("WinX32.DocFile")
Acquisition(dx1)
CalcSub(dx1)
Sub Acquisition(ByRef dx1)
Dim dx2, Exp1, xdim, ydim, zdim, strMsg
Set Exp1 = CreateObject("WinX32.ExpSetup")
Exp1.Start(dx1)
Exp1.WaitForExperiment ' Wait for collection to complete
End Sub
Sub CalcSub(ByRef dx1)
Dim temp
Dim dx2, Exp1, xdim, ydim, zdim, strMsg, i, j
Dim datatype
xdim=dx1.GetParam(6) 'DM_XDIM
ydim=dx1.GetParam(7) 'DM_YDIM
zdim=dx1.GetParam(24) 'DM_NUMFRAMES
datatype=dx1.GetParam(9) 'DM_DATATYPE
strMsg = CStr(xdim) & "x" & CStr(ydim) & "x" & CStr(zdim) & "のデータを2倍します"
Wscript.Echo strMsg
' 新しいデータファイルを開く
' ディメンジョンはdx1と同じ
' ファイル名は"temp"
Set dx2 = CreateObject("WinX32.DocFile")
dx2.Open "", xdim, ydim, zdim, datatype, "temp"
'****************************************
' 実際の計算部分
'****************************************
For i = 0 To xdim 'Loop through x dim
For j = 0 To ydim ' Loop through y dim
temp=2*dx1.GetPixel(1, j, i)
dx2.PutPixel 1, j, i, temp
Next
Next
dx2.Update
End Sub
ただし、実際に動作させて見ると、非常に遅い事がわかると思います。これは、ピクセルの値を毎回WinSpecに問い合わしているためで、先のVisual Basic版では、フレームごとデータを取得しているため高速に動作するのです。つまり、マクロを高速で動作させるには、WinSpecとの通信オーバーヘッドを減らす事が重要になります。(著者はVisual Basicに精通していないのですが、Visual Basicの例では1フレームのデータを配列で一度に取得している。VBScriptでは、こうした事は出来ない様に思われます。)
例2:ポンプ-プローブの例
白色光吸収スペクトルを測定するプログラム(ポンプ-プローブ)を示します。TTLポートの1番に外部シャッターを接続し、そのシャッターでポンプ光を遮断した時のスペクトルと開いた時のスペクトルの除算(透過率)を表示するプログラムです。演算速度の問題からVisual Basicでの記述としております。
Dim theFrame1 As Variant Dim theFrame2 As Variant Dim ex As New ExpSetup Dim dx1 As DocFile Dim dx2 As DocFile Dim bRes As Integer Dim filename1 As Variant Dim filename2 As Variant Dim ttl As Variant filename1 = "Io" filename2 = "I" ttl = &H0 ex.SetParam EXP_TTL_LINES, ttl ex.SetParam EXP_DATFILENAME, filename1 If ex.Start(dx1) Then ex.WaitForExperiment dx1.GetFrame 1, theFrame1 ex.SetParam EXP_DATFILENAME, filename2 ttl = &H1 ex.SetParam EXP_TTL_LINES, ttl If ex.Start(dx2) Then ex.WaitForExperiment dx2.GetFrame 1, theFrame2 '以上でデータの取得は終了 For i = LBound(theFrame1, 2) To UBound(theFrame1, 2) For j = LBound(theFrame1, 1) To UBound(theFrame1, 1) If theFrame1(j, i) > 0 Then theFrame2(j, i) = theFrame2(j, i) / theFrame1(j, i) Else theFrame2(j, i) = 0 End If Next Next dx2.PutFrame 1, theFrame2 dx2.Update End If End If
また、更にTTLポートの3番を使用してパルスを送ってステージを動作させる事を想定したサンプルプログラムも用意しています。こちらは、下のVC++での例と同様、TTLポートの1番と2番に外部シャッターを接続し、1番のシャッターでプローブ光(白色光)を、2番のシャッターでポンプ光をコントロールし、ダークも自動的に測定します。さらに、CCD素子のビニング(グルーピング)がしてあるとして(もしくはDual PDAを使用して)、上の領域に試料を通過するスペクトルを、下の領域でサンプルを通過しない参照スペクトルを取得して、白色光の揺らぎを抑える事が出来るように作成してあります。