Графики, которые наследовались 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
Задайте MeshGradientChart класс для отображения сетчатого графика с x и векторами градиента y в узлах решетки. Спроектируйте этот класс так, чтобы XLimylimzlim, и View свойства осей сохраняются, когда пользователь сохраняет и перезагружает экземпляр графика.
Чтобы задать этот класс, создайте программный файл под названием MeshGradientChart.m в папке, которая находится на пути MATLAB. Затем реализуйте класс путем выполнения шагов в таблице.
| Шаг | Реализация |
|---|---|
Выведите из |
classdef MeshGradientChart < matlab.graphics.chartcontainer.ChartContainer |
Задайте публичные свойства. |
properties
XData (:,:) double = []
YData (:,:) double = []
ZData (:,:) double = []
end |
Задайте частные свойства. Одно свойство хранит |
properties (Access = private,Transient,NonCopyable)
SurfaceObject (1,1) matlab.graphics.chart.primitive.Surface
QuiverObject (1,1) matlab.graphics.chart.primitive.Quiver
end |
Задайте защищенный |
properties (Access = protected)
ChartState = []
end |
Реализуйте |
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 |
Реализуйте |
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 |
Реализуйте |
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 |
Реализуйте |
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 свойство.