このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
モデル エディターのメニューへの項目の追加
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
はショートカット キーです。たとえば、Ctrl と Alt を押したまま 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
はショートカット キーです。たとえば、Ctrl と Alt を押したまま 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:PreContextMenu | Simulink エディターのコンテキスト メニューの先頭項目 |
Simulink:ContextMenu | Simulink エディターのコンテキスト メニューの末尾項目 |
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:PreContextMenu | Stateflow エディターのコンテキスト メニューの先頭項目 |
Stateflow:ContextMenu | Stateflow エディターのコンテキスト メニューの末尾項目 |
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 回 (それぞれのタグで一度ずつ) 呼び出します。両方のエディターでコードが機能していることを確認してください。