Все изменения накопившиеся с релиза

This commit is contained in:
2025-11-14 21:56:39 +03:00
parent ac2fe4d653
commit 9b8b5ec533
17 changed files with 1008 additions and 699 deletions

View File

@@ -1,159 +1,182 @@
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);
tableControl = mask.getDialogControl(table_name); % Элемент управления таблицей
tableParameter = mask.getParameter(table_name); % Параметр с данными таблицы
nCols = tableControl.getNumberOfColumns;
% инициализация колонок если они пустые
% такое случается при removeParameter
% Инициализация колонок если они пустые (после removeParameter)
if isempty(tableControl.Columns) || (nCols > 1)
for i = 1:nCols
tableControl.removeColumn(1);
end
% Удаляем все существующие колонки
for i = 1:nCols
tableControl.removeColumn(1);
end
% Создаем одну колонку по умолчанию
column = tableControl.addColumn(Name='Title', Type='edit');
tableControl.Sortable = 'on';
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;
Table.Value = newStr; % Сохраняем обратно в параметр
end
end
function column_titles = save_all_tables(table_names)
% Очищает столбцы в каждой таблице из массива имен table_names
% Возвращает cell-массив с названиями первых столбцов каждой таблицы
block = gcb;
% Сохраняет и очищает несколько таблиц одновременно
% table_names - cell-массив с именами таблиц
% Возвращает массив с названиями первых колонок каждой таблицы
% Получить объект маски блока
block = gcb;
maskObj = Simulink.Mask.get(block);
% Инициализировать cell-массив для хранения названий столбцов
% Инициализируем массив для хранения названий колонок
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;
% Удаляем все столбцы
% Важно: при удалении столбцов индексы меняются,
% поэтому удаляем всегда первый столбец nCols раз
% Удаляем все колонки (всегда удаляем первую, т.к. индексы сдвигаются)
for i = 1:nCols
tableControl.removeColumn(1);
end
else
% Если столбцов нет, возвращаем пустую строку
column_titles{k} = '';
column_titles{k} = ''; % Если колонок нет
end
end
end
function restore_all_tables(table_names, column_titles)
% Восстанавливает первый столбец в каждой таблице из массива имен
% Использует массив column_titles для установки имени столбца
block = gcb;
% Восстанавливает таблицы с сохраненными названиями колонок
% 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);
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);
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, ';') '}'];
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);
cleaned = cellArray(~isEmptyRow); % Фильтруем пустые строки
end
end
end
end