Этот пример покрывает набор стандартных ситуаций, когда ссылки между артефактами проекта и требованиями становятся устаревшими после одного или нескольких артефактов, перемещенных или переименованных. Скорее затем удаляя неработающие ссылки и создание новых единиц, мы хотим обновить существующие ссылки так, чтобы история создания/модификации и другие свойства (описание, ключевые слова, комментарии..) сохраняются. Использование следующих 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();
Мы будем фокусироваться на небольшой части Диаграммы зависимостей этого Проекта: рассмотрите 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);
Предположим, что обновленная версия документа требований получена, названная 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
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
Как продемонстрировано в ВАРИАНТЕ ИСПОЛЬЗОВАНИЯ 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
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
Теперь предположите, что мы переходим 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
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