Пример решения расчетной задачи по расчету нормы расхода
На данном примере, наглядно показано, как через вычисляемые атрибуты выполнять вычисления с помощью скриптов Groovy, для решения расчетных задач. Для проведения вычислений, рекомендуется использовать только переменные типа BigDecimal, которые позволяют получить нужную точность в десятичной системе исчисления. Для получения числовых значений из атрибутов, рекомендуется использовать методы: getDoubleValue, getLeftDoubleValue, getRightDoubleValue, которые позволяют получить числовое значение атрибута с требуемой точностью и пересчетом на необходимый коэффициент. Возврат вычисленного значения, рекомендуется выполнять через одну из функций: createDblSimpleValue, createDblRangeValue, createDblDeflectionValue. Если в формулах вычисления используются числовые константы, то к ним необходимо добавлять литеру “G”, чтобы указать системе что это число типа BigDecimal, например: “2G”, “3.1416G”. При необходимости выполнения округления числа типа BigDecimal, необходимо использовать метод setScale(), в который необходимо требуемую точность округления (количество знаков после запятой) и тип округления (RoundingMode):
|
Число
|
Тип округления
|
|
UP
|
DOWN
|
CEILING
|
FLOOR
|
HALF_UP
|
HALF_DOWN
|
HALF_EVEN
|
|
5.5
|
6
|
5
|
6
|
5
|
6
|
5
|
6
|
|
2.5
|
3
|
2
|
3
|
2
|
3
|
2
|
2
|
|
1.6
|
2
|
1
|
2
|
1
|
2
|
2
|
2
|
|
1.1
|
2
|
1
|
2
|
1
|
1
|
1
|
1
|
|
1.0
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
|
-1.0
|
-1
|
-1
|
-1
|
-1
|
-1
|
-1
|
-1
|
|
-1.1
|
-2
|
-1
|
-1
|
-2
|
-1
|
-1
|
-1
|
|
-1.6
|
-2
|
-1
|
-1
|
-2
|
-2
|
-2
|
-2
|
|
-2.5
|
-3
|
-2
|
-2
|
-3
|
-3
|
-2
|
-2
|
|
-5.5
|
-6
|
-5
|
-5
|
-6
|
-6
|
-5
|
-6
|
Пример округления до 5 знаков: D = D.setScale(5, RoundingMode.HALF_UP);. Для использования округления в скрипте, в начало скрипта требуется добавить: import java.math.RoundingMode.
Описание задачи по расчету нормы расхода: требуется вычислить норму расхода материала(@[Материал]) для заготовки по следующим данным:
-
@[Материал заготовки][Форма сортамента] – форме материала;
-
@[Материал заготовки][Марка материала][Плотность] – плотности материала, заданного в марке материала;
-
@[Длина заготовки], @[Ширина заготовки] – геометрических параметров заготовки;
-
Геометрических параметров материала заготовки.
Норму расхода требуется вычислить исходя из заданных параметров заготовки, геометрических параметров материала заготовки и плотности материала заготовки. Формула расчета, определяется формой сортамента материала заготовки. Все расчеты требуется проводить с использованием типа данных BigDecimal, который дает правильную точность при округлениях в десятичной системе исчисления.
Скрипт вычисления нормы расхода для кругов, лент, листов и труб
ValueDouble getValue(){
BigDecimal Res;
try {
// Форма сортамента
String SortForm = @[Материал заготовки][Форма сортамента];
if (SortForm != null) {
//Получим длину заготовки и плотность материала
BigDecimal L = support.getDoubleValue(@[Длина заготовки], 5, null);
BigDecimal Ro = support.getDoubleValue(@[Материал заготовки][Марка материала][Плотность], 5, null);
switch(SortForm) {
case "Круг":
case "Проволока":
case "Пруток":
case "Стержень":
BigDecimal D = support.getDoubleValue(@[Материал заготовки][Диаметр], 5, null);
Res = L * D * D * Ro * 3.1416G * 1000G / 4G; // приводим к граммам
return support.createDblSimpleValue(Res,2,null);// округляем до сотых грамма
break;
case "Лента":
BigDecimal B = support.getDoubleValue(@[Ширина заготовки], 5, null);
BigDecimal Hlent = support.getDoubleValue(@[Материал заготовки][Толщина], 5, null);
Res = Hlent * B * L * Ro * 1000G; // приводим к граммам
return support.createDblSimpleValue(Res,2,null);// округляем до сотых грамма
break;
case "Лист":
case "Листы":
case "Полоса":
case "Полосы":
case "Листовое органическое стекло":
case "Войлок":
case "Паронит":
case "Плита":
BigDecimal Hl = support.getDoubleValue(@[Материал заготовки][Толщина], 5, null);
BigDecimal B = support.getDoubleValue(@[Ширина заготовки], 5, null);
Res = Hl * B * L * Ro * 1000G; // приводим к граммам
return support.createDblSimpleValue(Res,2,null);// округляем до сотых грамма
break;
case "Труба":
// Марка материала
BigDecimal Dn = support.getDoubleValue(@[Материал заготовки][Наружный диаметр], 5, null);
BigDecimal Hst = support.getDoubleValue(@[Материал заготовки][Толщина стенки], 5, null);
Res = L * 3.1416G * (Dn * Dn – 4G * (Dn / 2G - Hst) * (Dn / 2G - Hst)) * Ro * 1000 / 4; // приводим к граммам
return support.createDblSimpleValue(Res,2,null); // округляем до сотых грамма
break;
case "Шестигранник":
BigDecimal Dvk = support.getDoubleValue(@[Материал заготовки][Диаметр], 5, null);
Res = 0.86605G * Dvk * Dvk * L * Ro * 1000G; // приводим к граммам
return support.createDblSimpleValue(Res,2,null); // округляем до сотых грамма
break;
default:
return support.createDblSimpleValue(0,null,null);
break;
}
}
else
return support.createDblSimpleValue(0,null,null);
}
catch (Exception ex) {
return support.createDblSimpleValue(0,null,null);
}
}