mcu_matlab/McuLib/m/customtable.m
2025-11-07 14:52:52 +03:00

182 lines
9.5 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

classdef customtable
% Класс для работы с таблицами в масках Simulink
% Обеспечивает форматирование, парсинг и управление табличными данными
% 1. Таблицы в масках Simulink хранятся как строки специального формата:
% {'строка1';'строка2';'строка3'}
% 2. Этот класс преобразует строковое представление в cell-массивы для удобной работы
% 3. Обеспечивает очистку от пустых строк, форматирование колонок и массовое обновление
methods(Static)
function format(table_name)
% Форматирует таблицу в маске - настраивает колонки и внешний вид
% table_name - имя табличного параметра в маске
block = gcb;
mask = Simulink.Mask.get(block);
tableControl = mask.getDialogControl(table_name); % Элемент управления таблицей
tableParameter = mask.getParameter(table_name); % Параметр с данными таблицы
nCols = tableControl.getNumberOfColumns;
% Инициализация колонок если они пустые (после removeParameter)
if isempty(tableControl.Columns) || (nCols > 1)
% Удаляем все существующие колонки
for i = 1:nCols
tableControl.removeColumn(1);
end
% Создаем одну колонку по умолчанию
column = tableControl.addColumn(Name='Title', Type='edit');
tableControl.Sortable = 'on'; % Разрешаем сортировку
end
% Устанавливаем имя колонки равным алиасу параметра
column.Name = tableParameter.Alias;
end
function update(tableName)
% Обновляет таблицу - удаляет пустые строки и сохраняет изменения
% tableName - имя табличного параметра для обновления
block = gcb;
mask = Simulink.Mask.get(block);
Table = mask.getParameter(tableName);
% Парсим текущее содержимое таблицы
cellArray = customtable.parse(tableName);
% Удаляем пустые строки
cleaned = customtable.removeEmptyRows(cellArray);
% Если были удалены пустые строки - сохраняем изменения
if numel(cleaned) ~= numel(cellArray)
% Обрамляем каждую строку в кавычки и формируем новое значение
quoted = cellfun(@(s) ['''' s ''''], cleaned, 'UniformOutput', false);
newStr = ['{' strjoin(quoted, ';') '}'];
Table.Value = newStr; % Сохраняем обратно в параметр
end
end
function column_titles = save_all_tables(table_names)
% Сохраняет и очищает несколько таблиц одновременно
% table_names - cell-массив с именами таблиц
% Возвращает массив с названиями первых колонок каждой таблицы
block = gcb;
maskObj = Simulink.Mask.get(block);
% Инициализируем массив для хранения названий колонок
column_titles = cell(size(table_names));
for k = 1:numel(table_names)
table_name = table_names{k};
tableControl = maskObj.getDialogControl(table_name);
nCols = tableControl.getNumberOfColumns;
if nCols > 0
% Сохраняем название первой колонки
column = tableControl.getColumn(1);
column_titles{k} = column.Name;
% Удаляем все колонки (всегда удаляем первую, т.к. индексы сдвигаются)
for i = 1:nCols
tableControl.removeColumn(1);
end
else
column_titles{k} = ''; % Если колонок нет
end
end
end
function restore_all_tables(table_names, column_titles)
% Восстанавливает таблицы с сохраненными названиями колонок
% table_names - имена таблиц для восстановления
% column_titles - массив с названиями для первых колонок
block = gcb;
maskObj = Simulink.Mask.get(block);
for k = 1:numel(table_names)
table_name = table_names{k};
title = column_titles{k};
tableControl = maskObj.getDialogControl(table_name);
% Добавляем новую колонку с сохраненным названием
column = tableControl.addColumn(Name='title', Type='edit');
column.Name = title;
end
end
function out = parse(tableName)
% Парсит содержимое таблицы из строкового параметра в cell-массив
% tableName - имя табличного параметра
% Возвращает cell-массив со строками таблицы
block = gcb;
TableStr = get_param(block, tableName); % Получаем строковое представление
out = customtable.parse__(TableStr); % Парсим во внутреннем методе
end
function collect(tableName, cellArray)
% Сохраняет cell-массив обратно в табличный параметр
% tableName - имя параметра для сохранения
% cellArray - cell-массив с данными таблицы
block = gcb;
newTableStr = customtable.collect__(cellArray); % Конвертируем в строку
set_param(block, tableName, newTableStr); % Сохраняем в параметр
end
end
methods(Static, Access=private)
function out = parse__(tableStr)
% Внутренний метод для парсинга строки таблицы в cell-массив
% tableStr - строковое представление таблицы в формате {'str1';'str2'}
str = strtrim(tableStr);
% Удаляем обрамляющие фигурные скобки если есть
if startsWith(str, '{') && endsWith(str, '}')
str = str(2:end-1);
end
% Разбиваем по разделителю строк ;
parts = split(str, ';');
out = cell(numel(parts), 1);
for i = 1:numel(parts)
el = strtrim(parts{i});
% Удаляем обрамляющие кавычки если есть
if startsWith(el, '''') && endsWith(el, '''')
el = el(2:end-1);
end
out{i} = el;
end
% Обработка пустых таблиц
if isempty(out) || (numel(out) == 1 && isempty(out{1}))
out = {};
end
end
function tableStr = collect__(cellArray)
% Внутренний метод для конвертации cell-массива в строку таблицы
% cellArray - входной cell-массив
% Возвращает строку в формате {'str1';'str2'}
% Обрамляем каждую строку в кавычки
quoted = cellfun(@(s) ['''' s ''''], cellArray, 'UniformOutput', false);
tableStr = ['{' strjoin(quoted, ';') '}']; % Объединяем в формат таблицы
end
function cleaned = removeEmptyRows(cellArray)
% Удаляет пустые строки из cell-массива
% cellArray - входной массив данных таблицы
% Возвращает очищенный массив без пустых строк
if isempty(cellArray)
cleaned = {};
else
% Определяем какие строки пустые (после удаления пробелов)
isEmptyRow = cellfun(@(s) isempty(strtrim(s)), cellArray);
cleaned = cellArray(~isEmptyRow); % Фильтруем пустые строки
end
end
end
end