モデル エディターのメニューへの項目の追加
Simulink® エディターおよび Stateflow® エディターについて、コンテキスト メニューにコマンドとサブメニューを追加できます。メニュー バーのカスタマイズは将来のリリースで削除される予定です。Simulink ツールストリップをカスタマイズするには、カスタム タブを使用します。カスタム タブの詳細については、Create Custom Simulink Toolstrip Tabsを参照してください。既存のツール バー メニューをツールストリップ タブに変換するには、slConvertCustomMenus
を使用します。
メニューに項目を追加するには次の手順に従います。
各項目に対して、項目を定義する関数を作成します。この関数は、スキーマ関数と呼ばれます (メニュー項目の定義を参照)。
Simulink の起動時にカスタマイズ マネージャーを使用してメニューの設定変更を登録します。たとえば、MATLAB® パス上のファイル
sl_customization.m
で登録します (メニューのカスタマイズの登録を参照)。メニューへの追加項目によってトリガーされるコマンドを実装するコールバック関数を作成します。
メニュー項目を追加するコード
次の 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 | アクションの状態を指定するプロパティ。有効な値は次のとおりです。
|
statustip | ユーザーがアクションをトリガーするメニュー項目を選択したときにエディターのステータス バーに現れるテキストを指定する文字ベクトル。 |
userdata | ユーザーが指定するデータ。任意のタイプで構いません。 |
accelerator | このアクションをトリガーするために使用する Ctrl とキーの組み合わせを指定する文字ベクトル。メニュー バーのメニューに表示されるカスタム メニュー項目のキーボード ショートカットのみ追加でき (削除予定)、Simulink エディターに付属するアクセラレータは再定義できません。たとえば、Ctrl + D は Simulink エディターの [ブロック線図の更新] のアクセラレータであるため、再定義できません。 この値を指定するには、 |
callback | ユーザーがアクションをトリガーするメニュー項目を選択したときに評価される MATLAB 式または呼び出される関数のハンドルを指定する文字ベクトル。この関数は、1 つの引数、すなわち、コールバック情報オブジェクトを受け入れなければなりません。 |
autoDisableWhen | メニュー項目を自動的に無効にするタイミングを制御するプロパティ。
|
トグル スキーマ オブジェクト. このオブジェクトは、一部のオブジェクトのオンとオフを切り替えるメニュー項目に関する情報を指定します。スキーマ関数内でこのオブジェクトのインスタンスを作成するには、関数 sl_toggle_schema
を使用します。このオブジェクトのプロパティには、以下が含まれます。
プロパティ | 説明 |
---|---|
tag | たとえば、フィルター関数により参照可能となるような、トグル アクションを定義するオプションの文字ベクトル。 |
label | トグル アクションをトリガーするメニュー項目上に現れるラベルを指定する文字ベクトル。 |
checked | メニュー項目のチェック マークの表示/非表示を指定。有効な値は |
state | この切り替えアクションの状態を指定するプロパティ。有効な値は次のとおりです。
|
statustip | ユーザーがトグル アクションをトリガーするメニュー項目を選択したときにエディターのステータス バーに現れるテキストを指定する文字ベクトル。 |
userdata | ユーザーが指定するデータ。任意のタイプで構いません。 |
accelerator | このアクションをトリガーするために使用する Ctrl とキーの組み合わせを指定する文字ベクトル。メニュー バーのメニューに表示されるカスタム メニュー項目のキーボード ショートカットのみ追加でき (削除予定)、Simulink エディターに付属するアクセラレータは再定義できません。たとえば、Ctrl + D は Simulink エディターの [ブロック線図の更新] のアクセラレータであるため、再定義できません。 この値を指定するには、 |
callback | ユーザーがアクションをトリガーするメニュー項目を選択したときに評価される MATLAB 式または呼び出される関数のハンドルを指定する文字ベクトル。この関数は、1 つの引数、すなわち、コールバック情報オブジェクトを受け入れなければなりません。 |
autoDisableWhen | メニュー項目を自動的に無効にするタイミングを制御するプロパティ。
|
カスタム サブメニューの定義
サブメニューを定義するには、コールバック情報オブジェクトを受け入れ、サブメニュー上の項目を定義するスキーマを指定するコンテナー スキーマ オブジェクト (コンテナー スキーマ オブジェクトを参照) を返すスキーマ関数を作成します。たとえば、次のスキーマ関数は、カスタム コマンドをトリガーするメニュー項目の定義の例で定義したメニュー項目の 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 | サブメニューの状態を指定する文字ベクトル。有効な値は |
statustip | ユーザーがこのサブメニューを選択したときにエディターのステータス バーに現れるテキストを指定する文字ベクトル。 |
childrenFcns | サブメニューの内容を指定する cell 配列。cell 配列の各エントリは、次のとおりです。
たとえば、次の cell 配列は 2 つのサブメニュー エントリを指定します。 {@getItem1, 'separator', {@getItem2, 1}} この例では、1 はコールバック情報オブジェクトによって |
generateFcn | サブメニューの内容を定義する cell 配列を返す関数のポインター。cell 配列は、コンテナー スキーマ オブジェクトの
|
userdata |
|
autoDisableWhen | メニュー項目を自動的に無効にするタイミングを制御するプロパティ。
|
メニューのカスタマイズの登録
カスタマイズ マネージャーを使用して 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 回 (それぞれのタグで一度ずつ) 呼び出します。両方のエディターでコードが機能していることを確認してください。