exponenta event banner

Управление свойствами классов диаграмм

При разработке пользовательской диаграммы в качестве подкласса ChartContainer базовый класс, вы можете использовать определенные методы, чтобы сделать ваш код более надежным, эффективным и адаптированным к потребностям ваших пользователей. Эти методы сосредоточены на определении свойств класса и управлении ими. Используйте любые, которые полезны для типа визуализации, которую вы хотите создать, и пользовательского интерфейса, который вы хотите предоставить.

Инициализация значений свойств

Назначьте значения по умолчанию для всех общих свойств класса. При этом настраивается допустимая диаграмма, если пользователь пропускает некоторые аргументы пары имя-значение при вызове метода конструктора.

Для свойств, хранящих данные координат, задайте начальные значения как 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. Затем реализуйте класс, следуя шагам в таблице.

ШагВнедрение

Вывести из ChartContainer базовый класс.

classdef IsoSurfCapChart < matlab.graphics.chartcontainer.ChartContainer

Определите общие свойства с помощью проверки класса и размера.

  • VolumeData, IsoValue, и Color являются параметрами для isosurface.

  • Enclose, WhichCapPlane, и CapVisible являются параметрами для isocaps.

    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

Определите частные свойства.

  • IsoPatch и CapPatch хранить Patch объекты для isosurface и isocaps.

  • SmoothData сохраняет сглаженную версию данных тома.

  • ExpensivePropChanged указывает, должен ли метод обновления пересчитывать isosurface и isocaps.

    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

Реализация setup способ. В этом случае вызовите patch дважды создать Patch объекты для isosurface и isocaps. Сохраните объекты в соответствующих свойствах и настройте оси.

    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

Реализация update способ. Решите, следует ли вызывать doExpensiveCalculation методом тестирования значения ExpensivePropChanged. Затем продолжите обновление других (менее дорогостоящих) аспектов диаграммы.

        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

Реализация doExpensiveCalculation , который сглаживает данные объема и пересчитывает грани и вершины isosurface и isocaps.

        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

Реализация getPropertyGroups для настройки отображения свойства.

        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

Реализация set методы для каждого дорогого объекта недвижимости (VolumeData, IsoValue, и Enclose). В каждом методе задайте соответствующее значение свойства, а затем задайте ExpensivePropChanged кому true.

    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;

См. также

Классы

Функции

Связанные темы