Диаграммы плитки Simulink

В этом примере показано, как создать отчет с большой схемой, которая охватывает несколько страниц.

Создание отчета с плитками изображений

Откройте модель с большой схемой.

model = 'slreportgen_demo_big_diagram';
open_system(model);

Создайте большой файл изображений для разделения на плитки.

imgFile = [model '.png'];
print('-dpng', ['-s' model], imgFile);

Создание и открытие отчета.

% To create a Word report, change the output type from "pdf" to "docx". 
% To create an HTML report, change "pdf" to "html" or "html-file for 
% a multifile or single-file report, respectively.
rpt = slreportgen.report.Report('myreport2', 'pdf');
open(rpt);

Получите информацию о макете страницы.

pageLayout = rpt.Document.CurrentPageLayout;
pageSize = pageLayout.PageSize;
pageMargins = pageLayout.PageMargins;

Установите верхний и нижний колонтитул страницы на 0 дюймов, чтобы максимизировать пространство.

pageMargins.Header = '0in';
pageMargins.Footer = '0in';

Определите размер плитки изображения, которая помещается на странице. Оптимальным размером плитки является размер страницы минус поля страницы, желоба, колонтитулы и нижние колонтитулы. Также, отрегулируйте высоту плитки, чтобы разрешить 0,5 дюйма для подписи. Обратите внимание, что для PDF документов MATLAB Report Generator задает один дюйм как равный 96 пикселям.

dpi = 96;
units = mlreportgen.utils.units;

tileHeight = units.toPixels(pageSize.Height, 'Resolution', dpi) ...
    - units.toPixels(pageMargins.Top, 'Resolution', dpi) ...
    - units.toPixels(pageMargins.Bottom, 'Resolution', dpi) ...
    - units.toPixels(pageMargins.Header, 'Resolution', dpi) ...
    - units.toPixels(pageMargins.Footer, 'Resolution', dpi) ...
    - units.toPixels('0.5in', 'Resolution', dpi);

tileWidth = units.toPixels(pageSize.Width, 'Resolution', dpi) ...
    - units.toPixels(pageMargins.Left, 'Resolution', dpi) ...
    - units.toPixels(pageMargins.Right, 'Resolution', dpi) ...
    - units.toPixels(pageMargins.Gutter, 'Resolution', dpi);

tileSize = [tileWidth tileHeight];

Вызовите локальную функцию sliceImage (см. ниже), чтобы срезать большой файл изображения в плитки изображений.

tiles = sliceImage(imgFile, [tileWidth tileHeight]);

Добавьте изображения плитки в отчет. Кроме того, добавьте подпись, чтобы указать, где находится изображение плитки относительно общего изображения.

for i = 1:numel(tiles)
    tile = tiles{i};
    formalImage = mlreportgen.report.FormalImage(tile.File);
    formalImage.ScaleToFit = false;
    formalImage.Caption = sprintf('row: %d, col: %d', tile.Row, tile.Col);
    add(rpt, formalImage);
end

Сгенерируйте и отобразите отчет.

close(rpt);
rptview(rpt);

Задайте локальную функцию sliceImage

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

function tiles = sliceImage(imgFile, tileSize)    
    % Read in the image file and determine the number of row and column 
    % tiles. Note that the image data is row-major, where the rows are 
    % specified first and the columns are second.
    img = imread(imgFile);
    imgSize = size(img); 
    
    imgRows = imgSize(1); % image height
    imgCols = imgSize(2); % image width
    
    tileNumRows = tileSize(2); % tile height
    tileNumCols = tileSize(1); % tile width
    
    numCols = ceil(imgCols / tileNumCols);
    numRows = ceil(imgRows / tileNumRows);    

    % Preallocate the tile data structures.
    tiles = cell(1, numCols*numRows);

    % Determine the base filename to create the tile image filenames.
    [fPath, fName, fExt] = fileparts(imgFile);
    tileName = fullfile(fPath, fName);

    % Iterate through all rows and columns.
    count = 0;
    for rowIdx = 1:numRows
        for colIdx = 1:numCols           
            % Determine the starting and ending image data indices to copy
            % into the tile image.  At the edges, the ending indices are 
            % the number of rows and number of columns.
            rowStart = (rowIdx - 1) * tileNumRows + 1;
            rowEnd = rowStart + tileNumRows - 1;
            
            colStart = (colIdx - 1) * tileNumCols + 1;
            colEnd = colStart + tileNumCols - 1;

            if (rowEnd >= imgRows)
                rowEnd = imgRows;
            end
            nTileRows = rowEnd - rowStart + 1;
            
            if (colEnd >= imgCols)
                colEnd = imgCols;
            end
            nTileCols = colEnd - colStart + 1;                

            % Copy the tile image data onto a white image tile.
            tileImg = uint8(255 * ones(tileNumRows, tileNumCols, 3));
            tileImg(1:nTileRows, 1:nTileCols, :) = img(rowStart:rowEnd,...
                colStart:colEnd, :);            

            % Write out the image tile.
            outFile = sprintf('%s_%d_%d.%s', tileName, rowIdx, colIdx, fExt);
            imwrite(tileImg, outFile);            

            % Create the tile data structure to describe the tile.
            count = count + 1;
            tiles{count} = struct( ...
                'File', outFile, ...
                'Row', rowIdx, ...
                'Col', colIdx);
        end
    end
end