Реализуйте расширение RMI для поддержки пользовательского типа документа

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 PowerPoint появляется в нижней части

  • Используйте Кнопку обзора, чтобы определить местоположение вашей копии документа в качестве примера

  • Введите метку 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);

Реализуйте навигацию к данному ID понижения

Соединение с сохраненным номером слайда может быть проблематичным: ссылки могут стать устаревшими, когда вы изменяете документ. Например, скопируйте первое понижение в нашем представлении:

Теперь все другие слайды переключают вниз одним. Навигация от блока 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_linktype.m файла, возможно, нуждается к clear functions прежде, чем указать обновленную версию.

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');

Соединение и навигация, чтобы двигать ID

Теперь, когда наши поддержки linktype, Названные идентификаторами местоположения Элемента, сделайте следующее:

"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 поддерживает вкладку индекса функционального документа, мы можем использовать его, чтобы заполнить поля ввода в первичной вкладке:

  • Щелкните правой кнопкой по блоку 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);

Позвольте соединиться с текущим слайдом в PowerPoint

Еще лучший способ поддержать устойчивые персистентные ссылки через Ярлыки Соединения Выбора. 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);

Импорт элементов из документа PowerPoint в Simulink Requirements

Продукт Simulink Requirements включает возможность импорта документа, если ваше Пользовательское определение Linktype включает все необходимые части. Со всего несколькими незначительными корректировками последней версии файла настройки (сравнивают rmidemo_pp_linktype_step8.m к rmidemo_pp_linktype_step7.m), вы сможете использовать slreq.import() API и автоматически получение по запросу - в содержимое как объекты типа slreq.Reference или slreq.Requirement, и сохраните в .slreqx файл. Обратитесь к slreq.import помогите для получения дополнительной информации.

Поскольку наше пользовательское определение типа документа не обеспечивает реализацию для HtmlViewFcn(), только импорт простого текста будет работать.

Щелкните, чтобы установить следующую версию скрипта. Повторно выполните нерегистр и потворите регистрацию команд как прежде. Возможно, нуждается к clear functions снова перед потворением регистрацию.

Убедитесь, что документ открыт в PowerPoint, прежде чем вы запустите slreq.import() команда. Средство импорта отобразит количество импортированных элементов, которое для нашего случая соответствует количеству слайдов. Используйте slreq.editor команда к принесенному Редактор Simulink Requirements пользовательский интерфейс. Расширьте узел документа, чтобы просмотреть импортированные элементы. Нажмите кнопку "Show in document", чтобы перейти от импортированной ссылки до исходного элемента в исходном документе.

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 во всех Слайдах и выбирает элемент с совпавшим текстом.

Шаблон типа ссылки 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();