@@ -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-
115114class 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
0 commit comments