Графические указатели являются теперь объектами, не удваивается

Графические указатели являются указателями на объект

В предыдущих релизах графические указатели являются числовыми указателями типа double. Начиная в R2014b, графические указатели являются указателями на объект различных типов, в зависимости от класса графического объекта. Графические объекты теперь ведут себя как другие объекты MATLAB®.

Большая часть кода, записанного для числовых указателей все еще, работает с указателями на объект. Например, можно получить доступ к свойствам графического объекта, и можно объединить графические объекты в массивы, даже если объекты принадлежат различным классам. Однако вы не должны выполнять операции, которые принимают или требуют, чтобы графические указатели были числовыми значениями, такими как:

  • Выполните арифметические операции на указателях

  • Используйте указатели непосредственно в логических операторах, не преобразовывая в логическое значение

  • Используйте числовые значения корневого объекта (0), или фигура обрабатывает (целые числа) в логических операторах

  • Объедините указатели с данными в числовых массивах

  • Используйте любую логику программы, которая зависит от указателей, являющихся числовым

  • Преобразование указателей на векторы символов или использование обрабатывает в операциях вектора символов

Accessing Properties графических объектов

Существует два способа получить доступ к свойствам графических объектов, которые имеют указатели на объект:

  • Используйте запись через точку для ссылки на конкретный объект и свойство. Имена свойства являются чувствительными к регистру при использовании записи через точку. Например, это кодовые наборы Color свойство линии к 'red'.

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

  • Используйте set и get функции, чтобы получить доступ к свойствам для массива объектов. Например, это кодовые наборы LineWidth свойство для нескольких линий.

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

Графические массивы указателя

При запуске в R2014b предварительно выделите массивы графических указателей с помощью gobjects функция вместо zeros или ones функция. Предварительное выделение с 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 протестируйте валидность графических указателей с помощью isgraphics функция вместо ishghandle.

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

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

     1     1 

Что касается фигур целочисленными указателями

Начиная в R2014b, можно обратиться к фигуре или его указателем на объект или его целочисленным указателем. Целочисленный указатель является значением в новом Number свойство фигуры.

h = figure; % object handle
fignum = h.Number; % integer handle
Целочисленный указатель, fignum, допустимый указатель фигуры.
isgraphics(fignum) % test handle validity
ans =

     1

Удаление нескольких графических объектов

Начиная в R2014b, delete функция принимает только один входной параметр. Чтобы удалить несколько графических объектов, передайте один массив указателя функции, вместо того, чтобы использовать несколько аргументов.

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

Логические выражения с графическими указателями

Начиная в R2014b, вы не можете использовать графические указатели в логических выражениях или использовать MATLAB, чтобы возвратить ненулевое значение или пустой двойной []. Используйте функции, такие как isemptyisgraphics, и isequal вместо этого.

  • Чтобы определить, существуют ли существующие фигуры, используйте 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

  • Чтобы определить, является ли указатель допустимым указателем фигуры, используйте 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

Преобразование Массивов ячеек графических указателей

Начиная в R2014b, вы не можете использовать cell2mat на массиве ячеек графических указателей, чтобы создать числовой массив. Создайте объектный массив из массива ячеек вместо этого.

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 функции, чтобы возвратить графические объекты, установите UniformOutput к false.

Например:

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

Сохранение графических объектов

Запуск в R2014b, если вы сохраняете графический объект в MAT-файле с помощью save функция, затем MAT-файл содержит всю информацию, запрошенную, чтобы регенерировать объект. В предыдущих релизах, save функция хранит объект как двойное, и вы не можете регенерировать объект, когда вы загружаете MAT-файл.

Постарайтесь не сохранять фигуры с save функция. Используя save сохранить фигуру в R2014b или позже делает MAT-файл недоступным в более ранних версиях MATLAB. Если вы используете save чтобы сохранить фигуру, затем функция отображает предупреждающее сообщение. Сохраните фигуры, использующие savefig функцию вместо этого.

Запись файлов MEX

Если вы пишете файлы MEX или создаете приложения механизма, то mexGet и mexSet функции не работают над указателями графического объекта. Используйте mxGetProperty и mxSetProperty функции в Матричной Библиотеке C/C++ или Фортрана вместо этого.

Для просмотра документации необходимо авторизоваться на сайте