ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

オブジェクト ハンドルへのアクセス

はじめに

MATLAB® では、作成するすべてのグラフィックス オブジェクトにハンドルが割り当てられます。すべてのオブジェクト作成関数は、作成したオブジェクトのハンドルを必要に応じて返します。関数やスクリプトなどでオブジェクトのプロパティにアクセスする場合は、作成時に対応するハンドルを変数に割り当て、後で検索しなくても済むようにします。

既存のオブジェクトのハンドルは、関数 findobj を使用するか、またはその親オブジェクトの Children プロパティをリストすることによって、いつでも取得できます。

詳細は、「プロパティ値によるオブジェクトの検索 — findobj」を参照してください。

通常のアクセスからオブジェクト ハンドルを隠す方法の詳細は、Figure と Axes の保護 を参照してください。

特殊なオブジェクト ハンドル

Root オブジェクトのハンドルは、常にゼロです。Figure のハンドルは次のいずれかになります。

  • 既定でウィンドウのタイトル バーに表示される整数

  • MATLAB の完全な内部精度を必要とする浮動小数点数

Figure の IntegerHandle プロパティは、Figure が受け取るハンドルのタイプを制御します。

他のすべてのグラフィックス オブジェクトのハンドルは、浮動小数点数です。ハンドルを参照するときは、これらの数値がフルの精度を保持していなければなりません。スクリーン外のハンドルを読み込んだり、再度入力するのではなく、変数にハンドルを格納し、MATLAB がハンドルを要求するときにその変数を渡すことが重要です。

現在の Figure、Axes とオブジェクト

Handle Graphics® 技術で重要な概念は、現在であるという概念です。現在の Figure は、グラフィックス出力を受け取るように設定されているウィンドウです。同様に、現在の Axes は、Axes の子オブジェクトを作成するコマンドのターゲットです。現在のオブジェクトは、最後に作成されたか、またはマウスでクリックされたグラフィックス オブジェクトです。

MATLAB は、親のプロパティ リストに、これらのオブジェクトに対応する 3 つのハンドルを格納します。

これらのプロパティからキーとなるオブジェクトのハンドルを得ることができます。

get(0,'CurrentFigure');
get(gcf,'CurrentAxes');
get(gcf,'CurrentObject');

次のコマンドは、get ステートメントの省略形表記です。

  • gcf — Root の CurrentFigure プロパティの値を返します。

  • gca — 現在の Figure の CurrentAxes プロパティの値を返します。

  • gco — 現在の Figure の CurrentObject プロパティの値を返します。

これらのコマンドは、オブジェクトのハンドルを必要とする関数の入力引数として使用します。たとえば、Line オブジェクトをクリックして、それから gco を使って、そのハンドルを set コマンドに指定することができます。

set(gco,'Marker','square')

または、以下で現在の Axes のすべてのプロパティ値をリストすることができます。

get(gca)

次のステートメントで、現在の Axes 内のすべてのグラフィックス オブジェクト (ハンドルが隠されているものを除きます) のハンドルを取得できます。

h = get(gca,'Children');

次にオブジェクトのタイプを決めます。

get(h,'type')
ans = 
      'text'
      'patch'
      'surface'
      'line'

gcfgca は、Figure と Axes の現在のハンドルを取得するには便利ですが、コード ファイルではあまり役に立ちません。特に、コードが MATLAB の上にレイヤー化されたアプリケーションの一部で、ハンドルの値を変更する可能性のあるユーザー アクションを十分に把握していない場合にはこのことがあてはまります。

保護するグラフィックス オブジェクトのハンドルにユーザーがアクセスできないようにする方法については、グラフィックス出力の制御 を参照してください。

プロパティ値によるオブジェクトの検索 — findobj

関数 findobj は、オブジェクト階層を迅速にスキャンし、特定のプロパティ値をもつオブジェクトのハンドルを取得する手段を提供します。識別手段として機能するために、すべてのグラフィックス オブジェクトは、任意の文字列に設定できる Tag プロパティをもちます。これにより、特定のプロパティと値の組み合わせを検索することができます。

たとえば、GUI 上でアクティブでないときがあるチェック ボックスを作成すると仮定します。Tag プロパティに対して一意の値を割り当てることによって、特定のインスタンスを見つけてそのプロパティを設定することが常に可能です。

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

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

set(findobj('Tag','save option'),'Enable','off')

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

例 オブジェクトの検索

次の正弦関数のプロットは、関数の特定の値にラベル付けを行うテキスト オブジェクトを含んでいます。

値 sin(t) = .707 のラベルの付いたテキスト文字列を、[pi/4,sin(pi/4)] の現在位置から関数が同じ値をもつ [3*pi/4,sin(3*pi/4)] の点 (図のグレーの部分) まで移動した場合を考えます。このために、その点にラベルを付けるテキスト オブジェクトのハンドルを決定し、その Position プロパティを変更します。

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

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

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

set(text_handle,'Position',[3*pi/4,sin(3*pi/4),0])

findobj は、Root オブジェクトから検索を開始する代わりに、階層内の検索開始点を指定することによって、検索範囲を制限できます。この結果、階層内に多くのオブジェクトが存在する場合は、検索が速くなります。前の例では、興味のあるテキスト オブジェクトは現在の Axes 内にあるので、以下のように入力することができます。

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

例 — 論理演算子と正規表現の利用

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

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

次の図は、グラフ内に作成されたグラフィックス オブジェクトを示します。3 つのデータセットが個々に Stemseries オブジェクトを生成し、2 つの Line を交互に使用して Stem グラフを作成します。Line の 1 つは Stem 用で、もう 1 つは各 Stem を区切るマーカー用です。ベースライン用に用いられる Line もあります。

検索の深さを制御する-  ベースラインを破線にします。これは Axes の直接の親であるため、以下のステートメントを使用してこの Line にのみアクセスしてください。

set(findobj(gca,'-depth',1,'Type','line'),'LineStyle','--')

-depth1 に設定することによって、findobj は Axes とその直下の子のみを検索します。上記のインスタンス図からわかるように、ベースラインは、Axes の直接の親となる唯一の Line オブジェクトです。

正規表現による検索の限定-  MarkerSize プロパティの値を、プロパティ Tag'Steady State' に設定されていないすべての Stemseries オブジェクトについて 2 ポイント増加させます。

h = findobj('-regexp','Tag','^(?!Steady State$).');
set(h,{'MarkerSize'},num2cell(cell2mat(get(h,'MarkerSize'))+2))

MATLAB における正規表現使用についての詳細は、関数 regexp を参照してください。

論理演算子の利用-  Stem ラインの色を変更します。その際、Stem マーカーの色は変更しません。そのためには、3 つの Stemseries オブジェクトが含む Line オブジェクトにアクセスする必要があります。Stemseries の Color プロパティのみを設定することはできません。これは、ラインとマーカーの両方の色を設定するためです。

Typeline で、Markernone に設定されており、LineStyle'--' (ベースライン) に設定されていないオブジェクトを検索します。

h = findobj('type','line','Marker','none',...
			'-and','-not','LineStyle','--');
set(h,'Color','red')

次の図は、これらの変更が行われた後のグラフを示します。

オブジェクトのコピー

関数 copyobj を使って、親オブジェクト間でオブジェクトをコピーすることができます。新しいオブジェクトは、その Parent プロパティとそのハンドルの値のみがオリジナルのオブジェクトとは異なります。それ以外では、オリジナルのオブジェクトとまったく同じです。結果が正しい親子関係を維持する限り、いくつかのオブジェクトを新しい親オブジェクトにコピーしたり、1 つのオブジェクトをいくつかの新しい親オブジェクトにコピーしたりすることができます。

子オブジェクトをもつオブジェクトをコピーすると、MATLAB は、すべての子オブジェクトもコピーします。

例 — オブジェクトのコピー

さまざまなデータをプロットする場合に、各プロットにおいて 5π÷4,sin(5π÷4) で決定される x 座標と y 座標をもつ点にラベルを付けるものとします。関数 text によって、x 軸と y 軸範囲で定義される座標内のラベルの位置を指定することができ、それにより Text を配置する処理が単純化されます。

text('String','\{5\pi\div4, sin(5\pi\div4)\}\rightarrow',...
     'Position',[5*pi/4,sin(5*pi/4),0],...
     'HorizontalAlignment','right')

このステートメントで関数 text は以下の動作をします。

  • TeX コマンドを使用して右向き矢印と数学記号を描き、文字列 {5π÷4,sin(5π÷4)} によってデータ点にラベルを付けます。

  • プロットされるデータに関して Position を指定します。

  • HorizontalAlignmentright (既定値は left) に変更することによって、データ点をテキスト文字列の右側に移動します。

他のプロットにおいて同じ点に同じ文字列でラベルを付けるには、copyobj を使ってテキストをコピーします。最後のステートメントでテキスト オブジェクトに対するハンドルを保存していないので、findobj'String' プロパティを使ってそれを見つけます。

text_handle = findobj('String',...
              '\{5\pi\div4,sin(5\pi\div4)\}\rightarrow');

次のプロットを作成した後で、ラベルを最初のプロットからコピーすることによって追加します。

copyobj(text_handle,gca).

この特別な例では、テキスト オブジェクトが Axes のデータ空間にそれらの位置を定義するという事実を利用しています。したがって、テキストの Position プロパティはプロット間で変更する必要がありませんでした。

オブジェクトの削除

グラフィックス オブジェクトは、オブジェクトのハンドルを引数として使用して、delete コマンドで削除することができます。たとえば、次のステートメントにより、現在の Axes (とその下位オブジェクトすべて) を削除することができます。

delete(gca)

findobj を使用して、削除したい特定のオブジェクトのハンドルを取得できます。たとえば、次の複数ラインのプロットで破線のハンドルを見つけるには、次のようにします。

findobj を使って、LineStyle プロパティが ':' であるオブジェクトを探します。

line_handle = findobj('LineStyle',':');

delete コマンドでこのハンドルを使います。

delete(line_handle)

これら 2 つのステートメントを組み合わせ、ハンドルを findobj ステートメントで置き換えることができます。

delete(findobj('LineStyle',':'))
この情報は役に立ちましたか?