mcu_matlab/McuLib/m/customtable.m
2025-06-19 13:29:33 +03:00

159 lines
6.1 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
methods(Static)
% формирование таблицы на всю ширину
function format(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)
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);
% Инициализировать 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} = '';
end
end
end
function restore_all_tables(table_names, column_titles)
% Восстанавливает первый столбец в каждой таблице из массива имен
% Использует массив 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)
block = gcb;
TableStr = get_param(block, tableName);
out = customtable.parse__(TableStr);
end
function collect(tableName, cellArray)
block = gcb;
newTableStr = customtable.collect__(cellArray);
% Записываем обратно в параметр маски
set_param(block, tableName, newTableStr);
end
end
methods(Static, Access=private)
function out = parse__(tableStr)
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)
quoted = cellfun(@(s) ['''' s ''''], cellArray, 'UniformOutput', false);
tableStr = ['{' strjoin(quoted, ';') '}'];
end
function cleaned = removeEmptyRows(cellArray)
if isempty(cellArray)
cleaned = {};
else
% Проверяем каждую строку, есть ли в ней содержимое (не пустая строка)
isEmptyRow = cellfun(@(s) isempty(strtrim(s)), cellArray);
cleaned = cellArray(~isEmptyRow);
end
end
end
end