MATLAB:区分轴的子级?

MATLAB:区分轴的子级?,matlab,plot,brush,Matlab,Plot,Brush,我有一个函数,可以收集刷过的数据(以ActionPostCallback的形式)。该函数的行为与预期的一样:当我高亮显示给定轴的一个区域时,它存储高亮显示数据的xmin和xmax。但是,有时我会在轴上的数据块周围绘制一个红色矩形,以引起对该数据的注意。如果我将矩形绘制在轴上,然后尝试在同一轴上刷其他数据,我会得到一个回调错误 EDIT2经过进一步的研究,我找到了故障代码行。函数注释SelectedRegion中的行: selectedData = currentSelection.Childre

我有一个函数,可以收集刷过的数据(以ActionPostCallback的形式)。该函数的行为与预期的一样:当我高亮显示给定轴的一个区域时,它存储高亮显示数据的xmin和xmax。但是,有时我会在轴上的数据块周围绘制一个红色矩形,以引起对该数据的注意。如果我将矩形绘制在轴上,然后尝试在同一轴上刷其他数据,我会得到一个回调错误

EDIT2经过进一步的研究,我找到了故障代码行。
函数注释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;”行中,当有多个子项时(在本例中是打印的行和框),代码将崩溃。我将相应地编辑我的问题。