exponenta event banner

Добавление элементов в меню редактора моделей

Можно добавлять команды и подменю в строку меню и контекстные меню для 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

Адаптация меню редактора Simulink и Stateflow

Используйте те же общие процедуры для настройки меню редактора Stateflow Editor, что и для Simulink Editor. Добавление пользовательских функций меню к концам меню верхнего уровня зависит от активного редактора:

  • Меню, связанные с Simulink:FileMenu появляется только при активном редакторе Simulink.

  • Меню, связанные с Stateflow:FileMenu появляется только в том случае, если активен редактор Stateflow Editor.

  • Чтобы меню появилось в обоих редакторах, вызовите addCustomMenuFcn дважды, один раз для каждого тега. Убедитесь, что код работает в обоих редакторах.

Связанные темы