pre-release 1.02

This commit is contained in:
2025-06-19 13:29:33 +03:00
parent 966ddc3bac
commit 1aa3c5b955
16 changed files with 1623 additions and 654 deletions

168
McuLib/m/mcuPath.m Normal file
View File

@@ -0,0 +1,168 @@
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