Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

カスタムのドキュメント タイプをサポートするための RMI 拡張の実装

要件管理インターフェイス (RMI) は、モデルベース デザイン要素と要件ドキュメント間にリンクを作成し、確認するためのツールを提供します。RMI には、多くのドキュメント タイプのサポートが内蔵されています。追加的に、カスタム リンク タイプの拡張を実装することで、その他のドキュメント タイプへのリンクを可能にすることができます。この例では、Microsoft® PowerPoint® プレゼンテーションとリンクするための RMI 拡張の実装について説明します。

この例で使用するファイル

このチュートリアル例では、slvnvdemo_powerwindowController.slx モデルのオブジェクトを、powerwindowController.pptx PowerPoint プレゼンテーションのスライドにリンクします。Simulink® モデル slvnvdemo_powerwindowController.slx を開きます。

open_system('slvnvdemo_powerwindowController');

リンクを使用するための要件マネージャーのセットアップ

  1. [アプリ] タブで [要件マネージャー] を開きます。

  2. [要件] タブで [レイアウト][要件ブラウザー] が選択されていることを確認します。

  3. [要件ブラウザー][表示] ドロップダウン メニューで、[Links] を選択します。

この例の操作はすべて [要件] タブ内で行います。ツールストリップ ボタンについて言及する場合、常にこのタブのツールストリップ ボタンを指します。

リンクの外部保存

slvnvdemo_powerwindowController モデルで、リンクを外部に保存するよう設定します。[要件] タブで [リンクの設定][既定のリンク ストレージ] を選択します。[要件の設定] ダイアログ ボックスが開きます。[トレーサビリティ データの既定のストレージ モード] の見出しの下で、[外部保存 (個別の *.slmx ファイル)] を選択します。あるいは、以下のコードを評価します。

rmipref('StoreDataExternally', true);

インストール済みのリンク タイプ定義ファイル

カスタムタイプ ドキュメントに使用するアプリケーションによっては、[外向きリンク] ダイアログ ボックスによるリンクの作成、コンテキスト メニュー ショートカットによるリンク移動を含む基本的なサポートを実装できます。また、コンテキスト メニュー ショートカットによる選択内容のリンク、整合性チェックなど、より多機能なサポートを実装することもできます。

このチュートリアルでは、最初から作成されたカスタム リンク タイプ定義を使用します。カスタム リンク タイプ拡張 API の詳細については、以下を評価して、含まれている linktype_TEMPLATE.m を参照してください。

edit([matlabroot,'/toolbox/slrequirements/linktype_examples/linktype_TEMPLATE.m'])

また、リリース済み製品で使用されている実際のリンクタイプ定義ファイルを確認することもできます。たとえば、最小限のテキスト ファイル リンク タイプを参照するには、以下を評価します。

edit([matlabroot,'/toolbox/slrequirements/linktype_examples/linktype_rmi_text.m'])

また、より高度な Microsoft Excel® ワークブック リンク タイプを参照することもできます。

edit([matlabroot,'/toolbox/slrequirements/linktype_examples/linktype_rmi_excel.m'])

スタブされたリンク タイプ ファイルの作成と登録

現在の作業ディレクトリにあるファイル rmidemo_pp_linktype.m には、RMI が Microsoft PowerPoint ファイルと連携するためのリンク タイプ情報が含まれています。以下を評価して、リンク タイプを RMI に登録します。

rmi('register', 'rmidemo_pp_linktype')

これは、ファイル名拡張子 .ppt および .pptx をサポートされるファイルとして認識し、ここに定義されたメソッドを RMI の機能で使用するよう RMI に指示します。

1 つ目のリンクの作成

  • slvnvdemo_powerwindowController モデル例の背景を右クリックします。コンテキスト メニューで、[このレベルの要件][[外向きリンク] ダイアログを開く...] を選択し、[外向きリンク] ダイアログ ボックスを開きます。

  • [新規] をクリックし、新規リンクを作成します。

  • [ドキュメント タイプ] ドロップダウン リストを展開します。リストの末尾にある Microsoft PowerPoint を選択します。

  • [参照] ボタンを使用して、powerwindowController.pptx を見つけます。

  • [説明] ラベルに、Example Presentation などを入力します。

  • [OK] をクリックして新しいリンクを保存し、ダイアログを閉じます。

customlinktype_linkeditor.png

あるいは、以下のコードを評価してリンクを作成することもできます。このコードは、まずリンク先の情報を入力してから、関数 rmi を使用してリンクを作成します。

firstReq = rmi('createempty');
firstReq.reqsys = 'rmidemo_pp_linktype';
firstReq.doc = 'powerwindowController.pptx';
firstReq.description = 'Example presentation';
rmi('set', 'slvnvdemo_powerwindowController', firstReq);

ドキュメントへの移動

PowerPoint ドキュメントへの移動は、rmidemo_pp_linktype.m ファイル内の関数によって提供されます。その実装、およびその他すべてのメソッドの実装には、要件ドキュメントを管理するアプリケーションで使用可能な API に関する詳細な知識が必要になります。この Microsoft PowerPoint の例では、COM API を使用します。MATLAB® で actxserver コマンドを使用して、PowerPoint アプリケーションとの接続を作成します。次に、Application.Presentations.Open(FILENAME) などの呼び出しを使用して、rmidemo_pp_linktype メソッドを介して PowerPoint アプリケーションを操作します。COM API で使用可能な PowerPoint オブジェクトおよびメソッドについては、Microsoft の開発者向けリファレンス ページを参照してください。

rmidemo_pp_linktype.m ファイルには、正しい .pptx ファイルを見つけるための関数が含まれています。

slvnvdemo_powerwindowController の Simulink モデルに戻ります。Simulink のブロック線図の背景を右クリックし、コンテキスト メニューから再度 [要件][このレベルの要件] に移動します。サブメニューの一番上に新しいナビゲーション ショートカットがあることを確認します。この新しいショートカットをクリックすると、MATLAB が PowerPoint ファイルを開きます。

customlinktype_firstlink.png

前と同じ方法で、あるいは、rmi('view','slvnvdemo_powerwindowController', 1) を評価することで、リンクを移動できます。

特定のスライド番号へのナビゲーションの実装

control サブシステム ブロックの driver 入力に接続される Truth Table ブロックを、PowerPoint プレゼンテーションの対応するスライド番号 5 にリンクする場合を考えます。Truth Table ブロックに移動するか、以下のコードを評価します。

rmidemo_callback('locate','slvnvdemo_powerwindowController/Truth Table')
  • ブロックを右クリックし、[要件][[外向きリンク] ダイアログを開く...] を選択して、[外向きリンク] ダイアログ ボックスを開きます。

  • [新規] をクリックし、新規リンクを作成します。

  • 前と同じように、ドキュメント タイプとファイル名を指定します。

  • [説明] フィールドに Driver input と入力します。

  • [場所: (タイプ/識別子)] 入力フィールドに 5 と入力します。

  • [OK] をクリックして新しいリンクを保存します。

customlinktype_driverinput.png

Simulink のブロック線図からこのリンクで移動すると、前と同じようにドキュメントが開きますが、今度は 5 枚目のスライドまでスクロールされます。補助メソッド goToSlide() と、関数 NavigateFcn() 内のコードにより、正しいスライドが開かれます。

function goToSlide(hDoc, slideNum)
  disp(['Opening slide #' num2str(slideNum)]);
  hDoc.Slides.Item(slideNum).Select;
end

Truth Table ブロックを選択し、右クリックして [要件]、[1. "Driver input"] を選択してリンクを移動します。PowerPoint プレゼンテーション ウィンドウが 5 枚目のスライドにスクロールされます。

あるいは、以下のコードを評価してリンクを作成します。このコードは、まずリンク先の情報を入力してから、関数 rmi を使用してリンクを作成します。

secondReq = rmi('createempty');
secondReq.reqsys = 'rmidemo_pp_linktype';
secondReq.doc = 'powerwindowController.pptx';
secondReq.description = 'Driver input';
secondReq.id = '#5';
rmi('set', 'slvnvdemo_powerwindowController/Truth Table', secondReq);

前と同じ方法で、あるいは、rmi('view','slvnvdemo_powerwindowController/Truth Table', 1) を評価することで、リンクを移動できます。

スライド ID へのリンクと移動

保存されたスライド番号へのリンクには、ドキュメントを変更するとリンクが古くなるという問題があります。たとえば、このプレゼンテーションの 1 枚目のスライドを複製します。

すると、他のすべてのスライドが 1 つずつずれます。Driver Input Truth Table ブロックから移動すると、間違ったスライドが表示されます。Page/Item number ではない、別の場所タイプを使用する必要があります。

  • control サブシステムの driver 入力に接続された、同じ Truth Table ブロックを選択します。以下のコードは、Truth Table ブロックに移動します。

rmidemo_callback('locate','slvnvdemo_powerwindowController/Truth Table')
  • ブロックを右クリックし、[要件][[外向きリンク] ダイアログを開く...] を選択して、[外向きリンク] ダイアログ ボックスを開きます。

  • [新規] をクリックし、新規リンクを作成します。

  • [場所 (タイプ/識別子)] ドロップダウン リストから Named Item を選択します。

  • [場所] 入力フィールドに 260 と入力します。

  • [OK] をクリックして変更したリンクを保存します。

"260" というのは、Driver Input スライドの永続 ID です (これについては後ほど詳述します)。

この変更を行った後、Driver Input Truth Table ブロックから移動すると、たとえ順序番号が変更されていても、正しいスライドが表示されます。

残念ながら、スライド ID を PowerPoint アプリケーション UI で確認することはできません。5 枚目のスライドの ID を知るには、COM API を使用できます。

>> hApp = actxGetRunningServer('powerpoint.application');
>> hDoc = hApp.ActivePresentation;
>> hDoc.Slides.Item(5).SlideID 
ans =
  260

以降の節で、この問題に対するよりユーザー フレンドリな解決法を説明します。

あるいは、以下のコードを使用してリンクを作成できます。このコードは、まずリンク先の情報を入力してから、関数 rmi を使用してリンクを作成します。

betterLink = rmi('createempty');
betterLink.reqsys = 'rmidemo_pp_linktype';
betterLink.doc = 'powerwindowController.pptx';
betterLink.description = 'Driver input - better link';
betterLink.id = '@260';
rmi('set', 'slvnvdemo_powerwindowController/Truth Table', betterLink);

前と同じ方法で、あるいはコード rmi('view','slvnvdemo_powerwindowController/Truth Table', 1) を評価することで、リンク先に移動できます。

[ドキュメント インデックス] タブを使用したリンク

上記のように、リンク先プレゼンテーションのスライドが並べ替えられても古くならない永続リンクを作成することができますが、PowerPoint で、永続 SlideID の値に簡単にアクセスすることはできません。考えられる 1 つの解決法は、[外向きリンク] ダイアログの [ドキュメント インデックス] タブで目的のスライドを選択することです。[ドキュメント インデックス] タブの内容は、リンクタイプ定義ファイルの ContentsFcn() メソッドによって制御されます。このメソッドに対して、リンクの作成時に、変わりやすい SlideNumber の値の代わりに永続 SlideID 値が RMI によって保存されるようにする実装を施すことができます。

ContentsFcn() メソッドは、以下の 3 つの配列を返します。

  • labels。ドキュメント インデックスのリスト項目とナビゲーション ショートカットに使用されます。

  • depths。リスト項目の階層関係を示します (この例では使用しません)。

  • locations。保存された一意の ID に使用します。

ContentsFcn() の実装では、 "場所" の値を入力するために、次の PowerPoint API 呼び出しを使用します。

hDoc.Slides.Item(k).SlideID

これにより、スライドの順番が変わっても、永続的なナビゲーション情報が得られます。locations 値の接頭辞として @ を使用することに注意してください。これは、後続の数値にスライド (ページ) 番号の場所値ではなく、名前付き項目の場所値が保存されることを示します。

外向きリンク エディター[ドキュメント インデックス] タブを使用し、リンクを作成します。

  • control サブシステム ブロックの passenger 入力に接続された Truth Table1 ブロックに移動します。以下のコードは、Truth Table1 ブロックに移動します。

rmidemo_callback('locate','slvnvdemo_powerwindowController/Truth Table1')
  • ブロックを右クリックし、[要件][[外向きリンク] ダイアログを開く...] を選択して、[外向きリンク] ダイアログ ボックスを開きます。

  • [新規] をクリックし、新規リンクを作成します。

  • [ドキュメント タイプ]Microsoft PowerPoint と指定します。

  • [参照] メニューから [ドキュメント]powerwindowController.pptx に指定します。

  • [説明] の入力はそのままにします。

  • [場所] を手動で指定する代わりに、[ドキュメント インデックス] タブに切り替え、Passenger Inputs スライドに対応する行を見つけ、行をダブルクリックします。

  • 残りの入力フィールドに正しい情報が自動的に入力されることを確認します。

  • [OK] をクリックして新しいリンクを保存します。

customlinktype_docindex.png

Truth Table1 ブロックを右クリックし、[要件][1."Passenger Input consists of a vector with three elements in powerwindowController.pptx"] を選択して、リンクを移動します。スライドがずれたり、並べ替えられたりしても、このリンクは正しく動作します。

あるいは、以下のコードを評価してリンクを作成できます。リンク ID は、永続 ID を設定した前の節と同じ方法で作成されます。このコードは、まずリンク先の情報を入力してから、関数 rmi を使用してリンクを作成します。

indexLink = rmi('createempty');
indexLink.reqsys = 'rmidemo_pp_linktype';
indexLink.doc = 'powerwindowController.pptx';
indexLink.description = 'Passenger input - linked via Index tab';
indexLink.id = '@259';
rmi('set', 'slvnvdemo_powerwindowController/Truth Table1', indexLink);

上と同じ方法でリンクに移動するか、rmi('view','slvnvdemo_powerwindowController/Truth Table1', 1) を評価します。

PowerPoint の現在のスライドへのリンク

ロバストな永続リンクをサポートするためにさらに良い方法は、選択内容のリンク ショートカットを使用することです。RMI API では、現在のドキュメントにおける現在のオブジェクトとリンクするために関数 SelectionLinkFcn() を定義できます。このチュートリアルの次のステップでは、現在開いている PowerPoint プレゼンテーションの現在のスライドへのリンク作成を自動化します。

コンテキスト メニューの [要件] セクションに、PowerPoint の現在のスライドとリンクするためのショートカットが表示されます。

  • PowerPoint プレゼンテーション例のコピー上で、Top or bottom of the window frame is reached というタイトルをもつスライド 6 に移動します。

  • Simulink ブロック線図で、endstop ブロックを右クリックします。

rmidemo_callback('locate','slvnvdemo_powerwindowController/endstop')
  • ブロックを右クリックし、コンテキスト メニューから [要件][Link to Slide in PowerPoint] を選択します。

customlinktype_selectionlink.png

RMI が、アクティブなプレゼンテーションの現在の場所に対応する SlideID へのリンクを自動的に作成します。RMI は、ターゲット スライドの見出しテキストを新しいリンクのラベルとして使用しようとします。

リンクに移動するには、endstop ブロックを再度右クリックし、[要件][1."Top or bottom of the window frame is rea..."] を選択します。PowerPoint プログラムが開き、正しいスライドが表示されます。

あるいは、以下のコードを使用してリンクを作成できます。リンク ID は、永続 ID を設定した前の節と同じ方法で作成されます。このコードは、まずリンク先の情報を入力してから、関数 rmi を使用してリンクを作成します。

selectionLink = rmi('createempty');
selectionLink.reqsys = 'rmidemo_pp_linktype';
selectionLink.doc = 'powerwindowController.pptx';
selectionLink.description = 'Endstop signal - selection link';
selectionLink.id = '@261';
rmi('set', 'slvnvdemo_powerwindowController/endstop', selectionLink);

上と同じ方法で、または rmi('view','slvnvdemo_powerwindowController/endstop', 1) を評価することで、リンクに移動します。

双方向リンクの作成

このチュートリアルの最後のステップとして、関数 SelectionLinkFcn() を拡張し、オプションで、PowerPoint から Simulink 内のリンク オブジェクトに移動するためのハイパーリンクを現在のスライドに挿入できるようにします。

この PowerPoint リンク タイプでは、Simulink オブジェクトのコンテキスト メニューで [Link to Slide in PowerPoint] ショートカットを使用したときに、リンクされたスライドに Simulink ナビゲーション コントロールを自動挿入することが可能です。この機能を有効にするには、Simulink モデルで [要件] タブを選択します。次に、[リンクの設定][リンク オプション] を選択します。あるいは、コード rmi_settings_dlg を評価すると、このダイアログ ボックスが開きます。

[選択ベースのリンクの作成時] の見出しの下にある [双方向リンクのリンク先を変更] がオンになっていることを確認します。あるいは、以下のコードを実行するとこれらの設定が行われます。

origMcState = rmipref('UnsecureHttpRequests', true);
origTwoWayPref = rmipref('BiDirectionalLinking', true);

R2019a 以降、MATLAB の組み込み HTTP サービスはセキュア ポート 31515 では有効ですが、非セキュアのポート 31415 では無効になっています。このナビゲーション URL では証明書のインストールなしにセキュア ポートを使用できないため、このタブの下部にある [MATLAB の起動時に外部接続を有効にする] チェック ボックスもオンにしなければなりません。

これを試すために、obstacle 信号入力ブロックで選択内容のリンク手順を繰り返し、プレゼンテーション例の対応するスライドに関連付けます。

  • powerwindowController.pptx のスライド 7 に移動します (アクティブなスライドにします)。

  • Simulink モデルの obstacle ブロックに移動します。

rmidemo_callback('locate','slvnvdemo_powerwindowController/obstacle')
  • ブロックを右クリックし、コンテキスト メニューから [要件][Link to Slide in PowerPoint] を選択します。

すると、新しい RMI アイコンがスライドの左上隅に挿入されることを確認できます。

customlinktype_selectiontwoway.png

Microsoft PowerPoint の手順に従ってリンクをたどると、slvnvdemo_powerwindowController モデルで対応するブロックが強調表示されます。

PowerPoint ドキュメントから Requirements Toolbox への項目のインポート

Requirements Toolbox™ は、カスタム リンク タイプ定義に必要なすべての情報が含まれる場合、"ドキュメントのインポート" 機能をもちます。カスタマイズ ファイル rmidemo_pp_linktype.m および slreq.import() API を使用することで、タイプ slreq.Reference または slreq.Requirement のオブジェクトとして自動的にコンテンツを取り込み、.slreqx ファイルに保存できます。詳細については、slreq.importを参照してください。

このカスタムのドキュメント タイプ定義では、HtmlViewFcn() に対する実装を提供していないため、プレーン テキストのインポートのみが動作します。

slreq.import() コマンドは、PowerPoint でドキュメントが開いていることを確認してから実行します。インポーターに、インポートされた項目の数が表示されます。今回のケースでは、スライドの数です。slreq.editorコマンドを使用して、"要件エディター" を開きます。ドキュメント ノードを展開し、インポートされた項目を参照します。[ドキュメントに表示] ボタンをクリックし、インポートされた "参照" からソース ドキュメント内の元の項目に移動します。

customlinktype_reqeditor.png

あるいは、以下のステップに従って、コマンド ラインから要件をインポートします。

  • インポートの前に、powerwindowController.pptx ドキュメントが開いていることを確認します。

rmi('view','slvnvdemo_powerwindowController', 1)
  • 以下を使用して、要件をインポートします。

slreq.import('rmidemo_pp_linktype', 'AsReference', true, 'RichText', false)
  • slreq.editor を使用して、"要件エディター" で要件を表示します。

この後のステップ

スライド全体にリンクするのではなく、SelectionLinkFcn() の実装をスライド内の特定のテキストやイメージにリンクするよう変更することができます。Simulink ナビゲーション コントロールのアンカーと外観を調整する方法については、Microsoft の開発者向けリファレンス ページを参照してください。たとえば、ハイパーリンク付きのアイコンを挿入する代わりに、現在のスライドで選択したテキストにハイパーリンクを付加することができます。

保存されたテキストがどのスライドに含まれるかにかかわらず、"検索テキスト" のパターンに対してリンクする必要がある場合は、以下のように、サポートされる場所タイプの宣言を拡張し、? 文字を含めることができます。

 linkType.LocDelimiters = '#@?';

その後、NavigateFcn() メソッドの switch(locationStr(1))case を追加します。対応するヘルパー findText() は、PowerPoint プレゼンテーション オブジェクトのすべての Slides のすべての TextFrame 項目をクエリし、一致するテキストをもつ項目を選択します。

RMI リンク タイプ テンプレートは、ニーズに応じてその他のメソッドをサポートしています。たとえば、カスタム リンクを要件の整合性チェックに含めるには、次のメソッドを実装することを検討してください。

  • IsValidDocFcn()

  • IsValidIdFcn()

  • IsValidDescFcn()

生成レポート上のリンクの表示方法を調整するには、以下を使用できます。

  • CreateURLFcn()

  • UrlLabelFcn()

  • DocDateFcn()

  • DetailsFcn()

  • HtmlViewFcn()

アプリケーションがファイルベースでなく、独自のデータベースを使用して要件ドキュメントを保存している場合、リンク タイプを "ファイルではない" としてマークしなければなりません。

linkType.IsFile = 0;

そして、BrowseFcn() に特殊な実装を提供します。これは、[外向きリンク] ダイアログで [参照] ボタンをクリックしたときに呼び出される関数です。

rmi('edit','slvnvdemo_powerwindowController');

クリーンアップ

クリーンアップ コマンドです。rmidemo_pp_linktype の登録を解除し、変更を保存せずに開いている要件セットをクリアし、変更を保存せずに開いているモデルを閉じます。

rmi('unregister', 'rmidemo_pp_linktype');
slreq.clear();
bdclose all;