Как мы можем использовать Curve Fitting Tool во время отладки? - PullRequest
0 голосов
/ 21 января 2019

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

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

enter image description here Однако во время отладки выбор данных отключен (это is задокументировано ):

enter image description here

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

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

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

1 Ответ

0 голосов
/ 22 января 2019

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

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

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

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

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

    hSFT = getappdata( groot, 'SurfaceFittingToolHandle' );
    

    b) Изучение свойств и дочерних элементов 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>.
...