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