このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
Microsoft PowerPoint 用のカスタム ドキュメント インターフェイスの定義
この例では、Microsoft® PowerPoint® プレゼンテーション内の要件へのリンクを有効にするためのカスタム ドキュメント インターフェイスを定義する方法を示します。
モデル例を開く
このチュートリアル例では、slvnvdemo_powerwindowController.slx
モデルのオブジェクトを、powerwindowController.pptx
PowerPoint プレゼンテーションのスライドにリンクします。Simulink® モデル slvnvdemo_powerwindowController.slx
を開きます。
open_system('slvnvdemo_powerwindowController');
リンクを使用するための要件マネージャーのセットアップ
[アプリ] タブで [要件マネージャー] を開きます。
[要件] タブで [レイアウト]、[要件ブラウザー] が選択されていることを確認します。
[要件ブラウザー] の [表示] ドロップダウン メニューで、
[Links]
を選択します。
リンクの外部保存
slvnvdemo_powerwindowController
モデルで、リンクを外部に保存するよう設定します。[要件] タブで [リンクの設定]、[既定のリンク ストレージ] を選択します。[要件の設定] ダイアログ ボックスが開きます。[トレーサビリティ データの既定のストレージ モード] の見出しの下で、[外部保存 (個別の *.slmx ファイル)] を選択します。あるいは、次のコードを評価します。
rmipref('StoreDataExternally',true);
スタブされたカスタム ドキュメント インターフェイスの作成と登録
現在の作業ディレクトリにあるファイル rmidemo_pp.m
に、Microsoft PowerPoint ファイル内の要件へのリンクを有効にするためのドキュメント インターフェイスが含まれています。次のコードを評価してカスタム ドキュメント インターフェイスを登録します。
rmi register rmidemo_pp
これは、ファイル名拡張子 .ppt
および .pptx
をサポートされるファイルとして認識し、ここに定義されたメソッドを RMI の機能で使用するよう RMI に指示します。
1 つ目のリンクの作成
slvnvdemo_powerwindowController
モデル例の背景を右クリックします。コンテキスト メニューで、[このレベルの要件]、[[外向きリンク] ダイアログを開く...] を選択し、[外向きリンク] ダイアログ ボックスを開きます。[新規] をクリックし、新規リンクを作成します。
[ドキュメント タイプ] ドロップダウン リストを展開します。リストの末尾にある Microsoft PowerPoint を選択します。
[参照] ボタンを使用して、
powerwindowController.pptx
を見つけます。[説明] ラベルに、Example Presentation などを入力します。
[OK] をクリックして新しいリンクを保存し、ダイアログを閉じます。
あるいは、次のコードを評価してリンクを作成することもできます。このコードは、まずリンク先の情報を入力してから、関数 rmi
を使用してリンクを作成します。
firstReq = rmi('createempty'); firstReq.reqsys = 'rmidemo_pp'; firstReq.doc = 'powerwindowController.pptx'; firstReq.description = 'Example presentation'; rmi('set','slvnvdemo_powerwindowController', firstReq);
ドキュメントへの移動
PowerPoint ドキュメントへの移動は、rmidemo_pp.m
ファイル内の関数によって提供されます。その実装、およびその他すべてのメソッドの実装には、要件ドキュメントを管理するアプリケーションで使用可能な API に関する詳細な知識が必要になります。この Microsoft PowerPoint の例では、COM API を使用します。MATLAB® で actxserver
コマンドを使用して、PowerPoint アプリケーションとの接続を作成します。次に、Application.Presentations.Open(FILENAME)
などの呼び出しを使用して、rmidemo_pp メソッドを介して PowerPoint アプリケーションを操作します。COM API で使用可能な PowerPoint オブジェクトおよびメソッドについては、Microsoft の開発者向けリファレンス ページを参照してください。
rmidemo_pp.m
ファイルには、正しい .pptx
ファイルを見つけるための関数が含まれています。
slvnvdemo_powerwindowController
の Simulink モデルに戻ります。Simulink のブロック線図の背景を右クリックし、コンテキスト メニューから再度 [要件][このレベルの要件] に移動します。サブメニューの一番上に新しいナビゲーション ショートカットがあることを確認します。この新しいショートカットをクリックすると、MATLAB が PowerPoint ファイルを開きます。
前と同じ方法で、あるいはコード rmi('view','slvnvdemo_powerwindowController', 1)
を評価することで、リンクに移動できます。
特定のスライド番号へのナビゲーションの実装
control
サブシステム ブロックの driver
入力に接続される Truth Table
ブロックを、PowerPoint プレゼンテーションの対応するスライド番号 5 にリンクする場合を考えます。Truth Table
ブロックに移動するか、次のコードを評価します。
rmidemo_callback('locate','slvnvdemo_powerwindowController/Truth Table')
ブロックを右クリックし、[要件]、[[外向きリンク] ダイアログを開く...] を選択して、[外向きリンク] ダイアログ ボックスを開きます。
[新規] をクリックし、新規リンクを作成します。
前と同じように、ドキュメント タイプとファイル名を指定します。
[説明] フィールドに Driver input と入力します。
[場所: (タイプ/識別子)] 入力フィールドに 5 と入力します。
[OK] をクリックして新しいリンクを保存します。
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'; 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'; 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] をクリックして新しいリンクを保存します。
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'; 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] を選択します。
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'; 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 内のリンク オブジェクトに移動するためのハイパーリンクを現在のスライドに挿入できるようにします。
rmidemo_pp
カスタム ドキュメント インターフェイスでは、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 アイコンがスライドの左上隅に挿入されることを確認できます。
Microsoft PowerPoint の手順に従ってリンクをたどると、slvnvdemo_powerwindowController
モデルで対応するブロックが強調表示されます。
PowerPoint ドキュメントから Requirements Toolbox への項目のインポート
Requirements Toolbox™ は、カスタム ドキュメント インターフェイスに必要なすべての情報が含まれる場合、"ドキュメントのインポート" 機能をもちます。カスタマイズ ファイル rmidemo_pp.m
および slreq.import
API を使用することで、タイプ slreq.Reference
または slreq.Requirement
のオブジェクトとして自動的にコンテンツを取り込み、.slreqx
ファイルに保存できます。詳細については、slreq.import
を参照してください。
このカスタムのドキュメント タイプ定義では、HtmlViewFcn
に対する実装を提供していないため、プレーン テキストのインポートのみが動作します。
slreq.import
コマンドは、PowerPoint でドキュメントが開いていることを確認してから実行します。インポーターに、インポートされた項目の数が表示されます。今回のケースでは、スライドの数です。slreq.editor
コマンドを使用して、"要件エディター" を開きます。ドキュメント ノードを展開し、インポートされた項目を参照します。[ドキュメントに表示] ボタンをクリックし、インポートされた "参照" からソース ドキュメント内の元の項目に移動します。
あるいは、以下のステップに従って、コマンド ラインから要件をインポートします。
インポートの前に、
powerwindowController.pptx
ドキュメントが開いていることを確認します。
rmi('view','slvnvdemo_powerwindowController', 1)
以下を使用して、要件をインポートします。
slreq.import('rmidemo_pp','AsReference', true, 'RichText', false)
slreq.editor
を使用して、"要件エディター" で要件を表示します。
この後のステップ
スライド全体にリンクするのではなく、SelectionLinkFcn
の実装をスライド内の特定のテキストやイメージにリンクするよう変更することができます。Simulink ナビゲーション コントロールのアンカーと外観を調整する方法については、Microsoft の開発者向けリファレンス ページを参照してください。たとえば、ハイパーリンク付きのアイコンを挿入する代わりに、現在のスライドで選択したテキストにハイパーリンクを付加することができます。
保存されたテキストがどのスライドに含まれるかにかかわらず、"検索テキスト" のパターンに対してリンクする必要がある場合は、以下のように、サポートされる場所タイプの宣言を拡張し、? 文字を含めることができます。
docInterface.LocDelimiters = '#@?';
その後、NavigateFcn
メソッドの switch(locationStr(1))
に case
を追加します。対応するヘルパー findText
は、PowerPoint プレゼンテーション オブジェクトのすべての "Slides" のすべての "TextFrame" 項目をクエリし、一致するテキストをもつ項目を選択します。
カスタム ドキュメント インターフェイス テンプレートは、ニーズに応じてその他のメソッドをサポートしています。たとえば、カスタム リンクを要件の整合性チェックに含めるには、次のメソッドを実装することを検討してください。
IsValidDocFcn
IsValidIdFcn
IsValidDescFcn
生成レポート上のリンクの表示方法を調整するには、以下を使用できます。
CreateURLFcn
UrlLabelFcn
DocDateFcn
DetailsFcn
HtmlViewFcn
アプリケーションがファイルベースでなく、独自のデータベースを使用して要件ドキュメントを保存している場合、カスタム ドキュメント インターフェイスを "ファイルではない" としてマークしなければなりません。
docInterface.IsFile = 0;
そして、BrowseFcn
に特殊な実装を提供します。これは、[外向きリンク] ダイアログで [参照] ボタンをクリックしたときに呼び出される関数です。
rmi('edit','slvnvdemo_powerwindowController');
rmidemo_pp
カスタム ドキュメント インターフェイスの登録を解除します。
rmi unregister rmidemo_pp