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