Этот пример покрывает набор стандартных ситуаций, когда ссылки между артефактами проекта и требованиями становятся устаревшими после того, как один или несколько артефактов перемещены или переименованы. Скорее затем удаляя неработающие ссылки и создание новых единиц, мы хотим обновить существующие ссылки так, чтобы история создания/модификации и другие свойства (описание, ключевые слова, комментарии..) сохраняются. Использование следующих 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();
Мы будем фокусироваться на небольшой части Диаграммы зависимостей этого Проекта: откройте 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);
Предположим, что обновленная версия документа требований получена, названная 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);
Отмените изменения данных о ссылке, чтобы избежать подсказок на Проекте близко. Закройтесь проект (также очищает изменения пути MATLAB). Закройте Microsoft Word.
slreq.clear();
prj = simulinkproject(); prj.close();
rmidotnet.MSWord.application('kill');
Как продемонстрировано в Варианте использования 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);
Отмените изменения данных о ссылке, чтобы избежать подсказок на Проекте близко. Закройтесь проект (также очищает изменения пути MATLAB). Закройте Microsoft Word.
slreq.clear();
prj = simulinkproject(); prj.close();
rmidotnet.MSWord.application('kill');
Теперь предположите, что мы переходим существующий проект с соединенными артефактами, и мы должны создать новый набор переименованных артефактов со всеми ссылками трассируемости как в исходном Проекте. Как прежде, мы извлечем Проект Круиз-контроля в новую подпапку и преобразуем "прямые ссылки" на "ссылки", когда мы сделали в Варианте использования 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);
Очистите открытые наборы требования и наборы ссылки, и закройте открытые модели и проекты, не сохраняя изменения. Закройте Microsoft Word.
slreq.clear(); close_system('crs_plant_v2'); prj = simulinkproject(); prj.close(); rmidotnet.MSWord.application('kill');