MATLAB:区分轴的子级?
我有一个函数,可以收集刷过的数据(以ActionPostCallback的形式)。该函数的行为与预期的一样:当我高亮显示给定轴的一个区域时,它存储高亮显示数据的xmin和xmax。但是,有时我会在轴上的数据块周围绘制一个红色矩形,以引起对该数据的注意。如果我将矩形绘制在轴上,然后尝试在同一轴上刷其他数据,我会得到一个回调错误 EDIT2经过进一步的研究,我找到了故障代码行。MATLAB:区分轴的子级?,matlab,plot,brush,Matlab,Plot,Brush,我有一个函数,可以收集刷过的数据(以ActionPostCallback的形式)。该函数的行为与预期的一样:当我高亮显示给定轴的一个区域时,它存储高亮显示数据的xmin和xmax。但是,有时我会在轴上的数据块周围绘制一个红色矩形,以引起对该数据的注意。如果我将矩形绘制在轴上,然后尝试在同一轴上刷其他数据,我会得到一个回调错误 EDIT2经过进一步的研究,我找到了故障代码行。函数注释SelectedRegion中的行: selectedData = currentSelection.Childre
函数注释SelectedRegion
中的行:
selectedData = currentSelection.Children
当有多个子项时,将导致代码崩溃,在本例中,是绘制的矩形和绘制的线。有没有办法区分矩形和打印线?或者,我最好的做法是在执行函数之前删除矩形
警告:模式回调期间出错
在matlab.uitools.internal.uimode/fireActionPostCallback(第16行)中
在datamanager/brushup中(第117行)
在%522823425>@(es,ed)数据管理器中。刷新(es,ed)
在hgfeval中(第62行)
在matlab.uitools.internal.uimode/modeWindowButtonUpFcn(第55行)中
在
matlab.uitools.internal.uimode/modeControl>localModeWindowButtonUpFcn
(第161行)
代码和屏幕截图附加
粗矩形是绘制的矩形,细矩形是刷牙工具。这是确实产生错误的场景的屏幕截图
矩形打印代码
function displayPrevAnnotation(obj, selectedAxes, rangeStart, rangeEnd)
if strcmp(selectedAxes, 'Raw')
axes(obj.rawDataDisplayAxes);
boxWidth = rangeEnd - rangeStart;
yLimits = obj.rawDataDisplayAxes.YLim;
boxHeight = yLimits(2) - yLimits(1);
obj.focusBox = rectangle('Position', [rangeStart, yLimits(1), boxWidth, boxHeight]); hold off;
elseif strcmp(selectedAxes, 'PSD')
axes(obj.psdDataDisplayAxes);
boxWidth = rangeEnd - rangeStart;
yLimits = obj.psdDataDisplayAxes.YLim;
boxHeight = yLimits(2) - yLimits(1);
obj.focusBox = rectangle('Position', [rangeStart, yLimits(1), boxWidth, boxHeight]); hold off;
end
obj.focusBox.LineWidth = 3;
obj.focusBox.EdgeColor = 'red';
end
拉丝数据采集功能
function annotateSelectedRegion(obj, ~, eventdata)
currentSelection = eventdata.Axes;
selectedData = currentSelection.Children;
if isempty(selectedData) || ~any(selectedData.BrushData(:))
% Do nothing
disp('please select data or load data');
elseif ~isempty(selectedData.BrushData)
brushedIdx = logical(selectedData.BrushData);
brushedXData = selectedData.XData(brushedIdx);
brushedYData = selectedData.YData(brushedIdx);
obj.t1 = brushedXData(1);
obj.t2 = brushedXData(end);
fillRecPairInfo(obj);
fillAnnotIDInfo(obj);
fillUniqueIDInfo(obj);
fillAnnotRangeInfo(obj, currentSelection);
annotationPopUp;
end
end
注意:此解决方案最适合我的情况,我不确定它对其他人有多大用处。但无论如何,这是我的解决方案。正如我在问题中所说的,我意识到函数“
AnnotatedSelectedRegion
”由于存在两个子项(矩形和绘制的线)而变得混乱。在函数“displayPrevAnnotation
”中,我只需将矩形的“handleviability
”属性设置为“off
”。通过这样做,矩形对于父对象(在本例中为轴)不再可见,因此它看到的唯一子对象是打印线 注意:此解决方案最适合我的情况,我不确定它对其他人有多大用处。但无论如何,这是我的解决方案。正如我在问题中所说的,我意识到函数“AnnotatedSelectedRegion
”由于存在两个子项(矩形和绘制的线)而变得混乱。在函数“displayPrevAnnotation
”中,我只需将矩形的“handleviability
”属性设置为“off
”。通过这样做,矩形对于父对象(在本例中为轴)不再可见,因此它看到的唯一子对象是打印线 “我收到一个回调错误”-完整地查看该错误消息可能会有帮助。@horchler错误消息非常无用,但我把它放进去了。它可能更像是一种解决方法,而不是修复/理解实际发生的情况,但是您是否尝试过调整矩形的or属性?您还可以将src
和eventdata
输入打印到回调中,以查看传递给回调的对象。@Horcler所以我接受了您的建议,打印了传递的内容,并意识到我的错误,或者更确切地说是问题。在“selectedData=currentSelection.Children;”行中,当有多个子项时(在本例中是打印的行和框),代码将崩溃。我将相应地编辑我的问题。“我收到一个回调错误”-完整地查看该错误消息可能会有所帮助。@horchler错误消息非常无用,但我把它放进去了。这可能更像是一种解决方法,而不是修复/理解实际发生的情况,但是您是否尝试过调整矩形的or属性?您还可以将src
和eventdata
输入打印到回调中,以查看传递给回调的对象。@Horcler所以我接受了您的建议,打印了传递的内容,并意识到我的错误,或者更确切地说是问题。在“selectedData=currentSelection.Children;”行中,当有多个子项时(在本例中是打印的行和框),代码将崩溃。我将相应地编辑我的问题。