diff --git a/api/__init__.py b/api/__init__.py index e566c75..ad08e19 100644 --- a/api/__init__.py +++ b/api/__init__.py @@ -2,7 +2,8 @@ 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 .inp_io import read_inp, dump_inp, import_inp, export_inp +from .inp_in import read_inp, import_inp +from .inp_out import dump_inp, export_inp from .database import API_ADD, API_UPDATE, API_DELETE from .database import ChangeSet diff --git a/api/inp_in.py b/api/inp_in.py new file mode 100644 index 0000000..d7f4d34 --- /dev/null +++ b/api/inp_in.py @@ -0,0 +1,281 @@ +from .project import * +from .database import get_current_operation, set_restore_operation +from .sections import section_name +from .batch_cmds import * +from .s1_title import inp_in_title +from .s2_junctions import inp_in_junction +from .s3_reservoirs import inp_in_reservoir +from .s4_tanks import inp_in_tank +from .s5_pipes import inp_in_pipe +from .s6_pumps import inp_in_pump +from .s7_valves import inp_in_valve +from .s8_tags import inp_in_tag +from .s9_demands import inp_in_demand +from .s10_status import inp_in_status +from .s11_patterns import inp_in_pattern +from .s12_curves import inp_in_curve +from .s13_controls import inp_in_control +from .s14_rules import inp_in_rule +from .s15_energy import inp_in_energy +from .s16_emitters import inp_in_emitter +from .s17_quality import inp_in_quality +from .s18_sources import inp_in_source +from .s19_reactions import inp_in_reaction +from .s20_mixing import inp_in_mixing +from .s21_times import inp_in_time +from .s22_report import inp_in_report +from .s23_options import inp_in_option +from .s24_coordinates import inp_in_coord +from .s25_vertices import inp_in_vertex +from .s26_labels import inp_in_label +from .s27_backdrop import inp_in_backdrop +#from .s28_end import * + + +def _parse_inp(inp: str) -> dict[str, list[str]]: + file: dict[str, list[str]] = {} + for s in section_name: + file[s] = [] + + section = '' + + for line in open(inp): + line = line.strip() + if line == '': + # skip empty line for control and rule + if section == 'CONTROLS' or section == 'RULES': + pass + else: + section = '' + continue + + if line.startswith('['): + is_section = False + for s in section_name: + if line.startswith(f'[{s}'): + section = s + is_section = True + break + if is_section: + continue + + if section != '': + file[section].append(line) + + return file + + +def _parse_cs(cs: ChangeSet) -> dict[str, list[str]]: + file: dict[str, list[str]] = {} + for s in section_name: + file[s] = [] + + section = '' + + for line in str(cs.operations[0]['inp']).split('\n'): + line = line.strip() + if line == '': + # skip empty line for control and rule + if section == 'CONTROLS' or section == 'RULES': + pass + else: + section = '' + continue + + if line.startswith('['): + is_section = False + for s in section_name: + if line.startswith(f'[{s}'): + section = s + is_section = True + break + if is_section: + continue + + if section != '': + file[section].append(line) + + return file + + +def _read_inp(file: dict[str, list[str]]) -> ChangeSet: + file_cs: dict[str, ChangeSet] = {} + for s in section_name: + file_cs[s] = ChangeSet() + + for name, section in file.items(): + if name == 'TITLE': + file_cs[name].merge(inp_in_title(section)) + + elif name == 'JUNCTIONS': # + coords + file_cs[name].merge(inp_in_junction(section)) + + elif name == 'RESERVOIRS': # + coords + file_cs[name].merge(inp_in_reservoir(section)) + + elif name == 'TANKS': # + coords + file_cs[name].merge(inp_in_tank(section)) + + elif name == 'PIPES': + file_cs[name].merge(inp_in_pipe(section)) + + elif name == 'PUMPS': + file_cs[name].merge(inp_in_pump(section)) + + elif name == 'VALVES': + file_cs[name].merge(inp_in_valve(section)) + + elif name == 'TAGS': + file_cs[name].merge(inp_in_tag(section)) + + elif name == 'DEMANDS': + file_cs[name].merge(inp_in_demand(section)) + + elif name == 'STATUS': + file_cs[name].merge(inp_in_status(section)) + + elif name == 'PATTERNS': + file_cs[name].merge(inp_in_pattern(section)) + + elif name == 'CURVES': + file_cs[name].merge(inp_in_curve(section)) + + elif name == 'CONTROLS': + file_cs[name].merge(inp_in_control(section)) + + elif name == 'RULES': + file_cs[name].merge(inp_in_rule(section)) + + elif name == 'ENERGY': + file_cs[name].merge(inp_in_energy(section)) + + elif name == 'EMITTERS': + file_cs[name].merge(inp_in_emitter(section)) + + elif name == 'QUALITY': + file_cs[name].merge(inp_in_quality(section)) + + elif name == 'SOURCES': + file_cs[name].merge(inp_in_source(section)) + + elif name == 'REACTIONS': + file_cs[name].merge(inp_in_reaction(section)) + + elif name == 'MIXING': + file_cs[name].merge(inp_in_mixing(section)) + + elif name == 'TIMES': + file_cs[name].merge(inp_in_time(section)) + + elif name == 'REPORT': + pass # ignore now, for simulation, always report all + + elif name == 'OPTIONS': + file_cs[name].merge(inp_in_option(section)) + + elif name == 'COORDINATES': + coords = inp_in_coord(section) + for s in ['JUNCTIONS', 'RESERVOIRS', 'TANKS']: + for node in file_cs[s].operations: + if node['type'] == 'demand': + continue + if node['id'] in coords: + coord = coords[node['id']] + node |= { 'x' : coord['x'], 'y' : coord['y'] } + else: + print(f"WARNING: [{s}] {node['id']} has no coordinate, set it at origin!") + node |= { 'x' : 0.0, 'y' : 0.0 } + + elif name == 'VERTICES': + file_cs[name].merge(inp_in_vertex(section)) + + elif name == 'LABELS': + file_cs[name].merge(inp_in_label(section)) + + elif name == 'BACKDROP': + file_cs[name].merge(inp_in_backdrop(section)) + + elif name == 'END': + pass # :) + + # release file + file = {} + + cs = ChangeSet() + priorities = [ + 'PATTERNS', + 'CURVES', + 'JUNCTIONS', + 'RESERVOIRS', + 'TANKS', + 'COORDINATES', + 'PIPES', + 'PUMPS', + 'VALVES', + 'DEMANDS', + 'STATUS', + 'OPTIONS', + 'TIMES', + 'EMITTERS', + 'QUALITY', + 'SOURCES', + 'REACTIONS', + 'MIXING', + 'ENERGY', + 'REPORT', + 'VERTICES', + 'CONTROLS', + 'RULES', + 'TITLE', + 'TAGS', + 'LABELS', + 'BACKDROP', + 'END', + ] + for s in priorities: + cs.merge(file_cs[s]) + + return cs + + +def read_inp(project: str, inp: str): + if is_project_open(project): + close_project(project) + + if have_project(project): + delete_project(project) + + create_project(project) + open_project(project) + + file = _parse_inp(inp) + cs = _read_inp(file) + + execute_batch_commands(project, cs) + op = get_current_operation(project) + set_restore_operation(project, op) + + close_project(project) + + +def import_inp(project: str, cs: ChangeSet) -> ChangeSet: + if is_project_open(project): + close_project(project) + + if have_project(project): + delete_project(project) + + create_project(project) + open_project(project) + + file = _parse_cs(cs) + new_cs = _read_inp(file) + + success_cs = execute_batch_commands(project, new_cs) + op = get_current_operation(project) + set_restore_operation(project, op) + + close_project(project) + + # return ? + return success_cs diff --git a/api/inp_io.py b/api/inp_io.py deleted file mode 100644 index 296d75a..0000000 --- a/api/inp_io.py +++ /dev/null @@ -1,510 +0,0 @@ -from typing import Any -import os -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 .s17_quality import * -from .s18_sources import * -from .s19_reactions import * -from .s20_mixing import * -from .s21_times import * -from .s22_report import * -from .s23_options import * -from .s24_coordinates import * -from .s25_vertices import * -from .s26_labels import * -from .s27_backdrop import * -from .s28_end import * -from .batch_cmds import * - - -section_name = ['TITLE', 'JUNCTIONS', 'RESERVOIRS', 'TANKS', 'PIPES', - 'PUMPS', 'VALVES', 'TAGS', 'DEMANDS', 'STATUS', - 'PATTERNS', 'CURVES', 'CONTROLS', 'RULES', 'ENERGY', - 'EMITTERS', 'QUALITY', 'SOURCES', 'REACTIONS', 'MIXING', - 'TIMES', 'REPORT', 'OPTIONS', 'COORDINATES', 'VERTICES', - 'LABELS', 'BACKDROP', 'END'] - - -def _parse_inp(inp: str) -> dict[str, list[str]]: - file: dict[str, list[str]] = {} - for s in section_name: - file[s] = [] - - section = '' - - for line in open(inp): - line = line.strip() - if line == '': - # skip empty line for control and rule - if section == 'CONTROLS' or section == 'RULES': - pass - else: - section = '' - continue - - if line.startswith('['): - is_section = False - for s in section_name: - if line.startswith(f'[{s}'): - section = s - is_section = True - break - if is_section: - continue - - if section != '': - file[section].append(line) - - return file - - -def _parse_cs(cs: ChangeSet) -> dict[str, list[str]]: - file: dict[str, list[str]] = {} - for s in section_name: - file[s] = [] - - section = '' - - for line in str(cs.operations[0]['inp']).split('\n'): - line = line.strip() - if line == '': - # skip empty line for control and rule - if section == 'CONTROLS' or section == 'RULES': - pass - else: - section = '' - continue - - if line.startswith('['): - is_section = False - for s in section_name: - if line.startswith(f'[{s}'): - section = s - is_section = True - break - if is_section: - continue - - if section != '': - file[section].append(line) - - return file - - -def _read_inp(file: dict[str, list[str]]) -> ChangeSet: - file_cs: dict[str, ChangeSet] = {} - for s in section_name: - file_cs[s] = ChangeSet() - - for name, section in file.items(): - if name == 'TITLE': - file_cs[name].merge(inp_in_title(section)) - - elif name == 'JUNCTIONS': # + coords - file_cs[name].merge(inp_in_junction(section)) - - elif name == 'RESERVOIRS': # + coords - file_cs[name].merge(inp_in_reservoir(section)) - - elif name == 'TANKS': # + coords - file_cs[name].merge(inp_in_tank(section)) - - elif name == 'PIPES': - file_cs[name].merge(inp_in_pipe(section)) - - elif name == 'PUMPS': - file_cs[name].merge(inp_in_pump(section)) - - elif name == 'VALVES': - file_cs[name].merge(inp_in_valve(section)) - - elif name == 'TAGS': - file_cs[name].merge(inp_in_tag(section)) - - elif name == 'DEMANDS': - file_cs[name].merge(inp_in_demand(section)) - - elif name == 'STATUS': - file_cs[name].merge(inp_in_status(section)) - - elif name == 'PATTERNS': - file_cs[name].merge(inp_in_pattern(section)) - - elif name == 'CURVES': - file_cs[name].merge(inp_in_curve(section)) - - elif name == 'CONTROLS': - file_cs[name].merge(inp_in_control(section)) - - elif name == 'RULES': - file_cs[name].merge(inp_in_rule(section)) - - elif name == 'ENERGY': - file_cs[name].merge(inp_in_energy(section)) - - elif name == 'EMITTERS': - file_cs[name].merge(inp_in_emitter(section)) - - elif name == 'QUALITY': - file_cs[name].merge(inp_in_quality(section)) - - elif name == 'SOURCES': - file_cs[name].merge(inp_in_source(section)) - - elif name == 'REACTIONS': - file_cs[name].merge(inp_in_reaction(section)) - - elif name == 'MIXING': - file_cs[name].merge(inp_in_mixing(section)) - - elif name == 'TIMES': - file_cs[name].merge(inp_in_time(section)) - - elif name == 'REPORT': - pass # ignore now, for simulation, always report all - - elif name == 'OPTIONS': - file_cs[name].merge(inp_in_option(section)) - - elif name == 'COORDINATES': - coords = inp_in_coord(section) - for s in ['JUNCTIONS', 'RESERVOIRS', 'TANKS']: - for node in file_cs[s].operations: - if node['type'] == 'demand': - continue - if node['id'] in coords: - coord = coords[node['id']] - node |= { 'x' : coord['x'], 'y' : coord['y'] } - else: - print(f"WARNING: [{s}] {node['id']} has no coordinate, set it at origin!") - node |= { 'x' : 0.0, 'y' : 0.0 } - - elif name == 'VERTICES': - file_cs[name].merge(inp_in_vertex(section)) - - elif name == 'LABELS': - file_cs[name].merge(inp_in_label(section)) - - elif name == 'BACKDROP': - file_cs[name].merge(inp_in_backdrop(section)) - - elif name == 'END': - pass # :) - - # release file - file = {} - - cs = ChangeSet() - priorities = [ - 'PATTERNS', - 'CURVES', - 'JUNCTIONS', - 'RESERVOIRS', - 'TANKS', - 'COORDINATES', - 'PIPES', - 'PUMPS', - 'VALVES', - 'DEMANDS', - 'STATUS', - 'OPTIONS', - 'TIMES', - 'EMITTERS', - 'QUALITY', - 'SOURCES', - 'REACTIONS', - 'MIXING', - 'ENERGY', - 'REPORT', - 'VERTICES', - 'CONTROLS', - 'RULES', - 'TITLE', - 'TAGS', - 'LABELS', - 'BACKDROP', - 'END', - ] - for s in priorities: - cs.merge(file_cs[s]) - - return cs - - -def read_inp(project: str, inp: str): - if is_project_open(project): - close_project(project) - - if have_project(project): - delete_project(project) - - create_project(project) - open_project(project) - - file = _parse_inp(inp) - cs = _read_inp(file) - - execute_batch_commands(project, cs) - op = get_current_operation(project) - set_restore_operation(project, op) - - close_project(project) - - -def import_inp(project: str, cs: ChangeSet) -> ChangeSet: - if is_project_open(project): - close_project(project) - - if have_project(project): - delete_project(project) - - create_project(project) - open_project(project) - - file = _parse_cs(cs) - new_cs = _read_inp(file) - - success_cs = execute_batch_commands(project, new_cs) - op = get_current_operation(project) - set_restore_operation(project, op) - - close_project(project) - - # return ? - return success_cs - - -def dump_inp(project: str, inp: str): - if not have_project(project): - return - - if not is_project_open(project): - open_project(project) - - dir = os.getcwd() - path = os.path.join(dir, inp) - - if os.path.exists(path): - os.remove(path) - - file = open(path, mode='w') - - for name in section_name: - if name == 'TITLE': - file.write(f'[{name}]\n') - else: - file.write(f'\n[{name}]\n') - - if name == 'TITLE': - file.write('\n'.join(inp_out_title(project))) - - elif name == 'JUNCTIONS': # + coords - file.write('\n'.join(inp_out_junction(project))) - - elif name == 'RESERVOIRS': # + coords - file.write('\n'.join(inp_out_reservoir(project))) - - elif name == 'TANKS': # + coords - file.write('\n'.join(inp_out_tank(project))) - - elif name == 'PIPES': - file.write('\n'.join(inp_out_pipe(project))) - - elif name == 'PUMPS': - file.write('\n'.join(inp_out_pump(project))) - - elif name == 'VALVES': - file.write('\n'.join(inp_out_valve(project))) - - elif name == 'TAGS': - file.write('\n'.join(inp_out_tag(project))) - - elif name == 'DEMANDS': - file.write('\n'.join(inp_out_demand(project))) - - elif name == 'STATUS': - file.write('\n'.join(inp_out_status(project))) - - elif name == 'PATTERNS': - file.write('\n'.join(inp_out_pattern(project))) - - elif name == 'CURVES': - file.write('\n'.join(inp_out_curve(project))) - - elif name == 'CONTROLS': - file.write('\n'.join(inp_out_control(project))) - - elif name == 'RULES': - file.write('\n'.join(inp_out_rule(project))) - - elif name == 'ENERGY': - file.write('\n'.join(inp_out_energy(project))) - - elif name == 'EMITTERS': - file.write('\n'.join(inp_out_emitter(project))) - - elif name == 'QUALITY': - file.write('\n'.join(inp_out_quality(project))) - - elif name == 'SOURCES': - file.write('\n'.join(inp_out_source(project))) - - elif name == 'REACTIONS': - file.write('\n'.join(inp_out_reaction(project))) - - elif name == 'MIXING': - file.write('\n'.join(inp_out_mixing(project))) - - elif name == 'TIMES': - file.write('\n'.join(inp_out_time(project))) - - elif name == 'REPORT': - file.write('\n'.join(inp_out_report(project))) - - elif name == 'OPTIONS': - file.write('\n'.join(inp_out_option(project))) - - elif name == 'COORDINATES': - file.write('\n'.join(inp_out_coord(project))) - - elif name == 'VERTICES': - file.write('\n'.join(inp_out_vertex(project))) - - elif name == 'LABELS': - file.write('\n'.join(inp_out_label(project))) - - elif name == 'BACKDROP': - file.write('\n'.join(inp_out_backdrop(project))) - - elif name == 'END': - pass # :) - - file.write('\n') - - file.close() - - close_project(project) - - -def export_inp(project: str) -> ChangeSet: - if not have_project(project): - return ChangeSet() - - project_open = is_project_open(project) - - if not project_open: - open_project(project) - - inp = '' - - for name in section_name: - if name == 'TITLE': - inp += f'[{name}]\n' - else: - inp += f'\n[{name}]\n' - - if name == 'TITLE': - inp += '\n'.join(inp_out_title(project)) - - elif name == 'JUNCTIONS': # + coords - inp += '\n'.join(inp_out_junction(project)) - - elif name == 'RESERVOIRS': # + coords - inp += '\n'.join(inp_out_reservoir(project)) - - elif name == 'TANKS': # + coords - inp += '\n'.join(inp_out_tank(project)) - - elif name == 'PIPES': - inp += '\n'.join(inp_out_pipe(project)) - - elif name == 'PUMPS': - inp += '\n'.join(inp_out_pump(project)) - - elif name == 'VALVES': - inp += '\n'.join(inp_out_valve(project)) - - elif name == 'TAGS': - inp += '\n'.join(inp_out_tag(project)) - - elif name == 'DEMANDS': - inp += '\n'.join(inp_out_demand(project)) - - elif name == 'STATUS': - inp += '\n'.join(inp_out_status(project)) - - elif name == 'PATTERNS': - inp += '\n'.join(inp_out_pattern(project)) - - elif name == 'CURVES': - inp += '\n'.join(inp_out_curve(project)) - - elif name == 'CONTROLS': - inp += '\n'.join(inp_out_control(project)) - - elif name == 'RULES': - inp += '\n'.join(inp_out_rule(project)) - - elif name == 'ENERGY': - inp += '\n'.join(inp_out_energy(project)) - - elif name == 'EMITTERS': - inp += '\n'.join(inp_out_emitter(project)) - - elif name == 'QUALITY': - inp += '\n'.join(inp_out_quality(project)) - - elif name == 'SOURCES': - inp += '\n'.join(inp_out_source(project)) - - elif name == 'REACTIONS': - inp += '\n'.join(inp_out_reaction(project)) - - elif name == 'MIXING': - inp += '\n'.join(inp_out_mixing(project)) - - elif name == 'TIMES': - inp += '\n'.join(inp_out_time(project)) - - elif name == 'REPORT': - inp += '\n'.join(inp_out_report(project)) - - elif name == 'OPTIONS': - inp += '\n'.join(inp_out_option(project)) - - elif name == 'COORDINATES': - inp += '\n'.join(inp_out_coord(project)) - - elif name == 'VERTICES': - inp += '\n'.join(inp_out_vertex(project)) - - elif name == 'LABELS': - inp += '\n'.join(inp_out_label(project)) - - elif name == 'BACKDROP': - inp += '\n'.join(inp_out_backdrop(project)) - - elif name == 'END': - pass # :) - - inp += '\n' - - if not project_open: - close_project(project) - - return ChangeSet({'operation': 'export', 'inp': inp}) diff --git a/api/inp_out.py b/api/inp_out.py new file mode 100644 index 0000000..015556b --- /dev/null +++ b/api/inp_out.py @@ -0,0 +1,253 @@ +import os +from .project import * +from .database import ChangeSet +from .sections import section_name +from .s1_title import inp_out_title +from .s2_junctions import inp_out_junction +from .s3_reservoirs import inp_out_reservoir +from .s4_tanks import inp_out_tank +from .s5_pipes import inp_out_pipe +from .s6_pumps import inp_out_pump +from .s7_valves import inp_out_valve +from .s8_tags import inp_out_tag +from .s9_demands import inp_out_demand +from .s10_status import inp_out_status +from .s11_patterns import inp_out_pattern +from .s12_curves import inp_out_curve +from .s13_controls import inp_out_control +from .s14_rules import inp_out_rule +from .s15_energy import inp_out_energy +from .s16_emitters import inp_out_emitter +from .s17_quality import inp_out_quality +from .s18_sources import inp_out_source +from .s19_reactions import inp_out_reaction +from .s20_mixing import inp_out_mixing +from .s21_times import inp_out_time +from .s22_report import inp_out_report +from .s23_options import inp_out_option +from .s24_coordinates import inp_out_coord +from .s25_vertices import inp_out_vertex +from .s26_labels import inp_out_label +from .s27_backdrop import inp_out_backdrop +#from .s28_end import * + + +def dump_inp(project: str, inp: str): + if not have_project(project): + return + + if not is_project_open(project): + open_project(project) + + dir = os.getcwd() + path = os.path.join(dir, inp) + + if os.path.exists(path): + os.remove(path) + + file = open(path, mode='w') + + for name in section_name: + if name == 'TITLE': + file.write(f'[{name}]\n') + else: + file.write(f'\n[{name}]\n') + + if name == 'TITLE': + file.write('\n'.join(inp_out_title(project))) + + elif name == 'JUNCTIONS': # + coords + file.write('\n'.join(inp_out_junction(project))) + + elif name == 'RESERVOIRS': # + coords + file.write('\n'.join(inp_out_reservoir(project))) + + elif name == 'TANKS': # + coords + file.write('\n'.join(inp_out_tank(project))) + + elif name == 'PIPES': + file.write('\n'.join(inp_out_pipe(project))) + + elif name == 'PUMPS': + file.write('\n'.join(inp_out_pump(project))) + + elif name == 'VALVES': + file.write('\n'.join(inp_out_valve(project))) + + elif name == 'TAGS': + file.write('\n'.join(inp_out_tag(project))) + + elif name == 'DEMANDS': + file.write('\n'.join(inp_out_demand(project))) + + elif name == 'STATUS': + file.write('\n'.join(inp_out_status(project))) + + elif name == 'PATTERNS': + file.write('\n'.join(inp_out_pattern(project))) + + elif name == 'CURVES': + file.write('\n'.join(inp_out_curve(project))) + + elif name == 'CONTROLS': + file.write('\n'.join(inp_out_control(project))) + + elif name == 'RULES': + file.write('\n'.join(inp_out_rule(project))) + + elif name == 'ENERGY': + file.write('\n'.join(inp_out_energy(project))) + + elif name == 'EMITTERS': + file.write('\n'.join(inp_out_emitter(project))) + + elif name == 'QUALITY': + file.write('\n'.join(inp_out_quality(project))) + + elif name == 'SOURCES': + file.write('\n'.join(inp_out_source(project))) + + elif name == 'REACTIONS': + file.write('\n'.join(inp_out_reaction(project))) + + elif name == 'MIXING': + file.write('\n'.join(inp_out_mixing(project))) + + elif name == 'TIMES': + file.write('\n'.join(inp_out_time(project))) + + elif name == 'REPORT': + file.write('\n'.join(inp_out_report(project))) + + elif name == 'OPTIONS': + file.write('\n'.join(inp_out_option(project))) + + elif name == 'COORDINATES': + file.write('\n'.join(inp_out_coord(project))) + + elif name == 'VERTICES': + file.write('\n'.join(inp_out_vertex(project))) + + elif name == 'LABELS': + file.write('\n'.join(inp_out_label(project))) + + elif name == 'BACKDROP': + file.write('\n'.join(inp_out_backdrop(project))) + + elif name == 'END': + pass # :) + + file.write('\n') + + file.close() + + close_project(project) + + +def export_inp(project: str) -> ChangeSet: + if not have_project(project): + return ChangeSet() + + project_open = is_project_open(project) + + if not project_open: + open_project(project) + + inp = '' + + for name in section_name: + if name == 'TITLE': + inp += f'[{name}]\n' + else: + inp += f'\n[{name}]\n' + + if name == 'TITLE': + inp += '\n'.join(inp_out_title(project)) + + elif name == 'JUNCTIONS': # + coords + inp += '\n'.join(inp_out_junction(project)) + + elif name == 'RESERVOIRS': # + coords + inp += '\n'.join(inp_out_reservoir(project)) + + elif name == 'TANKS': # + coords + inp += '\n'.join(inp_out_tank(project)) + + elif name == 'PIPES': + inp += '\n'.join(inp_out_pipe(project)) + + elif name == 'PUMPS': + inp += '\n'.join(inp_out_pump(project)) + + elif name == 'VALVES': + inp += '\n'.join(inp_out_valve(project)) + + elif name == 'TAGS': + inp += '\n'.join(inp_out_tag(project)) + + elif name == 'DEMANDS': + inp += '\n'.join(inp_out_demand(project)) + + elif name == 'STATUS': + inp += '\n'.join(inp_out_status(project)) + + elif name == 'PATTERNS': + inp += '\n'.join(inp_out_pattern(project)) + + elif name == 'CURVES': + inp += '\n'.join(inp_out_curve(project)) + + elif name == 'CONTROLS': + inp += '\n'.join(inp_out_control(project)) + + elif name == 'RULES': + inp += '\n'.join(inp_out_rule(project)) + + elif name == 'ENERGY': + inp += '\n'.join(inp_out_energy(project)) + + elif name == 'EMITTERS': + inp += '\n'.join(inp_out_emitter(project)) + + elif name == 'QUALITY': + inp += '\n'.join(inp_out_quality(project)) + + elif name == 'SOURCES': + inp += '\n'.join(inp_out_source(project)) + + elif name == 'REACTIONS': + inp += '\n'.join(inp_out_reaction(project)) + + elif name == 'MIXING': + inp += '\n'.join(inp_out_mixing(project)) + + elif name == 'TIMES': + inp += '\n'.join(inp_out_time(project)) + + elif name == 'REPORT': + inp += '\n'.join(inp_out_report(project)) + + elif name == 'OPTIONS': + inp += '\n'.join(inp_out_option(project)) + + elif name == 'COORDINATES': + inp += '\n'.join(inp_out_coord(project)) + + elif name == 'VERTICES': + inp += '\n'.join(inp_out_vertex(project)) + + elif name == 'LABELS': + inp += '\n'.join(inp_out_label(project)) + + elif name == 'BACKDROP': + inp += '\n'.join(inp_out_backdrop(project)) + + elif name == 'END': + pass # :) + + inp += '\n' + + if not project_open: + close_project(project) + + return ChangeSet({'operation': 'export', 'inp': inp}) diff --git a/api/sections.py b/api/sections.py index b105c92..bd0c097 100644 --- a/api/sections.py +++ b/api/sections.py @@ -33,3 +33,10 @@ s28_end = 'end' s29_scada_device = 'scada_device' s30_scada_device_data = 'scada_device_data' s31_scada_element = 'scada_element' + +section_name = ['TITLE', 'JUNCTIONS', 'RESERVOIRS', 'TANKS', 'PIPES', + 'PUMPS', 'VALVES', 'TAGS', 'DEMANDS', 'STATUS', + 'PATTERNS', 'CURVES', 'CONTROLS', 'RULES', 'ENERGY', + 'EMITTERS', 'QUALITY', 'SOURCES', 'REACTIONS', 'MIXING', + 'TIMES', 'REPORT', 'OPTIONS', 'COORDINATES', 'VERTICES', + 'LABELS', 'BACKDROP', 'END'] diff --git a/epanet/epanet2.py b/epanet/epanet2.py index bd21263..766cde0 100644 --- a/epanet/epanet2.py +++ b/epanet/epanet2.py @@ -6,7 +6,7 @@ import json from typing import Any sys.path.append("..") from api import project -from api import inp_io +from api import inp_out def _verify_platform(): @@ -234,7 +234,7 @@ def run_project(name: str) -> str: dir = os.path.abspath(os.getcwd()) db_inp = os.path.join(os.path.join(dir, 'db_inp'), name + '.db.inp') - inp_io.dump_inp(name, db_inp) + inp_out.dump_inp(name, db_inp) input = name + '.db' exe = os.path.join(os.path.join(dir, 'epanet'), 'runepanet.exe')