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

Этот пример покрывает набор стандартных ситуаций, когда ссылки между артефактами проекта и требованиями становятся устаревшими после одного или нескольких артефактов, перемещенных или переименованных. Скорее затем удаляя неработающие ссылки и создание новых единиц, мы хотим обновить существующие ссылки так, чтобы история создания/модификации и другие свойства (описание, ключевые слова, комментарии..) сохраняются. Использование следующих API является demostrated:

  • slreq.find() овладеть записями Simulink Requirements® и ссылками

  • ReqSet.find('type',TYPENAME) к расположенному требуемая запись в данном ReqSet

  • LinkSet.getLinks() запрашивать все исходящие Ссылки в LinkSet

  • Link.source() краткая информация об источнике ссылки

  • Link.destination() краткая информация о месте назначения ссылки

  • Link.getReferenceInfo() для, "как сохранено" целевой информации, которая отличается от, "как разрешено" Link.destination()

  • LinkSet.updateDocUri(ORIG_DOC, NEW_DOC) обновить места назначения ссылки когда целевой перемещенный документ

  • ReqSet.updateSrcFileLocation() обновить ранее импортированный набор когда перемещенный исходный документ

  • Reference.updateFromDocumet() обновить ранее импортированные Ссылки из обновленного документа

  • linkSet.redirectLinksToImportedReqs(reqSet) преобразовывать существующие "прямые ссылки" на "ссылки"

  • slreq.show() используемый, чтобы просмотреть или источник или целевой конец данного slreq.Link

В нескольких местах мы также используем устаревший RMI(ARGS) API, которые наследованы от части Requirements Management Interface (RMI) продукта SLVnV на пенсии.

Файлы проекта в качестве примера

Прежде чем вы начнете, гарантируете чистое начальное состояние путем выполнения slreq.clear команды. Затем введите slreqProjectStart, чтобы открыть пример Проекта Круиз-контроля. Это разархивирует набор соединенных файлов артефакта в новую подпапку под вашим MATLAB/Projects папка.

slreq.clear();
slreqCCProjectStart();

Модель Simulink, соединенная с требованиями

Мы будем фокусироваться на небольшой части Диаграммы зависимостей этого Проекта: рассмотрите crs_plant.slx Модель Simulink (щелкают, чтобы открыться), который имеет несколько ссылок на внешний Microsoft® документ Word crs_reqs.docx.

Переместитесь по одной из ссылок, чтобы открыть соединенный документ.

Документ Word открывается к правильному разделу:

Вот то, как использовать API командной строки и проверку на ссылки от crs_plant.slx к crs_reqs.docx.

open_system('crs_plant');
rmi('view', 'crs_plant/status', 1);
linkSet = slreq.find('type', 'LinkSet', 'Name', 'crs_plant');
links = linkSet.getLinks();
disp('Original Links to Word document:');
for i = 1:numel(links)
    linkTarget = links(i).getReferenceInfo();
    if contains(linkTarget.artifact, 'crs_req.docx')
        source = links(i).source;
        disp(['    found link from ' strrep(getfullname([bdroot source.id]),newline,'') ' to crs_req.docx']);
    end
end
Original Links to Word document:
    found link from crs_plant/Vehicle1/vehiclespeed to crs_req.docx
    found link from crs_plant/throttDrv to crs_req.docx
    found link from crs_plant/status to crs_req.docx
    found link from crs_plant/throttleCC to crs_req.docx

Навигация прямых ссылок в присутствии импортированных ссылок.

Открытый Редактор Simulink Requirements. Вы будете видеть два загруженные Набора Требования: crs_req.slreqx и crs_req_funct_spec.slreqx. Первый Набор Требования является набором ссылок, импортированных из crs_req.docx, и 2-е было вручную создано в Редакторе Simulink Requirements. Если вы теперь закрываете документ Word и перемещаетесь по той же ссылке от crs_plant/status Блок Inport, соответствующая импортированная ссылка подсвечена в Редакторе Требований, потому что операция навигации находит соответствующую ссылку в загруженном импортированном Наборе Требования.

Можно все еще использовать [Показывают в документе] кнопка, чтобы видеть связанное требование в контексте оригинала документа.

slreq.editor();
rmidotnet.MSWord.application('kill');
rmi('view', 'crs_plant/status', 1);

ВАРИАНТ ИСПОЛЬЗОВАНИЯ 1: Ссылки пакетного обновления после Переименованного Документа

Предположим, что обновленная версия документа требований получена, названная crs_req_v2.docx. Мы теперь хотим ссылки в crs_plant.slx предназначаться для соответствующих разделов обновленного документа. В целях этого примера мы сделаем копию оригинала документа в той же папке с модифицированным именем. Мы затем используем LinkSet.updateDocUri(ORIG_DOC, NEW_DOC) API к пакетному обновлению все ссылки в данном LinkSet соединяться с более новой копией документа:

copyfile(fullfile(pwd, 'documents/crs_req.docx'), fullfile(pwd, 'documents/crs_req_v2.docx'));
linkSet.updateDocUri('crs_req.docx', 'crs_req_v2.docx');

Проверьте правильное обновление соответствия со ссылками

Теперь мы можем переместиться по той же ссылке и подтвердить, что правильная версия внешнего документа открывается. IF мы выполняем итерации всех ссылок как прежде, это подтверждает что все 4 ссылки, обновленные правильно:

rmi('view', 'crs_plant/status', 1); % updated document opens
links = linkSet.getLinks();
disp('Links to Word document after update:');
for i = 1:numel(links)
    source = links(i).source;
    linkTarget = links(i).getReferenceInfo();
    if contains(linkTarget.artifact, 'crs_req.docx')
        warning(['link from ' source.id ' still points to crs_req.docx']);  % should not happen
    elseif contains(linkTarget.artifact, 'crs_req_v2.docx')
        disp(['    found link from ' strrep(getfullname([bdroot source.id]),newline,' ') ' to crs_req_v2.docx']);
    end
end
Links to Word document after update:
    found link from crs_plant/Vehicle1/vehicle speed to crs_req_v2.docx
    found link from crs_plant/throttDrv to crs_req_v2.docx
    found link from crs_plant/status to crs_req_v2.docx
    found link from crs_plant/throttleCC to crs_req_v2.docx

Перейдите к импортированным ссылкам после обновления ссылок

Как продемонстрировано выше, то, когда импортированные ссылки будут доступны в Редакторе Требований, перемещаясь по ссылке, выберет соответствующий ссылочный объект. Однако мы только что обновили ссылки для новой версии документа crs_req_v2.docx, и нет никаких импортированных ссылок для этого документа. Навигация от блока Simulink в присутствии Редактора Требований приносит вам непосредственно к внешнему документу Word.

Чтобы избежать этого несоответствия, мы должны обновить ранее импортированные ссылки для assotiation с обновленным названием документа. Мы используем ReqSet.updateSrcFileLocation() API, чтобы выполнить эту задачу. Кроме того, потому что обновленный документ, возможно, изменил Требования, мы должны использовать importNode.updateFromDocumet() API к получению по запросу - в обновления для ссылочных элементов, сохраненных на Simulink Requirements, примкнул. После того, как это сделано, перейти из модели Simulink определит местоположение правильного соответствия импортированная ссылка.

reqSet = slreq.find('type', 'ReqSet', 'Name', 'crs_req'); % ReqSet with imported References
reqSet.updateSrcFileLocation('crs_req.docx', 'crs_req_v2.docx');
importNode = reqSet.find('CustomId', 'crs_req_v2');  % top-level Import node
importNode.updateFromDocument();
rmidotnet.MSWord.application('kill');  % close Word application
rmi('view', 'crs_plant/status', 1);    % navigate to highlight the updated reference in Requiremets Editor

Очистка после ВАРИАНТА ИСПОЛЬЗОВАНИЯ 1

slreq.clear();                         % discard link data changes to avoid prompts on Project close
prj = simulinkproject(); prj.close();  % close the Simulink Project (also cleans-up MATLAB path changes)
rmidotnet.MSWord.application('kill');  % close MS Word application

ВАРИАНТ ИСПОЛЬЗОВАНИЯ 2: ссылки пакетного обновления, чтобы полностью использовать импортированные ссылки

Как продемонстрировано в ВАРИАНТЕ ИСПОЛЬЗОВАНИЯ 1 выше, дополнительные усилия требуются, чтобы обеспечивать "прямые ссылки" на внешние документы, когда документы перемещены или переименованы. Лучший рабочий процесс должен преобразовать существующие "прямые ссылки" в "ссылки", которые являются ссылками, которые указывают на импортированный References в *.slreqx файлы и более не дублирующаяся информация о местоположении или имени оригинала документа. При использовании этой опции внешний исходный документ assocation хранится только в Наборе Требования, который размещает импортированные Ссылки. Чтобы продемонстрировать этот рабочий процесс, мы перезапускаем от той же начальной точки путем повторного открытия примера Проекта Круиз-контроля в новой подпапке. Мы затем используем linkSet.redirectLinksToImportedReqs(reqSet) API, чтобы обновить все прямые ссылки в crs_plant.slmx. После обновления LinkSet таким образом мы циклично выполняемся по всем ссылкам, чтобы подтвердить отсутствие "прямых" ссылок на crs_req.docx файл.

slreqCCProjectStart();
copyfile(fullfile(pwd, 'documents/crs_req.docx'), fullfile(pwd, 'documents/crs_req_v2.docx'));
open_system('crs_plant');     % open the Simulink model
linkSet = slreq.find('type', 'LinkSet', 'Name', 'crs_plant'); % LinkSet for crs_plant.slx
reqSet = slreq.find('type', 'ReqSet', 'Name', 'crs_req');     % ReqSet with imported References
linkSet.redirectLinksToImportedReqs(reqSet);      % Convert all direct links to reference links
links = linkSet.getLinks();
disp('Check for links to original external document:');
counter = 0;
for i = 1:numel(links)
    linkTarget = links(i).getReferenceInfo();
    if contains(linkTarget.artifact, 'crs_req.docx')
        source = links(i).source;
        warning(['link from ' source.id ' still points to crs_req.docx']);  % should not happen
        counter = counter + 1;
    end
end
disp(['    Total ' num2str(counter) ' links to external document']);  % should be 0 direct links
rmi('view', 'crs_plant/status', 1); % navigate from Simulink model to updated Reference
Check for links to original external document:
    Total 0 links to external document

Ссылки на ссылки и внешний документ переименовывают

Теперь, когда все ссылки указывают на импортированные Ссылки а не на внешний документ, данные о трассируемости остаются сопоставимыми после того, как документ переименовывает, пока узел Импорта обновляется для нового внешнего названия документа. Как в ВАРИАНТЕ ИСПОЛЬЗОВАНИЯ 1, мы притворимся, что существует обновленная версия внешнего документа требований путем пересохранения нашего документа Word с новым именем. Мы затем выполняем необходимое обновление для узла Импорта при помощи тех же API как прежде. Теперь, потому что ссылки используют импортированные Ссылки и не хранят информацию об импортированном документе, навигация из модели Simulink приносит нам к правильно обновленной ссылке, то же самое как после выполнения всех шагов ВАРИАНТА ИСПОЛЬЗОВАНИЯ 1.

Ссылка теперь сопоставлена с обновленным внешним документом, [Показывают в документе], кнопка открывает обновленный (переименованный) документ, и никакая дальнейшая корректировка на стороне LinkSet не требуется.

reqSet = slreq.find('type', 'ReqSet', 'Name', 'crs_req'); % ReqSet with imported References
reqSet.updateSrcFileLocation('crs_req.docx', 'crs_req_v2.docx');
importNode = reqSet.find('CustomId', 'crs_req_v2');  % top-level Import node
importNode.updateFromDocument();
rmi('view', 'crs_plant/status', 1);   % navigates to a Reference in updated Requirement Set

Очистка после ВАРИАНТА ИСПОЛЬЗОВАНИЯ 2

slreq.clear();                         % discard link data changes to avoid prompts on Project close
prj = simulinkproject(); prj.close();  % close the Simulink Project (also cleans-up MATLAB path changes)
rmidotnet.MSWord.application('kill');  % close MS Word application

ВАРИАНТ ИСПОЛЬЗОВАНИЯ 3: перемещение соединенных артефактов к новому проекту

Теперь предположите, что мы переходим exisiting проект с соединенными артефактами, и мы должны создать новый набор переименованного aftifacts со всеми ссылками трассируемости как в исходном Проекте. Как прежде, мы извлечем Проект Круиз-контроля в новую подпапку и преобразуем "прямые ссылки" на "ссылки", когда мы сделали в ВАРИАНТЕ ИСПОЛЬЗОВАНИЯ 2 выше. Мы затем идем вперед и создаем "новые версии" соединенных артефактов путем пересохранения каждого с _v2. имя.

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

slreqCCProjectStart();
open_system('models/crs_plant.slx');
linkSet = slreq.find('type', 'LinkSet', 'Name', 'crs_plant'); % LinkSet for crs_plant.slx
reqSet = slreq.find('type', 'ReqSet', 'Name', 'crs_req');     % ReqSet with imported References
linkSet.redirectLinksToImportedReqs(reqSet);      % Convert all direct links to reference links
mkdir(fullfile(pwd, 'copied'));
save_system('crs_plant', fullfile(pwd, 'copied/crs_plant_v2.slx'));  % this also creates crs_plant_v2.slmx LinkSet file
reqSet.save(fullfile(pwd, 'copied/crs_req_v2.slreqx'));              % new ReqSet copy to use with crs_plant_v2.slx
copyfile('documents/crs_req.docx', 'copied/crs_req_v2.docx');        % new document copy to use with crs_req_v2.slreqx
reqSet.updateSrcFileLocation('crs_req.docx', fullfile(pwd, 'copied/crs_req_v2.docx'));  % associate renamed ReqSet with renamed Document
importNode = reqSet.find('CustomId', 'crs_req_v2');  % top-level Import node
importNode.updateFromDocument();                     % ensure contents in renamed ReqSet match the contents in renamed Document
rmi('view', 'crs_plant_v2/status', 1); % navigation from renamed Simulink model: the old item in the original ReqSet is highlighted <- WRONG

Обновите ссылки в переименованном источнике, чтобы использовать переименованное место назначения в качестве цели

Так же к ВАРИАНТУ ИСПОЛЬЗОВАНИЯ 1, мы можем использовать LinkSet.updateDocUri(OLD, NEW) API, чтобы обновить ссылки в crs_plant_v2.slmx использовать переименованный Набор Требования crs_req_v2.slreqx как цель ссылки, вместо исходного crs_req.slreqx. Если это сделано, перейдите снова от блока в переименованной модели. Правильное требование в переименованном Наборе Требования выбрано, и ссылки в панели Ссылок в нижней правой части разрешены.

linkSet = slreq.find('type', 'LinkSet', 'Name', 'crs_plant_v2'); % LinkSet for crs_plant_v2.slx (new copy)
linkSet.updateDocUri('crs_req.slreqx', 'crs_req_v2.slreqx');     % crs_plant_v2.slx should link with crs_req_v2.slreqx
rmi('view', 'crs_plant_v2/status', 1); % navigation from renamed Simulink model: correct item in renamed ReqSet is highlighted

Очистка после ВАРИАНТА ИСПОЛЬЗОВАНИЯ 3

slreq.clear();                         % discard link data changes to avoid prompts on Project close
close_system('crs_plant_v2');          % this Model is not in Project, hence need to close separately
prj = simulinkproject(); prj.close();  % close the Simulink Project (also cleans-up MATLAB path changes)
rmidotnet.MSWord.application('kill');  % close MS Word application