exponenta event banner

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

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

  • slreq.find чтобы получить информацию о требованиях к Simulink ® и ссылках

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

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

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

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

  • slreq.Link для целевой информации «as stored», которая отличается от «as resolved» Link.destination()

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

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

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

  • slreq.LinkSet преобразование существующих «прямых связей» в «ссылочные связи»

  • slreq.show используется для просмотра исходного или целевого конца данного slreq.Link

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

Примеры файлов проекта

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

slreq.clear();
slreqCCProjectStart();

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

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

open_system('crs_plant');

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

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

Документ Word откроется в соответствующем разделе:

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

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 путем ввода slreq.editor в командной строке MATLAB. Будут загружены два набора требований: crs_req.slreqx и crs_req_func_spec.slreqx. Первый набор требований - это набор привязок, импортированных из crs_req.docxвторой был создан вручную в редакторе требований Simulink. Если закрыть документ Word и перейти по той же ссылке из crs_plant/status В блоке ввода соответствующая импортированная привязка подсвечивается в редакторе требований, поскольку операция навигации находит соответствующую привязку в загруженном импортированном наборе требований.

По-прежнему можно использовать кнопку Показать в документе для просмотра связанного требования в контексте исходного документа.

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. После этого при переходе из модели 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 в *.slreqx файлы и больше не дублировать информацию о расположении или имени исходного документа. При использовании этой опции связь внешнего исходного документа сохраняется только в наборе требований, в котором размещены импортированные ссылки.

Чтобы продемонстрировать этот рабочий процесс, перезапустите его с той же начальной точки, снова открыв определение требований для модели Cruise Control в новой подпапке. Скопируйте модель 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 с новым именем. Затем выполняется необходимое обновление для узла Import с использованием тех же 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, импортированного внешнего документа и набора требований с импортированными требованиями возникает одна проблема: переименованная модель связана со ссылками в исходном наборе требований, а не в переименованном наборе требований. На панели Подробно (Details) в разделе Связи (Links) связи отображаются как неразрешенные, поскольку исходная модель не загружена.

Откройте проект круиз-контроля и откройте 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. После этого снова перейдите из блока в переименованной модели. Будет выбрано требование в переименованном наборе требований, и связи на панели Подробно (Details) в разделе Связи (Links) внизу справа будут разрешены.

Найдите набор ссылок для новой копии модели, 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();                        
bdclose('all');     
prj = simulinkproject(); prj.close(); 
rmidotnet.MSWord.application('kill');