Сохранение и загрузка образцов классов графика

Графики, которые наследуют от 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 пункт - The isLoadedStateAvailable значение true. Возврат содержимого ChartState свойство.

  • else пункт - The isLoadedStateAvailable значение false. Создайте структуру и получите объект осей. Добавьте XLim, YLim, и ZLim поля в структуру, только если XLim, YLim, и ZLim изменены свойства осей. Чтобы проверить, изменились ли свойства осей, проверяйте, заданы ли соответствующие свойства mode 'manual'. Поскольку свойство mode не связано с осями 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 метод (после создания графических объектов, составляющих ваш график). The 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 график, который хранит Пределы по осям и View

Задайте 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);

При создании графика:

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

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

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

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

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

Поверните или увеличьте изображение графика и сохраните ее

savefig(gcf,'mychart.fig')

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

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

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

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

Загрузите график

openfig('mychart.fig')

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

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

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

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

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

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

См. также

Классы

Функции

Свойства

Похожие темы