Можно добавлять команды и подменю в строку меню и контекстные меню для Simulink ® Editor и Stateflow ® Editor.
Чтобы добавить элемент в меню, выполните следующие действия.
Для каждого элемента создайте функцию, называемую функцией схемы, которая определяет элемент (см. раздел Определение пунктов меню).
Зарегистрируйте настройки меню в менеджере настройки Simulink при запуске, например, в sl_customization.m файл по пути MATLAB ® (см. раздел «Регистрация настроек меню»).
Создание функций обратного вызова, реализующих команды, запускаемые элементами, добавляемыми в меню.
Следующее sl_customization.m добавляет четыре элемента в меню «Инструменты редактора Simulink».
function sl_customization(cm)
%% Register custom menu function.
cm.addCustomMenuFcn('Simulink:ToolsMenu', @getMyMenuItems);
end
%% Define the custom menu function.
function schemaFcns = getMyMenuItems(callbackInfo)
schemaFcns = {@getItem1, ...
@getItem2, ...
{@getItem3,3}, ... %% Pass 3 as user data to getItem3.
@getItem4};
end
%% Define the schema function for first menu item.
function schema = getItem1(callbackInfo)
schema = sl_action_schema;
schema.label = 'Item One';
schema.userdata = 'item one';
schema.callback = @myCallback1;
end
function myCallback1(callbackInfo)
disp(['Callback for item ' callbackInfo.userdata ' was called']);
end
function schema = getItem2(callbackInfo)
% Make a submenu label 'Item Two' with
% the menu item above three times.
schema = sl_container_schema;
schema.label = 'Item Two';
schema.childrenFcns = {@getItem1, @getItem1, @getItem1};
end
function schema = getItem3(callbackInfo)
% Create a menu item whose label is
% 'Item Three: 3', with the 3 being passed
% from getMyItems above.
schema = sl_action_schema;
schema.label = ['Item Three: ' num2str(callbackInfo.userdata)];
end
function myToggleCallback(callbackInfo)
if strcmp(get_param(gcs, 'ScreenColor'), 'red') == 0
set_param(gcs, 'ScreenColor', 'red');
else
set_param(gcs, 'ScreenColor', 'white');
end
end
%% Define the schema function for a toggle menu item.
function schema = getItem4(callbackInfo)
schema = sl_toggle_schema;
schema.label = 'Red Screen';
if strcmp(get_param(gcs, 'ScreenColor'), 'red') == 1
schema.checked = 'checked';
else
schema.checked = 'unchecked';
end
schema.callback = @myToggleCallback;
end
Элемент меню определяется путем создания функции, возвращающей объект, называемый объектом схемы, который определяет информацию, необходимую для создания элемента меню. Определенный пункт меню может инициировать пользовательское действие или отображать пользовательское подменю. Дополнительные сведения см. в следующих разделах.
Чтобы определить элемент, запускающий пользовательскую команду, функция схемы должна принять объект информации обратного вызова (см. Объект информации о обратном вызове) и создать и вернуть объект схемы действий (см. Объект схемы действий), который указывает метку элемента и функцию, называемую обратным вызовом, для вызова при выборе элемента пользователем. Например, следующая функция схемы определяет пункт меню, который отображает сообщение при выборе пользователем.
function schema = getItem1(callbackInfo)
%% Create an instance of an action schema.
schema = sl_action_schema;
%% Specify the menu item label.
schema.label = 'My Item 1';
schema.userdata = 'item1';
%% Specify the menu item callback function.
schema.callback = @myCallback1;
end
function myCallback1(callbackInfo)
disp(['Callback for item ' callbackInfo.userdata
' was called']);
end
Объект схемы действия. Этот объект определяет информацию об элементах меню, которые запускают определенные команды, включая метку, которая появляется на пункте меню, и функцию, которая будет вызвана при выборе пункта меню пользователем. Используйте функцию sl_action_schema для создания экземпляров этого объекта в функциях схемы. К его свойствам относятся:
tag
Необязательный символьный вектор, идентифицирующий это действие, например, чтобы на него можно было ссылаться с помощью функции фильтра.
label
Вектор символов, указывающий метку, которая отображается в пункте меню, инициирующем это действие.
state
Свойство, указывающее состояние этого действия. Допустимые значения: 'Enabled' (по умолчанию), 'Disabled', и 'Hidden'.
statustip
Вектор символов, указывающий текст, который будет отображаться в строке состояния редактора при выборе пользователем пункта меню, инициирующего это действие.
userdata
Указанные данные. Может быть любого типа.
accelerator
Символьный вектор, указывающий комбинацию клавиш и клавиш для запуска этого действия. Можно добавить сочетание клавиш только для пользовательских пунктов меню, которые отображаются в меню строки меню и не могут переопределять акселераторы, поставляемые с Simulink Editor. Например, Ctrl + D является ускорителем для функции «Обновить схему» в редакторе Simulink Editor, поэтому переопределить ее невозможно.
Чтобы указать это значение, используйте форму 'Ctrl+K', где K является клавишей быстрого вызова. Например, использовать 'Ctrl+Alt+T' для ускорителя, вызываемого при нажатой клавише Ctrl и Alt и нажатой клавише T.
callback
Символьный вектор, задающий выражение MATLAB, которое должно быть вычислено, или дескриптор функции, которая должна быть вызвана, когда пользователь выбирает пункт меню, который запускает это действие. Эта функция должна принимать один аргумент: объект информации обратного вызова.
autoDisableWhen
Свойство, управляющее автоматическим отключением элемента меню.
| Настройка | Когда элементы меню отключены |
|---|---|
'Locked' | (по умолчанию) Когда активный редактор заблокирован или когда модель занята |
'Busy' | Только если модель занята |
'Never' | Никогда |
Переключить объект схемы. Этот объект указывает информацию о пункте меню, который включает или отключает какой-либо объект. Используйте функцию sl_toggle_schema для создания экземпляров этого объекта в функциях схемы. К его свойствам относятся:
tag
Дополнительный символьный вектор, идентифицирующий это действие переключения, например, чтобы на него можно было ссылаться с помощью функции фильтра.
label
Вектор символов, указывающий метку, которая отображается в пункте меню, вызывающем это действие переключения.
checked
Укажите, будет ли в пункте меню отображаться флажок. Допустимые значения: 'unchecked' (по умолчанию) и 'checked'
state
Состояние этого действия переключения, указанное как 'Enabled' (по умолчанию), 'Disabled', и 'Hidden'.
statustip
Вектор символов, указывающий текст, который будет отображаться в строке состояния редактора при выборе пользователем пункта меню, запускающего это действие переключения.
userdata
Указанные данные. Может быть любого типа.
accelerator
Символьный вектор, указывающий комбинацию клавиш и клавиш для запуска этого действия. Можно добавить сочетание клавиш только для пользовательских пунктов меню, которые отображаются в меню строки меню и не могут переопределять акселераторы, поставляемые с Simulink Editor. Например, Ctrl + D является ускорителем для функции «Обновить схему» в редакторе Simulink Editor, поэтому переопределить ее невозможно.
Чтобы указать это значение, используйте форму 'Ctrl+K', где K является клавишей быстрого вызова. Например, использовать 'Ctrl+Alt+T' для ускорителя, вызываемого при нажатой клавише Ctrl и Alt и нажатой клавише T.
callback
Символьный вектор, задающий выражение MATLAB, которое должно быть вычислено, или дескриптор функции, которая должна быть вызвана, когда пользователь выбирает пункт меню, который запускает это действие. Эта функция должна принимать один аргумент: объект информации обратного вызова.
autoDisableWhen
Свойство, управляющее автоматическим отключением элемента меню.
| Настройка | Когда элементы меню отключены |
|---|---|
'Locked' | (по умолчанию) Когда активный редактор заблокирован или когда модель занята |
'Busy' | Только если модель занята |
'Never' | Никогда |
Чтобы определить подменю, создайте функцию схемы, которая принимает объект информации обратного вызова и возвращает объект схемы контейнера (см. «Объект схемы контейнера»), определяющий схемы, определяющие элементы подменю. Например, следующая функция схемы определяет подменю, которое содержит три экземпляра элемента меню, определенного в примере «Определение элементов меню, запускающих пользовательские команды».
function schema = getItem2( callbackInfo )
schema = sl_container_schema;
schema.label = 'Item Two';
schema.childrenFcns = {@getItem1, @getItem1, @getItem1};
endОбъект схемы контейнера. Объект схемы контейнера задает метку подменю и ее содержимое. Используйте функцию sl_container_schema для создания экземпляров этого объекта в функциях схемы. Свойства объекта включают:
tag
Дополнительный символьный вектор, определяющий это подменю.
label
Вектор символов, определяющий метку подменю.
state
Вектор символов, указывающий состояние этого подменю. Допустимые значения: 'Enabled' (по умолчанию), 'Disabled', и 'Hidden'.
statustip
Вектор символов, указывающий текст, который будет отображаться в строке состояния редактора при выборе этого подменю.
childrenFcns
Массив ячеек, определяющий содержимое подменю. Каждая запись в массиве ячеек может быть
Указатель на функцию схемы, определяющую элемент в подменю (см. раздел Определение элементов меню)
Двухэлементный массив ячеек, первый элемент которого является указателем на функцию схемы, определяющую запись элемента, и второй элемент которого является данными, которые должны быть вставлены в качестве пользовательских данных в объект информации обратного вызова (см. Объект информации обратного вызова), переданный функции схемы
'separator', что приводит к появлению разделителя между элементом, определенным предыдущей записью в массиве ячеек, и элементом, определенным в следующей записи. Регистр для этой записи игнорируется (например, 'SEPARATOR' и 'Separator' оба являются допустимыми записями). Разделитель также подавляется, если он появляется в начале или в конце подменю, и разделители, которые будут появляться последовательно, объединяются в один разделитель (например, в результате скрытия элемента).
Например, следующий массив ячеек определяет две записи подменю:
{@getItem1, 'separator', {@getItem2, 1}}В этом примере 1 передается getItem2 через объект информации обратного вызова.
generateFcn
Указатель на функцию, которая возвращает массив ячеек, определяющий содержимое подменю. Массив ячеек должен иметь тот же формат, что указан для объектов схемы контейнера childrenFcns собственность.
Примечание
generateFcn свойство имеет приоритет над childrenFcns собственность. Если установить оба параметра, childrenFcns свойство игнорируется, и массив ячеек возвращается generateFcn используется для создания подменю.
userdata
Данные любого типа, передаваемые generateFcn.
autoDisableWhen
Свойство, управляющее автоматическим отключением элемента меню.
| Настройка | Когда элементы меню отключены |
|---|---|
'Locked' | (по умолчанию) Когда активный редактор заблокирован или когда модель занята |
'Busy' | Только если модель занята |
'Never' | Никогда |
Необходимо зарегистрировать пользовательские элементы для включения в меню Simulink с помощью диспетчера настройки. Используйте sl_customization.m файл для установки Simulink (см. раздел Регистрация настроек) для выполнения этой задачи. В частности, для каждого меню, которое требуется настроить, система sl_customization функция должна вызывать диспетчер настройки addCustomMenuFcn способ. Каждый вызов должен передавать тег меню (см. Теги меню) для настройки и пользовательскую функцию меню, которая определяет элементы, добавляемые в меню (см. Создание пользовательской функции меню). Например, следующее: sl_customization добавляет пользовательские элементы в меню Simulink Tools.
function sl_customization(cm)
%% Register custom menu function.
cm.addCustomMenuFcn('Simulink:ToolsMenu', @getMyItems);
Функция пользовательского меню возвращает массив ячеек функций схемы, которые определяют пользовательские элементы, которые должны отображаться в меню редактора модели (см. раздел Определение элементов меню). Функция пользовательского меню возвращает массив ячеек, аналогичный массиву, возвращенному generateFcn функция.
Пользовательская функция меню должна принимать объект информации обратного вызова (см. Объект информации обратного вызова) и возвращать массив ячеек, в котором перечислены функции схемы. Каждый элемент массива ячеек может быть либо дескриптором функции схемы, либо двухэлементным массивом ячеек, первый элемент которого является дескриптором функции схемы и второй элемент которого является определяемыми пользователем данными, подлежащими передаче функции схемы. Например, следующая функция пользовательского меню возвращает массив ячеек, в котором перечислены три функции схемы.
function schemas = getMyItems(callbackInfo)
schemas = {@getItem1, ...
@getItem2, ...
{@getItem3,3} }; % Pass 3 as userdata to getItem3.
end
Экземпляры этих объектов передаются в функции адаптации меню. Методы и свойства этих объектов включают в себя:
uiObject
Метод получения дескриптора владельцем меню, для которого это обратный вызов. Владельцем может быть редактор Simulink или редактор Stateflow.
model
Метод получения дескриптора модели, отображаемой в окне редактора.
userdata
Свойство пользовательских данных. Значение этого свойства может быть любым типом данных.
В системах, использующих ОС Microsoft ® Windows ®, выбор пользовательского пункта меню, обратный вызов которого содержит точку останова, может привести к тому, что мышь перестанет отвечать, или меню останется открытым и поверх других окон. Для устранения этих проблем используйте команды клавиатуры отладчика кода MATLAB для продолжения выполнения обратного вызова.
Тег меню идентифицирует редактор Simulink Editor или строку меню или меню Stateflow Editor. Необходимо знать тег для меню, чтобы добавить в него пользовательские элементы (см. раздел Регистрация настроек меню).
| Тэг | Что оно добавляет |
|---|---|
| Теги Simulink | |
Simulink:MenuBar | Меню к строке меню Simulink Editor |
Simulink:PreContextMenu | Элемент в начале контекстного меню Simulink Editor |
Simulink:ContextMenu | Элемент в конце контекстного меню Simulink Editor |
Simulink:FileMenu | Элемент в конце меню «Файл редактора Simulink» |
Simulink:EditMenu | Элемент в конце меню «Редактирование» редактора Simulink |
Simulink:ViewMenu | Элемент в конце меню «Вид редактора Simulink» |
Simulink:DisplayMenu | Элемент в конце меню «Отображение редактора Simulink» |
Simulink:DiagramMenu | Элемент в конце меню «Схема» редактора Simulink Editor |
Simulink:SimulationMenu | Элемент в конце меню моделирования Simulink Editor |
Simulink:AnalysisMenu | Элемент в конце меню анализа Simulink Editor |
Simulink:CodeMenu | Элемент в конце меню «Код редактора Simulink» |
Simulink:ToolsMenu | Элемент в конце меню «Инструменты редактора Simulink» |
Simulink:HelpMenu | Элемент в конце меню справки Simulink Editor |
| Теги потока состояния | |
Stateflow:MenuBar | Меню к строке меню «Редактор статусов» |
Stateflow:PreContextMenu | Элемент в начале контекстного меню Stateflow Editor. |
Stateflow:ContextMenu | Элементы в конце контекстного меню Stateflow Editor. |
Stateflow:FileMenu | Элемент в конце меню Файл редактора Stateflow |
Stateflow:EditMenu | Элемент в конце меню Правка (Edit) редактора статусов (Stateflow Editor) |
Stateflow:ViewMenu | Элемент в конце меню «Вид редактора Stateflow» |
Stateflow:DisplayMenu | Элемент в конце меню «Отображение редактора статусов» |
Stateflow:ChartMenu | Элемент в конце меню «Диаграмма редактора состояния» |
Stateflow:SimulationMenu | Элемент в конце меню моделирования Stateflow Editor |
Stateflow:AnalysisMenu | Элемент в конце меню анализа Stateflow Editor |
Stateflow:CodeMenu | Элемент в конце меню Код редактора Stateflow |
Stateflow:ToolsMenu | Элемент в конце меню «Инструменты редактора Stateflow» |
Stateflow:HelpMenu | Элемент в конце меню справки редактора Stateflow |
Используйте те же общие процедуры для настройки меню редактора Stateflow Editor, что и для Simulink Editor. Добавление пользовательских функций меню к концам меню верхнего уровня зависит от активного редактора:
Меню, связанные с Simulink:FileMenu появляется только при активном редакторе Simulink.
Меню, связанные с Stateflow:FileMenu появляется только в том случае, если активен редактор Stateflow Editor.
Чтобы меню появилось в обоих редакторах, вызовите addCustomMenuFcn дважды, один раз для каждого тега. Убедитесь, что код работает в обоих редакторах.