Графики, которые наследовались ChartContainer
базовый класс следует тем же правилам для сохранения и загрузки как другой MATLAB® объекты. Однако в некоторых случаях вы можете хотеть свои объекты сохранить и загрузить дополнительную информацию. Например, чтобы оказать поддержку для сохранения и загрузки результата интерактивных изменений, таких как вращение или изменение масштаба, необходимо сохранить модифицированное представление осей в свойстве на классе. Путем определения свойств и методов для того, чтобы сохранить и получить эти виды изменений, вы позволяете пользователям сохранить и перезагрузить экземпляры вашего графика с их сохраненными изменениями.
Встроенные взаимодействия осей изменяют определенные свойства на осях. Например, перетаскивание, чтобы вращать 3-D график изменяет View
свойство. Точно так же прокрутка для масштабирования в рамках графика изменяет XLim
ylim
, (и возможно 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
. Создайте структуру и получите объект осей. Добавьте 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
Задайте MeshGradientChart
класс для отображения сетчатого графика с x и векторами градиента y в узлах решетки. Спроектируйте этот класс так, чтобы XLim
ylim
zlim
, и 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
метод, который возвращает структуру, содержащую:
Значения XLim
ylim
, или ZLim
свойства на осях, но только если они изменились
Значение View
свойство на осях
После того, как MATLAB получает структуру, он хранит структуру в ChartState
свойство объекта диаграммы, который сохранен.
openfig('mychart.fig')
Когда вы загружаете график:
setup
вызовы метода loadstate
метод.
loadstate
метод выполняет эти задачи:
Вызовите get.ChartState
метод, который возвращает структуру в ChartState
свойство.
Сбросьте XLim
ylim
zlim
, и View
свойства на осях, но только если структура содержит соответствующие поля.
Очистите содержимое ChartState
свойство.