为 Microsoft PowerPoint 定义自定义文档界面
此示例显示如何定义自定义文档接口以便链接到 Microsoft® PowerPoint® 演示文稿中的需求。
打开示例模型
为了本示例教程的目的,您将把 slvnvdemo_powerwindowController.slx
模型中的对象与 powerwindowController.pptx
PowerPoint 演示文稿中的幻灯片链接起来。打开 Simulink®模型slvnvdemo_powerwindowController.slx
。
open_system('slvnvdemo_powerwindowController');
设置需求管理器以使用链接
在 App 选项卡中,打开需求管理器。
在需求选项卡中,确保选择了布局> 需求浏览器。
在需求浏览器的查看下拉菜单中,选择
Links
。
在外部存储链接
在slvnvdemo_powerwindowController
模型中,配置外部存储链接的设置。在需求选项卡中,选择链接设置 > 默认链接存储。这将打开需求设置对话框。在标题可追溯性数据的默认存储模式下,选择外部存储(在单独的 *.slmx 文件中)。或者,评估此代码。
rmipref('StoreDataExternally',true);
创建并注册上桩自定义文档界面
当前工作目录中的文件 rmidemo_pp .m
包含文档界面,以便链接到 Microsoft PowerPoint 文件中的需求。通过评估此代码来注册自定义文档接口。
rmi register rmidemo_pp
这指示 RMI 将文件扩展名 .ppt
和 .pptx
识别为受支持的文件,并使用此处定义的方法实现 RMI 功能。
创建第一个链接
右键点击
slvnvdemo_powerwindowController
示例模型的背景。在上下文菜单中,选择此级别的需求 > 打开出向链接对话框... 以调出“出向链接”对话框。点击新建即可创建新链接。
展开文档类型下拉列表。在列表底部选择 Microsoft PowerPoint。
使用浏览按钮找到
powerwindowController.pptx
。输入描述标签,如示例演示。
点击确定保存新链接并关闭对话框。
或者,您可以评估此代码来创建链接。此代码首先填写链接目标信息,然后使用 rmi
函数创建链接。
firstReq = rmi('createempty'); firstReq.reqsys = 'rmidemo_pp'; firstReq.doc = 'powerwindowController.pptx'; firstReq.description = 'Example presentation'; rmi('set','slvnvdemo_powerwindowController', firstReq);
导航至文档
rmidemo_pp .m
文件中的函数提供了对 PowerPoint 文档的导航。实现此方法和所有其他方法需要详细了解管理需求文档的应用程序中可用的 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')
右键点击该模块,选择需求 > 打开出向链接对话框... 以调出出向链接对话框。
点击新建即可创建新链接。
与之前一样指定文档类型和文件名。
在描述字段中输入驱动程序输入。
在位置/标识符输入字段中输入 5。
点击确定保存新链接。
如果您从 Simulink 图导航此链接,文档将像以前一样打开,但现在将向下滚动到第 5 张幻灯片。辅助 goToSlide
方法以及 NavigateFcn
函数中的代码打开正确的幻灯片。
function goToSlide(hDoc, slideNum) disp(['Opening slide #' num2str(slideNum)]); hDoc.Slides.Item(slideNum).Select; end
通过选择 Truth Table
模块,右键点击并选择 Requirements > 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
链接到存储的幻灯片编号可能会有问题:修改文档时链接可能会变得过时。例如,复制演示文稿中的第一张幻灯片:
现在,所有其他幻灯片都向下移动一位。从驾驶员输入Truth Table
模块进行导航将会显示错误的幻灯片。您需要使用除 Page/Item number
之外的其他位置类型。
选择连接到
control
子系统的driver
输入的相同Truth Table
模块。此代码导航到Truth Table
模块。
rmidemo_callback('locate','slvnvdemo_powerwindowController/Truth Table')
右键点击该模块,选择需求 > 打开出向链接对话框... 以调出出向链接对话框。
点击新建即可创建新链接。
从位置(类型/标识符)下拉列表中选择
Named Item
。在位置输入字段中输入
260
。点击确定保存修改后的链接。
“260” 是 Driver Input
幻灯片的永久 ID(有关详细信息,请参阅下文)。
现在,经过这一更改后,即使订单号发生变化,从驾驶员输入 Truth Table
模块导航也将显示正确的幻灯片。
不幸的是,在 PowerPoint 应用程序 UI 中看不到幻灯片 ID。要找出第五张幻灯片的 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 值。一种可能的解决方案是在“出向链接”对话框的“文档索引”选项卡中选择所需的幻灯片。文档索引选项卡的内容由自定义文档接口文件中的 ContentsFcn
方法控制。您可以为此方法提供实现,以便在创建链接时由 RMI 存储持久的 SlideID 值,而不是易失性的 SlideNumber 值。
ContentsFcn
方法返回三个数组:
labels
用于文档索引列表项和导航快捷方式depths
表示列出项目的层次关系(本例中未使用)locations
用于存储唯一 ID
ContentsFcn
实现依赖于此 PowerPoint API 调用来填充 location 值:
hDoc.Slides.Item(k).SlideID
即使幻灯片顺序发生变化后,这也能够确保导航信息持久存在。请注意,使用 @ 作为 locations
值的前缀,以指示后面的数字存储命名项目位置值而不是幻灯片(页面)编号位置值。
使用出向链接编辑器中的文档索引选项卡创建链接。
导航到连接到
control
子系统模块的passenger
输入的Truth Table1
模块。此代码导航到Truth Table1
模块。
rmidemo_callback('locate','slvnvdemo_powerwindowController/Truth Table1')
右键点击该模块,选择需求 > 打开出向链接对话框... 以调出出向链接对话框。
点击新建即可创建新链接。
将
Microsoft PowerPoint
指定为文档类型。从浏览菜单中将
powerwindowController.pptx
指定为文档。保留描述输入。
无需手动指定位置,而是切换到文档索引选项卡,找到与“乘客输入”幻灯片相对应的行,然后双击该行。
请注意,其余输入字段将自动填充正确的信息。
点击确定保存新链接。
通过右键点击 Truth Table1
模块并选择需求> 1.“Passenger Input 由 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')
右键点击该模块并从上下文菜单中选择需求 > 链接到 PowerPoint 中的幻灯片。
RMI 将自动创建指向与活动演示文稿的当前位置相对应的 SlideID 的链接。RMI 将尝试使用目标幻灯片的标题文本作为新链接的标签。
要导航到链接,请再次右键点击 endstop
模块并选择需求> 1.“窗口框架的顶部或底部是真实的...”。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 中的链接对象。
当您在 Simulink 对象的上下文菜单中使用链接到 PowerPoint 中的幻灯片快捷方式时,rmidemo_pp
自定义文档接口允许将 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')
右键点击该模块并从上下文菜单中选择需求 > 链接到 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