Я попытался настроить функцию пост-обратного вызова масштабирования для изменения фигуры определенным образом при масштабировании. Этот вызов вызвал ошибку, которая была в конечном счете прослежена до функции plotyy
.Ошибка обратного вызова matlab, связанная с функцией plotyy
В качестве простого примера, рассмотрим следующий блок кода, который проектирует две bar
элементы на одном наборе axes
и определяет zoom
объект с набором ActionPostCallback
поведения. Этот блок кода выполняется без каких-либо проблем и поддерживает функцию, вызванную масштабированием, подробно описанную в вопросе ниже.
h=figure;
z=zoom(h);
set(z,'ActionPostCallback',@post_callback);
plt1=bar(1:6,1:6);
hold on;
plt2=bar(4:6,1:3);
set(plt2,'FaceColor','r');
Создание простого изменения, то есть, обмениваясь bar
Plotting команды для plotyy
команды, которая присваивает каждому объекту участка в отдельный набор axes
приводит нефункционирующих код, который вызывает сообщение вообще бесполезные ошибки подробно ниже. Образец кода, который повторяет аберрантный и нежелательное поведение выглядит следующим образом:
h=figure;
z=zoom(h);
set(z,'ActionPostCallback',@post_callback);
[ax,plt1,plt2]=plotyy(1:6,1:6,4:6,1:3,@bar,@bar)
hold on;
set(plt2,'FaceColor','r');
Обратите внимание, что функция post_callback
, который является общим для обоих образцов кода, является given by:
function post_callback(obj,evd)
newLim = get(evd.Axes,'XLim');
msgbox(sprintf('The new X-Limits are [%.2f %.2f].',newLim));
отображается сообщение об ошибке когда операция масштабирования выполняется после запуска второго, но не первого блока кода, полностью неинформативна:
Warning: An error occurred during the mode callback.
> In uitools.uimode.fireActionPostCallback at 14
In zoom>local2DButtonUpFcn at 1332
In hgfeval at 63
In uitools.uimode.modeWindowButtonUpFcn at 46
In uitools.uimode.setCallbackFcn>localModeWindowButtonUpFcn at 58
S tudying соответствующие строки в каждом из файлов, указанных не helpfu ко мне, но я отправляю их здесь в случае, если другие могут различать смысл из них:
uitools.uimode.fireActionPostCallback [lines 9-16]
try
if ~isempty(hThis.ActionPostCallback)
hgfeval(hThis.ActionPostCallback,hFig,evd);
end
catch
warning('MATLAB:uitools:uimode:callbackerror',...
'An error occurred during the mode callback.');
end
zoom>local2DButtonUpFcn [lines 1330-1332]
localDoZoom2D(currentAxes,currentXLim,currentYLim,newXLim,newYLim);
% Fire mode post callback function:
hMode.fireActionPostCallback(localConstructEvd(currentAxes));
hgfeval [lines 62-66]
if cellFunction
feval(fcn{1},varargin{:},fcn{2:end});
else
evalin('base', fcn);
end
uitools.uimode.modeWindowButtonUpFcn [lines 45-46]
% Execute the specified callback function
hgfeval(newButtonUpFcn,hFig,evd);
uitools.uimode.setCallbackFcn>localModeWindowButtonUpFcn [lines 56-58]
function localModeWindowButtonUpFcn(hFig,evd,hThis,newButtonUpFcn)
hThis.modeWindowButtonUpFcn(hFig,evd,hThis,newButtonUpFcn);
Я был бы признателен, если кто-то может пролить свет на непреклонность этой ошибки и средства, с помощью которых ее можно избежать. Есть plotyy
и `zoom> ActionPostCallback 'принципиально несовместим?
Я впечатлен тем, что вы смогли это исправить. К сожалению, фактическая ошибка не была включена в трассировку, поскольку отладка была сложнее, чем это, вероятно, было необходимо. К сожалению, в моей попытке максимально упростить задачу для презентации на этом форуме (и моя убежденность в том, что проблема была «сюжетная» на основе исчерпывающего тестирования, удаляющего разные элементы и проверяющего, произошла ли ошибка), я задал вопрос о проблеме ('plotyy'), который, по-видимому, не является основной причиной. См. Мой новый вопрос, который более точно отражает мою реальную проблему. Еще раз спасибо. – user001
Вот ссылка на новый вопрос: http://stackoverflow.com/q/25114646/873757. Извините, этот первый вопрос оказался несколько красной селедкой ... – user001