exponenta event banner

Сохранение и загрузка экземпляров классов диаграмм

Диаграммы, наследующие от ChartContainer базовый класс должен соответствовать тем же правилам сохранения и загрузки, что и другие объекты MATLAB ®. Однако в некоторых случаях объекты могут сохранять и загружать дополнительную информацию. Например, чтобы обеспечить поддержку сохранения и загрузки результатов интерактивных изменений, таких как поворот или увеличение, необходимо сохранить измененный вид осей в свойстве класса. Определение свойств и методов для хранения и извлечения таких изменений позволяет пользователям сохранять и перезагружать экземпляры диаграммы с сохранением изменений.

Шаблон кодирования для сохранения и загрузки изменений осей

Встроенные взаимодействия осей изменяют определенные свойства осей. Например, при перетаскивании для поворота 3-D диаграммы изменяется View собственность. Аналогично, прокрутка для увеличения в пределах диаграммы изменяет XLim, YLim, (и, возможно, ZLim) свойства на осях. Чтобы сохранить изменения при сохранении и перезагрузке диаграммы, добавьте в класс следующие компоненты:

Определение защищенного свойства для сохранения состояния диаграммы

Определите защищенное свойство для хранения информации о соответствующих осях. Это свойство пусто, за исключением случаев, когда MATLAB устанавливает свое значение во время процесса сохранения или когда MATLAB загружает сохраненный экземпляр диаграммы. Определите свойство с именем, которое удобно и легко распознать. Например, определите свойство с именем ChartState.

properties (Access = protected)
    ChartState = []
end

Определение get Метод получения состояния диаграммы

Определение общедоступного get метод для ChartState собственность. Как и все set и get этот метод автоматически наследует разрешения доступа ChartState собственность. MATLAB вызывает этот метод при сохранении экземпляра диаграммы.

В рамках этого метода создайте переменную с именем isLoadedStateAvailable который хранит logical значение. Это значение равно true когда ChartState свойство не является пустым.

Затем напишите условный оператор, который проверяет значение isLoadedStateAvailable. Разделить оператор на пункты:

  • if...then пункт - isLoadedStateAvailable значение равно true. Возврат содержимого ChartState собственность.

  • else пункт - isLoadedStateAvailable значение равно false. Создайте структуру и получите объект оси. Добавить XLim, YLim, и ZLim к структуре, только если XLim, YLim, и ZLim свойства осей изменены. Чтобы проверить, изменились ли свойства осей, проверьте, установлены ли соответствующие свойства режима 'manual'. Поскольку нет свойства режима, связанного с осями View , добавьте View поле в структуру без проверки.

methods
    function data = get.ChartState(obj)
        isLoadedStateAvailable = ~isempty(obj.ChartState);
            
         if isLoadedStateAvailable
             data = obj.ChartState;
         else
             data = struct;
             ax = getAxes(obj);
                
             % Get axis limits only if mode is manual.
             if strcmp(ax.XLimMode,'manual')
                 data.XLim = ax.XLim;
             end
             if strcmp(ax.YLimMode,'manual')
                 data.YLim = ax.YLim;
             end
             if strcmp(ax.ZLimMode,'manual')
                 data.ZLim = ax.ZLim;
             end
                
             % No ViewMode to check. Store the view anyway.
             data.View = ax.View;
         end
     end
end

Определение защищенного метода обновления осей

Определение защищенного метода с именем loadstate. В этом методе выполните следующие шаги:

  • Запрос ChartState свойство и сохранить возвращенное значение как data.

  • Проверка существования XLim, YLim, ZLim, и View перед обновлением соответствующих свойств осей.

  • Очистить содержимое ChartState собственность.

После создания этого метода вызовите его в конце setup (после создания графических объектов, составляющих диаграмму). setup выполняется при создании MATLAB нового экземпляра диаграммы или при загрузке экземпляра диаграммы.

function loadstate(obj)
    data=obj.ChartState;
    ax = getAxes(obj);
            
    % Look for states that changed
    if isfield(data, 'XLim')
        ax.XLim=data.XLim;
    end
    if isfield(data, 'YLim')
        ax.YLim=data.YLim;
    end
    if isfield(data, 'ZLim')
        ax.ZLim=data.ZLim;
    end
    if isfield(data, 'View')
        ax.View=data.View;
    end
            
    % Reset ChartState to empty
    obj.ChartState=[];
end

Пример: 3-D График, хранящий пределы оси и вид

Определение MeshGradientChart класс для отображения графика сетки с x и y векторами градиента в точках сетки. Спроектируйте этот класс таким образом, чтобы XLim, YLim, ZLim, и View свойства осей сохраняются, когда пользователь сохраняет и перезагружает экземпляр диаграммы.

Чтобы определить этот класс, создайте файл программы с именем MeshGradientChart.m в папке, расположенной по пути MATLAB. Затем реализуйте класс, следуя шагам в таблице.

ШагВнедрение

Вывести из ChartContainer базовый класс.

classdef MeshGradientChart < matlab.graphics.chartcontainer.ChartContainer

Определите общие свойства.

    properties
        XData (:,:) double = []
        YData (:,:) double = []
        ZData (:,:) double = []
    end

Определите частные свойства. Одно свойство хранит Surface объект, а другой хранит Quiver объект.

    properties (Access = private,Transient,NonCopyable)
        SurfaceObject (1,1) matlab.graphics.chart.primitive.Surface
        QuiverObject (1,1) matlab.graphics.chart.primitive.Quiver
    end

Определение защищенного ChartState свойство для сохранения состояния осей.

    properties (Access = protected)
        ChartState = []
    end

Реализация setup способ. В этом случае вызовите mesh и quiver3 для создания Surface и Quiver соответственно. Сохраните объекты в соответствующих свойствах и переведите состояние удержания осей в 'off'. Затем вызовите loadstate для обновления состояния осей.

    methods(Access = protected)
        function setup(obj)
            ax = getAxes(obj);
            
            % Create Mesh and Quiver objects.
            obj.SurfaceObject=mesh(ax,[],[],[],'FaceColor','none');
            hold(ax,'on')
            obj.QuiverObject=quiver3(ax,[],[],[],[],'Color','r','LineWidth',2);
            hold(ax,'off')
            
            % Load state of the axes.
            loadstate(obj);
        end

Реализация update способ. В этом случае обновите координаты x и y графика сетки и хвосты векторов градиента. Затем обновите длины и направления векторов.

        function update(obj)
            % Update Mesh data.
            obj.SurfaceObject.XData = obj.XData;
            obj.SurfaceObject.YData = obj.YData;
            obj.SurfaceObject.ZData = obj.ZData;
            
            % Update locations of vector tails.
            obj.QuiverObject.XData = obj.XData;
            obj.QuiverObject.YData = obj.YData;
            obj.QuiverObject.ZData = obj.ZData;
            
            % Update lengths and directions of vectors.
            [gradx,grady] = gradient(obj.ZData);
            obj.QuiverObject.UData = gradx;
            obj.QuiverObject.VData = grady;
            obj.QuiverObject.WData = zeros(size(obj.ZData));
        end

Реализация loadstate , который обновляет оси и сбрасывает ChartState для пустого массива.

        function loadstate(obj)
            data=obj.ChartState;
            ax = getAxes(obj);
            
            % Look for states that changed.
            if isfield(data, 'XLim')
                ax.XLim=data.XLim;
            end
            if isfield(data, 'YLim')
                ax.YLim=data.YLim;
            end
            if isfield(data, 'ZLim')
                ax.ZLim=data.ZLim;
            end
            if isfield(data, 'View')
                ax.View=data.View;
            end
            
            % Reset ChartState to empty.
            obj.ChartState=[];
        end
    end

Реализация ChartState get , который возвращает информацию о состоянии осей.

    methods
        function data = get.ChartState(obj)
            isLoadedStateAvailable = ~isempty(obj.ChartState);
            
            % Return ChartState content if loaded state is available.
            % Otherwise, return current axes state.
            if isLoadedStateAvailable
                data = obj.ChartState;
            else
                data = struct;
                ax = getAxes(obj);
                
                % Get axis limits only if mode is manual.
                if strcmp(ax.XLimMode,'manual')
                    data.XLim = ax.XLim;
                end
                if strcmp(ax.YLimMode,'manual')
                    data.YLim = ax.YLim;
                end
                if strcmp(ax.ZLimMode,'manual')
                    data.ZLim = ax.ZLim;
                end
                
                % No ViewMode to check. Store the view anyway.
                data.View = ax.View;
            end
        end
    end
end

Затем создайте экземпляр диаграммы. Затем поверните или увеличьте изображение диаграммы и сохраните ее. Объект сохраняет интерактивные изменения при загрузке диаграммы обратно в MATLAB.

Создание экземпляра диаграммы

[X,Y] = meshgrid(-5:5);
Z = X.^2 + Y.^2;
c = MeshGradientChart('XData',X,'YData',Y,'ZData',Z);

При создании диаграммы:

  • setup метод вызывает loadstate способ.

  • loadstate метод выполняет эти задачи, которые в конечном итоге не оказывают влияния на объект диаграммы или объект нижележащих осей.

    • Позвоните в get.ChartState метод, который возвращает структуру, содержащую текущее значение осей View собственность.

    • Сбросить View свойство на осях к значению, сохраненному в структуре.

    • Очистить содержимое ChartState собственность.

Поворот или зумирование диаграммы и ее сохранение

savefig(gcf,'mychart.fig')

При сохранении диаграммы MATLAB вызывает get.ChartState способ, который возвращает структуру, содержащую:

  • Значения XLim, YLim, или ZLim свойства на осях, но только в случае их изменения

  • Значение View свойство на осях

После извлечения структуры MATLAB сохраняет структуру в ChartState свойства сохраняемого объекта диаграммы.

Загрузить сохраненную диаграмму

openfig('mychart.fig')

При загрузке диаграммы:

  • setup метод вызывает loadstate способ.

  • loadstate способ выполняет следующие задачи:

    • Позвоните в get.ChartState , который возвращает структуру из ChartState собственность.

    • Сбросить XLim, YLim, ZLim, и View свойства на осях, но только если структура содержит соответствующие поля.

    • Очистить содержимое ChartState собственность.

См. также

Классы

Функции

Свойства

Связанные темы