Skip to content

Commit 2fa2c75

Browse files
fix cli parsing
1 parent f9d8124 commit 2fa2c75

File tree

2 files changed

+49
-16
lines changed

2 files changed

+49
-16
lines changed

pythonfmu3/builder.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from xml.dom.minidom import parseString
1414
from xml.etree.ElementTree import Element, SubElement, tostring
1515
from .osutil import get_lib_extension, get_platform
16-
from .fmi3slave import FMI3_MODEL_OPTIONS, Fmi3Slave, Fmi3SlaveBase
16+
from .fmi3slave import FMI3_MODEL_OPTIONS_COMMON, FMI3_MODEL_OPTIONS_COSIM, FMI3_MODEL_OPTIONS_MX, Fmi3Slave, Fmi3SlaveBase
1717

1818
FilePath = Union[str, Path]
1919
HERE = Path(__file__).parent
@@ -137,16 +137,20 @@ def build_FMU(
137137
dest_file = dest / f"{model_identifier}.fmu"
138138

139139
type_node = xml.find("CoSimulation")
140-
option_names = [opt.name for opt in FMI3_MODEL_OPTIONS]
141-
if type_node:
140+
option_names = [opt.name for opt in FMI3_MODEL_OPTIONS_COMMON]
141+
cosim_option_names = option_names.copy()
142+
cosim_option_names.extend(opt.name for opt in FMI3_MODEL_OPTIONS_COSIM)
143+
if type_node is not None:
142144
for option, value in options.items():
143-
if option in option_names:
145+
if option in cosim_option_names:
144146
type_node.set(option, str(value).lower())
145147

146148
type_node = xml.find("ModelExchange")
147-
if type_node:
149+
mx_option_names = option_names.copy()
150+
mx_option_names.extend(opt.name for opt in FMI3_MODEL_OPTIONS_MX)
151+
if type_node is not None:
148152
for option, value in options.items():
149-
if option in option_names:
153+
if option in mx_option_names:
150154
type_node.set(option, str(value).lower())
151155

152156
with zipfile.ZipFile(dest_file, "w") as zip_fmu:
@@ -247,7 +251,25 @@ def create_command_parser(parser: argparse.ArgumentParser):
247251
default=None
248252
)
249253

250-
for option in FMI3_MODEL_OPTIONS:
254+
for option in FMI3_MODEL_OPTIONS_COMMON:
255+
action = "store_false" if option.value else "store_true"
256+
parser.add_argument(
257+
f"--{option.cli}",
258+
dest=option.name,
259+
help=f"If given, {option.name}={action[6:]}",
260+
action=action
261+
)
262+
263+
for option in FMI3_MODEL_OPTIONS_COSIM:
264+
action = "store_false" if option.value else "store_true"
265+
parser.add_argument(
266+
f"--{option.cli}",
267+
dest=option.name,
268+
help=f"If given, {option.name}={action[6:]}",
269+
action=action
270+
)
271+
272+
for option in FMI3_MODEL_OPTIONS_MX:
251273
action = "store_false" if option.value else "store_true"
252274
parser.add_argument(
253275
f"--{option.cli}",

pythonfmu3/fmi3slave.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,22 @@
2121

2222
ModelOptions = namedtuple("ModelOptions", ["name", "value", "cli"])
2323

24-
FMI3_MODEL_OPTIONS: List[ModelOptions] = [
24+
FMI3_MODEL_OPTIONS_COMMON: List[ModelOptions] = [
2525
ModelOptions("needsExecutionTool", True, "no-external-tool"),
26-
ModelOptions("canHandleVariableCommunicationStepSize", True, "no-variable-step"),
2726
ModelOptions("canBeInstantiatedOnlyOncePerProcess", False, "only-one-per-process"),
2827
ModelOptions("canGetAndSetFMUState", False, "handle-state"),
2928
ModelOptions("canSerializeFMUState", False, "serialize-state")
3029
]
3130

31+
FMI3_MODEL_OPTIONS_COSIM: List[ModelOptions] = [
32+
ModelOptions("canHandleVariableCommunicationStepSize", True, "no-variable-step"),
33+
]
34+
35+
FMI3_MODEL_OPTIONS_MX: List[ModelOptions] = [
36+
ModelOptions("needsCompletedIntegratorStep", False, "needs-completed-step"),
37+
]
38+
39+
3240
class Fmi3StepResult(NamedTuple):
3341
status: Fmi3Status = Fmi3Status.ok
3442
eventHandlingNeeded: bool = False
@@ -103,23 +111,26 @@ def to_xml(self, model_options: Dict[str, str] = dict()) -> Element:
103111
root = Element("fmiModelDescription", attrib)
104112

105113
options = dict()
106-
for option in FMI3_MODEL_OPTIONS:
114+
for option in FMI3_MODEL_OPTIONS_COMMON:
107115
value = model_options.get(option.name, option.value)
108116
options[option.name] = str(value).lower()
117+
109118
options["modelIdentifier"] = self.modelName
110-
options["canNotUseMemoryManagementFunctions"] = "true"
119+
120+
options_cs = options.copy()
121+
for option in FMI3_MODEL_OPTIONS_COSIM:
122+
options_cs[option.name] = str(value).lower()
111123

112-
options_me = dict()
113-
options_me["canGetAndSetFMUState"] = "true"
114-
options_me["modelIdentifier"] = self.modelName
115-
options_me["needsCompletedIntegratorStep"] = "false"
124+
options_me = options.copy()
125+
for option in FMI3_MODEL_OPTIONS_MX:
126+
options_me[option.name] = str(value).lower()
116127

117128
# check if we have cosim mixin or model exchange mixin
118129
if isinstance(self, ModelExchange):
119130
SubElement(root, "ModelExchange", attrib=options_me)
120131

121132
if isinstance(self, CoSimulation):
122-
SubElement(root, "CoSimulation", attrib=options)
133+
SubElement(root, "CoSimulation", attrib=options_cs)
123134

124135
if self.units:
125136
unit_defs = SubElement(root, "UnitDefinitions")

0 commit comments

Comments
 (0)