Пример 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");
}