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

Можно добавить команды и подменю в панель меню и контекстные меню для Simulink® Редактор и Stateflow® Редактор.

Чтобы добавить элемент в меню:

  • Для каждого элемента создайте функцию, называемую schema function, которая определяет элемент (см. «Определение элементов меню»).

  • Зарегистрируйте индивидуальные настройки меню в менеджере индивидуальной настройки Simulink при запуске, например, в sl_customization.m файл в MATLAB® путь (см. Register Menu Индивидуальных настроек).

  • Создайте функции обратного вызова, которые реализуют команды, инициируемые элементами, которые вы добавляете в меню.

Код для добавления элементов меню

Следующая sl_customization.m файл добавляет четыре элемента в меню Tools Редактор.

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

    Необязательный вектор символов, который идентифицирует это действие, например, чтобы на него могла ссылаться функция filter.

  • label

    Вектор символов, задающий метку, которая появляется в элементе меню, который запускает это действие.

  • state

    Свойство, которое задает состояние этого действия. Допустимые значения 'Enabled' (по умолчанию), 'Disabled', и 'Hidden'.

  • statustip

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

  • userdata

    Данные, которые вы задаете. Может быть любого типа.

  • accelerator

    Вектор символов, задающий комбинацию Ctrl и ключа, которая будет использоваться для запуска этого действия. Вы можете добавить горячую клавишу только для пользовательских элементов меню, которые появляются в меню панели меню и не могут переопределить ускорители, которые поставляются с редактором Simulink. Например, Ctrl+D является ускорителем для Update Diagram в Редактор, поэтому вы не можете переопределить его.

    Чтобы задать это значение, используйте форму 'Ctrl+K', где K - этот ярлык клавиш. Для примера используйте 'Ctrl+Alt+T' для ускорителя, вызываемого путем удержания вниз Ctrl и Alt и нажатия T.

  • callback

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

  • autoDisableWhen

    Свойство, которое управляет, когда элемент меню автоматически отключен.

    НастройкаКогда элементы меню отключены
    'Locked'

    (по умолчанию) Когда активный редактор заблокирован или когда модель занята

    'Busy'

    Только если модель занята

    'Never'

    Никогда

Переключение объекта схемы.  Этот объект задает информацию об элементе меню, который переключает какой-либо объект on или off. Используйте функцию sl_toggle_schema создание образцов этого объекта в функциях схемы. Его свойства включают:

  • tag

    Необязательный вектор символов, который идентифицирует это действие переключения, например, чтобы на него могла ссылаться функция filter.

  • label

    Вектор символов, задающий метку, которая появляется в элементе меню, который запускает это действие переключения.

  • checked

    Укажите, отображается ли в элементе меню флажок. Допустимые значения 'unchecked' (по умолчанию) и 'checked'

  • state

    Состояние этого действия переключения, заданное как 'Enabled' (по умолчанию), 'Disabled', и 'Hidden'.

  • statustip

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

  • userdata

    Данные, которые вы задаете. Может быть любого типа.

  • accelerator

    Вектор символов, задающий комбинацию Ctrl и ключа, которая будет использоваться для запуска этого действия. Вы можете добавить горячую клавишу только для пользовательских элементов меню, которые появляются в меню панели меню и не могут переопределить ускорители, которые поставляются с редактором Simulink. Например, Ctrl+D является ускорителем для Update Diagram в Редактор, поэтому вы не можете переопределить его.

    Чтобы задать это значение, используйте форму '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 свойство.

    Примечание

    The generateFcn свойство имеет приоритет над childrenFcns свойство. Если вы задаете оба, childrenFcns свойство игнорируется, и массив ячеек возвращается generateFcn используется для создания подменю.

  • userdata

    Данные любого типа, которые передаются в generateFcn.

  • autoDisableWhen

    Свойство, которое управляет, когда элемент меню автоматически отключен.

    НастройкаКогда элементы меню отключены
    'Locked'

    (по умолчанию) Когда активный редактор заблокирован или когда модель занята

    'Busy'

    Только если модель занята

    'Never'

    Никогда

Регистрация индивидуальных настроек меню

Необходимо зарегистрировать пользовательские элементы, которые будут включены в меню Simulink в диспетчере индивидуальных настроек. Используйте sl_customization.m файл для установки Simulink (см. «Регистрация индивидуальных настроек») для выполнения этой задачи. В частности, для каждого меню, которое вы хотите настроить, ваша система sl_customization функция должна вызвать диспетчер индивидуальной настройки addCustomMenuFcn способ. Каждый вызов должен передавать тег меню (см. «Теги меню»), который будет настроен, и пользовательскую функцию меню, которая задает элементы, добавляемые в меню (см. «Создание функции пользовательского меню»). Для примера выполните следующее sl_customization функция добавляет пользовательские элементы в меню Инструменты.

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 или панели меню или меню Редактора Stateflow. Необходимо знать тег для меню, чтобы добавить в него пользовательские элементы (см. раздел Индивидуальные настройки меню регистра).

ТэгЧто это добавляет
Теги Simulink
Simulink:MenuBarМеню на панели меню редактора Simulink
Simulink:PreContextMenuЭлемент к началу контекстного меню редактора Simulink
Simulink:ContextMenuЭлемент в конце контекстного меню Редактор
Simulink:FileMenuЭлемент в конце меню File Редактор
Simulink:EditMenuЭлемент в конце меню Edit Редактор
Simulink:ViewMenuЭлемент в конце меню View Редактор
Simulink:DisplayMenuЭлемент в конце меню Display Редактор
Simulink:DiagramMenuЭлемент в конце меню Diagram Редактор
Simulink:SimulationMenuЭлемент в конце меню Simulation Редактор
Simulink:AnalysisMenuЭлемент в конце меню Analysis Редактор
Simulink:CodeMenuЭлемент в конце меню Code Редактор
Simulink:ToolsMenuЭлемент в конце меню Tools Редактор
Simulink:HelpMenuЭлемент в конце меню Help Редактор
Теги Stateflow
Stateflow:MenuBarМеню на Редактора Stateflow панели меню
Stateflow:PreContextMenuЭлемент в начале контекстного меню редактора Stateflow.
Stateflow:ContextMenuЭлементы в конце контекстного меню редактора Stateflow.
Stateflow:FileMenuПункт в конце меню Редактора Stateflow File
Stateflow:EditMenuПункт в конце меню Редактора Stateflow Edit
Stateflow:ViewMenuПункт в конце меню Редактора Stateflow View
Stateflow:DisplayMenuПункт в конце меню Редактора Stateflow Display
Stateflow:ChartMenuПункт в конце меню Редактора Stateflow Chart
Stateflow:SimulationMenuПункт в конце меню Редактора Stateflow Simulation
Stateflow:AnalysisMenuПункт в конце меню Редактора Stateflow Analysis
Stateflow:CodeMenuПункт в конце меню Редактора Stateflow Code
Stateflow:ToolsMenuПункт в конце меню Редактора Stateflow Tools
Stateflow:HelpMenuПункт в конце меню Редактора Stateflow Help

Меню редактора Simulink и Stateflow Индивидуальной настройки

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

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

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

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

Похожие темы