Как мы можем использовать инструмент Curve Fitting Tool во время отладки?

Приложение MATLAB Curve Fitting (ранее «инструмент», следовательно, cftool) представляет собой графический инструмент для интерактивного подбора кривой 1.

Общий способ работы с этим инструментом - выбор переменных из рабочей области:

введите здесь описание изображения Однако во время отладки выбор данных отключен (это задокументировано):

введите здесь описание изображения

... что довольно неприятно, так как мы должны сохранить данные в файл и либо выйти из отладки, либо открыть новый экземпляр MATLAB, прежде чем мы сможем снова загрузить эти данные и использовать их в cftool.

Я бы предположил, что причина отключения входов заключается в том, что во время отладки у нас обычно есть несколько рабочих пространств, и поэтому повторение их или предоставление пользователю выбора рабочего пространства слишком громоздко с точки зрения UX, поэтому разработчики решили отключить входы до тех пор, пока это не произойдет. время, когда существует только одно рабочее пространство.

У меня такой вопрос: Как мы можем отключить «обнаружение отладки» cftool или иным образом указать интересующую нас рабочую область, чтобы мы могли использовать cftool во время отладки?


person Dev-iL    schedule 21.01.2019    source источник
comment
Также следует учитывать, что инструмент затем запускает динамически сгенерированный код, что потенциально является странной вещью в середине отладки существующего кода ... Вы можете использовать assignin для назначения переменной в базовую рабочую область, вместо того, чтобы сохранять ее в файл и повторная загрузка (вам все равно придется выйти из отладки).   -  person Wolfie    schedule 21.01.2019
comment
@Wolfie Я понял это, если тебе интересно. :)   -  person Dev-iL    schedule 22.01.2019


Ответы (1)


Я покопался и вот что нашел:

  • Инструмент подбора кривой содержит специальный тип полей со списком для выбора переменных, которые используют класс com.mathworks.mlservices.MatlabDebugObserver для обнаружения режима отладки и отключения элементов управления. Этот Java-класс для этих элементов управления

    MATLAB\R20###\java\jar\toolbox\curvefit.jar!
             com.mathworks.toolbox.curvefit.surfacefitting.SFDataCombo
    

    который я нашел:

    а) Запуск cftool и получение дескриптора его окна с помощью,

    hSFT = getappdata( groot, 'SurfaceFittingToolHandle' );
    

    б) Изучение свойств и дочерних элементов hSFT, чтобы найти объект java, который содержит панель, в которой мы указываем данные соответствия.

    c) Найдите .jar файл, содержащий указанный выше класс java, с помощью команды src:

    jObj.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
    
  • Мы можем отключить прослушиватель отладки, получив доступ к отдельным полям со списком и вызвав их метод cleanup(), который удаляет прослушиватели отладки (см. Примечания об этом в приведенном ниже коде). Это включает доступ к закрытым полям нескольких объектов, для которых мы будем использовать отражение:

    function unlockCftool()
    % NOTES: 
    % 1) After unlocking cftool, it will no longer update the list of workspace variables, so 
    % make sure all desired variables exist in the base workspace before proceeding, or you'll 
    % need to restart cftool.
    % 2) DO NOT execute this code while debugging, since then the variable selection fields in
    % cftool will be stuck in their disabled mode until it is restarted.
    
    hSFT = getappdata( groot, 'SurfaceFittingToolHandle' );
    jEFP = hSFT.FitFigures{1}.HFittingPanel.HUIPanel.Children.java.getJavaPeer();
    f = jEFP.getClass().getDeclaredField('fittingDataPanel');
    f.setAccessible(true);
    jFDP = f.get(jEFP);
    f = jFDP.getClass().getDeclaredFields(); f = f(1:4); % <- shortcut for:
    %{
    f = [jFDP.getClass().getDeclaredField('fXDataCombo');
         jFDP.getClass().getDeclaredField('fYDataCombo');
         jFDP.getClass().getDeclaredField('fZDataCombo');
         jFDP.getClass().getDeclaredField('fWDataCombo')];
    %}
    java.lang.reflect.AccessibleObject.setAccessible(f, true);
    for ind1 = 1:numel(f)
      f(ind1).get(jFDP).cleanup();
    end
    

Итак, теперь мы можем сделать следующее:

X = 0:9;
Y = 10:-1:1;
cftool();
% <select the X and Y variables in cftool to get a decreasing slope>.
unlockCftool();
% <enter debug mode, for example using: dbstop in unlockCftool; unlockCftool(); >
assignin('base', 'X', 5:-1:-4);
% <re-select X to update the data - resulting in a rising slope>.
person Dev-iL    schedule 22.01.2019