Программа для получения количества в расчетной позиции
Пример 1.
Расчет количества по формуле.
int main()
{
rvt_request("get_element_value","UPt","Толщина"); // запросить из текущего элемента значение свойства "Толщина"
double W = rvt_getnumvalue(); // записать значение в переменную W
rvt_request("get_element_value","UP","Площадь"); // запросить из текущего элемента значение свойства "Площадь"
double S = rvt_getnumvalue(); // записать значение в переменную S
double Step = 375;
rvt_request("get_element_value","UP","Длина"); // запросить из текущего элемента значение свойства "Длина"
double L = rvt_getnumvalue(); // записать значение в переменную L
// Выполнить расчет по формуле и записать результат в переменную Smesh.
double Smesh = ( W / 1000 ) * S / (Step / 1000 ) + (L / 1000 ) * ( W / 1000 );
// Задать значение Smesh в качестве количества для этой расчетной позиции.
rvt_setresult(Smesh);
}
Пример 2.
Расчет количества по площади связанного элемента сетки.
int main()
{
int iTableDescr; // объявить переменную для дескриптора таблицы
object("create","ts_table",iTableDescr); // создать таблицу и поместить ее дескриптор в переменную для дальнейшего обращения
int ires = rvt_request("GetJoinedElements","OST_Walls",iTableDescr); // получить список связанных элементов текущего элемента
if(ires > 0)
{
// Если элементов больше чем 0
string sGUID;
// Выбрать первую же запись в таблице
ts_table(iTableDescr,"select_row",0);
// Получить значение уникального ID элемента в текстовую переменную
ts_table(iTableDescr,"get_value_of",0,sGUID);
// Установить элемент с этим GUID как текущий
rvt_request("set_element_by_guidstr_as_current",sGUID);
// Получить из текущего элемента значение свойства "Площадь"
rvt_request("get_element_value","UP","Площадь");
double s = rvt_getnumvalue();
// Установить в виде результата получателя количества - значение площади связанного элемента.
rvt_setresult(s);
}
// Удалить ненужную таблицу
object("delete", iTableDescr);
}
Пример 3.
Расщепление одного элемента перемычки на составляющие бруски в соответствии с типом конструкции
int main()
{
rvt_request("get_element_value","UPt","Тип"); // Получаем название типа из семейства у элемента
string stype = rvt_getstrvalue();
// в названии типа семейства выглядит так: "Перемычка 2х5ПБ21-27,1х4ПФ14-4". Т.е. присутствуют маркировки с множителем спереди.
// поэтому мы можем вычленить каждый тип бруса и его количество
// для этого выполняем специальную функцию расщепления. В результате - таблица с колонками "count" и "text".
int iTable;
object("create","ts_table",iTable);
str_special_operations("parce_1xABC_to_table",stype,"\\d[хx][^,^$]{1,}",iTable);
int i,icount;
ts_table(iTable,"get_rows_count",icount);
string matname,PN; // имя материала и артикул (PN)
int brick_count; // количество брусков
int iTableMatEK; // дескриптор таблицы материалов
int ires;
iTableMatEK = object("get_descr_by_type_and_name","ts_table","ts_table_MaterialsEK"); // получить дескриптор таблицы материалов
// Для оптимизации работы и для удобства сделаем таблицу материалов с выборкой только брусков перемычек "PERM"
int iTableMatEK_PERM;
// попробуем получить ее из памяти, это если мы ее уже создали в прошлый раз, когда это запускалось для другого элемента проекта.
iTableMatEK_PERM = object("get_descr_by_type_and_name","ts_table","MaterialsEK_PERM");
if(iTableMatEK_PERM <= 0)
{
// если это не создавалось еще, то создадим объект таблицы, с такими же колонками, как у таблицы материалов.
object("create","ts_table", iTableMatEK_PERM, "MaterialsEK_PERM");
ts_table(iTableMatEK_PERM,"import_columns_from_table", iTableMatEK);
// команда ниже - позволяет сохранять нашу новую таблицу в памяти, поэтому она не удалится после завершения этой программы.
// и мы сможем ее использовать сколько хотим в других программах или в этой же, но применительно к другому элементу проекта.
object("KeepInMemory", iTableMatEK_PERM);
}
// но важно быть уверенным, что данные в этой таблице не устарели.
if(object("iteration","is_object_obsolete",iTableMatEK_PERM))
{
// если содержимое таблицы записывалось при прошлом запуске расчетной задачи или в первый раз, то надо освежить содержимое.
ts_table(iTableMatEK_PERM,"clear_rows"); // удалим все строки
// скопируем все строки из таблицы материалов с фильтром по колонке "Folder" - там должен быть только класс "PERM"
ts_table(iTableMatEK_PERM,"add_rows_from_eq_table_by_filter", iTableMatEK, 0, 0, "Folder","PERM");
// освежаем метку итерации
object("iteration","object_reset",iTableMatEK_PERM);
}
// теперь за дело.
// перебираем все строки количества и названия бруска, полученные из типа семейства в начале скрипта.
for(i=0;i<icount;i++)
{
ts_table(iTable,"select_row",i); // выбрать строку
ts_table(iTable,"get_value_of","count", block_count,"text",matname); // считать кол-во и название
cout << block_count; // выводим в окно логов кол-во (для примера)
ires = ts_table(iTableMatEK_PERM, "search","MatName",matname); // ищем в таблице материалов перемычек соответствующее название
if(ires >= 0)
{
// если такое есть - выбираем найденную строку
ts_table(iTableMatEK_PERM, "select_row", ires);
// считываем из нее артикул (PN)
ts_table(iTableMatEK_PERM, "get_value_of","PN",PN);
// пишем в результат нужное количество PN и снабжаем примечанием:
rvt_request("calc_task","add_answere_item",PN,brick_count,"Примечание");
//cout << PN;
}
else
{
// если не нашли - пишем в результат количество и название материала, который не нашли.
rvt_request("calc_task","add_answere_item",matname+"?",block_count,"Не найден в БД материалов");
}
//cout << matname;
}
// теперь у нас в результатах - не одна расчетная позиция, а она расщепляется на составляющие блоки.
// а, т.к. по умолчанию в ответ поместится и результат по общей позиции - его надо выключить - он нам не нужен.
rvt_request("calc_task","hide_basejsonrow_answere");
}