オブジェクトの検索
特定のプロパティ値をもつオブジェクトの検索
関数 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';