Создание отчетов о блоках DocBlock

Этот пример показывает, как включать содержимое блоков Simulink DocBlock в отчете Microsoft Word, сгенерированном API Отчета.

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

import mlreportgen.report.*
import slreportgen.report.*
import slreportgen.finder.*
import mlreportgen.dom.*

Загрузите модель, включенную в этот пример. Модель содержит блоки DocBlock, которые содержат простой текст, HTML и содержимое RTF, соответственно.

model = 'slreportgen_demo_docblock';
load_system(model);

Создайте контейнер, чтобы содержать содержимое отчета.

rpt = slreportgen.report.Report('ModelDoc', 'docx');

Добавьте титульный лист и оглавление.

add(rpt, TitlePage('Title', sprintf('%s Model Documentation', model)));
add(rpt, TableOfContents);

Создайте массив ячеек, чтобы содержать пути временных файлов, используемых, чтобы сохранить содержимое блоков DocBlock. Добавьте пути к этому массиву, когда файлы создаются. В конце отчета используйте этот массив, чтобы удалить файлы после того, как отчет будет завершен. Файлы не могут быть удалены, пока отчет Word не сгенерирован.

dbFiles = {};

Найдите и цикл через все системы в модели.

finder = SystemDiagramFinder(model);
for system = find(finder)

Создайте главу для каждой системы. Включайте имя системы в заголовок главы. Используйте эту главу для сообщить относительно содержимого DocBlock, если таковые имеются, системы.

    ch = Chapter('Title', sprintf('System %s', system.Name));

Найдите и цикл через все блоки DocBlock в существующей системе.

    docBlockFinder = BlockFinder(system);
    docBlockFinder.Properties = {'MaskType', 'DocBlock'}';
    docBlocks = find(docBlockFinder);
    for docBlock = docBlocks

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

        contentType = get_param(docBlock.Object, 'DocumentType');        
        switch (contentType)
            case 'RTF'
                dbFile = sprintf('%s.rtf', tempname);
                dbFiles = [dbFiles {dbFile}]; %#ok<AGROW>
                docblock('blk2file',docBlock.Object, dbFile);
                add(ch, DOCXSubDoc(dbFile));
            case 'HTML'
                dbFile = sprintf('%s.html', tempname);
                dbFiles = [dbFiles {dbFile}]; %#ok<AGROW>
                docblock('blk2file',docBlock.Object, dbFile);
                add(ch, HTMLFile(dbFile));
            case 'Text'
                dbFile = sprintf('%s.text', tempname);
                dbFiles = [dbFiles {dbFile}]; %#ok<AGROW>
                docblock('blk2file',docBlock.Object, dbFile);
                add(ch, Paragraph(fileread(dbFile)))
        end
    end
    
    if isempty(docBlocks)
        add(ch, 'This system lacks documentation');
    end
    
    add(rpt, ch);
end

close(rpt);

Используйте docview, чтобы скопировать соединенное содержимое RTF в отчет, обновить TOC отчета и поля номера страницы, и закрыть документ и Word..

docview(rpt.OutputPath, 'unlinkdocxsubdoc', 'updatedocxfields', 'closedoc', 'closeapp');

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

nFiles = numel(dbFiles);
for i = 1:nFiles
    delete(dbFiles{i})
end