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');
В этом примере показано, как найти указатели на объекты с помощью регулярных выражений для определения определенных значений свойств. Для получения дополнительной информации о регулярных выражениях см. 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
.