При разработке пользовательской диаграммы в качестве подкласса ChartContainer базовый класс, вы можете использовать определенные методы, чтобы сделать ваш код более надежным, эффективным и адаптированным к потребностям ваших пользователей. Эти методы сосредоточены на определении свойств класса и управлении ими. Используйте любые, которые полезны для типа визуализации, которую вы хотите создать, и пользовательского интерфейса, который вы хотите предоставить.
Инициализировать значения свойств (Initialize property values) - задает состояние диаграммы по умолчанию, если пользователи вызывают неявный конструктор без каких-либо входных аргументов.
Проверить значения свойств - убедитесь, что значения действительны, прежде чем использовать их для вычисления или настройки одного из базовых графических объектов диаграммы.
Настроить отображение свойств - предоставляет настраиваемый список свойств, когда пользователь ссылается на объект диаграммы без точки с запятой.
Оптимизация update метод - повышение производительности update метод, когда в вычислениях используется только подмножество свойств.
Назначьте значения по умолчанию для всех общих свойств класса. При этом настраивается допустимая диаграмма, если пользователь пропускает некоторые аргументы пары имя-значение при вызове метода конструктора.
Для свойств, хранящих данные координат, задайте начальные значения как NaN значения или пустые массивы, так что диаграмма по умолчанию пуста, если пользователь не указывает координаты. Выберите координаты по умолчанию в соответствии с требованиями функций печати, которые планируется вызвать в методах классов. Сведения о требованиях см. в документации по функциям печати, которые планируется использовать.
Рекомендуется проверять значения свойств класса, прежде чем код будет использовать эти значения. Удобным способом для этого является проверка размера и класса свойств при их определении. Например, этот блок свойств проверяет размер и класс четырех свойств.
properties IsoValue (1,1) double = 0.5 Enclose {mustBeMember(Enclose,{'above','below'})} = 'below' CapVisible (1,1) matlab.lang.OnOffSwitchState = 'on' Color (1,3) double {mustBeGreaterThanOrEqual(Color,0),... mustBeLessThanOrEqual(Color,1)} = [.2 .5 .8] end
IsoValue должен быть массивом класса 1 на 1 double.
Enclose должно иметь значение 'above' или 'below'.
CapVisible должен быть массивом класса 1 на 1 matlab.lang.OnOffSwitchState.
Color должен быть массивом класса 1 на 3 double, где каждое значение находится в диапазоне [0,1].
Можно также проверить свойства, которые хранят базовые графические объекты в диаграмме. Чтобы определить имя класса объекта, вызовите соответствующую функцию печати в командной строке, а затем вызовите class для получения имени класса. Например, если вы планируете вызвать patch функция в вашей setup метод, вызовите patch функция в командной строке с выходным аргументом (входные аргументы не имеют значения). Затем передайте выходной сигнал в class для получения имени класса.
x = patch(NaN,NaN,NaN); class(x)
ans =
'matlab.graphics.primitive.Patch'Используйте выходные данные class для проверки класса для соответствующего свойства в классе. Например, каждое из следующих свойств хранит Patch объект.
properties (Access = private,Transient,NonCopyable) IsoPatch (1,1) matlab.graphics.primitive.Patch CapPatch (1,1) matlab.graphics.primitive.Patch end
Иногда может потребоваться определить свойство, которое может хранить различные формы и классы значений. Например, если определено свойство, которое может хранить символьный вектор, массив ячеек символьных векторов или строковый массив, опустите проверку размера и класса или используйте пользовательский метод проверки свойств.
Дополнительные сведения о проверке свойств см. в разделе Проверка значений свойств.
Одно из преимуществ определения диаграммы как подкласса ChartContainer базовый класс состоит в том, что он также наследует от matlab.mixin.CustomDisplay класс. Таким образом, при ссылке на диаграмму без точки с запятой можно настроить список свойств, отображаемых в окне команд MATLAB ®. Чтобы настроить отображение свойства, перегружайте getPropertyGroups способ. В рамках этого метода можно настроить список свойств и порядок списка. Например, рассмотрим IsoSurfCapChart , который имеет следующие общие свойства.
properties IsoValue (1,1) double = 0.5 Enclose {mustBeMember(Enclose,{'above','below'})} = 'below' CapVisible (1,1) matlab.lang.OnOffSwitchState = 'on' Color (1,3) double {mustBeGreaterThanOrEqual(Color,0),... mustBeLessThanOrEqual(Color,1)} = [.2 .5 .8] end
Следующее getPropertyGroups метод задает список свойств скалярного объекта как Color, IsoValue, Enclose, и CapVisible.
function propgrp = getPropertyGroups(obj) if ~isscalar(obj) % List for array of objects propgrp = getPropertyGroups@matlab.mixin.CustomDisplay(obj); else % List for scalar object propList = {'Color','IsoValue','Enclose','CapVisible'}; propgrp = matlab.mixin.util.PropertyGroup(propList); end end
Когда пользователь ссылается на экземпляр этой диаграммы без точки с запятой, MATLAB отображает настроенный список.
c = IsoSurfCapChart
c =
IsoSurfCapChart with properties:
Color: [0.2000 0.5000 0.8000]
IsoValue: 0.5000
Enclose: 'below'
CapVisible: on
Дополнительные сведения о настройке отображения свойств см. в разделе Настройка отображения свойств.
update МетодВ большинстве случаев update метод класса реконфигурирует все соответствующие аспекты диаграммы, зависящие от общедоступных свойств. Иногда реконфигурация включает дорогостоящий расчет, который занимает много времени. Если расчет включает только подмножество свойств, можно создать класс для выполнения этого кода только в случае необходимости.
Один из способов оптимизации update метод заключается в добавлении в класс следующих компонентов:
Определение частного свойства с именем ExpensivePropChanged который принимает logical значение. Это свойство указывает, изменились ли какие-либо свойства, использованные в дорогостоящем расчете.
Написать set метод для каждого свойства, участвующего в дорогостоящем расчете. Внутри каждого set метод, установите ExpensivePropChanged свойство для true.
Запишите защищенный метод, который выполняет дорогостоящий расчет.
Запись условного оператора в update метод, который проверяет значение ExpensivePropChanged. Если значение равно true, выполните метод, который выполняет дорогостоящий расчет.
Следующий код обеспечивает упрощенную реализацию этой конструкции.
classdef OptimizedChart < matlab.graphics.chartcontainer.ChartContainer properties Prop1 Prop2 end properties(Access=private,Transient,NonCopyable) ExpensivePropChanged (1,1) logical = true end methods(Access = protected) function setup(obj) % Configure chart % ... end function update( obj ) % Perform expensive computation if needed if obj.ExpensivePropChanged doExpensiveCalculation(obj); obj.ExpensivePropChanged = false; end % Update other aspects of chart % ... end function doExpensiveCalculation(obj) % Expensive code % ... end end methods function set.Prop2(obj,val) obj.Prop2 = val; obj.ExpensivePropChanged = true; end end end
Prop2 участвует в дорогостоящем расчете. set.Prop2 метод устанавливает значение Prop2, а затем он устанавливает ExpensivePropChanged кому true. Таким образом, в следующий раз update метод запускается, он вызывает doExpensiveCalculation только если ExpensivePropChanged является true. Затем update продолжает обновлять другие аспекты диаграммы.Определение IsoSurfCapChart класс для отображения isosurface со связанным isocaps. Включите следующие функции:
Свойства, использующие проверку размера и класса
Настраиваемое отображение свойств
Оптимизированный update метод, который пересчитывает isosurface и isocaps только в случае изменения одного или нескольких соответствующих свойств
Чтобы определить этот класс, создайте файл программы с именем IsoSurfCapChart.m в папке, расположенной по пути MATLAB. Затем реализуйте класс, следуя шагам в таблице.
| Шаг | Внедрение |
|---|---|
Вывести из |
classdef IsoSurfCapChart < matlab.graphics.chartcontainer.ChartContainer |
Определите общие свойства с помощью проверки класса и размера.
|
properties
VolumeData double = rand(25,25,25)
IsoValue (1,1) double = 0.5
Enclose {mustBeMember(Enclose,{'above','below'})} = 'below'
WhichCapPlane {mustBeMember(WhichCapPlane,{'all','xmin',...
'xmax','ymin','ymax','zmin','zmax'})} = 'all'
CapVisible (1,1) matlab.lang.OnOffSwitchState = 'on'
Color (1,3) double {mustBeGreaterThanOrEqual(Color,0),...
mustBeLessThanOrEqual(Color,1)} = [.2 .5 .8]
end |
Определите частные свойства.
|
properties(Access = private,Transient,NonCopyable)
IsoPatch (1,1) matlab.graphics.primitive.Patch
CapPatch (1,1) matlab.graphics.primitive.Patch
SmoothData double = [];
ExpensivePropChanged (1,1) logical = true
end |
Реализация |
methods(Access = protected)
function setup(obj)
ax = getAxes(obj);
% Create two Patch objects
obj.IsoPatch = patch(ax,NaN,NaN,NaN, 'EdgeColor', 'none', ...
'FaceColor',[.2 .5 .8],'FaceAlpha',0.9);
hold(ax,'on');
obj.CapPatch = patch(ax,NaN,NaN,NaN,'EdgeColor', 'none', ...
'FaceColor','interp');
% Configure the axes
view(ax,3)
camlight(ax, 'infinite');
camlight(ax,'left');
lighting(ax, 'gouraud');
hold(ax,'off');
end |
Реализация |
function update(obj) % Perform expensive computation if needed if obj.ExpensivePropChanged doExpensiveCalculation(obj); obj.ExpensivePropChanged = false; end % Update visibility of CapPatch and update color obj.CapPatch.Visible = obj.CapVisible; obj.IsoPatch.FaceColor = obj.Color; end |
Реализация |
function doExpensiveCalculation(obj) % Update isosurface obj.SmoothData = smooth3(obj.VolumeData,'box',7); [F,V] = isosurface(obj.SmoothData, obj.IsoValue); set(obj.IsoPatch,'Faces',F,'Vertices',V); isonormals(obj.SmoothData,obj.IsoPatch); % Update isocaps [m,n,p] = size(obj.SmoothData); [Xc,Yc,Zc] = meshgrid(1:n,1:m,1:p); [Fc,Vc,Cc] = isocaps(Xc,Yc,Zc,obj.SmoothData,obj.IsoValue,... obj.Enclose,obj.WhichCapPlane); set(obj.CapPatch,'Faces',Fc,'Vertices',Vc,'CData',Cc); end |
Реализация |
function propgrp = getPropertyGroups(obj) if ~isscalar(obj) % List for array of objects propgrp = getPropertyGroups@matlab.mixin.CustomDisplay(obj); else % List for scalar object propList = {'Color','IsoValue','Enclose','CapVisible',... 'WhichCapPlane','VolumeData'}; propgrp = matlab.mixin.util.PropertyGroup(propList); end end end |
Реализация |
methods
function set.VolumeData(obj,val)
obj.VolumeData = val;
obj.ExpensivePropChanged = true;
end
function set.IsoValue(obj, val)
obj.IsoValue = val;
obj.ExpensivePropChanged = true;
end
function set.Enclose(obj, val)
obj.Enclose = val;
obj.ExpensivePropChanged = true;
end
end
end |
Затем создайте массив данных тома, а затем создайте экземпляр IsoSurfCapChart.
[X,Y,Z] = meshgrid(-2:0.1:2); v = (1/9)*X.^2 + (1/16)*Y.^2 + Z.^2; c = IsoSurfCapChart('VolumeData',v,'IsoValue',0.5)
c =
IsoSurfCapChart with properties:
Color: [0.2000 0.5000 0.8000]
IsoValue: 0.5000
Enclose: 'below'
CapVisible: on
WhichCapPlane: 'all'
VolumeData: [41×41×41 double]
Изменение цвета c и скрыть isocaps.
c.Color = [1 0.60 0]; c.CapVisible = false;
