Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

Simulink® エディターおよび Stateflow® エディターについて、メニュー バーとコンテキスト メニューにコマンドとサブメニューを追加できます。

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

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

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

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

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

次の sl_customization.m ファイルは、Simulink エディターの [ツール] メニューに 4 つの項目を追加します。

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

    このアクションをトリガーするために使用する 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 ファイルを使用します (カスタマイズの登録を参照)。特に、システムの関数 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:MenuBarSimulink エディターのメニュー バーへのメニュー
Simulink:PreContextMenuSimulink エディターのコンテキスト メニューの先頭項目
Simulink:ContextMenuSimulink エディターのコンテキスト メニューの末尾項目
Simulink:FileMenuSimulink エディターの [ファイル] メニューの末尾項目
Simulink:EditMenuSimulink エディターの [編集] メニューの末尾項目
Simulink:ViewMenuSimulink エディターの [表示] メニューの末尾項目
Simulink:DisplayMenuSimulink エディターの [表示] メニューの末尾項目
Simulink:DiagramMenuSimulink エディターの [ブロック線図] メニューの末尾項目
Simulink:SimulationMenuSimulink エディターの [シミュレーション] メニューの末尾項目
Simulink:AnalysisMenuSimulink エディターの [解析] メニューの末尾項目
Simulink:CodeMenuSimulink エディターの [コード] メニューの末尾項目
Simulink:ToolsMenuSimulink エディターの [ツール] メニューの末尾項目
Simulink:HelpMenuSimulink エディターの [ヘルプ] メニューの末尾項目
Stateflow タグ
Stateflow:MenuBarStateflow エディターのメニュー バーへのメニュー
Stateflow:PreContextMenuStateflow エディターのコンテキスト メニューの先頭項目
Stateflow:ContextMenuStateflow エディターのコンテキスト メニューの末尾項目
Stateflow:FileMenuStateflow エディターの [ファイル] メニューの末尾項目
Stateflow:EditMenuStateflow エディターの [編集] メニューの末尾項目
Stateflow:ViewMenuStateflow エディターの [表示] メニューの末尾項目
Stateflow:DisplayMenuStateflow エディターの [表示] メニューの末尾項目
Stateflow:ChartMenuStateflow エディターの [チャート] メニューの末尾項目
Stateflow:SimulationMenuStateflow エディターの [シミュレーション] メニューの末尾項目
Stateflow:AnalysisMenuStateflow エディターの [解析] メニューの末尾項目
Stateflow:CodeMenuStateflow エディターの [コード] メニューの末尾項目
Stateflow:ToolsMenuStateflow エディターの [ツール] メニューの末尾項目
Stateflow:HelpMenuStateflow エディターの [ヘルプ] メニューの末尾項目

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

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

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

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

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

関連するトピック