В предыдущих релизах графические указатели являются числовыми указателями типа double
. Начиная в R2014b, графические указатели являются указателями на объект различных типов, в зависимости от класса графического объекта. Графические объекты теперь ведут себя как другие объекты MATLAB®.
Большая часть кода, записанного для числовых указателей все еще, работает с указателями на объект. Например, можно получить доступ к свойствам графического объекта, и можно объединить графические объекты в массивы, даже если объекты принадлежат различным классам. Однако вы не должны выполнять операции, которые принимают или требуют, чтобы графические указатели были числовыми значениями, такими как:
Выполните арифметические операции на указателях
Используйте указатели непосредственно в логических операторах, не преобразовывая в логическое значение
Полагайтесь на числовые значения корневого объекта (0), или фигура обрабатывает (целые числа) в логических операторах
Объедините указатели с данными в числовых массивах
Используйте любую логику программы, которая зависит от указателей, являющихся числовым
Преобразование указателей на векторы символов или использование обрабатывает в операциях вектора символов
Существует два способа получить доступ к свойствам графических объектов, которые имеют указатели на объект:
Используйте запись через точку для ссылки на конкретный объект и свойство. Имена свойства являются чувствительными к регистру при использовании записи через точку. Например, это кодовые наборы свойство Color
строки к 'red'
.
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;
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
, чтобы возвратить графические объекты, установите 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 или создаете приложения механизма, то mexGet
и функции mexSet
не работают над указателями графического объекта. Используйте mxGetProperty
и функции mxSetProperty
в Матричной Библиотеке C/C++ или Фортрана вместо этого.