Main Content

オブジェクトの検索

特定のプロパティ値をもつオブジェクトの検索

関数 findobj はオブジェクト階層をスキャンして、特定のプロパティ値をもつオブジェクトのハンドルを取得できます。

識別のため、すべてのグラフィックス オブジェクトには、任意の文字ベクトルに設定できる Tag プロパティがあります。これにより、特定のプロパティと値の組み合わせを検索することができます。たとえば、UI 内で非アクティブになることがあるチェック ボックスを作成するとします。Tag プロパティに固有の値を割り当てることで、その特定のオブジェクトを検索できます。

uicontrol('Style','checkbox','Tag','save option')

findobj を使って、Tag プロパティが 'save option' に設定されているオブジェクトを見つけ、それを無効にします。

hCheckbox = findobj('Tag','save option');
hCheckbox.Enable = 'off'

検索の開始オブジェクトを指定しない場合は、findobj は Root オブジェクトから検索し、指定したすべてのプロパティ名/ プロパティ値の組み合わせを探します。

ハンドルが非表示のオブジェクトを検索するには、findall を使用します。

String プロパティによるテキストの検索

この例では、String プロパティを使用して text オブジェクトを検索する方法を説明します。

次のグラフには、関数の特定の値をラベル付けする text オブジェクトが含まれています。

sin(t) = .707 という値をラベル付けするテキストを、現在位置 [pi/4,sin(pi/4)] から関数が同じ値になる [3*pi/4,sin(3*pi/4)] の点 (グラフのライト グレーの部分) まで移動する場合を考えます。

[pi/4,sin(pi/4)] の点をラベル付けする text オブジェクトのハンドルを決定し、その Position プロパティを変更します。

findobj を使用するには、オブジェクトを一意的に識別するプロパティ値を選び出します。次の例では、テキストの String プロパティを使います。

hText = findobj('String','\leftarrowsin(t) = .707');

オブジェクトを新しい位置に移動し、座標軸の単位で Text の Position を定義します。

hText.Position = [3*pi/4,sin(3*pi/4),0];

findobj は、root オブジェクトから検索を開始する代わりに、階層内の検索開始点を指定することによって、検索範囲を制限できます。オブジェクト ツリーに多数のオブジェクトが含まれる場合、この機能を使用すると検索が高速になります。前の例では、目的の text オブジェクトは現在の座標軸内にあるので、以下のように入力することができます。

hText = findobj(gca,'String','\leftarrowsin(t) = .707');

findobj での正規表現の使用

この例では、正規表現を使用して固有のプロパティ値を特定することでオブジェクト ハンドルを検索する方法を説明します。正規表現についての詳細は、regexp を参照してください。

以下のグラフを作成し、作成したオブジェクトのいくつかのプロパティを変更するとします。

x = 0:30;
y = [1.5*cos(x);4*exp(-.1*x).*cos(x);exp(.05*x).*cos(x)]';
h = stem(x,y);
h(1).Marker = 'o';
h(1).Tag = 'Decaying Exponential';
h(2).Marker = 'square';
h(2).Tag = 'Growing Exponential';
h(3).Marker = '*';
h(3).Tag = 'Steady State';

findobj に正規表現を渡すことで、特定のパターンに一致させることができます。たとえば、Tag プロパティが 'Steady State' に "設定されていない" すべての stem オブジェクト (つまり、指数的な減衰または増加を表すステム) で、MarkerFaceColor プロパティの値を green に設定するとします。

hStems = findobj('-regexp','Tag','^(?!Steady State$).');
for k = 1:length(hStems)
   hStems(k).MarkerFaceColor = 'green'
end

検索範囲の制限

検索範囲を制限するには、オブジェクト ツリーでの開始点を指定します。開始点には、Figure、座標軸またはオブジェクト ハンドルのグループのハンドルを指定できます。

たとえば、ある座標軸のステムのマーカー面の色を変更する場合を考えます。

x = 0:30;
y = [1.5*cos(x);4*exp(-.1*x).*cos(x);exp(.05*x).*cos(x)]';
tiledlayout(3,1)
ax1 = nexttile;
stem(x,y(:,1))
ax2 = nexttile;
stem(x,y(:,2))
ax3 = nexttile;
stem(x,y(:,3))

3 番目の座標軸のみにおけるステムのマーカー面の色を設定します。

h = findobj(ax3,'Type','stem');
h.MarkerFaceColor = 'red';

オブジェクト検索の範囲および深さの制限についての詳細は、findobjfindall を参照してください。