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

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

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

  • find определять местоположение требуемой записи в данном ReqSet

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

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

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

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

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

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

  • updateFromDocument обновить ранее импортированные Ссылки из обновленного документа

  • slreq.LinkSet преобразовывать существующие "прямые ссылки" на "ссылки"

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

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

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

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

slreq.clear();
slreqCCProjectStart();

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

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

open_system('crs_plant');

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

rmi('view', 'crs_plant/status', 1);

Документ 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:');
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
    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.

slreq.editor;

Вы будете видеть два загруженные Набора Требования: crs_req.slreqx и crs_req_func_spec.slreqx. Первый Набор Требования является набором ссылок, импортированных из crs_req.docx, и второе было вручную создано в Редакторе 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 предназначаться для соответствующих разделов обновленного документа. В целях этого примера мы сделаем копию оригинала документа в той же папке с модифицированным именем. Мы затем используем slreq.LinkSet 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');

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

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

rmi('view', 'crs_plant/status', 1); % updated document opens
links = linkSet.getLinks();
disp('Links to Word document after update:');
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
    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.

Чтобы избежать этого несоответствия, мы должны обновить ранее импортированные ссылки для связи с обновленным названием документа. Используйте slreq.ReqSet API, чтобы выполнить эту задачу. Кроме того, потому что обновленный документ, возможно, изменил Требования, необходимо использовать updateFromDocument API к получению по запросу - в обновления для ссылочных элементов сохранен на стороне Simulink Requirements. После того, как это сделано, перейти из модели Simulink определит местоположение соответствия импортированная ссылка.

Найдите Набор Требования с импортированными ссылками. Обновите местоположение исходного файла и найдите узел Импорта верхнего уровня.

reqSet = slreq.find('type', 'ReqSet', 'Name', 'crs_req');
reqSet.updateSrcFileLocation('crs_req.docx', 'crs_req_v2.docx'); 
importNode = reqSet.find('CustomId', 'crs_req_v2');

Обновите импортированные ссылки от исходного файла. Закройте Microsoft Word. Затем перейдите к обновленной ссылке в Редакторе Требований.

importNode.updateFromDocument();

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

Очистка после варианта использования 1

Отмените изменения данных о ссылке, чтобы избежать подсказок на Проекте близко. Закройтесь проект (также очищает изменения пути MATLAB). Закройте Microsoft Word.

slreq.clear();                        
prj = simulinkproject(); prj.close();
rmidotnet.MSWord.application('kill'); 

Вариант использования 2: ссылки пакетного обновления, чтобы полностью использовать импортированные ссылки

Как продемонстрировано в Варианте использования 1 выше, дополнительные усилия требуются, чтобы обеспечивать "прямые ссылки" на внешние документы, когда документы перемещены или переименованы. Лучший рабочий процесс должен преобразовать существующие "прямые ссылки" в "ссылки", которые являются ссылками, которые указывают на импортированный References \in.slreqx файлы и более не дублирующаяся информация о местоположении или имени оригинала документа. При использовании этой опции внешняя ассоциация исходного документа хранится только в Наборе Требования, который размещает импортированные Ссылки.

Чтобы продемонстрировать этот рабочий процесс, перезапустите от той же начальной точки путем повторного открытия примера Проекта Круиз-контроля в новой подпапке. Скопируйте модель Simulink в свою директорию и откройте его.

slreqCCProjectStart();
copyfile(fullfile(pwd, 'documents/crs_req.docx'), fullfile(pwd, 'documents/crs_req_v2.docx'));
open_system('crs_plant');

Найдите crs_plant соедините набор и crs_req требование установлено с импортированными Ссылками.

linkSet = slreq.find('type', 'LinkSet', 'Name', 'crs_plant');
reqSet = slreq.find('type', 'ReqSet', 'Name', 'crs_req');

Мы затем используем slreq.LinkSet API, чтобы обновить все прямые ссылки в crs_plant.slmx. Затем создайте массив всех ссылок в наборе ссылки.

linkSet.redirectLinksToImportedReqs(reqSet);
links = linkSet.getLinks();

После обновления LinkSet таким образом, цикл по всем ссылкам, чтобы подтвердить отсутствие "прямых" ссылок на crs_req.docx файл.

disp('Check for links to original external document:');
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']);
        counter = counter + 1;
    end
end
disp(['    Total ' num2str(counter) ' links to external document']);
    Total 0 links to external document

Перейдите от модели Simulink до обновленной ссылки.

rmi('view', 'crs_plant/status', 1);

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

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

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

Найдите Набор Требования с импортированными ссылками. Обновите местоположение исходного файла и найдите узел Импорта верхнего уровня.

reqSet = slreq.find('type', 'ReqSet', 'Name', 'crs_req');
reqSet.updateSrcFileLocation('crs_req.docx', 'crs_req_v2.docx'); 
importNode = reqSet.find('CustomId', 'crs_req_v2');

Обновите импортированные ссылки от исходного файла. Затем перейдите к обновленной ссылке в Редакторе Требований.

importNode.updateFromDocument();
rmi('view', 'crs_plant/status', 1);

Очистка после варианта использования 2

Отмените изменения данных о ссылке, чтобы избежать подсказок на Проекте близко. Закройтесь проект (также очищает изменения пути MATLAB). Закройте Microsoft Word.

slreq.clear();                        
prj = simulinkproject(); prj.close();
rmidotnet.MSWord.application('kill'); 

Вариант использования 3: перемещение соединенных артефактов к новому проекту

Теперь предположите, что мы переходим существующий проект с соединенными артефактами, и мы должны создать новый набор переименованных артефактов со всеми ссылками трассируемости как в исходном Проекте. Как прежде, мы извлечем Проект Круиз-контроля в новую подпапку и преобразуем "прямые ссылки" на "ссылки", когда мы сделали в Варианте использования 2 выше. Мы затем идем вперед и создаем "новые версии" соединенных артефактов путем пересохранения каждого с _v2. имя.

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

Откройте Проект Круиз-контроля и откройте crs_plant модель. Найдите набор ссылки для crs_plant и требование установило crs_req.

slreqCCProjectStart();
open_system('models/crs_plant.slx');
linkSet = slreq.find('type', 'LinkSet', 'Name', 'crs_plant');
reqSet = slreq.find('type', 'ReqSet', 'Name', 'crs_req');   

Преобразуйте прямые ссылки на ссылки. Создайте переименованные копии файлов и сохраните их.

linkSet.redirectLinksToImportedReqs(reqSet);     
mkdir(fullfile(pwd, 'copied'));
save_system('crs_plant', fullfile(pwd, 'copied/crs_plant_v2.slx'));  
reqSet.save(fullfile(pwd, 'copied/crs_req_v2.slreqx'));              
copyfile('documents/crs_req.docx', 'copied/crs_req_v2.docx');        

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

reqSet.updateSrcFileLocation('crs_req.docx', fullfile(pwd, 'copied/crs_req_v2.docx'));
importNode = reqSet.find('CustomId', 'crs_req_v2');

Гарантируйте, что содержимое в переименованном наборе требования совпадает с содержимым переименованного документа путем обновления импортированных Ссылок. Перейдите от переименованной модели Simulink до элемента в переименованном наборе требования. Старый элемент в исходном наборе требования подсвечен, который является неправильным.

importNode.updateFromDocument();
rmi('view', 'crs_plant_v2/status', 1);

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

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

Найдите набор ссылки для новой копии модели, crs_plant_v2. Обновите имя набора требования, соединенного с новой копией модели. Перейдите от переименованной модели Simulink до элемента в переименованном наборе требования. На этот раз это подсвечивает правильный элемент.

linkSet = slreq.find('type', 'LinkSet', 'Name', 'crs_plant_v2');
linkSet.updateDocUri('crs_req.slreqx', 'crs_req_v2.slreqx');
rmi('view', 'crs_plant_v2/status', 1);

Очистка после варианта использования 3

Очистите открытые наборы требования и наборы ссылки, и закройте открытые модели и проекты, не сохраняя изменения. Закройте Microsoft Word.

slreq.clear();                        
close_system('crs_plant_v2');         
prj = simulinkproject(); prj.close(); 
rmidotnet.MSWord.application('kill');