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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

При запуске в R2014b предварительно выделите массивы графических указателей с помощью функции gobjects вместо функции ones или zeros. Предварительное выделение с 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, чтобы возвратить ненулевое значение или пустой двойной []. Используйте функции, такие как isempty, isgraphics и 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++ или Фортрана вместо этого.

Была ли эта тема полезной?