Запустить обратный вызов, чтобы перейти к текущему каталогу при открытии файлов - PullRequest
2 голосов
/ 26 октября 2011

Когда я открываю MATLAB, по умолчанию открывается значение /home/myUser. Всякий раз, когда я открываю файл в интерактивном режиме (скажем, я запускаю Simulink и нажимаю «Открыть ...»), диалог начинается в /home/myUser. Тогда я могу перейти в /home/myUser/myDir1/myDir2/, прежде чем нажать myModel.mdl.

Если я снова открою другой файл Simulink с помощью диалогового окна «Открыть ...», это вернет меня к /home/myUser. Обратите внимание, что это независимо от файла, я просто использую Simulink в качестве примера. Я хотел бы сохранить его в /home/myUser/myDir1/myDir2, что означает, что я должен находиться в том же каталоге, что и последний файл, который я только что открыл (или сохранил).

Программно, я бы настроил обратный вызов на cd в любой каталог, в котором был выбран файл, после выбора файла с помощью uigetfile. Можно ли это сделать только с помощью собственных команд MATLAB «Открыть» или «Сохранить как»?

1 Ответ

1 голос
/ 26 октября 2011

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

EDIT

Как перегрузить встроенный uigetdir и т. Д.

(1) Переименуйте uigetdir2 в uigetdir и убедитесь, что он находится в пути, который имеет приоритет над путем для встроенной функции (это должно иметь место по умолчанию).

(2) Используйте BUILTIN , чтобы новая функция не вызывала сама себя.

(2) Поскольку uigetdir реализован в виде .m-файла, а не компилируется (как sum), команда builtin для него не работает. Таким образом, откройте uigetdir, найдите закрытую функцию uigetdir_helper (которая является закрытой, поэтому мы не можем ее вызвать) и, наконец, раскройте метод java (который, как оказалось, изменился с R2011a на R2011b. Yay.). Это позволяет нам, наконец, перегрузить uigetdir за счет необходимости самостоятельно анализировать ввод.

Вот строки с 37 по 67 из модифицированного uigetdir

%% Check passed arguments and load saved directory
% if start path is specified and not empty call uigetdir with arguments
% from user, if no arguments are passed or start path is empty load saved
% directory from mat file

% parse inputs
parserObj = inputParser;
parserObj.FunctionName = 'uigetdir';
parserObj.addOptional('startPath',[],@(x)exist(x,'dir'));
parserObj.addOptional('dialogTitle','Please choose directory',@ischar);

parserObj.parse(varargin{:});
inputList = parserObj.Results;


% create directory dialog instance - this has changed from 2011a to 2011b
if verLessThan('matlab','7.13')
    dirdlg = UiDialog.UiDirDialog();
else
    dirdlg = matlab.ui.internal.dialog.FolderChooser();
end
dirdlg.InitialPathName = inputList.startPath;
dirdlg.Title = inputList.dialogTitle;


if nargin > 0 && ~isempty(inputList.startPath)
    % call dirdlg instead of uigetdir to avoid infinite recursion
     dirdlg.show();

    % if dirname empty, return 0 for uigetdir.
    directory_name = dirdlg.SelectedFolder;
else
    % set default dialog open directory to the present working directory
    lastDir = pwd;
    % load last data directory
    if exist(lastDirMat, 'file') ~= 0
        % lastDirMat mat file exists, load it
        load('-mat', lastDirMat)
        % check if lastDataDir variable exists and contains a valid path
        if (exist('lastUsedDir', 'var') == 1) && ...
                (exist(lastUsedDir, 'dir') == 7)
            % set default dialog open directory
            lastDir = lastUsedDir;
        end
    end

    dirdlg.InitialPathName = lastDir;

    % call dirdlg instead of uigetdir to avoid infinite recursion
     dirdlg.show();

    % if dirname empty, return 0 for uigetdir.
    directory_name = dirdlg.SelectedFolder;

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...