プロシージャ
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
