Main Content

slmetric.dashboard.CustomWidget Class

Namespace: slmetric.dashboard

(To be removed) Object for holding custom Metrics Dashboard widgets

The Metrics Dashboard user interface, metricdashboard function, slmetric package API, and corresponding customizations will be removed in a future release. For more information, see Migrating from Metrics Dashboard to Model Maintainability Dashboard.

Description

For custom or shipped metrics, use the slmetric.dashboard.CustomWidget object to visualize metric data in the Metrics Dashboard. Choose a single value, radial gauge, bar chart, or distribution heat map approach.

Construction

For slmetric.dashboard.Layout, slmetric.dashboard.Container, or slmetric.dashboard.Group objects, use the addWidget or removeWidget methods to add or remove slmetric.dashboard.CustomWidget objects from the Metrics Dashboard.

The Metrics Dashboard layout is divided into 12 columns of equal size. Use slmetric.dashboard.CustomWidget methods to specify the widget size.

To specify the metric data that the widget displays, use the method setMetricIDs to assign metric IDs to the widget. The custom widget automatically scales to fit the number of metrics IDs that you specify. For example, if you create a custom bar chart widget and specify two metric IDs, the bar chart widget uses two bars in the bar chart to display the metric results.

Properties

expand all

Type of slmetric.dashboard.CustomWidget object that you want to add, remove, or modify in the Metrics Dashboard. This property is read/write. Choose from these widget types:

  • bar chart

  • single value

  • radial gauge

  • distribution heatmap

Examples of each widget type

For an example of how to use the different visualization types, see Create Layout with Custom Metric.

Data Types: char

Add labels to custom widget. This property is only for the BarChart VisualizationType property, so you can add labels to each individual bar. This property is read/write.

Data Types: char

Specify a title for the custom widget. For a radial gauge, there is a 16 character limit. This property is read/write.

Data Types: char

Type of slmetric.dashboard.CustomWidget object. This property is read-only.

Data Types: char

Methods

getHeight(To be removed) Obtain height of Metrics Dashboard custom widget
getMetricIDs(To be removed) Obtain metric identifier for custom Metrics Dashboard widget
getPosition(To be removed) Obtain custom widget position within Metrics Dashboard
getSeparators(To be removed) Determine whether there are lines on sides of Metrics Dashboard custom widget
getWidths(To be removed) Obtain widths of Metrics Dashboard custom widget
setHeight(To be removed) Specify height of Metrics Dashboard custom widget
setMetricIDs(To be removed) Set metric identifier for custom Metrics Dashboard widget
setPosition(To be removed) Set custom widget position within Metrics Dashboard
setSeparators(To be removed) Specify lines on Metrics Dashboard custom widget sides
setWidths(To be removed) Specify multiples widths for Metrics Dashboard custom widget

Examples

collapse all

Create a custom metric that counts nonvirtual blocks. Specify a widget to display this metric on the Metrics Dashboard. Add it to the Size Group.

Open the model vdp by entering:

openExample('simulink_general/VanDerPolOscillatorExample')

Create a custom metric class.

className = 'nonvirtualblockcount';
slmetric.metric.createNewMetricClass(className);

Create the nonvirtual block count metric by adding this code to the nonvirtualblockcount.m file.

classdef nonvirtualblockcount < slmetric.metric.Metric
    %nonvirtualblockcount calculates number of nonvirtual blocks per level.
    % BusCreator, BusSelector and BusAssign are treated as nonvirtual.
    properties
        VirtualBlockTypes = {'Demux','From','Goto','Ground', ...
            'GotoTagVisibility','Mux','SignalSpecification', ...
            'Terminator','Inport'};
    end
    
    methods
    function this = nonvirtualblockcount()
        this.ID = 'nonvirtualblockcount';
        this.Name = 'Nonvirtual Block Count';
        this.Version = 1;
        this.CompileContext = 'None';
        this.Description = 'Algorithm that counts nonvirtual blocks per level.';
        this.AggregatedValueName = 'Nonvirtual Blocks (incl. Descendants)'
        this.ValueName = 'Nonvirtual Blocks'
        this.ComponentScope = [Advisor.component.Types.Model, ...
            Advisor.component.Types.SubSystem];
        this.AggregationMode = slmetric.AggregationMode.Sum;
        this.ResultChecksumCoverage = true;
        this.SupportsResultDetails = true;
            
    end

    function res = algorithm(this, component)
        % create a result object for this component
        res = slmetric.metric.Result();	

        % set the component and metric ID
        res.ComponentID = component.ID;
        res.MetricID = this.ID;
        
        % Practice
        D1=slmetric.metric.ResultDetail('identifier 1','Name 1');
        D1.Value=0;
        D1.setGroup('Group1','Group1Name');
        D2=slmetric.metric.ResultDetail('identifier 2','Name 2');
        D2.Value=1;
        D2.setGroup('Group1','Group1Name');
        
        

        % use find_system to get blocks inside this component
        blocks = find_system(getPath(component), ...
            'SearchDepth', 1, ...
            'Type', 'Block');

        isNonVirtual = true(size(blocks));

        for n=1:length(blocks)
            blockType = get_param(blocks{n}, 'BlockType');

            if any(strcmp(this.VirtualBlockTypes, blockType))
                isNonVirtual(n) = false;
            else
                switch blockType
                    case 'SubSystem'
                        % Virtual unless the block is conditionally executed
                        % or the Treat as atomic unit check box is selected.
                        if strcmp(get_param(blocks{n}, 'IsSubSystemVirtual'), ...
                                'on')
                            isNonVirtual(n) = false;
                        end
                    case 'Outport'
                        % Outport: Virtual when the block resides within
                        % SubSystem block (conditional or not), and 
                        % does not reside in the root (top-level) Simulink window.
                        if component.Type ~= Advisor.component.Types.Model
                            isNonVirtual(n) = false;
                        end
                    case 'Selector'
                        % Virtual only when Number of input dimensions 
                        % specifies 1 and Index Option specifies Select 
                        % all, Index vector (dialog), or Starting index (dialog).
                        nod = get_param(blocks{n}, 'NumberOfDimensions');
                        ios = get_param(blocks{n}, 'IndexOptionArray');

                        ios_settings = {'Assign all', 'Index vector (dialog)', ...
                            'Starting index (dialog)'};

                        if nod == 1 && any(strcmp(ios_settings, ios))
                            isNonVirtual(n) = false;
                        end
                    case 'Trigger'
                        % Virtual when the output port is not present.
                        if strcmp(get_param(blocks{n}, 'ShowOutputPort'), 'off')
                            isNonVirtual(n) = false;
                        end
                    case 'Enable'
                        % Virtual unless connected directly to an Outport block.
                        isNonVirtual(n) = false;

                        if strcmp(get_param(blocks{n}, 'ShowOutputPort'), 'on')
                            pc = get_param(blocks{n}, 'PortConnectivity');

                            if ~isempty(pc.DstBlock) && ...
                                    strcmp(get_param(pc.DstBlock, 'BlockType'), ...
                                    'Outport')
                                isNonVirtual(n) = true;
                            end
                        end
                end
            end
        end

        blocks = blocks(isNonVirtual);

        res.Value = length(blocks);
    end
    end
end

Register the new metric in the metric repository.

[id_metric,err_msg] = slmetric.metric.registerMetric(className);

To begin, open the default configuration for the Metrics Dashboard layout.

conf = slmetric.dashboard.Configuration.open();

Obtain the slmetric.dashboard.Layout object from the slmetric.dashboard.Configuration object.

layout = getDashboardLayout(conf);

Obtain widget objects that are in the layout object.

layoutWidget = getWidgets(layout);

Remove the widget that represents the Simulink block count metric.

sizeGroup = layoutWidget(2); 
sizeGroupWidgets = sizeGroup.getWidgets(); 
sizeGroup.removeWidget(sizeGroupWidgets(1));

Add a widget that displays the nonvirtual block count metric. For custom widgets, the default visualization type is single value. If you want to use a different visualization technique, specify a different value for the VisualizationType property.

newWidget = sizeGroup.addWidget('Custom', 1);
newWidget.Title = ('Nonvirtual Block Count'); 
newWidget.setMetricIDs('nonvirtualblockcount');
newWidget.setWidths(slmetric.dashboard.Width.Medium);
newWidget.setHeight(70);

Specify whether there are lines separating the custom widget from other widgets in the group. These commands specify that there is a line to the right of the widget.

s.top = false;
s.bottom = false;
s.left = false;
s.right = true;
newWidget.setSeparators([s, s, s, s]);

Save the configuration object. This command serializes the API information to an XML file.

save(conf,'Filename','DashboardConfig.xml');

Set the active configuration.

slmetric.dashboard.setActiveConfiguration(fullfile(pwd,'DashboardConfig.xml'));

Open the Metrics Dashboard for the model vdp.

metricsdashboard vdp

Click the All Metrics button to run all metrics.

Version History

Introduced in R2018b

collapse all

R2022a: Metrics Dashboard will be removed

The Metrics Dashboard user interface, metricdashboard function, slmetric package API, and corresponding customizations will be removed in a future release. For more information, see Migrating from Metrics Dashboard to Model Maintainability Dashboard.