主要内容

管理图表类的属性

控件的子类开发自定义图表时ChartContainer基类,您可以使用某些技术使您的代码更健壮、更高效,并根据用户的需求进行定制。这些技术主要关注如何定义和管理类的属性。使用任何对您想要创建的可视化类型和您想要提供的用户体验有帮助的工具。

  • 初始化属性值-设置图表的默认状态,以防用户在没有任何输入参数的情况下调用隐式构造函数。

  • 验证属性值—在使用这些值进行计算或配置图表中的一个底层图形对象之前,请确保这些值是有效的。

  • 自定义属性显示-当用户引用不带分号的图表对象时,提供自定义的属性列表。

  • 优化更新方法—提升设备性能更新当仅在耗时的计算中使用属性的子集时,使用。

初始化属性值

为类的所有公共属性指定默认值。这样做可以配置一个有效的图表,如果用户在调用构造函数方法时省略了一些名称-值对参数。

对于存储坐标数据的属性,将初始值设置为值或空数组,以便当用户未指定坐标时,默认图表为空。根据计划在类方法中调用的绘图函数的要求,选择默认坐标。要了解这些需求,请参阅计划使用的绘图功能的文档。

验证属性值

一个好的实践是在代码使用类属性值之前验证这些值。一种方便的方法是在定义属性时验证属性的大小和类。例如,这个属性块验证四个属性的大小和类。

属性等值(1,1)的两倍= 0.5附上{mustBeMember(附上,{“以上”、“以下”})}“下面”CapVisible(1,1) matlab.lang.OnOffSwitchState“上”颜色(3)双{mustBeGreaterThanOrEqual(颜色,0),...mustBeLessThanOrEqual(颜色,1)}=(。2。5。8)结束

  • 等值必须是一个1乘1的类数组

  • 附上必须有一个值吗“以上”“下面”

  • CapVisible必须是一个1乘1的类数组matlab.lang.OnOffSwitchState

  • 颜色必须是一个1乘3的类数组,其中每个值都在范围内[0, 1]

您还可以验证在图表中存储底层图形对象的属性。要确定对象的类名,请在命令行中调用相应的绘图函数,然后调用函数获取类名。例如,如果你计划调用补丁函数在你设置方法,叫补丁函数在命令行中使用输出参数(输入参数无关紧要)。然后将输出传递给函数获取其类名。

x =补丁(南、南南);类(x)
ans = ' matlab.graphics.primitive.Patch '

的输出函数来验证类中的相应属性。例如,下面的每个属性存储一个补丁对象。

属性(Access = private,Transient,NonCopyable) IsoPatch(1,1) matlab.graphics.primitive.PatchCapPatch(1,1) matlab.graphics.primitive.Patch结束

有时,您可能希望定义一个属性来存储不同的形状和值的类。例如,如果您定义了一个可以存储字符向量、字符向量的单元格数组或字符串数组的属性,则忽略大小和类验证或使用自定义的属性验证方法。

有关验证属性的更多信息,请参见验证属性值

自定义属性显示

将图表定义为类的子类的好处之一是ChartContainer的基类,它也继承自matlab.mixin.CustomDisplay类。因此,可以自定义MATLAB属性列表®当您引用没有分号的图表时,将显示在命令窗口中。要自定义属性显示,请重载getPropertyGroups方法。在该方法中,您可以自定义列出哪些属性以及列表的顺序。例如,考虑一个IsoSurfCapChart具有下列公共属性的类。

属性等值(1,1)的两倍= 0.5附上{mustBeMember(附上,{“以上”、“以下”})}“下面”CapVisible(1,1) matlab.lang.OnOffSwitchState“上”颜色(3)双{mustBeGreaterThanOrEqual(颜色,0),...mustBeLessThanOrEqual(颜色,1)}=(。2。5。8)结束

以下getPropertyGroups方法将标量对象属性列表指定为颜色等值附上,CapVisible

函数propgrp = getPropertyGroups (obj)如果~ isscalar (obj)%对象数组列表propgrp = getPropertyGroups@matlab.mixin.CustomDisplay (obj);其他的%标量对象列表propList = {“颜色”“等值”“封闭”“CapVisible”};propgrp = matlab.mixin.util.PropertyGroup (propList);结束结束

当用户引用一个没有分号的图表实例时,MATLAB将显示定制列表。

c = IsoSurfCapChart
c = IsoSurfCapChart with properties: Color: [0.2000 0.5000 0.8000] IsoValue: 0.5000

有关自定义属性显示的详细信息,请参见自定义属性显示

优化更新方法

在大多数情况下更新方法将重新配置依赖于公共属性的图表的所有相关方面。有时,重新配置涉及昂贵的、耗时的计算。如果计算只涉及属性的一个子集,则可以将类设计为仅在必要时执行该代码。

优化的一个方法是更新方法是将这些组件添加到类中:

  • 定义一个名为ExpensivePropChanged接受一个逻辑价值。此属性指示昂贵计算中使用的任何属性是否已更改。

  • 写一个方法的每个属性涉及的昂贵的计算。在每一个方法,设置ExpensivePropChanged财产真正的

  • 编写一个受保护的方法来执行昂贵的计算。

  • 在中写一个条件语句更新的值ExpensivePropChanged.如果值为真正的,执行执行昂贵计算的方法。

下面的代码提供了这个设计的简化实现。

classdefOptimizedChart < matlab.graphics.chartcontainer.ChartContainer属性Prop1 Prop2结束属性(=私人访问,瞬态NonCopyable) ExpensivePropChanged(1)逻辑= true结束方法(访问=保护)函数设置(obj)%配置图%……结束函数更新(obj)如果需要,执行昂贵的计算如果obj。ExpensivePropChanged doExpensiveCalculation (obj);obj。ExpensivePropChanged = false;结束%更新图表的其他方面%……结束函数doExpensiveCalculation (obj)%昂贵的代码%……结束结束方法函数set.Prop2 (obj, val) obj。Prop2 = val;obj。ExpensivePropChanged = true;结束结束结束
在这种情况下,Prop2涉及到昂贵的计算。的集。Prop2方法设置的值Prop2,然后它就成立了ExpensivePropChanged真正的.因此,下一次更新方法运行时,它调用doExpensiveCalculation只有在ExpensivePropChanged真正的.然后更新方法继续更新其他方面的图表。

示例:优化的等值线图与定制的属性显示

定义一个IsoSurfCapChart类,用于显示等值面与相关的isocaps.包括以下特点:

  • 使用大小和类验证的属性

  • 自定义属性显示

  • 一个优化更新方法重新计算等值面isocaps仅当一个或多个相关属性发生更改时

要定义这个类,创建一个名为IsoSurfCapChart.m在MATLAB路径中的一个文件夹中。然后按照表中的步骤实现类。

一步 实现

源自ChartContainer基类。

classdefIsoSurfCapChart < matlab.graphics.chartcontainer.ChartContainer

使用类和大小验证定义公共属性。

  • VolumeData等值,颜色的参数等值面

  • 附上WhichCapPlane,CapVisible的参数isocaps

属性VolumeData兰特(25)25日,25日isvalue (1,1) double = 0.5“以上”“下面”})} =“下面”WhichCapPlane{mustBeMember (WhichCapPlane{‘所有’,‘xmin’,...“xmax”“ymin”“ymax”“zmin”“zmax”})} =“所有”matlab.lang.OnOffSwitchState = . CapVisible (1,1)“上”颜色(1、3)翻倍{mustBeGreaterThanOrEqual(颜色,0),...mustBeLessThanOrEqual(颜色,1)}=[。2.58)结束

定义私有属性。

  • IsoPatchCapPatch存储补丁对象等值面isocaps

  • SmoothData存储平滑版本的卷数据。

  • ExpensivePropChanged指示更新方法是否需要重新计算等值面isocaps

IsoPatch (1,1) matlab.graphics.primitiv . patch CapPatch (1,1) matlab.graphics.primitiv . patch平滑数据[];ExpensivePropChanged (1,1) logical = true结束

实现设置方法。在这种情况下,调用补丁函数创建补丁对象等值面isocaps.将对象存储在相应的属性中,并配置坐标轴。

方法(访问=保护)函数setup(obj) ax = getAxes(obj);%创建两个Patch对象obj。IsoPatch =补丁(ax,南,南南“EdgeColor”“没有”...“FaceColor”,(。2。5。8),“FaceAlpha”, 0.9);(ax,“上”);obj。CapPatch =补丁(ax,南,南南“EdgeColor”“没有”...“FaceColor”的插值函数);配置坐标轴视图(ax, 3) camlight (ax,“无限”);camlight (ax,“左”);照明(ax,“古尔戈”);(ax,“关闭”);结束

实现更新方法。决定是否调用doExpensiveCalculation方法通过测定ExpensivePropChanged.然后继续更新图表的其他方面(成本较低)。

函数更新(obj)如果需要,执行昂贵的计算如果obj。ExpensivePropChanged doExpensiveCalculation (obj);obj。ExpensivePropChanged = false;结束%更新CapPatch的可见性和更新颜色obj.CapPatch.Visible = obj.CapVisible;obj.IsoPatch.FaceColor = obj.Color;结束

实现doExpensiveCalculation方法,该方法对体数据进行平滑处理,并对曲面和顶点进行重新计算等值面isocaps

函数doExpensiveCalculation (obj)%更新等值面obj。SmoothData = smooth3 (obj。VolumeData,“盒子”7);(F, V) =等值面(obj。SmoothData,obj。等值);设置(obj。IsoPatch,“脸”F“顶点”, V);isonormals (obj.SmoothData obj.IsoPatch);%更新isocaps大小(m, n, p) = (obj.SmoothData);(Xc、Yc佐]= meshgrid (1: n, 1: m, 1: p);(Fc、Vc、Cc) = isocaps (Xc、Yc佐,obj.SmoothData, obj.IsoValue,...obj.Enclose obj.WhichCapPlane);设置(obj。CapPatch,“脸”足球俱乐部,“顶点”风险投资,CData的, Cc);结束

实现getPropertyGroups方法以自定义属性显示。

函数propgrp = getPropertyGroups (obj)如果~ isscalar (obj)%对象数组列表propgrp = getPropertyGroups@matlab.mixin.CustomDisplay (obj);其他的%标量对象列表propList = {“颜色”“等值”“封闭”“CapVisible”...“WhichCapPlane”“VolumeData”};propgrp = matlab.mixin.util.PropertyGroup (propList);结束结束结束

实现每个昂贵属性的方法(VolumeData等值,附上).在每个方法中,设置相应的属性值,然后设置ExpensivePropChanged真正的

方法函数set.VolumeData (obj, val) obj。VolumeData = val;obj。ExpensivePropChanged = true;结束函数集。等值(obj, val) obj。等值= val;obj。ExpensivePropChanged = true;结束函数集。附上(obj, val) obj。附上= val;obj。ExpensivePropChanged = true;结束结束结束

接下来,创建一个卷数据数组,然后创建一个实例IsoSurfCapChart

[X, Y, Z] = meshgrid (2:0.1:2);v = (1/9) * X。Y ^ 2 +(1/16) *。^ 2 + z ^ 2;c = IsoSurfCapChart (“VolumeData”v,“等值”, 0.5)
c = issurfcapchart with properties: Color: [0.2000 0.5000 0.8000] IsoValue: 0.5000

改变颜色c和隐藏isocaps

c.Color = [1 0.60 0];c.CapVisible = false;

另请参阅

功能

相关的话题