プロシージャ

Igor Pro® の組み込みプログラミング言語を使って、独自のソフトウェアルーチン(または「プロシージャ」)を作成できます。これらのルーチンは「Procedure ウィンドウ」にテキストとして入力します。

procedure window containing examples of Igor's programming language

「Procedure」という名前のメインの Procedure ウィンドウ(これは現在の Igor Pro® エクスペリメントから分離できません)に加えて、作業を整理したり、ユーザー自身や他のユーザーが以前に作成したルーチンを再利用したりするために、追加のプロシージャウィンドウを使用できます。Igor Pro には、WaveMetrics のプログラマーによって作成された約200個のプロシージャファイルが同梱されています。

Igor Pro の組み込みプログラミング言語を使って、組み込み関数やコマンドを呼び出すことができます。これらはかなりの数(約550個)存在します。Help メニューの Command Help 項目はこれらに関する便利なガイドであり、コンテキストヘルプメニューはテンプレートやドキュメントへの迅速なアクセスを提供します。

Procedure ウィンドウには、Igor Pro に次の動作をさせるテキストを含めることもできます。

  • 他のプロシージャファイルを読み込む(「include」する)
  • 定数を定義する
  • 新しいユーザー定義のメニューまたはメニュー項目を定義する

ユーザー定義の関数

ユーザー定義関数は、C 言語、Pascal、あるいは Fortran で記述された関数と非常に似ており、高速化のためにコンパイルされます。

パラメーターと戻り値

関数にはパラメーターと戻り値があります。パラメーターは値渡しまたは参照渡しで渡すことができます。それらは数値、文字列、構造体、あるいはデータの配列(ウェーブ)への参照である場合もあります。パラメーターは必須の場合もあれば、オプションの場合もあります。

指定された数値を超えるデータ値の数を数える簡単な関数は次のとおりです。

xx

ローカル変数とグローバル変数

他のほとんどのプロシージャ言語と同様に、Igor Pro の言語はローカル(または「スタック」)変数(および文字列や構造体)をサポートしており、それらが含まれるルーチンの実行が終了すると消滅します。

上記の例では、パラメーター w と value、およびローカル変数 exceed, i, n は、CountValuesThatExceed 関数の実行中のみ存在します。その後、呼び出し元ルーチン内か、グローバル変数として割り当てられている場合はグローバル領域に、戻り値のみが存在します。例えば:

Variable/G gCount= CountValuesThatExceed(wave0,100)

返された超過値であるグローバル変数 gCount を作成します。gCount はコマンド実行終了後も存在し続け、Igor Pro の データブラウザー で確認できます。

参照渡しされるパラメーター

Igor Pro では、データの配列は常にグローバルオブジェクトです。それらは常に、ローカルな「ウェーブ参照」パラメーターとして参照渡しでルーチンに渡されます。上記の例では、w がそのようなウェーブ参照パラメーターです。

その他の種類のパラメーターは、C++ から借用した規約を用いて参照渡しと明示的に宣言されない限り、値渡しで渡されます。

Function CountTwoThings(w, thing1, thing2)
    Wave 1
    Variable &thing1, &thing2
    
    thing1=0; thing2=0
    if( ... )
        thing1 += 1
    endif
    if( ... )
        thing2 += 1
    endif
End

CountTwoThings が呼び出されたとき:

Variable loc1, loc2 // two local variable in the calling routine
CountTwoThings(aWave, loc1, loc2)

呼び出しルーチンにおける loc1 と loc2 の値は、CountTwoThings によって変更されます。この動作は、ほとんどの Fortran プログラマーにとっては馴染み深いものです。

CountTwoThings 内の & 文字がない場合、loc1 と loc2 は値渡し(CountTwoThings内にコピー)され、そのルーチン内の代入やインクリメントの影響を受けません。

フロー制御コマンド

Igor Pro 言語は、標準的な現代的なフロー制御構文の多くと、その他いくつかの構文を備えた、より「構造化」されていないプロシージャ型言語です。以下にいくつかの例を示します:

do-while
    do
        thesum += wave[i];
        i += 1;
    while( i < n )
for-endfor
    for( j=0; j < n*2; j += 2 )
        thesum += wave[j];
    endfor
if-elseif-endif
    if ( i < j )
        val = j - i;
    elseif( i > j )
        val = i - j;
    else
        val = 0
    endif
strswitch-case-endswitch ("文字列スイッチ")
    strswitch(ctrlNameString)
        case "revert"// literal string or string constant
            val= 2
            break   // without this execution "falls through" to val=1
        case "okay":
            val= 1
            break
        default:
            val= 0
            break
    endswitch
switch-case-endswitch ("数値スイッチ")
    switch(num-1)
        case 0:         // literal number
        case kMyConstant:   // Constant kMyConstant =<some value>
            val= 1
            break
        default:
            val= 2
            break
    endswitch
try-catch-endtry
    try
        // test denominator
        if( denominator==0 )
            AbortOnRTE      // this is like C++´s "throw"
        endif
        // use denominator
        val= numerator / denominator
        ...
    catch
        // denominator must have been 0
        val=NaN
    endtry

構造体

独自の構造体を定義し、関数間で渡すことができます。構造体メンバーの使用構文は C 言語と類似しています。構造体には数値、文字列、文字配列、および部分構造体を格納できます。さらに、Igor Pro には WMButtonAction のような事前に定義された構造体が存在します。この簡単なコーディング例では、Igor Pro の構造体が文字列との間で変換可能であることも示しています:

// A window proc that creates a user-defined panel
// with two buttons named b0 and b1.
Window DemoStructuresPanel() : Panel
    PauseUpdate; Silent 1       // building window...
    NewPanel /W=(343,91,561,138)
    Button b0,pos={26,12},size={50,20},proc=ButtonProc,title="Click"
    Button b1,pos={130,12},size={50,20},proc=ButtonProc,title="Click"
EndMacro
 
// Defines a custom structure
Structure mystruct
    Int32 nclicks
    double lastTime
EndStructure
 
// The function which runs when Button b0 or b1 are clicked.
Function ButtonProc(bStruct) : ButtonControl
    STRUCT WMButtonAction &bStruct  // Igor-defined structure, passed by reference.
    
    if( bStruct.eventCode != 1 )
        return 0        // we only handle mouse down (code=1)
    endif
 
    STRUCT mystruct s1          // local user-defined structure
    if( strlen(bStruct.userdata) == 0 ) // button hasn't had userdata initialized
        print "first click on " + bStruct.ctrlName
    else
        // button has a structure packed into its userdata.
        StructGet/S s1,bStruct.userdata // unpack structure from userdata string.
        Variable lastTime= s1.lastTime  // get a value from the structure.
        String ctime= Secs2Date(lastTime, 1 )+" "+Secs2Time(lastTime,1)
        printf "button %s clicked %d time(s), last click = %s\r",bStruct.ctrlName,s1.nclicks,ctime
    endif
    s1.nclicks += 1         // update the structure members
    s1.lastTime= datetime       // seconds since Jan 1, 1904.
    StructPut/S s1,bStruct.userdata // pack structure s1 into string inside struct bStruct.
    return 0
End

そしてこれが結果として得られたユーザーインターフェイスです:

panel with two buttons labeled "Click" and the print output displayed when they are clicked

ベクトルと配列の演算

Igor Pro プログラミング言語では、標準的なプログラミング言語で1つの変数に値を代入するのと同じように、データセット全体またはその部分集合に対して代入文を記述できます:

Make/O/N=1000 data  // a vector ("wave") to hold 1000 values.
data = sin(2*pi*p/1000) // assigns to each element of data. p iterates from 0 to 999.
Display data

graph showing one cycle of sine wave

配列の一部のみを変更する例を以下に示します:

data[0,499] = data[p]*data[p]   // replace first 500 values with sqrt(value).

graph showing one cycle of sine wave

その他の例については、データ演算を参照してください。

#include

Igor Pro は C 言語と同様の「include」メカニズムを通じてコードの再利用を促進します。

例えば、任意の Procedure ウィンドウに次のステートメントを入力するだけで:

#include  <Multipeak Fitting>

Igor Pro は、Multipeak Fitting パッケージをあなたの Igor エクスペリメントに追加します:

peak fitting interface created by the Multipeak Fitting Package このパッケージは、Igor Pro に同梱されている WaveMetrics Procedures フォルダー内に保存された複数の事前作成済みプロシージャファイルで構成されています。Multipeak Fitting.ipf プロシージャファイル自体には、その機能をサポートする他のプロシージャファイルが含まれています:

procedure file containing commands to #include code from additional procedure files.

この方法で自身のプロシージャを再利用できますが、構文が少し異なります:

#include "MyProcedureFile"

「MyProcedureFile.ipf」という名前のプロシージャファイルを、「User Procedures」フォルダー(Documents\WaveMetrics\Igor Pro User Files フォルダー内にあります)から読み込みます。

定数

プログラムコードを見て、なぜ特定の「マジックナンバー」が使われているのか疑問に思ったことはありませんか?

Sleep/T 7200    // an unexplained "magic" number
Sleep/T 60*60*2 // perhaps a little clearer

適切に命名された定数を使うことで、保守しやすいコードを書くことができます:

Constant kTicksPerSecond=60
Constant kSecondsPerMinute=60
Constant kMinutesToWait=2
 
Sleep/T kTicksPerSecond*kSecondsPerMinute*kMinutesToWait

(定数を使うもう一つの利点は、コード内の複数の場所で同じ値を使用する必要がある場合です。値が必要な箇所にすべて定数名を使用しておけば、後でその値を変更する必要が生じた時、定数の定義を変更するだけで、使われているすべての箇所の値を一括変更できます。これは、例えば「1」が「2」に変更すべき箇所を特定するためにコードをくまなく探さなければならない状況よりも優れています。)

Igor Pro には文字列定数もあり、定数定義を「static」にすることで、それらが定義されたプロシージャファイル内でのみプライベートになります:

Static StrConstant ksPrefsFileName="MyPrefs.txt"

ユーザー定義のメニュー

Igor Pro のメニューには、Procedure ウィンドウにメニュー定義を記述することで追加できます。例えば、上記で示した Multipeak Fitting.ipf ファイル内の「Analysis」メニュー定義を参照してください。

SetIgorMenuMode コマンドを使って Igor Pro の標準メニューを有効化または無効化することもできます。また、ShowIgorMenus および HideIgorMenus コマンドで組み込みメニューを表示または非表示にできます。

また、PopupContextualMenu コマンドを使って、グラフ、テーブル、パネル、レイアウトウィンドウにコンテキストメニューをプログラムで追加したり、Igor Pro の組み込みコンテキストメニューの多くにメニュー項目を追加したりすることもできます。

これらの機能により、アプリケーションに合わせて Igor Pro をカスタマイズしたり、カスタマイズしたアプリケーションのユーザーが気にしなくてよい Igor Pro の機能を無効にしたりできます。

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More