пятница, 26 декабря 2014 г.

Округление: меньше килограмма до сотых, больше - до десятых

В форматировании спецификации мы можем указать, с какой точностью выводить значение.
Вот только небольшие значения лучше выводить с округлением до сотых, а большие - с округлением до десятых. Такое обычно надо в спецификации арматуры.





Как сделать такое в Ревите?


Для начала скажу, что я вообще недолюбливаю округление, которое по умолчанию используется в спецификациях - например, из-за того, что, в подсчете Ревит сначала складывает неокругленные значения, а затем округляет сумму.

Поэтому мы создадим расчетный параметр, который будет округлять значения при помощи формул, и будем работать с ним.

1. Расчетные параметры для подсчета массы


Для подсчета массы создадим параметр "МассаПогМетра" типа "число", с формулой
МассаПогМетра = 3.1416 * 7.86 * ((Диаметр стержня / 2 мм) ^ 2) / 1000

Определяем площадь поперечного сечения и умножаем на плотность стали - получаем массу единицы длины.

Затем создадим параметр "МассаСтержня" типа "Длина", определим массу, пока без округления:
МассаСтержня = МассаПогМетра * Длина стержня

Вот только получается что-то не то - масса в граммах:

Оно и понятно, массу мы посчитали на погонный метр, а длина - в миллиметрах. Надо еще разделить на 1000:
МассаСтержня = МассаПогМетра * Длина стержня / 1000

Сделаем пока в "Форматировании" округление до двух знаков и перейдем ко второй части


2. Работа с округлением при помощи формул


Добрались до самого интересного.
В чем идея округления? В формулах Ревита есть оператор round(x). Он округляет число до ближайшего целого. Для того, чтобы получить округление до десятых, нужно использовать 
0.1*round(x*10)
0.1*round(6.5785*10) = 0.1*round(65.785) = 0.1*66 = 6.6

До сотых, соответственно, 0.01*round(x*100).

Есть еще одна проблема - round() работает только с безразмерными единицами - типа "Число". Длину-массу-площадь он не округляет, и оно понятно - ведь неизвестно, до каких единиц надо округлять. Мы воспользуемся возможностью перевода единиц в формулах:

ПараметрДлина/1мм = ПараметрЧисло
68мм / 1мм = 68мм / 1мм = 68

Понятно - миллиметры сокращаются, остается голое число. Если надо опять получить длину - можно умножить на 1мм.

Пробуем - создаем расчетный параметр "МассаСтержняОкругл" и пишем формулу, используя оператор if (вместо умножения на 10 использую деление на 0.1, чтобы сразу и от миллиметров избавиться):

МассаСтержняОкругл = if(МассаСтержня < 1, 0.01 мм * round(МассаСтержня * 10 /), 0,1 мм * round(МассаСтержня / 0.1 мм))

Но вот что получилось:

Где мы ошиблись?

Откроем снова окно формулы, вот что видим:

Ревиту не понравилось число "0.01 мм" и он округлил его до нуля.  Еще, надо использовать не "МассаСтержня < 1", а "МассаСтержня < 1000"; и вообще, что-то я в единицах совсем запутался.
Конечно, все можно победить (через "Настройки единиц проекта" и тд), но я рекомендую другой способ, которым обычно пользуюсь.

3. Использование в расчетах параметра "Число"


Вместо того, чтобы бодаться с настройками единиц, лучше всего везде работать с параметром типа "Число". Это очень простой параметр, не имеющий размерности, имеющий максимальную точность и без сюрпризов вроде автоматического округления "0.01" до "0".
К "числу" можно привести любой параметр, если разделить его на нужную единицу измерения, как мы делали для round(). Настоятельно рекомендую не давать Ревиту самостоятельно заниматься округлением и работой с единицами измерения, и использовать только параметр "длина", "целое", "площадь", а все остальное - массы, плотности, да что угодно, - делать "Числом".

Итак, удалим параметр "МассаСтержня" и создадим новый, типа "Число". Формула для него:

МассаСтержня = МассаПогМетра * Длина стержня / 1000мм

 Обратите внимание на "мм" в конце формулы - делим "длину" на миллиметры, получаем "число".
Также удалим параметр "МассаСтержняОкругл" и создадим такой же, типа "Число". Формула:

МассаСтержняОкругл = if(МассаСтержня < 1, 0,01 * round(МассаСтержня * 100), 0,1 * round(МассаСтержня * 10))

Ну и результат:



Удачи!

2 комментария:

  1. Ну и фантазер, молодец! Зачем только изначально так ревит создан, что потом так приходится мудрить(?) Вроде стремимся к порядку, в итоге приходится дорабатывать напильником. Так надо весь ревит перепахать, чтобы работать нормально. Нда, это тебе не "сел и поехал".

    ОтветитьУдалить
    Ответы
    1. А кто тут говорил про "сел и поехал"? Вы куда-то не туда зашли, кажется.

      Удалить