Структура данных объекта LABPP_Table (для программистов)
Изменяя значения можно управлять таблицей и заполнять данными из собственных программных модулей
Как это делается можно посмотреть в файле редактора таблиц LABPP_Table_unicode.cpp.
TS_Cells_poscode - коды содержимого в ячейках таблицы.
Массив текстовый 500х100
Код показывает информацию о содержимом ячейки.
Первые 4 символа отвечают за наличие раздела ячейки с каждой из 4-х сторон.
LTRB - означает, что все границы есть.
Если стоит _ на какой-то позиции, значит ячейка объединена по этой стороне.
У смежной ячейки должен такой же символ присутствовать по стороне сопряжений.
Например, если две ячейки с индексами [2][1] и [3][1] (в 1-й колонке в строке 2 и 3) объединены, то у верхней будет:
LTR_ а у нижней L_RB.
Позиция 5 отвечает за направление текста.
Пробел - горизонтально.
'a' - текст првернут на 90 градусов.
Позиция 6 отвечает за стиль текста в ячейке.
't', 'h', 's', 'n' - стиль названия таблицы, заголовка, подзаголовка или обычный текст.
7-я позиция - код формата 0-текст, 1 - целое, 2 - число с 1 знаком, 3 - число с 2 знаками.
8-я позиция - l/m/f/r выравнивание по горизонтали влево/по центру/вправо/по ширине
9-я позиция - t/m/b - выравнивание по вертикали вверх/посредине/вниз
Позиции 10,11,12,13 - тип линий в ячейке - лев/верх/прав/низ -> 0/1/2 - нет/жирная/тонкая
по умолчанию
LTRB n0mm1111
TS_Cells_value - значения в ячейках.
Массив текстовый 500х100
TS_Cells_macro - коды для отрисовки макросов в ячейках таблицы
Массив текстовый 500х100
TS_ColumnsUsedCount - число колонок в таблице.
TS_RowsUsedCount - число строк в таблице.
TS_RowsH - массив высот колонок.
TS_ColumnsW - массив ширин колонок.
TS_ShowSelection - показывать или нет выбор ячеек.
После изменения данных необходимо присвоить переменной TS_DoRecalcAll значение 1.
При этом элемент таблицы пересчитает служебные переменные.
Из следующих служебных переменных можно получить реальную картину элемента LABPP_Table на текущий момент.
TS_RealCells - реальная рассчитанная картина всех ячеек
Массив типа линейная длина N x 17.
Таблица плоская, значения для ячеек идут друг за другом слева направа сверху вниз.
Т.е. первые 17 элементов - первая строка таблицы, вторые 17 элементов - вторая строка таблицы и т.д. по числу задействованных ячеек.
Назначение позиций
1 - SX
2 - SY
3 - EX
4 - EY
5 - I - номер колонки
6 - J - номер строки
7 - стартовая позиция текста
8 - конечная позиция текста
9 - левая граница нет/да
10 - верхняя граница нет/да
11 - правая граница нет/да
12 - нижняя граница нет/да
13 - кол-во позиций вниз совмещено
14 - кол-во позиций вправо совмещено
15 - самый левый нет/да
16 - самый верхний нет/да
17 - selected
TS_RealCellsSelected - массив выбранных ячеек.
Рассчитывается по 17-й позиции из TS_RealCells
Чтобы задать выбранные ячейки - надо установить 17-ую позицию у соответствующих элементов ячеек в поле TS_RealCells.
Имейте в виду, что после перерасчета таблицы информация о выбранных ячейках сбрасывается как в электронных таблицах.
TS_DoRequestBeforReRun - логическая переменная, отвечающая за то, чтобы при нажатии кнопки запуска программы обновления данных в таблице, пользователя переспросили, уверен ли он в том, что хочет этого.

TS_Program - текстовая переменная для размещения текста программы или имени файла, запускаемого для обновления данных, конфигурирования и получения помощи по таблице.
Если текст заканчивается на ".cpp", то он рассматривается как имя файла программы.
К нему спереди прибавляется путь к каталогу tsprg (см. пункт этого руководства) и файл запускается на выполнение.
В тексте программы должен присутствовать код, распознающий режим запуска модуля.
int iarg1; double darg2; string sRunMode;
run_cpp("get_args", iarg1, darg2, sRunMode);
if (sRunMode == "Table Help")
{
string sTableHelpText = "Описание работы с таблицей ограждений";
var_extern_set("TableHelpText", sTableHelpText);
return 0;
}
else if (sRunMode == "Table Configure")
{
cout << "\nЗдесь будет настройка параметров текущей выбранной таблицы\n";
return 0;
}
Далее - код выполнения программы обновления таблицы.
При успешном выполнении программа должна возвращать 0.
TS_ConfigData - текстовая переменная для хранения пользовательских настроек таблицы.
Предназначен для модифицирования программой обновления данных.
TS_InternalClass - текстовая переменная для хранения произвольного идентификатора таблицы. Удобно для того, чтобы понять в программе обновления данных, что за таблицу мы обрабатываем.
TS_CellsGUIDS - текстовый массив [500][100], соответствующий массиву TS_CellsValue. В нем записываем список GUID'ов элементов через знак "\n".
Тогда если пользователь использует кнопку "найти элементы в BIM Мастере" - он получит в список выборки именно эти GUIDы.
Пример программы TS_Program
string TSModuleVersion = "21.11.2024 - Первая версия";
int iTable;
int iTableBlockSections; // таблица блок-секций
bool bIsByFloors;
int main()
{
coutvar << TSModuleVersion;
string cppname;
shell_func("get_path", "currentcppfilename",cppname);
cout << "cppname=" << cppname << "\n";
int iarg1; double darg2; string sRunMode;
run_cpp("get_args", iarg1, darg2, sRunMode);
if (sRunMode == "Table Help")
{
string sTableHelpText = "Описание работы с таблицей ограждений";
var_extern_set("TableHelpText", sTableHelpText);
return 0;
}
else if (sRunMode == "Table Configure")
{
cout << "\nЗдесь будет настройка параметров текущей выбранной таблицы\n";
return 0;
}
// Выбираем все ограждения в проекте
ac_request_special("load_elements_list", 1, "RailingType", 2,
"","Cls", "Классификация АПБ AU", "==", "Ограждение", "", );
ac_request("get_loaded_elements_list_count", 1);
int icount = ac_getnumvalue();
ac_request("get_loaded_elements_list_count", 1);
icount = ac_getnumvalue();
cout << icount << "\n";
if (icount == 0)
{
cout << "Нет ограждений для формирования спецификации\n";
return -1;
}
object("create", "ts_table", iTableBlockSections);
ts_table(iTableBlockSections, "add_column", 0, "string", "Номер секции");
ts_table(iTableBlockSections, "set_columns_to_add_sum");
ts_table(iTableBlockSections, "set_first_key", 0);
int i;
// 1. Собрать все номера секций
string svalue="";
string sguid;
for (i = 0; i < icount; i++)
{
ac_request("set_current_element_from_list", 1, i);
ac_request_special("get_element_value", "UP", "_Общие\\_Номер секции (3)");
svalue = ac_getstrvalue();
ts_table(iTableBlockSections, "add_row_sum", 0, svalue);
}
ts_table(iTableBlockSections, "sort");
ts_table(iTableBlockSections, "print_to_str", svalue);
coutvar << svalue;
// 2. Добавить колонки
object("create", "ts_table", iTable);
ts_table(iTable, "add_column", 0, "string", "Марка");
ts_table(iTable, "add_column", 1, "string", "Назначение ограждения");
ts_table(iTable, "add_column", 2, "string", "Обозначение");
ts_table(iTable, "add_column", 3, "string", "Наименование");
int icount2;
ts_table(iTableBlockSections, "get_rows_count", icount2);
string sLevel;
for (i = 0; i < icount2; i++)
{
ts_table(iTableBlockSections, "select_row", i);
ts_table(iTableBlockSections, "get_value_of", 0, svalue);
ts_table(iTable, "add_column", -1, "double", svalue);
ts_table(iTable, "add_columns_to_add_sum", svalue);
ts_table(iTable, "add_column", -1, "string", svalue+"_GUIDs");
ts_table(iTable, "add_columns_to_add_sum", svalue+"_GUIDs");
}
ts_table(iTable, "add_column", -1, "double", "Всего");
ts_table(iTable, "add_column", -1, "string", "All_GUIDs");
ts_table(iTable, "add_columns_to_add_sum", "All_GUIDs");
ts_table(iTable, "add_column", -1, "double", "Масса");
ts_table(iTable, "add_column", -1, "string", "Примечание");
ts_table(iTable, "add_columns_to_add_sum", "Всего");
ts_table(iTable, "set_columns_to_sort_as_LikeABC10_a","Марка");
ts_table(iTable, "set_first_key", "Назначение ограждения","Марка");
// 3. Заполнить таблицу
string smarka, snasn, sobosn, snaim, sblocksec;
double dvaluetosum;
for (i = 0; i < icount; i++)
{
ac_request("set_current_element_from_list", 1, i);
ac_request("get_element_value", "ID");
smarka = ac_getstrvalue();
ac_request_special("get_element_value", "UP", "Общие свойства ограждений\\Назначение ограждения");
snasn = ac_getstrvalue();
ac_request_special("get_element_value", "EP", "GuidAsText");
sguid = ac_getstrvalue();
dvaluetosum = 1;
ac_request_special("get_element_value", "UP", "_Общие\\_Номер секции (3)");
sblocksec = ac_getstrvalue();
sobosn = "Обозначение " + ecvt(i + 1);
snaim = "Наименование " + ecvt(i + 1);
ts_table(iTable, "add_row_sum", 0, smarka, 1, snasn, 2, sobosn, 3, snaim, sblocksec, dvaluetosum, sblocksec+"_GUIDs", sguid,
"All_GUIDs", sguid, "Всего", dvaluetosum, "Примечание", "");
}
ts_table(iTable, "sort");
ts_table(iTable, "print_to_str", svalue);
coutvar << svalue;
// --------------------------------------- Получить таблицу в список 2 и заполнить ------------------------------------------
ac_request_special("load_elements_list_from_selection", 2, "ObjectType", 2,
"", "GDL", "ObjectName", "=", "LABPP_Table", "", "И",
"", "GDL", "TS_InternalClass", "CONTAINS", "Спецификация ограждений лестниц и т.п.", "");
ac_request("get_loaded_elements_list_count", 2);
int icount_tables = ac_getnumvalue();
cout << "Выбрано таблиц для выгрузки =" << icount_tables;
if (icount_tables == 0)
{
tsalert(-3, "Предупреждение", "Выберите элемент таблицы для заполнения", "", "Ок");
return;
}
int ires = ac_request("set_current_element_from_list", 2, 0);
// Ширины колонок->
int iTableW;
object("create", "ts_table", iTableW);
ac_request("get_object_property_value", "TS_ColumnsW", iTableW);
ts_table(iTableW, "select_row", 0); ts_table(iTableW, "set_value_of", 0, 0.150);
ts_table(iTableW, "select_row", 1); ts_table(iTableW, "set_value_of", 0, 0.600);
ts_table(iTableW, "select_row", 2); ts_table(iTableW, "set_value_of", 0, 0.650);
int j;
for (j = 0; j < icount2+1; j++)
{
ts_table(iTableW, "select_row", 3 + j); ts_table(iTableW, "set_value_of", 0, 0.150);
}
ts_table(iTableW, "select_row", 3 + icount2 + 1); ts_table(iTableW, "set_value_of", 0, 0.240);
ts_table(iTableW, "select_row", 3 + icount2 + 2); ts_table(iTableW, "set_value_of", 0, 0.500);
ac_request("set_object_property_value", "TS_ColumnsW", iTableW);
//<-
int iTableRowsH;
int TS_Cells_value, TS_Cells_poscode, TS_CellsGUIDS;
object("create", "ts_table", TS_Cells_value);
object("create", "ts_table", TS_Cells_poscode);
object("create", "ts_table", TS_CellsGUIDS);
ac_request("get_object_property_value", "TS_Cells_value", TS_Cells_value);
ac_request("get_object_property_value", "TS_Cells_poscode", TS_Cells_poscode);
ac_request("get_object_property_value", "TS_CellsGUIDS", TS_CellsGUIDS);
ts_table(TS_Cells_value, "select_row", 0);
ts_table(TS_Cells_value, "set_value_of", 0, "Марка, поз");
ts_table(TS_Cells_value, "set_value_of", 1, "Обозначение");
ts_table(TS_Cells_value, "set_value_of", 2, "Наименование");
ts_table(TS_Cells_value, "set_value_of", 3, "Количество");
// заполнить наименования в колонках блок-секций
double dvalue;
ts_table(TS_Cells_value, "select_row", 1);
for (i = 0; i < icount2; i++)
{
ts_table(iTableBlockSections, "select_row", i);
ts_table(iTableBlockSections, "get_value_of", 0, sblocksec);
ts_table(TS_Cells_value, "set_value_of", i + 3, sblocksec);
if (i == 0)
{
ts_table(TS_Cells_poscode,"select_row", 0);
ts_table(TS_Cells_poscode,"set_value_of", i+3, "LT_B h0mm1111");
}
else
{
ts_table(TS_Cells_poscode, "select_row", 0);
ts_table(TS_Cells_poscode, "set_value_of", i + 3, "_T_B h0mm1111");
}
ts_table(TS_Cells_poscode, "select_row", 1);
ts_table(TS_Cells_poscode, "set_value_of", i + 3, "LTRB h0mm1111");
}
ts_table(TS_Cells_value, "select_row", 1);
ts_table(TS_Cells_value, "set_value_of", 3 + icount2, "Всего");
ts_table(TS_Cells_poscode, "select_row", 0);
ts_table(TS_Cells_poscode, "set_value_of", icount2 + 3, "_TRB h0mm1111");
ts_table(TS_Cells_poscode, "select_row", 1);
ts_table(TS_Cells_poscode, "set_value_of", icount2 + 3, "LTRB h0mm1111");
ts_table(TS_Cells_value, "select_row", 0);
ts_table(TS_Cells_value, "set_value_of", 3 + icount2 + 1, "Масса ед., кг");
ts_table(TS_Cells_poscode, "select_row", 0);
ts_table(TS_Cells_poscode, "set_value_of", icount2 + 3 + 1, "LTR_ h0mm1111");
ts_table(TS_Cells_poscode, "select_row", 1);
ts_table(TS_Cells_poscode, "set_value_of", icount2 + 3 + 1, "L_RB h0mm1111");
ts_table(TS_Cells_value, "select_row", 0);
ts_table(TS_Cells_value, "set_value_of", 3 + icount2 + 2, "Примечание");
ts_table(TS_Cells_poscode, "select_row", 0);
ts_table(TS_Cells_poscode, "set_value_of", icount2+3+2, "LTR_ h0mm1111");
ts_table(TS_Cells_poscode, "select_row", 1);
ts_table(TS_Cells_poscode, "set_value_of", icount2+3+2, "L_RB h0mm1111");
string def = "LTRB n0mm1111";
for (i = 2; i < 100; i++)
{
ts_table(TS_Cells_poscode, "select_row", i);
ts_table(TS_Cells_poscode, "set_value_of", 0, def, 1, def, 2, def, 3, def, 4, def, 5, def, 6, def, 7, def, 8, def, 9, def, 10, def);
ts_table(TS_Cells_value, "select_row", i);
ts_table(TS_Cells_value, "set_value_of", 0, "", 1, "", 2, "", 3, "", 4, "", 5, "", 6, "", 7, "", 8, "", 9, "", 10, "");
ts_table(TS_CellsGUIDS, "select_row", i);
ts_table(TS_CellsGUIDS, "set_value_of", 0, "", 1, "", 2, "", 3, "", 4, "", 5, "", 6, "", 7, "", 8, "", 9, "", 10, "");
}
double dsum;
string snasn_last;
int irow=2;
ts_table(iTable, "get_rows_count", icount);
string all_guids;
for (i = 0; i < icount; i++)
{
ts_table(iTable, "select_row", i);
ts_table(iTable, "get_value_of", 0, smarka, 1, snasn, 2, sobosn, 3, snaim, "Всего", dsum, "All_GUIDs", all_guids);
if (snasn_last != snasn) {
snasn_last = snasn;
// Раздел
ts_table(TS_Cells_poscode, "select_row", irow);
ts_table(TS_Cells_poscode, "set_value_of", 0, "LT_B n0lm1111", 1, "_T_B n0mm1111", 2, "_T_B n0mm1111");
ts_table(TS_Cells_value, "select_row", irow);
ts_table(TS_Cells_value, "set_value_of", 0, snasn);
for (j = 0; j < icount2 + 1; j++)
{
ts_table(TS_Cells_poscode, "set_value_of", 3 + j, "_T_B n0mm1111");
}
ts_table(TS_Cells_poscode, "set_value_of", 3 + j, "_T_B n0mm1111", 3 + j + 1, "_TRB n0mm1111");
irow++;
}
// Строка
ts_table(TS_Cells_poscode, "select_row", irow);
ts_table(TS_Cells_poscode, "set_value_of", 0, "LTRB n0mm1111", 1, "LTRB n0mm1111", 2, "LTRB n0mm1111");
ts_table(TS_Cells_value, "select_row", irow);
ts_table(TS_Cells_value , "set_value_of", 0, smarka, 1, sobosn, 2, snaim);
ts_table(TS_CellsGUIDS, "select_row", irow);
for (j = 0; j < icount2; j++)
{
ts_table(TS_Cells_poscode, "set_value_of", 3 + j, "LTRB n0mm1111");
ts_table(iTableBlockSections, "select_row", j);
ts_table(iTableBlockSections, "get_value_of", 0, sblocksec);
ts_table(iTable, "get_value_of", sblocksec, dvalue);
ts_table(TS_Cells_value, "set_value_of", 3 + j, iif(dvalue == 0; "-"; ecvt(dvalue)));
ts_table(iTable, "get_value_of", sblocksec+"_GUIDs", sguid);
ts_table(TS_CellsGUIDS, "set_value_of", 3 + j, sguid);
}
ts_table(TS_Cells_poscode, "set_value_of", 3 + j, "LTRB n0mm1111");
ts_table(TS_Cells_value, "set_value_of", 3 + j, ecvt(dsum));
ts_table(TS_CellsGUIDS, "set_value_of", 3 + j, all_guids);
ts_table(TS_Cells_poscode, "set_value_of", 3 + j+1, "LTRB n0mm1111", 3 + j + 1+1, "LTRB n0mm1111");
ts_table(TS_Cells_value, "set_value_of", 3 + j+1, "", 3 + j + 1+1, ""); // масса и примечание
irow++;
}
//
ires = ac_request("set_object_property_value", "TS_Cells_value", TS_Cells_value);
ires = ac_request("set_object_property_value", "TS_Cells_poscode", TS_Cells_poscode);
ires = ac_request("set_object_property_value", "TS_CellsGUIDS", TS_CellsGUIDS);
ires = ac_request("set_object_property_value", "TS_RowsUsedCount", irow);
ires = ac_request("set_object_property_value", "TS_ColumnsUsedCount", 3 + icount2 + 1 + 2);
ires = ac_request("set_object_property_value", "ts_operationtodo", "Подогнать высоту строк по тексту");
ires = ac_request("set_object_property_value", "TS_DoRecalcAll", 1);
return;
/// /////////////////////////////////////////////////////////////
ts_table(iTable, "get_rows_count", icount);
string pos,naim,prim,smassa;
double massa;
int j;
string last_sobosn;
for (i = 0; i < icount; i++)
{
ts_table(iTable, "select_row", i);
ts_table(iTable, "get_value_of", 0, pos);
ts_table(iTable, "get_value_of", 2, obozn);
ts_table(iTable, "get_value_of", 3, naim);
ts_table(iTable, "get_value_of", 4+icount2+1, massa);
ts_table(iTable, "get_value_of", 4+icount2+2, prim);
ts_table(TS_Cells_value, "select_row", i+2);
ts_table(TS_Cells_value, "set_value_of", 0, pos);
ts_table(TS_Cells_value, "set_value_of", 1, obozn);
ts_table(TS_Cells_value, "set_value_of", 2, naim);
for (j = 0; j <= icount2; j++)
{
ts_table(iTable, "get_value_of", j + 4, dvalue);
if (dvalue != 0)
{
svalue = ecvt(dvalue);
}
else
{
svalue = "-";
}
ts_table(TS_Cells_value, "set_value_of", j + 3, svalue);
}
smassa = ecvt(tsround(massa,2));
smassa = strreplace(smassa, ".", ",", 0, 0, -1);
ts_table(TS_Cells_value, "set_value_of", 3+icount2+1, smassa);
ts_table(TS_Cells_value, "set_value_of", 3+icount2+2, prim);
ts_table(TS_Cells_poscode, "select_row", i + 2);
for (j = 0; j < 20; j++)
{
ts_table(TS_Cells_poscode, "set_value_of", j, "LTRB n0mm1111");
}
}
ac_request("set_object_property_value", "TS_TitleText", "Спецификация оргаждений й и ворот");
ac_request("set_object_property_value", "ts_rowstart", 3);
ac_request("set_object_property_value", "ts_rowend", i+2);
ac_request("set_object_property_value", "ts_columnsnumlist", "1-"+itoa(3 + icount2 + 1 + 2));
string mystr = ">\n<";
ires = ac_request("set_object_property_value", "LABPP_NewStringSymbol", mystr);
ires = ac_request("set_object_property_value", "TS_Cells_value", TS_Cells_value);
ires = ac_request("set_object_property_value", "TS_Cells_poscode", TS_Cells_poscode);
ires = ac_request("set_object_property_value", "TS_RowsUsedCount", i+2);
ires = ac_request("set_object_property_value", "TS_ColumnsUsedCount", 3+icount2+1+2);
ires = ac_request("set_object_property_value", "ts_operationtodo", "Подогнать высоту строк по тексту");
ires = ac_request("set_object_property_value", "TS_DoRecalcAll", 1);
object("delete", TS_Cells_value);
object("delete", TS_Cells_poscode);
object("delete", TS_CellsGUIDS);
object("delete", iTable);
object("delete", iTableBlockSections);
}
Created with the Personal Edition of HelpNDoc: Make Your PDFs More Secure with Encryption and Password Protection