168 lines
7.2 KiB
Matlab
168 lines
7.2 KiB
Matlab
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 |