from utils.mysql import get_all_standard_diameters import math from decimal import Decimal def group_pipes(pipes): result = {} for pipe in pipes: if pipe['parent_id'] not in result: result[pipe['parent_id']] = [] result[pipe['parent_id']].append(pipe) return result def get_pipes_diameter(pipes,design_plan_id): pipeFlow= 0 standard_diamters = get_all_standard_diameters(design_plan_id) res = [] for pipe in pipes: pipeFlow += pipe['flow'] * pipe['valve_opening'] / 100 res.append(get_pipe_diameter(pipe,pipeFlow,standard_diamters)) return res def get_pipe_diameter(pipe,pipeFlow,standard_diamters): cal_diameter =Decimal(2000 * math.sqrt(pipeFlow / 19 / 3600 / Decimal(math.pi))) diameter = find_closest_greater_diameter(cal_diameter, standard_diamters) return { 'id':pipe['id'], 'flow':pipe['flow'], 'valve_opening':pipe['valve_opening'], 'is_normally_open':pipe['is_normally_open'], 'pipe_flow':pipeFlow, 'diameter':diameter, 'cal_diameter':cal_diameter, } def find_closest_greater_diameter(cal_diameter, standard_diameters): greater_diameters = [d for d in standard_diameters if d > cal_diameter] if not greater_diameters: return max(standard_diameters) closest_diameter = min(greater_diameters, key=lambda d: d - cal_diameter) return closest_diameter