Skip to content

Commit 6e47458

Browse files
committed
Fix fmusplit
1 parent f876bc4 commit 6e47458

File tree

2 files changed

+41
-23
lines changed

2 files changed

+41
-23
lines changed

fmu_manipulation_toolbox/split.py

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -111,16 +111,10 @@ def extract_fmu(self, directory: str, filename: str):
111111
fmu_file.writestr(file[len(directory):], data)
112112
logger.info(f"FMU Extraction of '{filename}'")
113113

114-
115114
class FMUSplitterDescription:
116115
def __init__(self, zip):
117116
self.zip = zip
118-
self.links: Dict[str, Dict[int, FMUSplitterLink]] = {
119-
"Real": {},
120-
"Integer": {},
121-
"Boolean": {},
122-
"String": {}
123-
}
117+
self.links: Dict[str, Dict[int, FMUSplitterLink]] = dict((el, {}) for el in EmbeddedFMUPort.ALL_TYPES)
124118
self.vr_to_name: Dict[str, Dict[str, Dict[int, Dict[str, str]]]] = {} # name, fmi_type, vr <-> {name, causality}
125119
self.config: Dict[str, Any] = {
126120
"auto_input": False,
@@ -133,10 +127,11 @@ def __init__(self, zip):
133127

134128
# used for modelDescription.xml parsing
135129
self.current_fmu_filename = None
130+
self.current_fmi_version = None
136131
self.current_vr = None
137132
self.current_name = None
138133
self.current_causality = None
139-
self.supported_fmi_types: Tuple[str] = ()
134+
self.supported_fmi_types: Tuple[str] = tuple()
140135

141136
@staticmethod
142137
def get_line(file):
@@ -146,14 +141,23 @@ def get_line(file):
146141
return line
147142
raise StopIteration
148143

149-
def start_element(self, name, attrs):
150-
if name == "ScalarVariable":
144+
def start_element(self, tag, attrs):
145+
if tag == "fmiModelDescription":
146+
self.current_fmi_version = attrs["fmiVersion"]
147+
elif tag == "ScalarVariable":
151148
self.current_name = attrs["name"]
152149
self.current_vr = int(attrs["valueReference"])
153150
self.current_causality = attrs["causality"]
154-
elif name in self.vr_to_name[self.current_fmu_filename]:
155-
self.vr_to_name[self.current_fmu_filename][name][self.current_vr] = {"name": self.current_name,
156-
"causality": self.current_causality}
151+
elif self.current_fmi_version == "2.0" and tag in EmbeddedFMUPort.FMI_TO_CONTAINER[2]:
152+
fmi_type = EmbeddedFMUPort.FMI_TO_CONTAINER[2][tag]
153+
self.vr_to_name[self.current_fmu_filename][fmi_type][self.current_vr] = {
154+
"name": self.current_name,
155+
"causality": self.current_causality}
156+
elif self.current_fmi_version == "3.0" and tag in EmbeddedFMUPort.FMI_TO_CONTAINER[3]:
157+
fmi_type = EmbeddedFMUPort.FMI_TO_CONTAINER[3][tag]
158+
self.vr_to_name[self.current_fmu_filename][fmi_type][int(attrs["valueReference"])] = {
159+
"name": attrs["name"],
160+
"causality": attrs["causality"]}
157161
else:
158162
self.current_vr = None
159163
self.current_name = None
@@ -166,14 +170,10 @@ def parse_model_description(self, directory: str, fmu_filename: str):
166170
else:
167171
filename = f"{directory}/modelDescription.xml"
168172

169-
self.vr_to_name[fmu_filename] = {
170-
"Real": {},
171-
"Integer": {},
172-
"Boolean": {},
173-
"String": {}
174-
}
173+
self.vr_to_name[fmu_filename] = dict((el, {}) for el in EmbeddedFMUPort.ALL_TYPES)
175174
parser = xml.parsers.expat.ParserCreate()
176175
self.current_fmu_filename = fmu_filename
176+
self.current_fmi_version = None
177177
self.current_vr = None
178178
self.current_name = None
179179
self.current_causality = None
@@ -266,14 +266,14 @@ def parse_txt_file_ports(self, file):
266266
def parse_txt_file(self, txt_filename: str):
267267
self.parse_model_description(str(Path(txt_filename).parent.parent), ".")
268268
logger.debug(f"Parsing container file '{txt_filename}'")
269-
270269
with (self.zip.open(txt_filename) as file):
271270
self.parse_txt_file_header(file, txt_filename)
272271
self.parse_txt_file_ports(file)
273272

274273
for fmu_filename in self.config["candidate_fmu"]:
275274
# Inputs per FMUs
276-
for fmi_type in ("Real", "Integer", "Boolean", "String"):
275+
276+
for fmi_type in self.supported_fmi_types:
277277
nb_input = int(self.get_line(file))
278278
for i in range(nb_input):
279279
local, vr = self.get_line(file).split(" ")
@@ -285,7 +285,7 @@ def parse_txt_file(self, txt_filename: str):
285285
link.to_port.append(FMUSplitterPort(fmu_filename,
286286
self.vr_to_name[fmu_filename][fmi_type][int(vr)]["name"]))
287287

288-
for fmi_type in ("Real", "Integer", "Boolean", "String"):
288+
for fmi_type in self.supported_fmi_types:
289289
nb_start = int(self.get_line(file))
290290
for i in range(nb_start):
291291
tokens = self.get_line(file).split(" ")
@@ -299,7 +299,7 @@ def parse_txt_file(self, txt_filename: str):
299299
self.config["start"] = [start_definition]
300300

301301
# Output per FMUs
302-
for fmi_type in ("Real", "Integer", "Boolean", "String"):
302+
for fmi_type in self.supported_fmi_types:
303303
nb_output = int(self.get_line(file))
304304

305305
for i in range(nb_output):
@@ -311,6 +311,10 @@ def parse_txt_file(self, txt_filename: str):
311311
self.links[fmi_type][local] = link
312312
link.from_port = FMUSplitterPort(fmu_filename,
313313
self.vr_to_name[fmu_filename][fmi_type][int(vr)]["name"])
314+
#conversion
315+
nb_conversion = int(self.get_line(file))
316+
for i in range(nb_conversion):
317+
self.get_line(file)
314318

315319
logger.debug("End of parsing.")
316320

tests/containers/ssp/REF-split-bouncing.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,20 @@
88
"profiling": false,
99
"sequential": false,
1010
"step_size": 0.001,
11+
"link": [
12+
[
13+
"bb_velocity.fmu",
14+
"velocity",
15+
"bb_position.fmu",
16+
"velocity"
17+
],
18+
[
19+
"bb_position.fmu",
20+
"is_ground",
21+
"bb_velocity.fmu",
22+
"reset"
23+
]
24+
],
1125
"name": "bouncing.fmu",
1226
"fmu": [
1327
"bb_velocity.fmu",

0 commit comments

Comments
 (0)