From 047de0b792ba2ed4d95aa9036add1521663a85eb Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 12 Nov 2022 10:16:12 +0800 Subject: [PATCH] Support new parser to bypass api --- api/__init__.py | 2 +- api/old_parser.py | 275 ++++++++++++++++++++++++++++++++++++++++++++++ api/parser.py | 270 --------------------------------------------- 3 files changed, 276 insertions(+), 271 deletions(-) create mode 100644 api/old_parser.py diff --git a/api/__init__.py b/api/__init__.py index 21e3621..e25e0ac 100644 --- a/api/__init__.py +++ b/api/__init__.py @@ -2,7 +2,7 @@ from .project import list_project, have_project, create_project, delete_project from .project import is_project_open, get_project_open_count, open_project, close_project from .project import copy_project -from .parser import read_inp +from .old_parser import read_inp from .operation import API_ADD, API_UPDATE, API_DELETE from .operation import ChangeSet diff --git a/api/old_parser.py b/api/old_parser.py new file mode 100644 index 0000000..9ac9403 --- /dev/null +++ b/api/old_parser.py @@ -0,0 +1,275 @@ +from typing import Any +from .project import * +from .s1_title import * +from .s2_junctions import * +from .s3_reservoirs import * +from .s4_tanks import * +from .s5_pipes import * +from .s6_pumps import * +from .s7_valves import * +from .s8_tags import * +from .s9_demands import * +from .s10_status import * +from .s11_patterns import * +from .s12_curves import * +from .s13_controls import * +from .s14_rules import * +from .s15_energy import * +from .s16_emitters import * +from .s16_emitters import * +from .s21_times import * +from .s23_options import * + + +def read_inp(name: str, inp: str): + if is_project_open(name): + close_project(name) + + if have_project(name): + delete_project(name) + + create_project(name) + open_project(name) + + section = '' + + title : str = '' + junctions : dict[str, dict[str, Any]] = {} + reservoirs : dict[str, dict[str, Any]] = {} + tanks : dict[str, dict[str, Any]] = {} + pipes : dict[str, dict[str, Any]] = {} + pumps : dict[str, dict[str, Any]] = {} + valves : dict[str, dict[str, Any]] = {} + demands : dict[str, list[dict[str, Any]]] = {} + status : dict[str, dict[str, Any]] = {} + patterns : dict[str, list[float]] = {} + curves : dict[str, list[dict[str, float]]] = {} + emitters : dict[str, float] = {} + times : dict[str, str] = {} + options : dict[str, str] = {} + + for line in open(inp): + line = line.strip() + + if line.startswith(';'): + continue + if line.endswith(';'): + line = line.removesuffix(';') + + if line.startswith('[TITLE'): + section = 'title' + continue + if line.startswith('[JUNCTION'): + section = JUNCTION + continue + if line.startswith('[RESERVOIR'): + section = RESERVOIR + continue + if line.startswith('[TANK'): + section = TANK + continue + if line.startswith('[PIPE'): + section = PIPE + continue + if line.startswith('[PUMP'): + section = PUMP + continue + if line.startswith('[VALVE'): + section = VALVE + continue + if line.startswith('[DEMAND'): + section = 'demand' + continue + if line.startswith('[STATUS'): + section = 'status' + continue + if line.startswith('[PATTERN'): + section = PATTERN + continue + if line.startswith('[CURVE'): + section = CURVE + continue + if line.startswith('[EMITTER'): + section = 'emitter' + continue + if line.startswith('[TIME'): + section = 'time' + continue + if line.startswith('[OPTION'): + section = 'option' + continue + if line.startswith('[COORDINATE'): + section = 'coordinate' + continue + if line.startswith('['): + section = '' + continue + + tokens = [] + if section == 'time' or section == 'option': + tokens = line.upper().split() + else: + tokens = line.split() + tokens_len = len(tokens) + if tokens_len == 0: + continue + + if section == 'title': + if title == '': + title += '\n' + title += line + continue + elif section == JUNCTION: + junction_demand = float(tokens[2]) if tokens_len >= 3 else None + junction_pattern = tokens[3] if tokens_len == 4 else None + junctions[tokens[0]] = {'id': tokens[0], 'elevation': tokens[1], 'demand': junction_demand, 'pattern': junction_pattern} + continue + elif section == RESERVOIR: + reservoir_pattern = tokens[2] if tokens_len == 3 else None + reservoirs[tokens[0]] = {'id': tokens[0], 'head': tokens[1], 'pattern': reservoir_pattern} + continue + elif section == TANK: + tank_vol_curve = tokens[7] if tokens_len >= 8 else None + tank_overflow = tokens[8].upper() if tokens_len == 9 else None + tanks[tokens[0]] = {'id': tokens[0], 'elevation': tokens[1], 'init_level': tokens[2], 'min_level': tokens[3], 'max_level': tokens[4], 'diameter': tokens[5], 'min_vol': tokens[6], 'vol_curve': tank_vol_curve, 'overflow': tank_overflow} + continue + elif section == PIPE: + # status is must-have, here fix input + pipe_status = tokens[7].upper() if tokens_len == 8 else PIPE_STATUS_OPEN + pipes[tokens[0]] = {'id': tokens[0], 'node1': tokens[1], 'node2': tokens[2], 'length': tokens[3], 'diameter': tokens[4], 'roughness': tokens[5], 'minor_loss': tokens[6], 'status': pipe_status} + continue + elif section == PUMP: + pumps[tokens[0]] = {'id': tokens[0], 'node1': tokens[1], 'node2': tokens[2]} + for i in range(3, tokens_len, 2): + pumps[tokens[0]] |= { tokens[i].lower(): tokens[i + 1] } + continue + elif section == VALVE: + valves[tokens[0]] = {'id': tokens[0], 'node1': tokens[1], 'node2': tokens[2], 'diameter': tokens[3], 'v_type': tokens[4], 'setting': tokens[5], 'minor_loss': tokens[6]} + continue + elif section == 'demand': + demand_pattern = tokens[2] if tokens_len >= 3 else None + demand_category = tokens[3] if tokens_len == 4 else None + demands[tokens[0]].append({'demand': tokens[1], 'pattern': demand_pattern, 'category': demand_category}) + continue + elif section == 'status': + if tokens[0] not in status: + status[tokens[0]] = {} + setting = None + try: + setting = float(tokens[1]) + except: + setting = None + if setting != None: + status[tokens[0]]['setting'] = setting + else: + status[tokens[0]]['status'] = tokens[1].upper() + continue + elif section == PATTERN: + if tokens[0] not in patterns: + patterns[tokens[0]] = [] + for i in range(1, tokens_len): + patterns[tokens[0]].append(float(tokens[i])) + continue + elif section == CURVE: + if tokens[0] not in curves: + curves[tokens[0]] = [] + for i in range(1, tokens_len, 2): + curves[tokens[0]].append({ 'x': float(tokens[i]), 'y': float(tokens[i + 1]) }) + continue + elif section == 'emitter': + emitters[tokens[0]] = float(tokens[1]) + continue + elif section == 'time': + if tokens_len == 2: + times[tokens[0]] = tokens[1] + elif tokens_len == 3: + times[tokens[0] + ' ' + tokens[1]] = tokens[2] + elif tokens_len == 4: + times[tokens[0] + ' ' + tokens[1]] = tokens[2] + ' ' + tokens[3] + continue + elif section == 'option': + if tokens[0] == 'HYDRAULICS' or tokens[0] == 'MAP': + continue + if tokens_len == 2: + options[tokens[0]] = tokens[1] + elif tokens_len == 3: + if tokens[0] == 'UNBALANCED' or tokens[0] == 'QUALITY': + options[tokens[0]] = tokens[1] + ' ' + tokens[2] + else: + options[tokens[0] + ' ' + tokens[1]] = tokens[2] + continue + elif section == 'coordinate': + if tokens[0] in junctions: + junctions[tokens[0]] |= {'x': tokens[1], 'y': tokens[2]} + elif tokens[0] in reservoirs: + reservoirs[tokens[0]] |= {'x': tokens[1], 'y': tokens[2]} + elif tokens[0] in tanks: + tanks[tokens[0]] |= {'x': tokens[1], 'y': tokens[2]} + continue + + # title + set_title(name, ChangeSet({ 'value': title })) + + # pattern + for key, value in patterns.items(): + set_pattern(name, ChangeSet({'id': key, 'factors': value})) + + # curve + for key, value in curves.items(): + set_curve(name, ChangeSet({'id': key, 'coords': value})) + + # junction + for value in junctions.values(): + if 'x' not in value: + value['x'] = 0.0 + if 'y' not in value: + value['y'] = 0.0 + add_junction(name, ChangeSet(value)) + + # reservoir + for value in reservoirs.values(): + if 'x' not in value: + value['x'] = 0.0 + if 'y' not in value: + value['y'] = 0.0 + add_reservoir(name, ChangeSet(value)) + + # tank + for value in tanks.values(): + if 'x' not in value: + value['x'] = 0.0 + if 'y' not in value: + value['y'] = 0.0 + add_tank(name, ChangeSet(value)) + + # pipe + for value in pipes.values(): + add_pipe(name, ChangeSet(value)) + + # pump + for value in pumps.values(): + add_pump(name, ChangeSet(value)) + + # valve + for value in valves.values(): + add_valve(name, ChangeSet(value)) + + # demand + for key, value in demands.items(): + set_demand(name, ChangeSet({'junction': key, 'demands': value})) + + # status + for key, value in status.items(): + set_status(name, ChangeSet({'link': key} | value)) + + # emitter + for key, value in emitters.items(): + set_emitter(name, ChangeSet({'junction': key, 'coefficient': value})) + + # time + set_time(name, ChangeSet(times)) + + # option + set_option(name, ChangeSet(options)) + + close_project(name) diff --git a/api/parser.py b/api/parser.py index 0f68d45..e69de29 100644 --- a/api/parser.py +++ b/api/parser.py @@ -1,270 +0,0 @@ -from typing import Any -from .project import * -from .s1_title import * -from .s2_junctions import * -from .s3_reservoirs import * -from .s4_tanks import * -from .s5_pipes import * -from .s6_pumps import * -from .s7_valves import * -from .s9_demands import * -from .s10_status import * -from .s11_patterns import * -from .s12_curves import * -from .s16_emitters import * -from .s21_times import * -from .s23_options import * - - -def read_inp(name: str, inp: str): - if is_project_open(name): - close_project(name) - - if have_project(name): - delete_project(name) - - create_project(name) - open_project(name) - - section = '' - - title : str = '' - junctions : dict[str, dict[str, Any]] = {} - reservoirs : dict[str, dict[str, Any]] = {} - tanks : dict[str, dict[str, Any]] = {} - pipes : dict[str, dict[str, Any]] = {} - pumps : dict[str, dict[str, Any]] = {} - valves : dict[str, dict[str, Any]] = {} - demands : dict[str, list[dict[str, Any]]] = {} - status : dict[str, dict[str, Any]] = {} - patterns : dict[str, list[float]] = {} - curves : dict[str, list[dict[str, float]]] = {} - emitters : dict[str, float] = {} - times : dict[str, str] = {} - options : dict[str, str] = {} - - for line in open(inp): - line = line.strip() - - if line.startswith(';'): - continue - if line.endswith(';'): - line = line.removesuffix(';') - - if line.startswith('[TITLE'): - section = 'title' - continue - if line.startswith('[JUNCTION'): - section = JUNCTION - continue - if line.startswith('[RESERVOIR'): - section = RESERVOIR - continue - if line.startswith('[TANK'): - section = TANK - continue - if line.startswith('[PIPE'): - section = PIPE - continue - if line.startswith('[PUMP'): - section = PUMP - continue - if line.startswith('[VALVE'): - section = VALVE - continue - if line.startswith('[DEMAND'): - section = 'demand' - continue - if line.startswith('[STATUS'): - section = 'status' - continue - if line.startswith('[PATTERN'): - section = PATTERN - continue - if line.startswith('[CURVE'): - section = CURVE - continue - if line.startswith('[EMITTER'): - section = 'emitter' - continue - if line.startswith('[TIME'): - section = 'time' - continue - if line.startswith('[OPTION'): - section = 'option' - continue - if line.startswith('[COORDINATE'): - section = 'coordinate' - continue - if line.startswith('['): - section = '' - continue - - tokens = [] - if section == 'time' or section == 'option': - tokens = line.upper().split() - else: - tokens = line.split() - tokens_len = len(tokens) - if tokens_len == 0: - continue - - if section == 'title': - if title == '': - title += '\n' - title += line - continue - elif section == JUNCTION: - junction_demand = float(tokens[2]) if tokens_len >= 3 else None - junction_pattern = tokens[3] if tokens_len == 4 else None - junctions[tokens[0]] = {'id': tokens[0], 'elevation': tokens[1], 'demand': junction_demand, 'pattern': junction_pattern} - continue - elif section == RESERVOIR: - reservoir_pattern = tokens[2] if tokens_len == 3 else None - reservoirs[tokens[0]] = {'id': tokens[0], 'head': tokens[1], 'pattern': reservoir_pattern} - continue - elif section == TANK: - tank_vol_curve = tokens[7] if tokens_len >= 8 else None - tank_overflow = tokens[8].upper() if tokens_len == 9 else None - tanks[tokens[0]] = {'id': tokens[0], 'elevation': tokens[1], 'init_level': tokens[2], 'min_level': tokens[3], 'max_level': tokens[4], 'diameter': tokens[5], 'min_vol': tokens[6], 'vol_curve': tank_vol_curve, 'overflow': tank_overflow} - continue - elif section == PIPE: - # status is must-have, here fix input - pipe_status = tokens[7].upper() if tokens_len == 8 else PIPE_STATUS_OPEN - pipes[tokens[0]] = {'id': tokens[0], 'node1': tokens[1], 'node2': tokens[2], 'length': tokens[3], 'diameter': tokens[4], 'roughness': tokens[5], 'minor_loss': tokens[6], 'status': pipe_status} - continue - elif section == PUMP: - pumps[tokens[0]] = {'id': tokens[0], 'node1': tokens[1], 'node2': tokens[2]} - for i in range(3, tokens_len, 2): - pumps[tokens[0]] |= { tokens[i].lower(): tokens[i + 1] } - continue - elif section == VALVE: - valves[tokens[0]] = {'id': tokens[0], 'node1': tokens[1], 'node2': tokens[2], 'diameter': tokens[3], 'v_type': tokens[4], 'setting': tokens[5], 'minor_loss': tokens[6]} - continue - elif section == 'demand': - demand_pattern = tokens[2] if tokens_len >= 3 else None - demand_category = tokens[3] if tokens_len == 4 else None - demands[tokens[0]].append({'demand': tokens[1], 'pattern': demand_pattern, 'category': demand_category}) - continue - elif section == 'status': - if tokens[0] not in status: - status[tokens[0]] = {} - setting = None - try: - setting = float(tokens[1]) - except: - setting = None - if setting != None: - status[tokens[0]]['setting'] = setting - else: - status[tokens[0]]['status'] = tokens[1].upper() - continue - elif section == PATTERN: - if tokens[0] not in patterns: - patterns[tokens[0]] = [] - for i in range(1, tokens_len): - patterns[tokens[0]].append(float(tokens[i])) - continue - elif section == CURVE: - if tokens[0] not in curves: - curves[tokens[0]] = [] - for i in range(1, tokens_len, 2): - curves[tokens[0]].append({ 'x': float(tokens[i]), 'y': float(tokens[i + 1]) }) - continue - elif section == 'emitter': - emitters[tokens[0]] = float(tokens[1]) - continue - elif section == 'time': - if tokens_len == 2: - times[tokens[0]] = tokens[1] - elif tokens_len == 3: - times[tokens[0] + ' ' + tokens[1]] = tokens[2] - elif tokens_len == 4: - times[tokens[0] + ' ' + tokens[1]] = tokens[2] + ' ' + tokens[3] - continue - elif section == 'option': - if tokens[0] == 'HYDRAULICS' or tokens[0] == 'MAP': - continue - if tokens_len == 2: - options[tokens[0]] = tokens[1] - elif tokens_len == 3: - if tokens[0] == 'UNBALANCED' or tokens[0] == 'QUALITY': - options[tokens[0]] = tokens[1] + ' ' + tokens[2] - else: - options[tokens[0] + ' ' + tokens[1]] = tokens[2] - continue - elif section == 'coordinate': - if tokens[0] in junctions: - junctions[tokens[0]] |= {'x': tokens[1], 'y': tokens[2]} - elif tokens[0] in reservoirs: - reservoirs[tokens[0]] |= {'x': tokens[1], 'y': tokens[2]} - elif tokens[0] in tanks: - tanks[tokens[0]] |= {'x': tokens[1], 'y': tokens[2]} - continue - - # title - set_title(name, ChangeSet({ 'value': title })) - - # pattern - for key, value in patterns.items(): - set_pattern(name, ChangeSet({'id': key, 'factors': value})) - - # curve - for key, value in curves.items(): - set_curve(name, ChangeSet({'id': key, 'coords': value})) - - # junction - for value in junctions.values(): - if 'x' not in value: - value['x'] = 0.0 - if 'y' not in value: - value['y'] = 0.0 - add_junction(name, ChangeSet(value)) - - # reservoir - for value in reservoirs.values(): - if 'x' not in value: - value['x'] = 0.0 - if 'y' not in value: - value['y'] = 0.0 - add_reservoir(name, ChangeSet(value)) - - # tank - for value in tanks.values(): - if 'x' not in value: - value['x'] = 0.0 - if 'y' not in value: - value['y'] = 0.0 - add_tank(name, ChangeSet(value)) - - # pipe - for value in pipes.values(): - add_pipe(name, ChangeSet(value)) - - # pump - for value in pumps.values(): - add_pump(name, ChangeSet(value)) - - # valve - for value in valves.values(): - add_valve(name, ChangeSet(value)) - - # demand - for key, value in demands.items(): - set_demand(name, ChangeSet({'junction': key, 'demands': value})) - - # status - for key, value in status.items(): - set_status(name, ChangeSet({'link': key} | value)) - - # emitter - for key, value in emitters.items(): - set_emitter(name, ChangeSet({'junction': key, 'coefficient': value})) - - # time - set_time(name, ChangeSet(times)) - - # option - set_option(name, ChangeSet(options)) - - close_project(name)