Requirements Management Interface (RMI) обеспечивает инструменты для создания и рассмотрения ссылок между элементами модельно-ориентированного проектирования и документами требований. RMI оказывает встроенную поддержку для многих типов документа. Кроме того, можно реализовать расширения типа настраиваемой ссылки, чтобы позволить соединиться с другими типами документа. Этот пример иллюстрирует реализацию расширения RMI для соединения с презентациями Microsoft PowerPoint.
В целях этого примера в качестве примера мы будем объекты ссылки в slvnvdemo_powerwindowController.slx модели со слайдами в powerwindowController.pptx презентации PowerPoint. Из-за возможных ограничений полномочий пользователя, и избегать риска неумышленного изменения установленных файлов, рекомендуется, чтобы вы создали свои собственные копии и модели и документа. Считайте создание обоих файлов writeable, и сконфигурируйте настройки RMI, чтобы хранить данные о трассируемости в отдельном файле .req
(см. вкладку Storage в диалоговом окне Настроек).
rmipref('StoreDataExternally', true); % use "external" (.req) storage rmidemoroot = [matlabroot,'/toolbox/slrequirements/slrequirementsdemos']; copyfile([rmidemoroot,'/powerwin_reqs/powerwindowController.pptx'], './powerwindowController_copy.pptx'); fileattrib(fullfile(pwd, 'powerwindowController_copy.pptx'),'+w'); % make user copy writable copyfile([rmidemoroot,'/slvnvdemo_powerwindowController.slx'], './slvnvdemo_powerwindowController_copy.slx'); fileattrib(fullfile(pwd, 'slvnvdemo_powerwindowController_copy.slx'),'+w'); % make user copy writable open_system('slvnvdemo_powerwindowController_copy');
В зависимости от приложения вы используете для своих документов пользовательского типа, можно реализовать основную поддержку, включая создание ссылки через диалоговое окно Outgoing Links и соединить навигацию через ярлыки контекстного меню, или можно принять решение реализовать более многофункциональную поддержку с выбором, соединяющимся через ярлыки контекстного меню, проверку непротиворечивости, и т.д.
В этом примере мы создадим определение Типа Настраиваемой ссылки с нуля. Чтобы узнать больше о API расширения Типа Настраиваемой ссылки, обратитесь к включенному linktype_TEMPLATE или рассмотрите фактические linktype файлы определения, используемые выпущенным продуктом. Для примера обратитесь к минимальному типу ссылки Текстового файла или более усовершенствованному типу ссылки Рабочей книги Microsoft Excel.
Скопируйте и вставьте следующий код в редактора MATLAB и сохраните скрипт как rmidemo_pp_linktype.m
где угодно на пути MATLAB.
function linkType = rmidemo_pp_linktype linkType = ReqMgr.LinkType; linkType.Registration = mfilename; linkType.Version = ''; % not used % % Label describing this link type linkType.Label = 'Microsoft Power Point'; % % File information linkType.IsFile = 1; linkType.Extensions = {'.ppt', '.pptx'}; % % Location delimiters linkType.LocDelimiters = '#'; % % Supported methods linkType.NavigateFcn = @NavigateFcn; end
function NavigateFcn(filePath,locationStr) if isempty(locationStr) disp(['Navigating to "' filePath '"']); else disp(['Navigating to "' locationStr '" in "' filePath '"']); end end
Также щелкните здесь, чтобы установить этот скрипт.
Затем, укажите свой новый тип ссылки с RMI.
Это дает RMI команду распознавать расширения файла .ppt
и .pptx
как поддерживаемые файлы и использовать методы, заданные здесь для функциональности RMI.
rmidemoroot = [matlabroot,'/toolbox/slrequirements/slrequirementsdemos']; copyfile([rmidemoroot,'/powerwin_reqs/rmidemo_pp_linktype_step1.m'], './rmidemo_pp_linktype.m'); fileattrib('./rmidemo_pp_linktype.m','+w'); rmi('register', 'rmidemo_pp_linktype')
Щелкните правой кнопкой по фону slvnvdemo_powerwindowController_copy модели в качестве примера и расширьте подменю Requirements
Нажмите диалоговое окно Open Outgoing Links, чтобы поднять Редактор связей
Нажмите New, чтобы создать новую ссылку
Расширьте Тип документа выпадающий список. Microsoft Power Point появляется в нижней части
Используйте Кнопку обзора, чтобы определить местоположение вашей копии документа в качестве примера
Введите метку Description, как Представление В качестве примера
Нажмите ОК, чтобы сохранить новую ссылку и закрыть диалоговое окно
Щелкните правой кнопкой по фону схемы Simulink снова и расширьте подменю Requirements. Заметьте новый ярлык навигации наверху подменю. Когда вы кликаете по этому новому ярлыку, MATLAB отображает сообщение в командном окне, согласно заблокированной реализации rmidemo_pp_linktype.
firstReq = rmi('createempty'); firstReq.reqsys = 'rmidemo_pp_linktype'; firstReq.doc = 'powerwindowController_copy.pptx'; firstReq.description = 'Example presentation'; rmi('set', 'slvnvdemo_powerwindowController_copy', firstReq); rmi('view','slvnvdemo_powerwindowController_copy', 1);
Можно теперь обеспечить функциональную реализацию для NavigateFcn
в rmidemo_pp_linktype.m
. Реализация этого и всех других методов требует детального знания API, доступных в приложении, которое управляет документами требований. Для этого примера Microsoft PowerPoint мы используем API COM. Мы используем команду actxserver
в MATLAB, чтобы создать связь с приложением PowerPoint. Затем мы используем вызовы как Application.Presentations.Open(FILENAME)
, чтобы управлять приложением PowerPoint с помощью методов rmidemo_pp_linktype
. Смотрите Страницы с описанием Разработчика Microsoft для получения информации, на которой Объекты PowerPoint и Методы доступны через API COM.
Скопируйте и вставьте следующий код, чтобы заменить существующий тупик NavigateFcn()
в rmidemo_pp_linktype.m
. Убедитесь, что скопировали новые функции помощника также.
function NavigateFcn(filePath, locationStr) if isempty(loctionStr) disp(['Navigating to "' filePath '"']); else disp(['Navigating to "' locationStr '" in "' filePath '"']); end hDoc = openFile(filePath); if isempty(hDoc) disp(['Failed to open ' filePath]); else % try to bring the window forward [~, fileName, ext] = fileparts(filePath); reqmgt('winFocus', [fileName ext]); % locate by window title match end end
function hDoc = openFile(fileName) disp(['Checking for ' fileName]); hApp = getApplication(); hDoc = findOpenDoc(hApp, fileName); if isempty(hDoc) try hDoc = hApp.Presentations.Open(fileName); catch hDoc = []; end end end
function hApp = getApplication() try % try to connect to already running application hApp = actxGetRunningServer('powerpoint.application'); catch % start-up PowerPoint and connect to it hApp = actxserver('powerpoint.application'); end end
function hDoc = findOpenDoc(hApp, fileName) hDoc = []; hDocs = hApp.Presentations; for i = 1:hDocs.Count if strcmp(hDocs.Item(i).FullName, fileName) hDoc = hDocs.Item(i); return; end end end
Также щелкните, чтобы установить.
Повторите навигацию из блок-схемы. Приложение Microsoft PowerPoint должно запустить и отобразить правильный документ.
rmidemoroot = [matlabroot,'/toolbox/slrequirements/slrequirementsdemos']; copyfile([rmidemoroot,'/powerwin_reqs/rmidemo_pp_linktype_step2.m'], './rmidemo_pp_linktype.m'); fileattrib('./rmidemo_pp_linktype.m','+w'); rmi('view','slvnvdemo_powerwindowController_copy', 1);
Предположим, что мы хотим соединить Входную Таблицу истинности Драйвера с соответствующим номером слайда 5 в презентации PowerPoint.
Щелкните правой кнопкой по блоку, расширьте подменю Requirements и откройте Исходящее диалоговое окно Ссылок
Задайте тип документа и имя файла как прежде
Введите вход Driver в поле Description
Войдите 5 в поле ввода Местоположения/Идентификатора
Нажмите ОК, чтобы сохранить новую ссылку
Если вы переместитесь по этой ссылке из схемы Simulink, документ откроется как прежде, но это не прокрутит вниз к 5-му понижению. Необходимо расширить реализацию NavigateFcn()
в rmidemo_pp_linktype.m
, чтобы позволить навигацию конкретному понижению. Скопируйте и вставьте следующую реализацию, включая помощника метод goToSlide()
.
function NavigateFcn(filePath, locationStr) if isempty(locationStr) disp(['Navigating to "' filePath '"']); else disp(['Navigating to "' locationStr '" in "' filePath '"']); end hDoc = openFile(filePath); if isempty(hDoc) disp(['Failed to open ' filePath]); else if ~isempty(locationStr) switch(locationStr(1)) case '#' slideNum = str2num(locationStr(2:end)); %#ok<ST2NM> goToSlide(hDoc, slideNum); otherwise warning('Invalid location specifier: %s', locationStr); end end % try to bring the window forward [~, fileName, ext] = fileparts(filePath); reqmgt('winFocus', [fileName ext]); % locate by window title match end end
function goToSlide(hDoc, slideNum) disp(['Opening slide #' num2str(slideNum)]); hDoc.Slides.Item(slideNum).Select; end
Также щелкните, чтобы установить.
Повторите навигацию от блока Driver Input Truth Table.
Окно презентации PowerPoint должно прокрутить вниз к 5-му понижению.
secondReq = rmi('createempty'); secondReq.reqsys = 'rmidemo_pp_linktype'; secondReq.doc = 'powerwindowController_copy.pptx'; secondReq.description = 'Driver input'; secondReq.id = '#5'; rmi('set', 'slvnvdemo_powerwindowController_copy/Truth Table', secondReq); rmidemoroot = [matlabroot,'/toolbox/slrequirements/slrequirementsdemos']; copyfile([rmidemoroot,'/powerwin_reqs/rmidemo_pp_linktype_step3.m'], './rmidemo_pp_linktype.m'); fileattrib('./rmidemo_pp_linktype.m','+w'); rmi('view','slvnvdemo_powerwindowController_copy/Truth Table', 1);
Соединение с сохраненным номером слайда может быть проблематичным: ссылки могут стать устаревшими, когда вы изменяете документ. Например, копируйте первое понижение в нашем представлении:
Теперь все другие слайды переключают вниз одним. Навигация от блока Driver Input Truth Table поднимет неправильное понижение. Мы должны использовать тип другого места кроме Page/Item number
. Для этого мы изменяем список LocDelimiters
в файле rmidemo_pp_linktype.m
, чтобы стать:
% Location delimiters linkType.LocDelimiters = '#@';
Мы также должны далее расширить реализацию NavigateFcn
путем добавления другого case
:
case '@' goToItem(hDoc, locationStr(2:end));
Наконец, мы добавляем реализацию для метода goToItem()
:
function goToItem(hDoc, itemIdStr) disp(['Opening item ID ' itemIdStr]); itemId = str2num(itemIdStr); %#ok<ST2NM> hDoc.Slides.FindBySlideID(itemId).Select; end
Можно вставить эти изменения вручную или щелкнуть, чтобы установить. Также необходимо не указать и потворить регистрацию linktype для этих изменений, чтобы вступить в силу. Поскольку MATLAB, возможно, кэшировал предыдущую версию rmidemo_pp_linkype.m файла, возможно, нуждается к функциям |clear} прежде, чем указать обновленную версию.
rmi('unregister', 'rmidemo_pp_linktype'); rmidemoroot = [matlabroot,'/toolbox/slrequirements/slrequirementsdemos']; copyfile([rmidemoroot,'/powerwin_reqs/rmidemo_pp_linktype_step4.m'], './rmidemo_pp_linktype.m'); fileattrib('./rmidemo_pp_linktype.m','+w'); clear('functions') %#ok<CLFUNC> rmi('register', 'rmidemo_pp_linktype');
Теперь, когда наши поддержки linktype, Названные идентификаторами местоположения Элемента, сделайте следующее:
Вновь откройте Исходящее диалоговое окно Ссылок для блока Driver Input Truth Table
Выберите Named Item из Местоположения (Тип/Идентификатор) выпадающий список
Войдите 260 в поле ввода Местоположения
Нажмите ОК, чтобы сохранить измененную ссылку
"260" персистентный ID для Входного понижения Драйвера (больше на этом ниже).
Теперь, после этого изменения, навигация от блока Driver Input Truth Table поднимет правильное понижение, даже после того, как его номер заказа изменится.
К сожалению, каждый не видит идентификаторы понижения в приложении PowerPoint пользовательский интерфейс. Чтобы узнать ID для 5-го понижения, можно использовать API COM:
>> hApp = actxGetRunningServer('powerpoint.application'); >> hDoc = hApp.ActivePresentation; >> hDoc.Slides.Item(5).SlideID ans = 260
Более удобные для пользователя решения этой проблемы покрыты разделами ниже.
betterLink = rmi('createempty'); betterLink.reqsys = 'rmidemo_pp_linktype'; betterLink.doc = 'powerwindowController_copy.pptx'; betterLink.description = 'Driver input - better link'; betterLink.id = '@260'; rmi('set', 'slvnvdemo_powerwindowController_copy/Truth Table', betterLink); rmi('view','slvnvdemo_powerwindowController_copy/Truth Table', 1);
Как показано выше, мы можем создать персистентные ссылки, которые не становятся устаревшими после того, как слайды в соединенном представлении переупорядочиваются, но у вас нет быстрого доступа к персистентным значениям SlideID в PowerPoint. Одно возможное решение состоит в том, чтобы выбрать желаемое понижение во вкладке Document Index Исходящего диалогового окна Ссылок. Содержимым вкладки Document Index управляет метод ContentsFcn()
в linktype файле определения. Мы можем обеспечить реализацию для этого метода, такого, что персистентное значение SlideID хранится RMI при создании ссылки вместо энергозависимого значения SlideNumber.
В rmidemo_pp_linktype.m
добавьте объявление ContentsFcn()
в список поддерживаемых методов:
% Supported methods linkType.NavigateFcn = @NavigateFcn; linkType.ContentsFcn = @ContentsFcn;
Затем, обеспечьте реализацию для ContentsFcn()
:
function [labels, depths, locations] = ContentsFcn(filePath) hDoc = openFile(filePath); slidecount = hDoc.Slides.Count; if slidecount == 0 labels = {'no slides in presentation!'}; locations = {''}; depths = 0; else labels = cell(slidecount,1); locations = cell(slidecount,1); depths = zeros(slidecount,1); end for k = 1:slidecount try txt = hDoc.Slides.Item(k).Shapes.Item(1).TextFrame.TextRange.Text; txt(txt < 32) = ' '; % avoid control characters in labels catch txt = '[slide with no title]'; end labels{k} = strtrim(txt); locations{k} = ['@' num2str(hDoc.Slides.Item(k).SlideID)]; end reqmgt('winFocus', 'Outgoing Links'); % try to keep the dialog on top end
Также щелкните, чтобы установить. Также необходимо не указать и потворить регистрацию linktype для этих изменений, чтобы вступить в силу.
Как вы видите, методы ContentsFcn()
возвращает три массива:
labels
, чтобы использовать для Индекса Документа перечисляет ярлыки навигации и элементы
depths
, чтобы указать на иерархическое отношение перечисленных элементов (неиспользованный в этом примере)
locations
, чтобы использовать для сохраненных уникальных идентификаторов
Реализация ContentsFcn()
полагается на следующий вызов API PowerPoint, чтобы заполнить значения местоположения:
hDoc.Slides.Item(k).SlideID
Это гарантирует персистентную информацию о навигации даже после того, как порядок понижения изменится. Обратите внимание на то, что мы используем в качестве префикса для значений locations
, чтобы указать, что номер, который следует, хранит Именованное значение местоположения Элемента вместо понижения (страница) значение местоположения номера.
rmi('unregister', 'rmidemo_pp_linktype'); rmidemoroot = [matlabroot,'/toolbox/slrequirements/slrequirementsdemos']; copyfile([rmidemoroot,'/powerwin_reqs/rmidemo_pp_linktype_step5.m'], './rmidemo_pp_linktype.m'); fileattrib('./rmidemo_pp_linktype.m','+w'); clear('functions') %#ok<CLFUNC> rmi('register', 'rmidemo_pp_linktype');
Теперь, когда наш тип ссылки PowerPoint поддерживает функциональный документ вкладка Index, мы можем использовать его, чтобы заполнить поля ввода в первичной вкладке:
Щелкните правой кнопкой по блоку Truth Table, соединенному с пассажирскими входными параметрами
Расширьте подменю Requirements
Как сделано прежде, нажмите New для новой записи ссылки
Задайте Microsoft PowerPoint как Тип документа
Задайте powerwindowController_copy.pptx как Документ
Оставьте вход Description
Вместо того, чтобы задать Местоположение вручную, переключитесь на вкладку Document Index, найдите строку, которая соответствует Пассажирскому Входному понижению, и дважды кликните строку
Заметьте, что остающиеся поля ввода автоматически заполнены правильной информацией
Нажмите ОК, чтобы сохранить новую ссылку
Переместитесь по ссылке через новый ярлык наверху подменю контекста Требований для блока Truth Table1. Эта ссылка должна работать правильно даже после того, как слайды переключены или переупорядочены.
indexLink = rmi('createempty'); indexLink.reqsys = 'rmidemo_pp_linktype'; indexLink.doc = 'powerwindowController_copy.pptx'; indexLink.description = 'Passenger input - linked via Index tab'; indexLink.id = '@259'; rmi('set', 'slvnvdemo_powerwindowController_copy/Truth Table1', indexLink); rmi('view','slvnvdemo_powerwindowController_copy/Truth Table1', 1);
Еще лучший способ поддержать устойчивые персистентные ссылки через Ярлыки Соединения Выбора. API RMI позволяет вам заданному функцию SelectionLinkFcn()
для соединения с текущим объектом в текущем документе. На следующем шаге нашего примера вы автоматизируете соединение с текущим слайдом в в настоящее время открытой презентации PowerPoint.
В главном разделе rmidemo_pp_linktype.m
добавьте следующие объявления:
% For selection-based linking: linkType.SelectionLinkLabel = 'Link to Slide in PowerPoint'; linkType.SelectionLinkFcn = @SelectionLinkFcn;
Затем, скопируйте и вставьте следующую реализацию для SelectionLinkFcn()
, включая вспомогательный метод getCurrentDoc()
:
function reqstruct = SelectionLinkFcn(objH, varargin) reqstruct=[]; hDoc = getCurrentDoc(); if isempty(hDoc) errordlg('PowerPoint presentation is not open', 'Linking Failed'); return; end % % PPT file we are linking with: docName = hDoc.Name; % or should we use .FullName ?? % % PPT slide we are linking with: currentSlide = hDoc.Application.ActiveWindow.Selection.Slide; [objName, objType] = rmi.objname(objH); disp(['Linking ' objName ' (' objType ') to ' currentSlide.Name ' in ' docName]); % % Add a new requirement reqstruct = rmi('createempty'); reqstruct.reqsys = mfilename; reqstruct.doc = docName; reqstruct.id = sprintf('@%d', currentSlide.SlideId); % % Label for navigation shortcut try txt = currentSlide.Shapes.Item(1).TextFrame.TextRange.Text; txt(txt < 32) = ' '; % avoid control characters in labels catch txt = '[slide with no title]'; end if length(txt) > 40 reqstruct.description = [txt(1:40) '...']; else reqstruct.description = txt; end end
function hDoc = getCurrentDoc() hDoc = []; try % try to connect to already running application hApp = actxGetRunningServer('powerpoint.application'); hDoc = hApp.ActivePresentation; catch return; % PowerPoint is not running end end
Или, щелкните, чтобы установить этот скрипт. Снова, необходимо будет не указать и потворить регистрацию linktype для этих изменений, чтобы вступить в силу.
rmi('unregister', 'rmidemo_pp_linktype'); rmidemoroot = [matlabroot,'/toolbox/slrequirements/slrequirementsdemos']; copyfile([rmidemoroot,'/powerwin_reqs/rmidemo_pp_linktype_step6.m'], './rmidemo_pp_linktype.m'); fileattrib('./rmidemo_pp_linktype.m','+w'); clear('functions') %#ok<CLFUNC> rmi('register', 'rmidemo_pp_linktype');
Раздел Requirements контекстных меню теперь отобразит новый ярлык для соединения с текущим слайдом в PowerPoint.
В вашей копии примера презентации PowerPoint откройте слайд 6, который имеет дело с конечными положениями перемещения окна (сделайте его активным слайдом),
В схеме Simulink щелкните правой кнопкой по входу endstop
Расширьте подменю контекста Требований
Нажмите на Link to Slide in PowerPoint
RMI автоматически создаст ссылку на SlideID, который соответствует текущему местоположению в активном представлении. RMI попытается использовать текст заголовка целевого понижения как метка для новой ссылки.
Закройте приложение PowerPoint
Щелкните правой кнопкой по входу снова, чтобы вновь отобразить контекстное меню
Щелкните по новой ссылке, чтобы переместиться по нему
Приложение PowerPoint должно открыться к правильному понижению.
selectionLink = rmi('createempty'); selectionLink.reqsys = 'rmidemo_pp_linktype'; selectionLink.doc = 'powerwindowController_copy.pptx'; selectionLink.description = 'Endstop signal - selection link'; selectionLink.id = '@261'; rmi('set', 'slvnvdemo_powerwindowController_copy/endstop', selectionLink); rmi('view','slvnvdemo_powerwindowController_copy/endstop', 1);
Как последний шаг этого примера вы расширите функцию SelectionLinkFcn()
, чтобы опционально вставить гиперссылку в текущий слайд для навигации от PowerPoint до связанного объекта в Simulink.
В скрипте rmidemo_pp_linktype.m
измените заголовок SelectionLinkFcn()
, чтобы выглядеть так:
function reqstruct = SelectionLinkFcn(objH, make2way, varargin)
Затем добавьте следующий код в нижней части SelectionLinkFcn()
:
if make2way % Insert a Simulink RMI icon with navigation hyperlink: slPicture = [matlabroot '\toolbox\shared\reqmgt\icons\mwlink.bmp']; currentSlide.Shapes.AddPicture(slPicture, 'msoTrue', 'msoTrue', 20, 20); myNewShape = currentSlide.Shapes.Item(currentSlide.Shapes.Count); myNewShape.ActionSettings.Item(1).Hyperlink.Address = rmi.getURL(objH); myNewShape.ActionSettings.Item(1).Hyperlink.ScreenTip = ['Linked from ' objName ' (' objType ')']; end
Или, щелкните, чтобы установить этот скрипт. Обязательно не укажите и потворите регистрацию linktype.
rmi('unregister', 'rmidemo_pp_linktype'); rmidemoroot = [matlabroot,'/toolbox/slrequirements/slrequirementsdemos']; copyfile([rmidemoroot,'/powerwin_reqs/rmidemo_pp_linktype_step7.m'], './rmidemo_pp_linktype.m'); fileattrib('./rmidemo_pp_linktype.m','+w'); clear('functions') %#ok<CLFUNC> rmi('register', 'rmidemo_pp_linktype');
Ваш тип ссылки PowerPoint теперь позволяет автоматизированную вставку средств управления навигацией Simulink в соединенные слайды, когда вы используете Ссылку, чтобы Скользить в ярлыке PowerPoint в контекстном меню для объектов Simulink. Чтобы активировать эту опцию, включите Изменить месту назначения для двунаправленного флажка соединения во вкладке Selection Linking диалогового окна Настроек RMI.
Начинаясь в R2019a, встроенный сервис HTTP MATLAB активируется на защищенном порте 31515, но не на небезопасном порте 31415. Поскольку наши navigtion URL не могут использовать защищенный порт без установки сертификата, должен также включить флажок в нижней части: Включите внешнюю возможность соединения при запуске MATLAB.
Чтобы испытать это, давайте повторим процедуру соединения выбора для входа сигнала препятствия, давайте сопоставим его с соответствующим понижением в представлении в качестве примера.
Прокрутите к слайду 7 в презентации PowerPoint (сделайте его активным слайдом),
Щелкните правой кнопкой по входу препятствия
Расширьте подменю контекста Требований
Нажмите Link to Slide in PowerPoint
Необходимо теперь видеть новый значок RMI, вставленный в верхнем левом углу понижения.
Можно открыть диалоговое окно Гиперссылки Редактирования в PowerPoint, чтобы подтвердить, что существует URL MATLAB, сопоставленный с новым значком. Рекомендуется, чтобы вы не редактировали этот URL вручную.
Видеть гиперссылку в действии, приложении переключателя PowerPoint в режим презентации и кликнуть по значку MATLAB. Схема Simulink появится с правильным подсвеченным входом.
origMcState = rmipref('UnsecureHttpRequests', true); origTwoWayPref = rmipref('BiDirectionalLinking', true);
Продукт Simulink Requirements включает возможность импорта документа, если ваше Пользовательское определение Linktype включает все необходимые части. Со всего несколькими незначительными корректировками последней версии файла настройки (сравнивают rmidemo_pp_linktype_step8.m
с rmidemo_pp_linktype_step7.m
), вы сможете использовать API slreq.import()
и автоматически вытянуть - в содержимом как объекты типа slreq.Reference
или slreq.Requirement
, и сохранить в файл .slreqx
. Обратитесь к справке slreq.import
для получения дополнительной информации.
Поскольку наше пользовательское определение типа документа не обеспечивает реализацию для HtmlViewFcn()
, только импорт простого текста будет работать.
Щелкните, чтобы установить следующую версию скрипта. Повторно выполните нерегистр и потворите регистрацию команд как прежде. Возможно, нуждается к clear functions
снова перед потворением регистрацию.
Убедитесь, что документ открыт в PowerPoint, прежде чем вы запустите команду slreq.import()
. Средство импорта отобразит количество импортированных элементов, которое для нашего случая соответствует количеству слайдов. Используйте команду slreq.editor
для принесенного Редактор Simulink Requirements пользовательский интерфейс. Расширьте узел документа, чтобы просмотреть импортированные элементы. Нажмите кнопку "Show in document" к havigate от импортированной ссылки до исходного элемента в исходном документе.
rmi('unregister', 'rmidemo_pp_linktype'); rmidemoroot = [matlabroot,'/toolbox/slrequirements/slrequirementsdemos']; copyfile([rmidemoroot,'/powerwin_reqs/rmidemo_pp_linktype_step8.m'], './rmidemo_pp_linktype.m'); fileattrib('./rmidemo_pp_linktype.m','+w'); clear('functions') %#ok<CLFUNC> rmi('register', 'rmidemo_pp_linktype'); rmi('view','slvnvdemo_powerwindowController_copy', 1); % to make sure document is open before import pause(1); % allow the document to open before calling slreq.import() slreq.import('rmidemo_pp_linktype', 'AsReference', true, 'RichText', false) slreq.editor();
В противоположность соединению с Понижением в целом, можно хотеть изменить реализацию SelectionLinkFcn()
, чтобы соединиться с определенным текстом или изображением в понижении. Обратитесь к Страницам с описанием Разработчика Microsoft для получения информации о том, как настроить привязку и внешний вид средств управления навигацией Simulink. Например, вместо того, чтобы вставить значок с гиперссылкой, можно хотеть присоединить гиперссылку на выделенный текст на текущем слайде.
Если необходимо соединиться с шаблоном Искомого текста, независимо от которого понижение включает сохраненный текст, можно ли расширить объявление поддерживаемых типов местоположения, чтобы включать? символ:
linkType.LocDelimiters = '#@?';
Необходимо затем обеспечить дополнительный case
для switch(locationStr(1))
в методе NavigateFcn()
. Соответствующий помощник findText()
запрашивает объект презентации PowerPoint для всех элементов TextFrame во всех Слайдах и выбирает элемент с tje совпавшим текстом.
Шаблон типа ссылки RMI поддерживает другие методы, в зависимости от ваших потребностей. Например, чтобы покрыть ваши настраиваемые ссылки Проверкой Непротиворечивости Требований, рассмотрите реализацию следующих методов:
IsValidDocFcn()
IsValidIdFcn()
IsValidDescFcn()
Чтобы настроить путь, ваши ссылки отображены в сгенерированных отчетах, можно использовать:
CreateURLFcn()
UrlLabelFcn()
DocDateFcn()
DetailsFcn()
HtmlViewFcn()
Если ваше приложение не основано на файле, но использует собственную базу данных, чтобы хранить документы требований, необходимо отметить тип ссылки как "не файл":
linkType.IsFile = 0;
и обеспечьте специализированную реализацию для BrowseFcn()
. Это - функция, которая вызвана, когда вы кликаете по Кнопке обзора в Исходящем диалоговом окне Ссылок.
Для этого примера, чтобы работать, как предназначено, когда вы запустите его снова, отмените все изменения и удалите пример linktype регистрация:
rmipref('BiDirectionalLinking', origTwoWayPref); rmipref('UnsecureHttpRequests', origMcState); try hApp = actxGetRunningServer('powerpoint.application'); hApp.Quit ; catch ; end docFile = 'powerwindowController_copy.pptx'; if exist(docFile, 'file') == 2 ; delete(docFile) ; end try close_system('slvnvdemo_powerwindowController_copy', 0); catch ; end modelFile = 'slvnvdemo_powerwindowController_copy.slx'; if exist(modelFile, 'file') == 4 ; delete(modelFile) ; end reqFilePath = 'slvnvdemo_powerwindowController_copy.req'; if exist(reqFilePath, 'file') == 2 ; delete(reqFilePath) ; end try rmi('unregister', 'rmidemo_pp_linktype') ; catch ; end if exist('rmidemo_pp_linktype.m', 'file') == 2 ; delete('rmidemo_pp_linktype.m') ; end clear('hApp', 'rmidemoroot', 'firstReq', 'secondReq', 'betterLink', 'indexLink'); clear('selectionLink', 'docFile', 'modelFile', 'reqFilePath', 'origTwoWayPref'); if exist('powerwindowController_copy.slreqx','file') ; delete 'powerwindowController_copy.slreqx' ; end slreq.import.docToReqSetMap(fullfile(pwd,'powerwindowController_copy.pptx'),'clear'); slreq.clear();