プロシージャ

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