classdef mcuPath methods(Static) %% GET PATH FROM PARAM function path = get(paramName) blockPath = gcb; path = get_param(blockPath, paramName); end %% ADD PATH TO TABLE function addSourceFileTable(targetParamName, message) % Открываем проводник для выбора файлов [files, pathstr] = uigetfile({ ... '*.c;*.cpp', 'Исходные файлы (*.c, *.cpp)'; ... '*.obj;*.lib', 'Библиотеки (*.obj, *.lib)'; ... '*.*', 'Все файлы (*.*)'}, ... message, ... 'MultiSelect', 'on'); if isequal(files, 0) return; % Отмена выбора end if ischar(files) files = {files}; % Один файл — в cell end % Парсим строку в cell-массив oldTable = customtable.parse(targetParamName); % Добавляем новые пути, проверяя уникальность for i = 1:numel(files) fullpath = fullfile(pathstr, files{i}); rel = mcuPath.absoluteToRelativePath(fullpath); if ~any(strcmp(rel, oldTable)) oldTable{end+1, 1} = rel; end end % Парсим строку в cell-массив customtable.collect(targetParamName, oldTable); end function addPathTable(targetParamName, message) % Открываем проводник для выбора папок pathstr = uigetdir(pwd, message); if isequal(pathstr, 0) return; % Отмена выбора end % Парсим таблицу oldTable = customtable.parse(targetParamName); rel = mcuPath.absoluteToRelativePath(pathstr); % Проверяем наличие пути if ~any(strcmp(rel, oldTable)) oldTable{end+1, 1} = rel; end % Собираем таблицу customtable.collect(targetParamName, oldTable); end %% ADD PATH TO EDIT function addPath(targetParamName, message) block = gcb; mask = Simulink.Mask.get(block); % Открываем окно выбора папки folderPath = uigetdir('', 'Выберите папку'); % Проверка на отмену if isequal(folderPath, 0) return; end % Установка значения параметра маски rel = mcuPath.absoluteToRelativePath(folderPath); param = mask.getParameter(targetParamName); param.Value = rel; end function addAnyFile(targetParamName, message) block = gcbh; mask = Simulink.Mask.get(block); [file, path] = uigetfile({'*.*','Все файлы (*.*)'}, 'Выберите файл'); if isequal(file, 0) || isequal(path, 0) % Отмена выбора — ничего не делаем return; end fullFilePath = fullfile(path, file); rel = mcuPath.absoluteToRelativePath(fullFilePath); param = mask.getParameter(targetParamName); param.Value = rel; end %% GET PATH STRING function absPath = getAbsolutePath(relPath) % relativeToAbsolutePath — преобразует относительный путь в абсолютный. % % Если путь уже абсолютный — возвращается он же, приведённый к канонической форме. % Если путь относительный — преобразуется относительно текущей директории. % Проверка: абсолютный ли путь if ispc isAbsolute = ~isempty(regexp(relPath, '^[a-zA-Z]:[\\/]', 'once')) || startsWith(relPath, '\\'); else isAbsolute = startsWith(relPath, '/'); end if isAbsolute % Канонизируем абсолютный путь (убираем ./, ../ и т.п.) absPath = char(java.io.File(relPath).getCanonicalPath()); else % Строим абсолютный путь от текущей директории cwd = pwd; combined = fullfile(cwd, relPath); absPath = char(java.io.File(combined).getCanonicalPath()); end end function rel = absoluteToRelativePath(pathstr) % absoluteToRelativePath — преобразует абсолютный путь в относительный от текущей директории. % % Если путь находится в текущей директории или вложенной в неё — добавляется префикс './' % Если выше — формируются переходы '..' % Если путь совпадает с текущей директорией — возвращается '.' % Получаем текущую рабочую директорию cwd = pwd; % Преобразуем пути в канонические абсолютные пути fullpath = char(java.io.File(pathstr).getCanonicalPath()); cwd = char(java.io.File(cwd).getCanonicalPath()); % Разбиваем пути на части targetParts = strsplit(fullpath, filesep); baseParts = strsplit(cwd, filesep); % Находим длину общего префикса j = 1; while j <= min(length(targetParts), length(baseParts)) && strcmpi(targetParts{j}, baseParts{j}) j = j + 1; end % Формируем количество подъемов ".." из cwd numUps = length(baseParts) - (j - 1); ups = repmat({'..'}, 1, numUps); % Оставшаяся часть пути после общего префикса rest = targetParts(j:end); % Объединяем для получения относительного пути relParts = [ups, rest]; rel = fullfile(relParts{:}); % Если путь пустой — это текущая директория if isempty(rel) rel = '.'; end % Если путь не содержит ".." и начинается внутри текущей директории — добавим './' if ~isempty(rest) && isempty(ups) rel = fullfile('.', rel); end end end end