Поиск объектов

Поиск объектов с определенными значениями свойств

findobj функция может сканировать иерархию объектов, чтобы получить указатели на объекты, которые имеют определенные значения свойств.

Для идентификации все графические объекты имеют Tag свойство, которое можно задать в любой вектор символов. Затем можно искать определенную пару свойство/значение. Например, предположим, что вы создаете флажок, который иногда инактивируется в пользовательском интерфейсе. Путем присвоения уникального значения для Tag свойство, вы можете найти этот конкретный объект:

uicontrol('Style','checkbox','Tag','save option')

Использование findobj для определения местоположения объекта, чья Tag для свойства задано значение 'save option'и отключить его:

hCheckbox = findobj('Tag','save option');
hCheckbox.Enable = 'off'

Если вы не задаете стартовый объект, findobj поиск из корневого объекта, обнаружение всех экземпляров заданной вами комбинации имя свойства/ значение.

Чтобы найти объекты со скрытыми указателями, используйте findall.

Свойство поиска текста по строкам

В этом примере показано, как найти текстовые объекты с помощью String свойство.

Следующий график содержит текстовые объекты, маркирующие конкретные значения функции.

Предположим, что вы хотите переместить текст с меткой значения sin (t) = .707 из его текущего местоположения в [pi/4,sin(pi/4)] в точку [3*pi/4,sin(3*pi/4)] где функция имеет то же значение (показано светло-серым цветом на графике).

Определите указатель на текстовый объект, помечающий точку [pi/4,sin(pi/4)] и изменить его Position свойство.

Как использовать findobj, выберите значение свойства, которое однозначно идентифицирует объект. Этот пример использует текст String свойство:

hText = findobj('String','\leftarrowsin(t) = .707');

Переместите объект в новое положение, определяя текст Position в единицах измерения осей.

hText.Position = [3*pi/4,sin(3*pi/4),0];

findobj позволяет ограничить поиск путем определения начальной точки в иерархии вместо начала с корневого объекта. Если в дереве объектов много объектов, эта возможность приводит к более быстрым поискам. В предыдущем примере вы знаете, что интересующий текстовый объект находится в текущей системе координат, поэтому можно вводить:

hText = findobj(gca,'String','\leftarrowsin(t) = .707');

Использование регулярных выражений с findobj

В этом примере показано, как найти указатели на объекты с помощью регулярных выражений для определения определенных значений свойств. Для получения дополнительной информации о регулярных выражениях см. regexp.

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

x = 0:30;
y = [1.5*cos(x);4*exp(-.1*x).*cos(x);exp(.05*x).*cos(x)]';
h = stem(x,y);
h(1).Marker = 'o';
h(1).Tag = 'Decaying Exponential';
h(2).Marker = 'square';
h(2).Tag = 'Growing Exponential';
h(3).Marker = '*';
h(3).Tag = 'Steady State';

Передача регулярного выражения в findobj позволяет соответствовать определенным шаблонам. Например, предположим, что вы хотите задать значение MarkerFaceColor свойство зеленого цвета на всех стволовых объектах, которые не имеют своих Tag значение свойства установлено в 'Steady State' (то есть стебли, которые представляют собой разлагающиеся и растущие экспоненциалы).

hStems = findobj('-regexp','Tag','^(?!Steady State$).');
for k = 1:length(hStems)
   hStems(k).MarkerFaceColor = 'green'
end

Предельные возможности поиска

Задайте начальную точку в дереве объектов, чтобы ограничить возможности поиска. Начальной точкой может быть указатель на рисунок, оси или группу указателей на объекты.

Например, предположим, что вы хотите изменить цвет граней маркера стеблей в определенных осях:

x = 0:30;
y = [1.5*cos(x);4*exp(-.1*x).*cos(x);exp(.05*x).*cos(x)]';
tiledlayout(3,1)
ax1 = nexttile;
stem(x,y(:,1))
ax2 = nexttile;
stem(x,y(:,2))
ax3 = nexttile;
stem(x,y(:,3))

Установите цвет граней маркера стеблей только в третьих осях.

h = findobj(ax3,'Type','stem');
h.MarkerFaceColor = 'red';

Для получения дополнительной информации об ограничении возможностей и глубины поиска объекта см. findobj и findall.