ドキュメンテーション

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

グラフィックス ハンドルが double からオブジェクトに変更

オブジェクト ハンドルになったグラフィックス ハンドル

以前のリリースのグラフィックス ハンドルは double 型の数値ハンドルでした。R2014b からは、グラフィックス ハンドルは、グラフィックス オブジェクトのクラスに応じたさまざまな種類のオブジェクト ハンドルとなります。グラフィックス オブジェクトは他の MATLAB® オブジェクトと同様に動作するようになりました。

数値ハンドル用に作成したほとんどのコードは、オブジェクト ハンドルでも機能します。たとえば、グラフィックス オブジェクトのプロパティにアクセスしたり、異なるクラスに属しているグラフィックス オブジェクトを配列にまとめたりできます。ただし、グラフィックス ハンドルが数値であることを前提とする、あるいは要求する、次のような操作は実行できません。

  • ハンドルで算術演算を実行する

  • ハンドルを論理値に変換せずに、論理ステートメント内で直接使用する

  • 論理ステートメント内で、ルート オブジェクト (0) または Figure ハンドル (整数) の数値を利用する

  • ハンドルを数値配列内のデータと結合する

  • ハンドルが数値であることに依存する何らかのプログラム ロジックを使用する

  • ハンドルを文字ベクトルに変換するか、文字ベクトルの操作にハンドルを使用する

グラフィックス オブジェクトのプロパティへのアクセス

オブジェクト ハンドルをもつグラフィックス オブジェクトのプロパティにアクセスする方法は 2 つあります。

  • ドット表記を使用して、特定のオブジェクトとプロパティを参照する。ドット表記を使用する場合、プロパティ名の大文字と小文字は区別されます。たとえば、次のコードは Line の Color プロパティを 'red' に設定します。

    h = plot(1:10);
    h.Color = 'red';

  • 関数 set および get を使用して、オブジェクトの配列のプロパティにアクセスする。たとえば、次のコードは複数の Line の LineWidth プロパティを設定します。

    h = plot(rand(4));
    set(h,'LineWidth',2);

グラフィックス ハンドルの配列

R2014b からは、グラフィックス ハンドルの配列を事前に割り当てるには、関数 zeros または ones ではなく、関数 gobjects を使用します。zeros または ones を使用して事前割り当てを行うと、今のところ動作しますが、速度は遅くなる可能性があります。

gobjects の構文は、ones および zeros の構文と同じです。

h = gobjects(3,1); % preallocate
h(1) = figure;
h(2) = plot(1:10);
h(3) = gca;
グラフィックス ハンドルは、ハンドルのクラスが異なっている場合でも、配列にまとめることができます。MATLAB は、この配列を共通の基本クラスにキャストします。
class(h)
ans =

matlab.graphics.Graphics

グラフィックス ハンドルの有効性のテスト

R2014b からは、グラフィックス ハンドルの有効性をテストするには、関数 ishghandle ではなく、関数 isgraphics を使用します。

x = 1:10;
y = sin(x);

p = plot(x,y);
ax = gca;
isgraphics([p,ax])
ans =

     1     1 

整数ハンドルによる Figure の参照

R2014b からは、Figure を参照するには、Figure のオブジェクト ハンドルまたは整数ハンドルを使用します。整数ハンドルとは、Figure の新しい Number プロパティの値です。

h = figure; % object handle
fignum = h.Number; % integer handle
整数ハンドル fignum は有効な Figure ハンドルです。
isgraphics(fignum) % test handle validity
ans =

     1

複数のグラフィックス オブジェクトの削除

R2014b からは、関数 delete は入力引数を 1 つのみ受け入れます。複数のグラフィックス オブジェクトを削除するには、複数の引数を使用するのではなく、関数に 1 つのハンドル配列を渡します。

h1 = annotation('line');
h2 = annotation('ellipse');
h3 = annotation('rectangle');
delete([h1,h2,h3])

グラフィックス ハンドルを含む論理式

R2014b からは、論理式でグラフィックス ハンドルを使用することや、MATLAB を利用して非ゼロ値や空の double の [] を返すことはできません。代わりに、isemptyisgraphicsisequal などの関数を使用してください。

  • 既存の Figure が存在するかどうかを調べるには、isempty を使用します。新しい groot コマンドはルート オブジェクトを参照します。

    if ~isempty(get(groot,'CurrentFigure'))
        disp('There are existing figures.')
    else
        disp('There are no existing figures.')
    end

  • 特定のタグをもつグラフィックス オブジェクトが存在するかどうかを調べるには、isempty を使用します。

    if ~isempty(findobj('Tag','myFigures'))
        disp('There are objects with this tag.')
    else
        disp('There are no objects with this tag.')
    end

  • ハンドルが有効な Figure ハンドルであるかどうかを調べるには、isgraphics でオブジェクトの Type を使用します。

    if isgraphics(h,'figure')
        disp('h is a valid figure handle.')
    else
        disp('h is not a valid figure handle.')
    end

  • ハンドルがルート ハンドルであるかどうかを調べるには、新しい groot コマンドを使用します。

    if isequal(h,groot)
        disp('h is the root handle')
    else 
        disp('h is not the root handle')
    end

グラフィックス ハンドルの cell 配列の変換

R2014b からは、グラフィックス ハンドルの cell 配列に cell2mat を使用して数値配列を作成することはできません。代わりに、cell 配列からオブジェクト配列を作成してください。

p = plot(magic(3));
par = get(p,'Parent');
objarray = [par{:}]';
whos objarray
  Name          Size            Bytes  Class   Attributes

  objarray      3x1             128    matlab.graphics.axis.Axes 

グラフィックス ハンドルの等価性のテスト

R2014b からは、== または isequal を使用してグラフィックス ハンドルの等価性をテストします。

  • 複数のハンドルが同じオブジェクトを参照しているかどうか、つまり同じハンドルであるかどうかを調べるには、== を使用します。

    p1 = plot(1:10);
    p2 = p1;
    p2 == p1
    ans =
    
         1

  • 複数のハンドルが同じプロパティ値をもつ同じクラスのオブジェクト (必ずしも同じオブジェクトではない) を参照しているかどうかを調べるには、isequal を使用します。

    l1 = line;
    l2 = line;
    isequal(l1,l2)
    ans =
    
         1

関数 cellfun および arrayfun からグラフィックス オブジェクトを戻す

関数 cellfun および arrayfun を使用してグラフィックス オブジェクトを戻すには、UniformOutputfalse に設定します。

以下に例を示します。

t = num2str(rand);
fh = @(t) text(1,1,t);
th = cellfun(fh,{t},'UniformOutput',false); 

グラフィックス オブジェクトの保存

R2014b 以降、関数 save を使用してグラフィックス オブジェクトを MAT ファイルに保存すると、MAT ファイルにはオブジェクトを再生成するために必要なすべての情報が含まれます。以前のリリースでは、関数 save は、オブジェクトを double として格納していたため、MAT ファイルの読み込み時にオブジェクトを再生成できませんでした。

関数 save を使用して Figure を保存しないでください。R2014b 以降で save を使用して Figure を保存すると、それより前のバージョンの MATLAB で MAT ファイルにアクセスできなくなります。save を使用して Figure を保存すると、関数によって警告メッセージが表示されます。代わりに、関数 savefig を使用して Figure を保存します。

MEX ファイルの作成

MEX ファイルを作成する場合、またはエンジン アプリケーションをビルドする場合、関数 mexGet および mexSet はグラフィックス オブジェクト ハンドルでは機能しません。代わりに、C/C++ または Fortran 行列ライブラリの関数 mxGetProperty および mxSetProperty を使用してください。