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

「Procedure」という名前のメインの Procedure ウィンドウ(これは現在の Igor Pro® エクスペリメントから分離できません)に加えて、作業を整理したり、ユーザー自身や他のユーザーが以前に作成したルーチンを再利用したりするために、追加のプロシージャウィンドウを使用できます。Igor Pro には、WaveMetrics のプログラマーによって作成された約200個のプロシージャファイルが同梱されています。
Igor Pro の組み込みプログラミング言語を使って、組み込み関数やコマンドを呼び出すことができます。これらはかなりの数(約550個)存在します。Help メニューの Command Help 項目はこれらに関する便利なガイドであり、コンテキストヘルプメニューはテンプレートやドキュメントへの迅速なアクセスを提供します。
Procedure ウィンドウには、Igor Pro に次の動作をさせるテキストを含めることもできます。
- 他のプロシージャファイルを読み込む(「include」する)
- 定数を定義する
- 新しいユーザー定義のメニューまたはメニュー項目を定義する
ユーザー定義の関数
ユーザー定義関数は、C 言語、Pascal、あるいは Fortran で記述された関数と非常に似ており、高速化のためにコンパイルされます。
パラメーターと戻り値
関数にはパラメーターと戻り値があります。パラメーターは値渡しまたは参照渡しで渡すことができます。それらは数値、文字列、構造体、あるいはデータの配列(ウェーブ)への参照である場合もあります。パラメーターは必須の場合もあれば、オプションの場合もあります。
指定された数値を超えるデータ値の数を数える簡単な関数は次のとおりです。

ローカル変数とグローバル変数
他のほとんどのプロシージャ言語と同様に、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
そしてこれが結果として得られたユーザーインターフェイスです:

ベクトルと配列の演算
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

配列の一部のみを変更する例を以下に示します:
data[0,499] = data[p]*data[p] // replace first 500 values with sqrt(value).

その他の例については、データ演算を参照してください。
#include
Igor Pro は C 言語と同様の「include」メカニズムを通じてコードの再利用を促進します。
例えば、任意の Procedure ウィンドウに次のステートメントを入力するだけで:
#include <Multipeak Fitting>
Igor Pro は、Multipeak Fitting パッケージをあなたの Igor エクスペリメントに追加します:
このパッケージは、Igor Pro に同梱されている WaveMetrics Procedures フォルダー内に保存された複数の事前作成済みプロシージャファイルで構成されています。Multipeak Fitting.ipf プロシージャファイル自体には、その機能をサポートする他のプロシージャファイルが含まれています:
この方法で自身のプロシージャを再利用できますが、構文が少し異なります:
#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
