Изменяя значения можно управлять таблицей и заполнять данными из собственных программных модулей

Как это делается можно посмотреть в файле редактора таблиц 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