Skip to content

Commit 1ffc5b2

Browse files
committed
[ModelicaSystemCmd] special handling for override in simflags / simargs
1 parent 09f98b1 commit 1ffc5b2

File tree

1 file changed

+36
-9
lines changed

1 file changed

+36
-9
lines changed

OMPython/ModelicaSystem.py

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
import csv
3636
import logging
37+
import numbers
3738
import os
3839
import platform
3940
import re
@@ -128,7 +129,7 @@ def __init__(self, runpath: pathlib.Path, modelname: str, timeout: Optional[int]
128129
self._timeout = timeout
129130
self._args = {}
130131

131-
def arg_set(self, key: str, val: str = None) -> None:
132+
def arg_set(self, key: str, val: str | dict = None) -> None:
132133
"""
133134
Set one argument for the executeable model.
134135
@@ -140,14 +141,26 @@ def arg_set(self, key: str, val: str = None) -> None:
140141
if not isinstance(key, str):
141142
raise ModelicaSystemError(f"Invalid argument key: {repr(key)} (type: {type(key)})")
142143
key = key.strip()
143-
if val is not None:
144-
if not isinstance(val, str):
145-
raise ModelicaSystemError(f"Invalid argument value for {repr(key)}: {repr(val)} (type: {type(val)})")
146-
val = val.strip()
144+
if val is None:
145+
argval = None
146+
elif isinstance(val, str):
147+
argval = val.strip()
148+
elif isinstance(val, numbers.Number):
149+
argval = str(val)
150+
elif key == 'override' and isinstance(val, dict):
151+
argval = self._args['override'] if 'override' in self._args else {}
152+
for overwrite_key in val:
153+
if not isinstance(overwrite_key, str) or not isinstance(val[overwrite_key], (str, numbers.Number)):
154+
raise ModelicaSystemError("Invalid argument for 'override': "
155+
f"{repr(overwrite_key)} = {repr(val[overwrite_key])}")
156+
argval[overwrite_key] = val[overwrite_key]
157+
else:
158+
raise ModelicaSystemError(f"Invalid argument value for {repr(key)}: {repr(val)} (type: {type(val)})")
159+
147160
if key in self._args:
148-
logger.warning(f"Overwrite model executable argument: {repr(key)} = {repr(val)} "
161+
logger.warning(f"Overwrite model executable argument: {repr(key)} = {repr(argval)} "
149162
f"(was: {repr(self._args[key])})")
150-
self._args[key] = val
163+
self._args[key] = argval
151164

152165
def args_set(self, args: dict) -> None:
153166
"""
@@ -181,6 +194,9 @@ def run(self) -> bool:
181194
for key in self._args:
182195
if self._args[key] is None:
183196
cmdl.append(f"-{key}")
197+
elif key == 'override' and isinstance(self._args[key], dict):
198+
valstr = ','.join([f"{valkey}={str(self._args[key][valkey])}" for valkey in self._args[key]])
199+
cmdl.append(f"-{key}={valstr}")
184200
else:
185201
cmdl.append(f"-{key}={self._args[key]}")
186202

@@ -251,8 +267,19 @@ def parse_simflags(simflags: str) -> dict:
251267
parts = arg.split('=')
252268
if len(parts) == 1:
253269
simargs[parts[0]] = None
254-
else:
255-
simargs[parts[0]] = '='.join(parts[1:])
270+
elif parts[0] == 'override':
271+
override = '='.join(parts[1:])
272+
273+
simargs[parts[0]] = {}
274+
for item in override.split(','):
275+
kv = item.split('=')
276+
if not (0 < len(kv) < 3):
277+
raise ModelicaSystemError(f"Invalide value for '-override': {override}")
278+
if kv[0]:
279+
try:
280+
simargs[parts[0]][kv[0]] = kv[1]
281+
except (KeyError, IndexError) as ex:
282+
raise ModelicaSystemError(f"Invalide value for '-override': {override}") from ex
256283

257284
return simargs
258285

0 commit comments

Comments
 (0)