Files
TJWaterServerBinary/app/native/wndb/inp/exporter.py
T
jiang fa188af0b1 refactor(db)!: adopt project-routed pooled databases
Reorganize WNDB by responsibility and remove legacy scheme endpoints.\n\nRoute analysis and time-series access through project pools, preserve transactional realtime replacement, and refresh GIS materialized views after writes.\n\nAdd database architecture documentation, live pooling coverage, API contract updates, and executable container verification.\n\nBREAKING CHANGE: legacy scheme APIs and flat app.native.wndb module imports are removed.
2026-08-25 18:35:05 +08:00

320 lines
8.7 KiB
Python

import os
from ..core.projects import close_project, have_project, is_project_open, open_project
from ..core.database import ChangeSet
from .sections import (
BACKDROP,
CONTROLS,
COORDINATES,
CURVES,
DEMANDS,
EMITTERS,
END,
ENERGY,
JUNCTIONS,
LABELS,
MIXING,
OPTIONS,
PATTERNS,
PIPES,
PUMPS,
QUALITY,
REACTIONS,
REPORT,
RESERVOIRS,
RULES,
SOURCES,
STATUS,
TAGS,
TANKS,
TIMES,
TITLE,
VALVES,
VERTICES,
section_name,
section_names_for_epanetv2,
)
from ..model.title import inp_out_title
from ..model.junctions import inp_out_junction
from ..model.reservoirs import inp_out_reservoir
from ..model.tanks import inp_out_tank
from ..model.pipes import inp_out_pipe
from ..model.pumps import inp_out_pump
from ..model.valves import inp_out_valve
from ..model.tags import inp_out_tag
from ..model.demands import inp_out_demand
from ..model.status import inp_out_status
from ..model.patterns import inp_out_pattern, inp_out_pattern_v3
from ..model.curves import inp_out_curve, inp_out_curve_v3
from ..model.controls import inp_out_control
from ..model.rules import inp_out_rule
from ..model.energy import inp_out_energy
from ..model.emitters import inp_out_emitter
from ..model.quality import inp_out_quality
from ..model.sources import inp_out_source
from ..model.reactions import inp_out_reaction
from ..model.mixing import inp_out_mixing
from ..model.times import inp_out_time
from ..model.reports import inp_out_report
from ..model.options_legacy import inp_out_option
from ..model.options_v3 import inp_out_option_v3
from ..gis.coordinates import inp_out_coord
from ..gis.vertices import inp_out_vertex
from ..gis.labels import inp_out_label
from ..gis.backdrop import inp_out_backdrop
#from .s28_end import *
def dump_inp(project: str, inp: str, version: str = '3'):
if version != '3' and version != '2':
version = '2'
if not have_project(project):
return
project_open = is_project_open(project)
if not project_open:
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',encoding="UTF-8")
# REGION, BOUND, REGION_NODES 在 epanet v2 中没有,是我们自己定制的
# v2 需要去掉我们自己定制的 section
sections = section_names_for_epanetv2
if version == '3':
sections = section_name
for name in sections:
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:
if version == '3':
file.write('\n'.join(inp_out_pattern_v3(project)))
else:
file.write('\n'.join(inp_out_pattern(project)))
elif name == CURVES:
if version == '3':
file.write('\n'.join(inp_out_curve_v3(project)))
else:
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:
if version == '3':
file.write('\n'.join(inp_out_option_v3(project)))
else:
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()
if not project_open:
close_project(project)
def export_inp(project: str, version: str = '3') -> ChangeSet:
if version != '3' and version != '2':
version = '2'
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:
if version == '3':
inp += '\n'.join(inp_out_pattern_v3(project))
else:
inp += '\n'.join(inp_out_pattern(project))
elif name == CURVES:
if version == '3':
inp += '\n'.join(inp_out_curve_v3(project))
else:
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:
if version == '3':
inp += '\n'.join(inp_out_option_v3(project))
else:
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})