Заполнить таблицу с расчетом плитки по элементам Штриховка и записать общую площадь в поле LabPP_Calc
Скачать файл можно здесь.
// Урок 2
// Для начала - в проекте АРХИКАД в любом окне разложить штриховки 600х600. Задать им типы штриховок произвольно.
// Поставить там же GDL элемент LABPP_Table.gsm.
// Выделить одновременно все штриховки и элемент таблицы.
// открыть LabPP_Calc
// открыть в нем правой нижней маленькой кнопкой окно сообщений
// второй справа нижней маленькой кнопкой запустить этот программный модуль средствами LabPP_Calc
// Результат - в таблицу запишется список штриховок с названием типа и количеством
// Задание 1
// Переименовать колонку "Название штриховки" в "Тип плитки"
// Задание 2
// Поменять местами колонки.
// Задание 3
// Упорядочить строки по колонке с названием штриховки (см. команду "Sort")
int main()
{
// загрузить из проекта в список 1 все выбранные элементы штриховок
ac_request_special("add_elements_list_from_selection", 1, "HatchType", 2);
// зарузить из проекта в список 2 все выбранные элементы таблиц
ac_request_special("add_elements_list_from_selection", 2, "ObjectType", 2,
"", "EP", "ObjectName", "=", "LABPP_Table", "");
// запросить количество собранных элементов штриховок
ac_request("get_loaded_elements_list_count", 1);
int icount = ac_getnumvalue(); // получить количество в переменную
coutvar << icount; // вывести в окно сообщений
if (icount == 0)
{
cout << "В списке нет элементов штриховок";
return -1;
}
// запросить количество собранных элементов штриховок
ac_request("get_loaded_elements_list_count", 2);
int icountTables = ac_getnumvalue(); // получить количество в переменную
coutvar << icountTables; // вывести в окно сообщений
if (icountTables == 0)
{
cout << "В списке нет элемента таблицы";
return -1;
}
int iTable;
object("create", "ts_table", iTable); // создать таблицу
// Создаем колонки таблицы
ts_table(iTable, "add_column", 0, "string", "Название штриховки");
ts_table(iTable, "add_column", 1, "double", "Площадь");
ts_table(iTable, "add_column", 2, "int", "Кол-во");
ts_table(iTable, "set_first_key", 0); // по этой колонке будет отслеживаться одинаковость строк при суммировании показатей
// объявляем необходимые переменные для работы
double dSquare, dAllSquare=0;
string sFillName;
int i;
int ires;
// выполнить цикл icount раз чтобы заполнить таблицу.
// обратите внимание, что одинаковые строки в таблице суммируются автоматически ("add_row_sum")
for (i = 0; i < icount; i++)
{
ires = ac_request("set_current_element_from_list", 1, i); // сделать текущим i-вый элемент из списка 1
ires = ac_request("get_element_value", "fillName"); // запрашиваем название типа штриховки у элемента штриховки
sFillName = ac_getstrvalue(); // получаем его в переменную
ires = ac_request("get_quantity_value", "Surface"); // запрашиваем площадь элемента штриховки
dSquare = ac_getnumvalue(); // получаем его в переменную
dAllSquare += dSquare; // суммируем общую площадь
// Добавляем строку в таблицу, если уже есть - то суммируем
ts_table(iTable, "add_row_sum", 0, sFillName, 1, dSquare, 2, 1);
}
// вывести содержимое таблицы в окно сообщений
string str;
ts_table(iTable, "print_to_str", str);
coutvar << str;
// вывести содержимое таблицы в элемент LABPP_Table.gsm
ac_request("set_current_element_from_list", 2, 0); // сделать текущим 0-ой элемент из списка 2
bool withheader = true; // выводить с заголовками колонок
int startcolindex = 1; // стартовая колонка в LABPP_Talbe будет 1
int startObjectrow = 1; // стартовая строка в LABPP_Table будет 1 (т.е. с левого верхнего угла)
int starttablerow = 0; // из таблицы iTable начинать с первой строки (индекс первой строки 0)
int maxcolumns; // сколько колонок задействовано
int maxrows; // сколько строк получилось задействовано
// получить число колонок и строк
ts_table(iTable, "get_columns_count", maxcolumns);
ts_table(iTable, "get_rows_count", maxrows);
ts_table(iTable, "export_to_LABPP_Table", withheader, startcolindex, startObjectrow, starttablerow, maxrows);
// Задать в объекте количество использованных строк
ac_request("set_object_property_value", "TS_RowsUsedCount", maxrows + 1);
// Задать в объекте количество использованных колонок
ac_request("set_object_property_value", "TS_ColumnsUsedCount", maxcolumns);
// Дать команду GDL объекту таблицы LABPP_Table выполнить внутренний перерасчет
ac_request("set_object_property_value", "TS_DoRecalcAll", 1);
// Удалить из памяти таблицу
object("delete", iTable);
// Записываем общую площадь в поле "a" калькулятора с комментарием
string svalue = ecvt(dAllSquare); // переводим общую площадь в текст
string scomment = "Общая площадь шриховок";
ac_request("interface", "calc_field", "set", "a", 1, svalue, scomment);
// "a" - здесь имя ячейки у LabPP_Calc куда записать значение. Всего ячеек - a,b,c и main
}