182 lines
9.5 KiB
Matlab
182 lines
9.5 KiB
Matlab
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 |