■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を使用して)、上の領域に試料を通過するスペクトルを、下の領域でサンプルを通過しない参照スペクトルを取得して、白色光の揺らぎを抑える事が出来るように作成してあります。