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

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

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

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

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

  • Задайте get метод для получения состояния графика — Этот метод делает или двух вещей в зависимости от того, сохраняет ли MATLAB или загружает объект диаграммы. Когда MATLAB сохраняет объект диаграммы, метод возвращает соответствующие изменения осей, таким образом, они могут быть сохранены. Когда MATLAB загружает объект диаграммы, метод возвращает изменения осей, которые хранятся в ChartState свойство.

  • Задайте защищенный метод, который обновляет оси — Когда объект диаграммы загружает в MATLAB, это вызовы метода get метод для ChartState свойство и затем обновляет соответствующие свойства осей для графика.

Задайте защищенное свойство для хранения состояния графика

Задайте защищенное свойство хранить соответствующую информацию осей. Это свойство пусто кроме тех случаев, когда 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. Создайте структуру и получите объект осей. Добавьте XLimylim, и ZLim поля к структуре, только если XLimylim, и 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.

  • Проверяйте на существование XLimylimzlim, и 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 в узлах решетки. Спроектируйте этот класс так, чтобы XLimylimzlim, и 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 метод, который возвращает структуру, содержащую:

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

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

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

Загрузите график что вы сохраненный

openfig('mychart.fig')

Когда вы загружаете график:

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

  • loadstate метод выполняет эти задачи:

    • Вызовите get.ChartState метод, который возвращает структуру в ChartState свойство.

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

    • Очистите содержимое ChartState свойство.

Смотрите также

Классы

Функции

Свойства

Похожие темы