Реализуйте расширение 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 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);

Реализуйте навигацию к данному 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_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');

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

Позвольте соединиться с текущим слайдом в 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), вы сможете использовать 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();