我可以在轴UserData存储类属性吗?

5次浏览(最近30天)
我一直在为一种特殊的轴开发一个类。因为我们不能从内置的axes类派生类,所以我创建了一个句柄类,它有一个关联的axes对象作为它的属性之一。由于具有这些专用轴之一的图形将保存在.fig文件而不是.mat文件中,因此我将类属性存储在相关轴对象的UserData属性中。如果我的类构造函数像输入参数一样传递了一个.fig文件,那么它将查找这些属性。
我的一些类属性是定制的图形对象,类方法希望看到这些对象。我的问题是,当我试图设置其中一个属性的值时,它会删除所有其他UserData字段,并用这个值替换所有这些字段。
下面是一个简化版本:
在为图形对象设置属性之前,我有这个:
myAxes.UserData.myClassProperties
其中myClassProperties是一个结构体,有几十个字段用于类属性,其中一个叫做'EarthPatchHandle'。当我尝试这样设置时:
myaxis . userdata . myclassproperties . earthpatchhandle = surfl();
myClassProperties的所有其他字段都消失了,唯一剩下的字段是EarthPatchHandle。
我怀疑,通过将句柄类对象存储为另一个句柄类的UserData属性中的另一个句柄类的属性,我遇到了麻烦,但我不确定。
有人知道这是怎么回事吗?
[注:可能有一个更好的设计,我正在尝试做什么,如存储我的完整类对象在轴UserData,而不是单独的属性。如果可能的话,我将开始另一个问题。]
1评论
布鲁斯·艾略特
布鲁斯·艾略特 2020年4月16日
更新:我试图解决这个问题,把我的问题归结为一个更基本的问题:
为什么绘图命令删除轴UserData?
我将把这个作为一个单独的问题贴出来。

登录评论。

接受的答案

史蒂文的主
史蒂文的主 2020年4月16日
所以你想创建一个自定义的情节类型,沿着相同的思路 蜘蛛的阴谋 ?如果您使用的是R2019b或更高版本,请查看 该博客系列的第3部分 。在第3部分中,Sean介绍了如何创建自定义蜘蛛图。
至于为什么你的UserData 用你现在的方法就会被清除 本文档页面 为了一个解释。两个 控件中创建新绘图时,不会重置属性 其NextPlot属性设置为“replace”:单位和位置。类的EarthPatchHandle字段 结构体 存储在UserData中的数组myClassProperties不会 保持 ,但确实如此。 重新创建 属性开始时清除UserData属性之后 surfl 调用。
1评论
布鲁斯·艾略特
布鲁斯·艾略特 2020年4月16日
编辑:布鲁斯·艾略特 2020年4月16日
谢谢你,史蒂文,这很有帮助。我从R2019b以后就没有看到过,我们可以从中派生类 matlab.graphics.chartcontainer.ChartContainer ;这会对我的项目有很大的改变。
我的自定义情节类型是我多年来一直在做的一个次要项目,现在它接近完成,我已经看到R2020a现在在Mapping Toolbox中包含了这种情节类型(!!)。
它是用来绘制三维数据的如纬度,经度,海拔三联体而不失真。我的团队多年来一直使用plot3(lon,lat,alt)作为一种“快速而肮脏”的方法,但是对于远距离来说,几何扭曲可能会分散注意力,甚至更糟。
我想创建一个用户可以使用的自定义轴类以及自定义线和补丁类,就像他使用通常的笛卡尔绘图函数一样。
现在Mapping Toolbox已经大大改进了3d绘图,我所做的大部分工作在完成之前都将被淘汰。哦,好吧。不管怎样,这很有趣。

登录评论。

更多答案(1)

布鲁斯·艾略特
布鲁斯·艾略特 2020年4月16日
我想我已经回答了我自己的问题(当我最终在这里发布问题时总是发生这种情况-参见橡皮鸭代码调试)。
我只需要设置“hold on”(即轴NextPlot属性为“add”),我的轴属性将持续存在。
我没有意识到,如果将NextPlot设置为“替换” 所有 不仅清除了Children对象,还清除了坐标轴属性。
1评论
布鲁斯·艾略特
布鲁斯·艾略特 2020年4月20日
正如Steven Lord在另一个关于一般问题的回复中指出的那样,并不是所有的轴属性都被重置为默认值,例如单位和位置仍然存在。

登录评论。

社区寻宝

在MATLAB Central中寻找宝藏,并了解社区如何帮助您!

开始狩猎!