3434
3535import csv
3636import logging
37+ import numbers
3738import os
3839import platform
3940import 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