控件的子类开发自定义图表时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路径中的一个文件夹中。然后按照表中的步骤实现类。
一步 | 实现 |
---|---|
源自 |
classdefIsoSurfCapChart < matlab.graphics.chartcontainer.ChartContainer
|
使用类和大小验证定义公共属性。
|
属性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)结束 |
定义私有属性。
|
IsoPatch (1,1) matlab.graphics.primitiv . patch CapPatch (1,1) matlab.graphics.primitiv . patch平滑数据双=[];ExpensivePropChanged (1,1) logical = true结束 |
实现 |
方法(访问=保护)函数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,“关闭”);结束 |
实现 |
函数更新(obj)如果需要,执行昂贵的计算如果obj。ExpensivePropChanged doExpensiveCalculation (obj);obj。ExpensivePropChanged = false;结束%更新CapPatch的可见性和更新颜色obj.CapPatch.Visible = obj.CapVisible;obj.IsoPatch.FaceColor = obj.Color;结束 |
实现 |
函数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);结束 |
实现 |
函数propgrp = getPropertyGroups (obj)如果~ isscalar (obj)%对象数组列表propgrp = getPropertyGroups@matlab.mixin.CustomDisplay (obj);其他的%标量对象列表propList = {“颜色”,“等值”,“封闭”,“CapVisible”,...“WhichCapPlane”,“VolumeData”};propgrp = matlab.mixin.util.PropertyGroup (propList);结束结束结束 |
实现 |
方法函数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;