Main Content

モデル エディターのメニューへの項目の追加

Simulink® エディターおよび Stateflow® エディターについて、コンテキスト メニューにコマンドとサブメニューを追加できます。メニュー バーのカスタマイズは将来のリリースで削除される予定です。Simulink ツールストリップをカスタマイズするには、カスタム タブを使用します。カスタム タブの詳細については、Create Custom Simulink Toolstrip Tabsを参照してください。既存のツール バー メニューをツールストリップ タブに変換するには、slConvertCustomMenusを使用します。

メニューに項目を追加するには次の手順に従います。

  1. 各項目に対して、項目を定義する関数を作成します。この関数は、スキーマ関数と呼ばれます (メニュー項目の定義を参照)。

  2. Simulink の起動時にカスタマイズ マネージャーを使用してメニューの設定変更を登録します。たとえば、MATLAB® パス上のファイル sl_customization.m で登録します (メニューのカスタマイズの登録を参照)。

  3. メニューへの追加項目によってトリガーされるコマンドを実装するコールバック関数を作成します。

メニュー項目を追加するコード

次の sl_customization.m ファイルは、Simulink エディターのキャンバスを右クリックすると表示されるコンテキスト メニューの下部に 4 つの項目を追加します。

function sl_customization(cm)

  %% Register custom menu function.
  cm.addCustomMenuFcn('Simulink:ContextMenu', @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

このアクションをトリガーするために使用する Ctrl とキーの組み合わせを指定する文字ベクトル。メニュー バーのメニューに表示されるカスタム メニュー項目のキーボード ショートカットのみ追加でき (削除予定)、Simulink エディターに付属するアクセラレータは再定義できません。たとえば、Ctrl + D は Simulink エディターの [ブロック線図の更新] のアクセラレータであるため、再定義できません。

この値を指定するには、'Ctrl+K' の形式を使用します。ここで、K はショートカット キーです。たとえば、CtrlAlt を押したまま T を押すと呼び出されるアクセラレータには 'Ctrl+Alt+T' を使用します。

callback

ユーザーがアクションをトリガーするメニュー項目を選択したときに評価される MATLAB 式または呼び出される関数のハンドルを指定する文字ベクトル。この関数は、1 つの引数、すなわち、コールバック情報オブジェクトを受け入れなければなりません。

autoDisableWhen

メニュー項目を自動的に無効にするタイミングを制御するプロパティ。

  • 'Locked' (既定) – アクティブなエディターがロックされた、あるいはモデルがビジー状態である

  • 'Busy'– モデルがビジー状態である場合のみ

  • 'Never'– 行わない

トグル スキーマ オブジェクト.  このオブジェクトは、一部のオブジェクトのオンとオフを切り替えるメニュー項目に関する情報を指定します。スキーマ関数内でこのオブジェクトのインスタンスを作成するには、関数 sl_toggle_schema を使用します。このオブジェクトのプロパティには、以下が含まれます。

プロパティ説明
tag

たとえば、フィルター関数により参照可能となるような、トグル アクションを定義するオプションの文字ベクトル。

label

トグル アクションをトリガーするメニュー項目上に現れるラベルを指定する文字ベクトル。

checked

メニュー項目のチェック マークの表示/非表示を指定。有効な値は 'unchecked' (既定) および 'checked' です。

state

この切り替えアクションの状態を指定するプロパティ。有効な値は次のとおりです。

  • 'Enabled'(既定) – アクションがメニューに表示され、選択できる

  • 'Disabled'– アクションがメニューに表示されるが、選択できない

  • 'Hidden'– アクションがメニューに表示されない

statustip

ユーザーがトグル アクションをトリガーするメニュー項目を選択したときにエディターのステータス バーに現れるテキストを指定する文字ベクトル。

userdata

ユーザーが指定するデータ。任意のタイプで構いません。

accelerator

このアクションをトリガーするために使用する Ctrl とキーの組み合わせを指定する文字ベクトル。メニュー バーのメニューに表示されるカスタム メニュー項目のキーボード ショートカットのみ追加でき (削除予定)、Simulink エディターに付属するアクセラレータは再定義できません。たとえば、Ctrl + D は Simulink エディターの [ブロック線図の更新] のアクセラレータであるため、再定義できません。

この値を指定するには、'Ctrl+K' の形式を使用します。ここで、K はショートカット キーです。たとえば、CtrlAlt を押したまま T を押すと呼び出されるアクセラレータには 'Ctrl+Alt+T' を使用します。

callback

ユーザーがアクションをトリガーするメニュー項目を選択したときに評価される MATLAB 式または呼び出される関数のハンドルを指定する文字ベクトル。この関数は、1 つの引数、すなわち、コールバック情報オブジェクトを受け入れなければなりません。

autoDisableWhen

メニュー項目を自動的に無効にするタイミングを制御するプロパティ。

  • 'Locked' (既定) – アクティブなエディターがロックされた、あるいはモデルがビジー状態である

  • 'Busy'– モデルがビジー状態である場合のみ

  • 'Never'– 行わない

カスタム サブメニューの定義

サブメニューを定義するには、コールバック情報オブジェクトを受け入れ、サブメニュー上の項目を定義するスキーマを指定するコンテナー スキーマ オブジェクト (コンテナー スキーマ オブジェクトを参照) を返すスキーマ関数を作成します。たとえば、次のスキーマ関数は、カスタム コマンドをトリガーするメニュー項目の定義の例で定義したメニュー項目の 3 つのインスタンスを含むサブメニューを定義します。

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

サブメニューの内容を指定する cell 配列。cell 配列の各エントリは、次のとおりです。

  • サブメニューの項目を定義するスキーマ関数のポインター (メニュー項目の定義を参照)。

  • 最初の要素が項目のエントリを定義するスキーマ関数へのポインターで、2 番目の要素がユーザー データとしてスキーマ関数に渡されるコールバック情報オブジェクト (コールバック情報オブジェクトを参照) に挿入されるデータである 2 要素 cell 配列。

  • 'separator'。cell 配列内の前にあるエントリによって定義される項目と、次のエントリで定義される項目間に現れる区切りを表示します。このエントリでは、大文字と小文字の区別をしません (たとえば、'SEPARATOR''Separator' は両方とも有効なエントリです)。また区切りは、サブメニューの先頭および末尾にある場合は削除され、連続表示となる場合 (たとえば項目が非表示になった結果) は 1 つにまとめられます。

たとえば、次の cell 配列は 2 つのサブメニュー エントリを指定します。

{@getItem1, 'separator', {@getItem2, 1}}

この例では、1 はコールバック情報オブジェクトによって getItem2 に渡されます。

generateFcn

サブメニューの内容を定義する cell 配列を返す関数のポインター。cell 配列は、コンテナー スキーマ オブジェクトの childrenFcns プロパティに対して指定されたものと同じ形式でなければなりません。

generateFcn プロパティは、childrenFcns プロパティよりも優先されます。両方設定した場合は、childrenFcns プロパティは無視され、generateFcn により返される cell 配列がサブメニューを作成するために使用されます。

userdata

generateFcn に渡される任意の型のデータ。

autoDisableWhen

メニュー項目を自動的に無効にするタイミングを制御するプロパティ。

  • 'Locked' (既定) – アクティブなエディターがロックされた、あるいはモデルがビジー状態である

  • 'Busy'– モデルがビジー状態である場合のみ

  • 'Never'– 行わない

メニューのカスタマイズの登録

カスタマイズ マネージャーを使用して Simulink メニューに含めるカスタム項目を登録する必要があります。この作業を行うには、Simulink のインストール時に sl_customization.m ファイルを使用します (Simulink でのカスタマイズの登録を参照)。特に、システムの関数 sl_customization は、カスタマイズするメニューごとにカスタマイズ マネージャーの addCustomMenuFcn メソッドを呼び出さなければなりません。メソッドが呼び出されるごとに、カスタマイズするメニューのタグ (メニュー タグを参照) およびメニューに追加する項目を指定するカスタム メニュー関数 (カスタム メニュー関数の作成を参照) が渡されます。たとえば、次の例の関数 sl_customization は、カスタム項目を Simulink の [ツール] メニューに追加します。

function sl_customization(cm)
  %% Register custom menu function.
  cm.addCustomMenuFcn('Simulink:ToolsMenu', @getMyItems);

カスタム メニュー関数の作成

カスタム メニュー関数を使用すると、モデル エディターのメニューに表示するカスタム項目を定義するスキーマ関数の cell 配列が返されます (メニュー項目の定義を参照)。このカスタム メニュー関数は、関数 generateFcn で返されるものと同様の cell 配列を返します。

カスタム メニュー関数は、コールバック情報オブジェクト (コールバック情報オブジェクトを参照) を受け入れ、スキーマ関数の一覧を表示する cell 配列を返します。cell 配列の各要素は、スキーマ関数のハンドル、または最初の要素がスキーマ関数のハンドルで、2 番目の要素がスキーマ関数に渡されるユーザー定義データである 2 要素 cell 配列のいずれかです。たとえば、次のカスタム メニュー関数は、3 つのスキーマ関数を一覧表示する cell 配列を返します。

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:PreContextMenuSimulink エディターのコンテキスト メニューの先頭項目
Simulink:ContextMenuSimulink エディターのコンテキスト メニューの末尾項目
Simulink:FileMenu (削除予定)Simulink エディターの [ファイル] メニューの末尾項目
Simulink:EditMenu (削除予定)Simulink エディターの [編集] メニューの末尾項目
Simulink:ViewMenu (削除予定)Simulink エディターの [表示] メニューの末尾項目
Simulink:DisplayMenu (削除予定)Simulink エディターの [表示] メニューの末尾項目
Simulink:DiagramMenu (削除予定)Simulink エディターの [ブロック線図] メニューの末尾項目
Simulink:SimulationMenu (削除予定)Simulink エディターの [シミュレーション] メニューの末尾項目
Simulink:AnalysisMenu (削除予定)Simulink エディターの [解析] メニューの末尾項目
Simulink:CodeMenu (削除予定)Simulink エディターの [コード] メニューの末尾項目
Simulink:ToolsMenu (削除予定)Simulink エディターの [ツール] メニューの末尾項目
Simulink:HelpMenu (削除予定)Simulink エディターの [ヘルプ] メニューの末尾項目
Stateflow タグ
Stateflow:MenuBar (削除予定)Stateflow エディターのメニュー バーへのメニュー
Stateflow:PreContextMenuStateflow エディターのコンテキスト メニューの先頭項目
Stateflow:ContextMenuStateflow エディターのコンテキスト メニューの末尾項目
Stateflow:FileMenu (削除予定)Stateflow エディターの [ファイル] メニューの末尾項目
Stateflow:EditMenu (削除予定)Stateflow エディターの [編集] メニューの末尾項目
Stateflow:ViewMenu (削除予定)Stateflow エディターの [表示] メニューの末尾項目
Stateflow:DisplayMenu (削除予定)Stateflow エディターの [表示] メニューの末尾項目
Stateflow:ChartMenu (削除予定)Stateflow エディターの [チャート] メニューの末尾項目
Stateflow:SimulationMenu (削除予定)Stateflow エディターの [シミュレーション] メニューの末尾項目
Stateflow:AnalysisMenu (削除予定)Stateflow エディターの [解析] メニューの末尾項目
Stateflow:CodeMenu (削除予定)Stateflow エディターの [コード] メニューの末尾項目
Stateflow:ToolsMenu (削除予定)Stateflow エディターの [ツール] メニューの末尾項目
Stateflow:HelpMenu (削除予定)Stateflow エディターの [ヘルプ] メニューの末尾項目

Simulink および Stateflow エディター メニューのカスタマイズ

Stateflow エディター メニューのカスタマイズでは、Simulink エディターで使用したものと同様の通常の方法を使用します。それぞれの最上位レベル メニュー末尾へのカスタム メニュー機能の追加状況は、アクティブなエディターによって異なります。

  • Simulink:FileMenu にバインドされたメニューは、Simulink エディターがアクティブな場合にのみ表示されます。

  • Stateflow:FileMenu にバインドされたメニューは、Stateflow エディターがアクティブな場合にのみ表示されます。

  • メニューを両方のエディターに表示させるには、addCustomMenuFcn を 2 回 (それぞれのタグで一度ずつ) 呼び出します。両方のエディターでコードが機能していることを確認してください。

関連するトピック