Support to convert between option v2 & v3
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
from .database import *
|
from .database import *
|
||||||
|
from .s23_options_util import generate_v3
|
||||||
|
|
||||||
|
|
||||||
OPTION_UNITS_CFS = 'CFS'
|
OPTION_UNITS_CFS = 'CFS'
|
||||||
@@ -144,10 +145,6 @@ def set_option(name: str, cs: ChangeSet) -> ChangeSet:
|
|||||||
#--------------------------------------------------------------
|
#--------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
def _sync_to_v3() -> ChangeSet:
|
|
||||||
return ChangeSet()
|
|
||||||
|
|
||||||
|
|
||||||
def inp_in_option(section: list[str]) -> ChangeSet:
|
def inp_in_option(section: list[str]) -> ChangeSet:
|
||||||
if len(section) <= 0:
|
if len(section) <= 0:
|
||||||
return ChangeSet()
|
return ChangeSet()
|
||||||
@@ -173,7 +170,7 @@ def inp_in_option(section: list[str]) -> ChangeSet:
|
|||||||
cs |= { key : value }
|
cs |= { key : value }
|
||||||
|
|
||||||
result = ChangeSet(cs)
|
result = ChangeSet(cs)
|
||||||
result.merge(_sync_to_v3())
|
result.merge(generate_v3(result))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
@@ -183,5 +180,6 @@ def inp_out_option(name: str) -> list[str]:
|
|||||||
for obj in objs:
|
for obj in objs:
|
||||||
key = obj['key']
|
key = obj['key']
|
||||||
value = obj['value']
|
value = obj['value']
|
||||||
lines.append(f'{key} {value}')
|
if value != '':
|
||||||
|
lines.append(f'{key} {value}')
|
||||||
return lines
|
return lines
|
||||||
|
|||||||
129
api/s23_options_util.py
Normal file
129
api/s23_options_util.py
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
from .database import *
|
||||||
|
|
||||||
|
_key_map_23 = {
|
||||||
|
'UNITS' : 'FLOW_UNITS',
|
||||||
|
'PRESSURE' : 'PRESSURE_UNITS',
|
||||||
|
'HEADLOSS' : 'HEADLOSS_MODEL',
|
||||||
|
'QUALITY' : 'QUALITY_MODEL',
|
||||||
|
'UNBALANCED' : 'IF_UNBALANCED',
|
||||||
|
'PATTERN' : 'DEMAND_PATTERN',
|
||||||
|
'DEMAND MODEL' : 'DEMAND_MODEL',
|
||||||
|
'DEMAND MULTIPLIER' : 'DEMAND_MULTIPLIER',
|
||||||
|
'EMITTER EXPONENT' : 'EMITTER_EXPONENT',
|
||||||
|
'VISCOSITY' : 'SPECIFIC_VISCOSITY',
|
||||||
|
'DIFFUSIVITY' : 'SPECIFIC_DIFFUSIVITY',
|
||||||
|
'SPECIFIC GRAVITY' : 'SPECIFIC_GRAVITY',
|
||||||
|
'TRIALS' : 'MAXIMUM_TRIALS',
|
||||||
|
'ACCURACY' : 'RELATIVE_ACCURACY',
|
||||||
|
#'HEADERROR' : '',
|
||||||
|
'FLOWCHANGE' : 'FLOW_CHANGE_LIMIT',
|
||||||
|
'MINIMUM PRESSURE' : 'MINIMUM_PRESSURE',
|
||||||
|
'REQUIRED PRESSURE' : 'SERVICE_PRESSURE',
|
||||||
|
'PRESSURE EXPONENT' : 'PRESSURE_EXPONENT',
|
||||||
|
'TOLERANCE' : 'QUALITY_TOLERANCE',
|
||||||
|
'HTOL' : 'HEAD_TOLERANCE',
|
||||||
|
'QTOL' : 'FLOW_TOLERANCE',
|
||||||
|
#'RQTOL' : '',
|
||||||
|
#'CHECKFREQ' : '',
|
||||||
|
#'MAXCHECK' : '',
|
||||||
|
#'DAMPLIMIT' : '',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_key_map_32 = {
|
||||||
|
'FLOW_UNITS' : 'UNITS',
|
||||||
|
'PRESSURE_UNITS' : 'PRESSURE',
|
||||||
|
'HEADLOSS_MODEL' : 'HEADLOSS',
|
||||||
|
'SPECIFIC_GRAVITY' : 'SPECIFIC GRAVITY',
|
||||||
|
'SPECIFIC_VISCOSITY' : 'VISCOSITY',
|
||||||
|
'MAXIMUM_TRIALS' : 'TRIALS',
|
||||||
|
'HEAD_TOLERANCE' : 'HTOL',
|
||||||
|
'FLOW_TOLERANCE' : 'QTOL',
|
||||||
|
'FLOW_CHANGE_LIMIT' : 'FLOWCHANGE',
|
||||||
|
'RELATIVE_ACCURACY' : 'ACCURACY',
|
||||||
|
#'TIME_WEIGHT' : '',
|
||||||
|
#'STEP_SIZING' : '',
|
||||||
|
'IF_UNBALANCED' : 'UNBALANCED',
|
||||||
|
'DEMAND_MODEL' : 'DEMAND MODEL',
|
||||||
|
'DEMAND_PATTERN' : 'PATTERN',
|
||||||
|
'DEMAND_MULTIPLIER' : 'DEMAND MULTIPLIER',
|
||||||
|
'MINIMUM_PRESSURE' : 'MINIMUM PRESSURE',
|
||||||
|
'SERVICE_PRESSURE' : 'REQUIRED PRESSURE',
|
||||||
|
'PRESSURE_EXPONENT' : 'PRESSURE EXPONENT',
|
||||||
|
#'LEAKAGE_MODEL' : '',
|
||||||
|
#'LEAKAGE_COEFF1' : '',
|
||||||
|
#'LEAKAGE_COEFF2' : '',
|
||||||
|
'EMITTER_EXPONENT' : 'EMITTER EXPONENT',
|
||||||
|
'QUALITY_MODEL' : 'QUALITY',
|
||||||
|
#'QUALITY_NAME' : '',
|
||||||
|
#'QUALITY_UNITS' : '',
|
||||||
|
#'TRACE_NODE' : '',
|
||||||
|
'SPECIFIC_DIFFUSIVITY' : 'DIFFUSIVITY',
|
||||||
|
'QUALITY_TOLERANCE' : 'TOLERANCE'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def generate_v2(cs: ChangeSet) -> ChangeSet:
|
||||||
|
op = cs.operations[0]
|
||||||
|
|
||||||
|
if op['type'] == 'option':
|
||||||
|
return cs
|
||||||
|
|
||||||
|
map = _key_map_32
|
||||||
|
|
||||||
|
cs_v2 = {}
|
||||||
|
for key in op:
|
||||||
|
if key == 'operation' or key == 'type':
|
||||||
|
continue
|
||||||
|
|
||||||
|
if key in map.keys():
|
||||||
|
if key != 'QUALITY_MODEL' and key != 'DEMAND_MODEL':
|
||||||
|
cs_v2 |= { map[key] : op[key] }
|
||||||
|
elif key == 'QUALITY_MODEL':
|
||||||
|
if str(op[key]).upper() == 'TRACE' and 'TRACE_NODE' in op.keys():
|
||||||
|
cs_v2 |= { map[key] : f"TRACE {op['TRACE_NODE']}" }
|
||||||
|
else:
|
||||||
|
cs_v2 |= { map[key] : str(op[key]).upper() }
|
||||||
|
elif key == 'DEMAND_MODEL':
|
||||||
|
if op[key] == 'FIXED':
|
||||||
|
cs_v2 |= { map[key] : 'DDA' }
|
||||||
|
else:
|
||||||
|
cs_v2 |= { map[key] : 'PDA' }
|
||||||
|
|
||||||
|
if len(cs_v2) > 0:
|
||||||
|
cs_v2 |= g_update_prefix | { 'type' : 'option' }
|
||||||
|
return ChangeSet(cs_v2)
|
||||||
|
|
||||||
|
return ChangeSet()
|
||||||
|
|
||||||
|
|
||||||
|
def generate_v3(cs: ChangeSet) -> ChangeSet:
|
||||||
|
op = cs.operations[0]
|
||||||
|
|
||||||
|
if op['type'] == 'option_v3':
|
||||||
|
return cs
|
||||||
|
|
||||||
|
map = _key_map_23
|
||||||
|
|
||||||
|
cs_v3 = {}
|
||||||
|
for key in op:
|
||||||
|
if key == 'operation' or key == 'type':
|
||||||
|
continue
|
||||||
|
|
||||||
|
if key in map.keys():
|
||||||
|
if key != 'QUALITY' and key != 'DEMAND MODEL':
|
||||||
|
cs_v3 |= { map[key] : op[key] }
|
||||||
|
elif key == 'QUALITY':
|
||||||
|
tokens = str(op[key]).split()
|
||||||
|
if len(tokens) >= 1:
|
||||||
|
cs_v3 |= { map[key] : tokens[0].upper() }
|
||||||
|
if tokens[0].upper() == 'TRACE' and len(tokens) >= 2:
|
||||||
|
cs_v3 |= { 'TRACE_NODE' : tokens[1] }
|
||||||
|
elif key == 'DEMAND MODEL':
|
||||||
|
cs_v3 |= { map[key] : 'POWER' }
|
||||||
|
|
||||||
|
if len(cs_v3) > 0:
|
||||||
|
cs_v3 |= g_update_prefix | { 'type' : 'option_v3' }
|
||||||
|
return ChangeSet(cs_v3)
|
||||||
|
|
||||||
|
return ChangeSet()
|
||||||
@@ -5,6 +5,8 @@ from .s23_options import OPTION_HEADLOSS_HW, OPTION_HEADLOSS_DW, OPTION_HEADLOSS
|
|||||||
from .s23_options import OPTION_UNBALANCED_STOP, OPTION_UNBALANCED_CONTINUE
|
from .s23_options import OPTION_UNBALANCED_STOP, OPTION_UNBALANCED_CONTINUE
|
||||||
from .s23_options import OPTION_QUALITY_NONE, OPTION_QUALITY_CHEMICAL, OPTION_QUALITY_AGE, OPTION_QUALITY_TRACE
|
from .s23_options import OPTION_QUALITY_NONE, OPTION_QUALITY_CHEMICAL, OPTION_QUALITY_AGE, OPTION_QUALITY_TRACE
|
||||||
from .s23_options import element_schema
|
from .s23_options import element_schema
|
||||||
|
from .s23_options import get_option_schema
|
||||||
|
from .s23_options_util import generate_v2, generate_v3
|
||||||
|
|
||||||
OPTION_V3_FLOW_UNITS_CFS = OPTION_UNITS_CFS
|
OPTION_V3_FLOW_UNITS_CFS = OPTION_UNITS_CFS
|
||||||
OPTION_V3_FLOW_UNITS_GPM = OPTION_UNITS_GPM
|
OPTION_V3_FLOW_UNITS_GPM = OPTION_UNITS_GPM
|
||||||
@@ -130,15 +132,31 @@ def set_option_v3(name: str, cs: ChangeSet) -> ChangeSet:
|
|||||||
return execute_command(name, set_option_v3_cmd(name, cs))
|
return execute_command(name, set_option_v3_cmd(name, cs))
|
||||||
|
|
||||||
|
|
||||||
def _sync_to_v2() -> ChangeSet:
|
def _parse_v2(v2_lines: list[str]) -> dict[str, str]:
|
||||||
return ChangeSet()
|
cs_v2 = g_update_prefix | { 'type' : 'option' }
|
||||||
|
for s in v2_lines:
|
||||||
|
tokens = s.split()
|
||||||
|
if tokens[0].upper() == 'PATTERN': # can not upper id
|
||||||
|
cs_v2 |= { 'PATTERN' : tokens[1] }
|
||||||
|
elif tokens[0].upper() == 'QUALITY': # can not upper trace node
|
||||||
|
value = tokens[1]
|
||||||
|
if len(tokens) > 2:
|
||||||
|
value += f' {tokens[2]}'
|
||||||
|
cs_v2 |= { 'QUALITY' : value }
|
||||||
|
else:
|
||||||
|
line = s.upper().strip()
|
||||||
|
for key in get_option_schema('').keys():
|
||||||
|
if line.startswith(key):
|
||||||
|
value = line.removeprefix(key).strip()
|
||||||
|
cs_v2 |= { key : value }
|
||||||
|
return cs_v2
|
||||||
|
|
||||||
|
|
||||||
def inp_in_option_v3(section: list[str]) -> ChangeSet:
|
def inp_in_option_v3(section: list[str]) -> ChangeSet:
|
||||||
if len(section) <= 0:
|
if len(section) <= 0:
|
||||||
return ChangeSet()
|
return ChangeSet()
|
||||||
|
|
||||||
cs = g_update_prefix | { 'type' : 'option_v3' }
|
cs_v3 = g_update_prefix | { 'type' : 'option_v3' }
|
||||||
v2_lines = []
|
v2_lines = []
|
||||||
for s in section:
|
for s in section:
|
||||||
if s.startswith(';'):
|
if s.startswith(';'):
|
||||||
@@ -148,15 +166,16 @@ def inp_in_option_v3(section: list[str]) -> ChangeSet:
|
|||||||
key = tokens[0]
|
key = tokens[0]
|
||||||
if key in get_option_v3_schema('').keys():
|
if key in get_option_v3_schema('').keys():
|
||||||
value = tokens[1] if len(tokens) >= 2 else ''
|
value = tokens[1] if len(tokens) >= 2 else ''
|
||||||
cs |= { key : value }
|
cs_v3 |= { key : value }
|
||||||
else:
|
else:
|
||||||
v2_lines.append(s.strip())
|
v2_lines.append(s.strip())
|
||||||
|
|
||||||
for line in v2_lines:
|
# unlikely...
|
||||||
pass
|
cs_v2 = _parse_v2(v2_lines)
|
||||||
|
|
||||||
result = ChangeSet(cs)
|
result = ChangeSet(cs_v3)
|
||||||
result.merge(_sync_to_v2())
|
result.merge(generate_v3(ChangeSet(cs_v2)))
|
||||||
|
result.merge(generate_v2(result))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
@@ -166,5 +185,6 @@ def inp_out_option_v3(name: str) -> list[str]:
|
|||||||
for obj in objs:
|
for obj in objs:
|
||||||
key = obj['key']
|
key = obj['key']
|
||||||
value = obj['value']
|
value = obj['value']
|
||||||
lines.append(f'{key} {value}')
|
if value != '':
|
||||||
|
lines.append(f'{key} {value}')
|
||||||
return lines
|
return lines
|
||||||
|
|||||||
Reference in New Issue
Block a user