fmu-manipulation-toolbox 1.8.4.2rc1__py3-none-any.whl → 1.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. fmu_manipulation_toolbox/__init__.py +0 -1
  2. fmu_manipulation_toolbox/__main__.py +1 -1
  3. fmu_manipulation_toolbox/__version__.py +1 -1
  4. fmu_manipulation_toolbox/assembly.py +22 -13
  5. fmu_manipulation_toolbox/checker.py +16 -11
  6. fmu_manipulation_toolbox/cli/__init__.py +0 -0
  7. fmu_manipulation_toolbox/cli/fmucontainer.py +105 -0
  8. fmu_manipulation_toolbox/cli/fmusplit.py +48 -0
  9. fmu_manipulation_toolbox/cli/fmutool.py +127 -0
  10. fmu_manipulation_toolbox/cli/utils.py +36 -0
  11. fmu_manipulation_toolbox/container.py +1054 -0
  12. fmu_manipulation_toolbox/gui.py +48 -56
  13. fmu_manipulation_toolbox/gui_style.py +8 -0
  14. fmu_manipulation_toolbox/help.py +3 -0
  15. fmu_manipulation_toolbox/operations.py +577 -0
  16. fmu_manipulation_toolbox/remoting.py +107 -0
  17. fmu_manipulation_toolbox/resources/darwin64/container.dylib +0 -0
  18. fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Annotation.xsd +51 -0
  19. fmu_manipulation_toolbox/resources/fmi-3.0/fmi3AttributeGroups.xsd +119 -0
  20. fmu_manipulation_toolbox/resources/fmi-3.0/fmi3BuildDescription.xsd +117 -0
  21. fmu_manipulation_toolbox/resources/fmi-3.0/fmi3InterfaceType.xsd +80 -0
  22. fmu_manipulation_toolbox/resources/fmi-3.0/fmi3LayeredStandardManifest.xsd +93 -0
  23. fmu_manipulation_toolbox/resources/fmi-3.0/fmi3ModelDescription.xsd +131 -0
  24. fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Terminal.xsd +87 -0
  25. fmu_manipulation_toolbox/resources/fmi-3.0/fmi3TerminalsAndIcons.xsd +84 -0
  26. fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Type.xsd +207 -0
  27. fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Unit.xsd +69 -0
  28. fmu_manipulation_toolbox/resources/fmi-3.0/fmi3Variable.xsd +413 -0
  29. fmu_manipulation_toolbox/resources/fmi-3.0/fmi3VariableDependency.xsd +64 -0
  30. fmu_manipulation_toolbox/resources/linux32/client_sm.so +0 -0
  31. fmu_manipulation_toolbox/resources/linux32/server_sm +0 -0
  32. fmu_manipulation_toolbox/resources/linux64/client_sm.so +0 -0
  33. fmu_manipulation_toolbox/resources/linux64/container.so +0 -0
  34. fmu_manipulation_toolbox/resources/linux64/server_sm +0 -0
  35. fmu_manipulation_toolbox/resources/win32/client_sm.dll +0 -0
  36. fmu_manipulation_toolbox/resources/win32/server_sm.exe +0 -0
  37. fmu_manipulation_toolbox/resources/win64/client_sm.dll +0 -0
  38. fmu_manipulation_toolbox/resources/win64/container.dll +0 -0
  39. fmu_manipulation_toolbox/resources/win64/server_sm.exe +0 -0
  40. fmu_manipulation_toolbox/split.py +331 -0
  41. {fmu_manipulation_toolbox-1.8.4.2rc1.dist-info → fmu_manipulation_toolbox-1.9.dist-info}/METADATA +1 -1
  42. fmu_manipulation_toolbox-1.9.dist-info/RECORD +71 -0
  43. fmu_manipulation_toolbox-1.9.dist-info/entry_points.txt +7 -0
  44. fmu_manipulation_toolbox/cli.py +0 -235
  45. fmu_manipulation_toolbox/fmu_container.py +0 -753
  46. fmu_manipulation_toolbox/fmu_operations.py +0 -489
  47. fmu_manipulation_toolbox-1.8.4.2rc1.dist-info/RECORD +0 -52
  48. fmu_manipulation_toolbox-1.8.4.2rc1.dist-info/entry_points.txt +0 -3
  49. {fmu_manipulation_toolbox-1.8.4.2rc1.dist-info → fmu_manipulation_toolbox-1.9.dist-info}/WHEEL +0 -0
  50. {fmu_manipulation_toolbox-1.8.4.2rc1.dist-info → fmu_manipulation_toolbox-1.9.dist-info}/licenses/LICENSE.txt +0 -0
  51. {fmu_manipulation_toolbox-1.8.4.2rc1.dist-info → fmu_manipulation_toolbox-1.9.dist-info}/top_level.txt +0 -0
@@ -1,489 +0,0 @@
1
- import csv
2
- import html
3
- import os
4
- import re
5
- import shutil
6
- import tempfile
7
- import xml.parsers.expat
8
- import zipfile
9
- import hashlib
10
- from pathlib import Path
11
-
12
-
13
- class FMU:
14
- """Unpack and Repack facilities for FMU package. Once unpacked, we can process Operation on
15
- modelDescription.xml file."""
16
- def __init__(self, fmu_filename):
17
- self.fmu_filename = fmu_filename
18
- self.tmp_directory = tempfile.mkdtemp()
19
-
20
- try:
21
- with zipfile.ZipFile(self.fmu_filename) as zin:
22
- zin.extractall(self.tmp_directory)
23
- except FileNotFoundError:
24
- raise FMUException(f"'{fmu_filename}' does not exist")
25
- self.descriptor_filename = os.path.join(self.tmp_directory, "modelDescription.xml")
26
- if not os.path.isfile(self.descriptor_filename):
27
- raise FMUException(f"'{fmu_filename}' is not valid: {self.descriptor_filename} not found")
28
-
29
- def __del__(self):
30
- shutil.rmtree(self.tmp_directory)
31
-
32
- def save_descriptor(self, filename):
33
- shutil.copyfile(os.path.join(self.tmp_directory, "modelDescription.xml"), filename)
34
-
35
- def repack(self, filename):
36
- with zipfile.ZipFile(filename, "w", zipfile.ZIP_DEFLATED) as zout:
37
- for root, dirs, files in os.walk(self.tmp_directory):
38
- for file in files:
39
- zout.write(os.path.join(root, file),
40
- os.path.relpath(os.path.join(root, file), self.tmp_directory))
41
- # TODO: Add check on output file
42
-
43
- def apply_operation(self, operation, apply_on=None):
44
- manipulation = Manipulation(operation, self)
45
- manipulation.manipulate(self.descriptor_filename, apply_on)
46
-
47
-
48
- class FMUException(Exception):
49
- def __init__(self, reason):
50
- self.reason = reason
51
-
52
- def __repr__(self):
53
- return self.reason
54
-
55
-
56
- class Manipulation:
57
- """Parse modelDescription.xml file and create a modified version"""
58
- def __init__(self, operation, fmu):
59
- self.output_filename = tempfile.mktemp()
60
- self.out = None
61
- self.operation = operation
62
- self.parser = xml.parsers.expat.ParserCreate()
63
- self.parser.StartElementHandler = self.start_element
64
- self.parser.EndElementHandler = self.end_element
65
- self.parser.CharacterDataHandler = self.char_data
66
- self.skip_until = None
67
- self.operation.set_fmu(fmu)
68
-
69
- self.current_port = 0
70
- self.port_translation = []
71
- self.port_name = []
72
- self.apply_on = None
73
-
74
- @staticmethod
75
- def escape(value):
76
- if isinstance(value, str):
77
- return html.escape(html.unescape(value))
78
- else:
79
- return value
80
-
81
- def start_element(self, name, attrs):
82
- if self.skip_until:
83
- return
84
- try:
85
- if name == 'ScalarVariable':
86
- causality = OperationAbstract.scalar_get_causality(attrs)
87
- if not self.apply_on or causality in self.apply_on:
88
- if self.operation.scalar_attrs(attrs):
89
- self.remove_port(attrs['name'])
90
- else:
91
- self.keep_port(attrs['name'])
92
- else: # Keep ScalarVariable as it is.
93
- self.keep_port(attrs['name'])
94
- elif name == 'CoSimulation':
95
- self.operation.cosimulation_attrs(attrs)
96
- elif name == 'DefaultExperiment':
97
- self.operation.experiment_attrs(attrs)
98
- elif name == 'fmiModelDescription':
99
- self.operation.fmi_attrs(attrs)
100
- elif name == 'Unknown':
101
- self.unknown_attrs(attrs)
102
- elif name in ('Real', 'Integer', 'String', 'Boolean', 'Enumeration'):
103
- self.operation.scalar_type(name, attrs)
104
-
105
- except ManipulationSkipTag:
106
- self.skip_until = name
107
- return
108
-
109
- if attrs:
110
- attrs_list = [f'{key}="{self.escape(value)}"' for (key, value) in attrs.items()]
111
- print(f"<{name}", " ".join(attrs_list), ">", end='', file=self.out)
112
- else:
113
- print(f"<{name}>", end='', file=self.out)
114
-
115
- def end_element(self, name):
116
- if self.skip_until:
117
- if self.skip_until == name:
118
- self.skip_until = None
119
- return
120
- else:
121
- print(f"</{name}>", end='', file=self.out)
122
-
123
- def char_data(self, data):
124
- if not self.skip_until:
125
- print(data, end='', file=self.out)
126
-
127
- def remove_port(self, name):
128
- self.port_name.append(name)
129
- self.port_translation.append(None)
130
- raise ManipulationSkipTag
131
-
132
- def keep_port(self, name):
133
- self.port_name.append(name)
134
- self.current_port += 1
135
- self.port_translation.append(self.current_port)
136
-
137
- def unknown_attrs(self, attrs):
138
- index = int(attrs['index']) - 1
139
- new_index = self.port_translation[index]
140
- if new_index:
141
- attrs['index'] = self.port_translation[int(attrs['index']) - 1]
142
- else:
143
- print(f"WARNING: Removed port '{self.port_name[index]}' is involved in dependencies tree.")
144
- raise ManipulationSkipTag
145
-
146
- def manipulate(self, descriptor_filename, apply_on=None):
147
- self.apply_on = apply_on
148
- with open(self.output_filename, "w", encoding="utf-8") as self.out, open(descriptor_filename, "rb") as file:
149
- self.parser.ParseFile(file)
150
- self.operation.closure()
151
- os.replace(self.output_filename, descriptor_filename)
152
-
153
-
154
- class ManipulationSkipTag(Exception):
155
- """Exception: We need to skip every thing until matching closing tag"""
156
-
157
-
158
- class OperationAbstract:
159
- """This class hold hooks called during parsing"""
160
- fmu: FMU = None
161
-
162
- def set_fmu(self, fmu):
163
- self.fmu = fmu
164
-
165
- def fmi_attrs(self, attrs):
166
- pass
167
-
168
- def scalar_attrs(self, attrs) -> int:
169
- """ return 0 to keep port, otherwise remove it"""
170
- return 0
171
-
172
- def cosimulation_attrs(self, attrs):
173
- pass
174
-
175
- def experiment_attrs(self, attrs):
176
- pass
177
-
178
- def scalar_type(self, type_name, attrs):
179
- pass
180
-
181
- def closure(self):
182
- pass
183
-
184
- @staticmethod
185
- def scalar_get_causality(attrs) -> str:
186
- try:
187
- causality = attrs['causality']
188
- except KeyError:
189
- causality = 'local' # Default value according to FMI Specifications.
190
-
191
- return causality
192
-
193
-
194
- class OperationSaveNamesToCSV(OperationAbstract):
195
- def __repr__(self):
196
- return f"Dump names into '{self.output_filename}'"
197
-
198
- def __init__(self, filename):
199
- self.output_filename = filename
200
- self.csvfile = open(filename, 'w', newline='')
201
- self.writer = csv.writer(self.csvfile, delimiter=';', quotechar="'", quoting=csv.QUOTE_MINIMAL)
202
- self.writer.writerow(['name', 'newName', 'valueReference', 'causality', 'variability', 'scalarType',
203
- 'startValue'])
204
- self.name = None
205
- self.vr = None
206
- self.variability = None
207
- self.causality = None
208
-
209
- def reset(self):
210
- self.name = None
211
- self.vr = None
212
- self.variability = None
213
- self.causality = None
214
-
215
- def closure(self):
216
- self.csvfile.close()
217
-
218
- def scalar_attrs(self, attrs):
219
- self.name = attrs['name']
220
- self.vr = attrs['valueReference']
221
- self.causality = self.scalar_get_causality(attrs)
222
-
223
- try:
224
- self.variability = attrs['variability']
225
- except KeyError:
226
- self.variability = 'continuous' # Default value according to FMI Specifications.
227
-
228
- return 0
229
-
230
- def scalar_type(self, type_name, attrs):
231
- if "start" in attrs:
232
- start = attrs["start"]
233
- else:
234
- start = ""
235
- self.writer.writerow([self.name, self.name, self.vr, self.causality, self.variability, type_name, start])
236
- self.reset()
237
-
238
-
239
- class OperationStripTopLevel(OperationAbstract):
240
- def __repr__(self):
241
- return "Remove Top Level Bus"
242
-
243
- def scalar_attrs(self, attrs):
244
- new_name = attrs['name'].split('.', 1)[-1]
245
- attrs['name'] = new_name
246
- return 0
247
-
248
-
249
- class OperationMergeTopLevel(OperationAbstract):
250
- def __repr__(self):
251
- return "Merge Top Level Bus with signal names"
252
-
253
- def scalar_attrs(self, attrs):
254
- old = attrs['name']
255
- attrs['name'] = old.replace('.', '_', 1)
256
- return 0
257
-
258
-
259
- class OperationRenameFromCSV(OperationAbstract):
260
- def __repr__(self):
261
- return f"Rename according to '{self.csv_filename}'"
262
-
263
- def __init__(self, csv_filename):
264
- self.csv_filename = csv_filename
265
- self.translations = {}
266
- self.current_port = 0
267
- self.port_translation = []
268
- try:
269
- with open(csv_filename, newline='') as csvfile:
270
- reader = csv.reader(csvfile, delimiter=';', quotechar="'")
271
- for row in reader:
272
- self.translations[row[0]] = row[1]
273
- except FileNotFoundError:
274
- raise OperationException(f"file '{csv_filename}' is not found")
275
- except KeyError:
276
- raise OperationException(f"file '{csv_filename}' should contain two columns")
277
-
278
- def scalar_attrs(self, attrs):
279
- name = attrs['name']
280
- try:
281
- new_name = self.translations[attrs['name']]
282
- except KeyError:
283
- new_name = name # if port is not in CSV file, keep old name
284
-
285
- if new_name:
286
- attrs['name'] = new_name
287
- return 0
288
- else:
289
- # we want to delete this name!
290
- return 1
291
-
292
-
293
- class OperationAddRemotingWinAbstract(OperationAbstract):
294
- bitness_from = None
295
- bitness_to = None
296
-
297
- def __repr__(self):
298
- return f"Add '{self.bitness_to}' remoting on '{self.bitness_from}' FMU"
299
-
300
- def cosimulation_attrs(self, attrs):
301
- fmu_bin = {
302
- "win32": os.path.join(self.fmu.tmp_directory, "binaries", f"win32"),
303
- "win64": os.path.join(self.fmu.tmp_directory, "binaries", f"win64"),
304
- }
305
-
306
- if not os.path.isdir(fmu_bin[self.bitness_from]):
307
- raise OperationException(f"{self.bitness_from} interface does not exist")
308
-
309
- if os.path.isdir(fmu_bin[self.bitness_to]):
310
- print(f"INFO: {self.bitness_to} already exists. Add front-end.")
311
- shutil.move(os.path.join(fmu_bin[self.bitness_to], attrs['modelIdentifier'] + ".dll"),
312
- os.path.join(fmu_bin[self.bitness_to], attrs['modelIdentifier'] + "-remoted.dll"))
313
- else:
314
- os.mkdir(fmu_bin[self.bitness_to])
315
-
316
- to_path = Path(__file__).parent / "resources" / self.bitness_to
317
- shutil.copyfile(to_path / "client_sm.dll",
318
- Path(fmu_bin[self.bitness_to]) / Path(attrs['modelIdentifier']).with_suffix(".dll"))
319
-
320
- from_path = Path(__file__).parent / "resources" / self.bitness_from
321
- shutil.copyfile(from_path / "server_sm.exe",
322
- Path(fmu_bin[self.bitness_from]) / "server_sm.exe")
323
-
324
- shutil.copyfile(Path(__file__).parent / "resources" / "license.txt",
325
- Path(fmu_bin[self.bitness_to]) / "license.txt")
326
-
327
-
328
- class OperationAddRemotingWin64(OperationAddRemotingWinAbstract):
329
- bitness_from = "win32"
330
- bitness_to = "win64"
331
-
332
-
333
- class OperationAddFrontendWin32(OperationAddRemotingWinAbstract):
334
- bitness_from = "win32"
335
- bitness_to = "win32"
336
-
337
-
338
- class OperationAddFrontendWin64(OperationAddRemotingWinAbstract):
339
- bitness_from = "win64"
340
- bitness_to = "win64"
341
-
342
-
343
- class OperationAddRemotingWin32(OperationAddRemotingWinAbstract):
344
- bitness_from = "win64"
345
- bitness_to = "win32"
346
-
347
-
348
- class OperationRemoveRegexp(OperationAbstract):
349
- def __repr__(self):
350
- return f"Remove ports matching '{self.regex_string}'"
351
-
352
- def __init__(self, regex_string):
353
- self.regex_string = regex_string
354
- self.regex = re.compile(regex_string)
355
- self.current_port = 0
356
- self.port_translation = []
357
-
358
- def scalar_attrs(self, attrs):
359
- name = attrs['name']
360
- if self.regex.match(name):
361
- return 1 # Remove port
362
- else:
363
- return 0
364
-
365
-
366
- class OperationKeepOnlyRegexp(OperationAbstract):
367
- def __repr__(self):
368
- return f"Keep only ports matching '{self.regex_string}'"
369
-
370
- def __init__(self, regex_string):
371
- self.regex_string = regex_string
372
- self.regex = re.compile(regex_string)
373
-
374
- def scalar_attrs(self, attrs):
375
- name = attrs['name']
376
- if self.regex.match(name):
377
- return 0
378
- else:
379
- return 1 # Remove port
380
-
381
-
382
- class OperationSummary(OperationAbstract):
383
- def __init__(self):
384
- self.nb_port_per_causality = {}
385
-
386
- def __repr__(self):
387
- return f"FMU Summary"
388
-
389
- def fmi_attrs(self, attrs):
390
- print(f"| fmu filename = {self.fmu.fmu_filename}")
391
- print(f"| temporary directory = {self.fmu.tmp_directory}")
392
- hash_md5 = hashlib.md5()
393
- with open(self.fmu.fmu_filename, "rb") as f:
394
- for chunk in iter(lambda: f.read(4096), b""):
395
- hash_md5.update(chunk)
396
- digest = hash_md5.hexdigest()
397
- print(f"| MD5Sum = {digest}")
398
-
399
- print(f"|\n| FMI properties: ")
400
- for (k, v) in attrs.items():
401
- print(f"| - {k} = {v}")
402
- print(f"|")
403
-
404
- def cosimulation_attrs(self, attrs):
405
- print("| Co-Simulation capabilities: ")
406
- for (k, v) in attrs.items():
407
- print(f"| - {k} = {v}")
408
- print(f"|")
409
-
410
- def experiment_attrs(self, attrs):
411
- print("| Default Experiment values: ")
412
- for (k, v) in attrs.items():
413
- print(f"| - {k} = {v}")
414
- print(f"|")
415
-
416
- def scalar_attrs(self, attrs) -> int:
417
- causality = self.scalar_get_causality(attrs)
418
-
419
- try:
420
- self.nb_port_per_causality[causality] += 1
421
- except KeyError:
422
- self.nb_port_per_causality[causality] = 1
423
-
424
- return 0
425
-
426
- def closure(self):
427
- print("| Supported platforms: ")
428
- try:
429
- for platform in os.listdir(os.path.join(self.fmu.tmp_directory, "binaries")):
430
- print(f"| - {platform}")
431
- except FileNotFoundError:
432
- pass # no binaries
433
-
434
- if os.path.isdir(os.path.join(self.fmu.tmp_directory, "sources")):
435
- print(f"| - RT (sources available)")
436
-
437
- resource_dir = os.path.join(self.fmu.tmp_directory, "resources")
438
- if os.path.isdir(resource_dir):
439
- print("|\n| Embedded resources:")
440
- for resource in os.listdir(resource_dir):
441
- print(f"| - {resource}")
442
-
443
- extra_dir = os.path.join(self.fmu.tmp_directory, "extra")
444
- if os.path.isdir(extra_dir):
445
- print("|\n| Additional (meta-)data:")
446
- for extra in os.listdir(extra_dir):
447
- print(f"| - {extra}")
448
-
449
- print("|\n| Number of signals")
450
- for causality, nb_ports in self.nb_port_per_causality.items():
451
- print(f"| {causality} : {nb_ports}")
452
-
453
- print("|\n| [End of report]")
454
-
455
-
456
- class OperationRemoveSources(OperationAbstract):
457
- def __repr__(self):
458
- return f"Remove sources"
459
-
460
- def cosimulation_attrs(self, attrs):
461
- try:
462
- shutil.rmtree(os.path.join(self.fmu.tmp_directory, "sources"))
463
- except FileNotFoundError:
464
- print("This FMU does not embed sources.")
465
-
466
-
467
- class OperationTrimUntil(OperationAbstract):
468
- def __init__(self, separator):
469
- self.separator = separator
470
-
471
- def __repr__(self):
472
- return f"Trim names until (and including) '{self.separator}'"
473
-
474
- def scalar_attrs(self, attrs) -> int:
475
- name = attrs['name']
476
- try:
477
- attrs['name'] = name[name.index(self.separator)+len(self.separator):-1]
478
- except KeyError:
479
- pass # no separator
480
-
481
- return 0
482
-
483
-
484
- class OperationException(Exception):
485
- def __init__(self, reason):
486
- self.reason = reason
487
-
488
- def __repr__(self):
489
- return self.reason
@@ -1,52 +0,0 @@
1
- fmu_manipulation_toolbox/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
2
- fmu_manipulation_toolbox/__main__.py,sha256=mAzrtkil506DS0F3g3CEbHdtZsZotzntcNhIn_lNJkw,344
3
- fmu_manipulation_toolbox/__version__.py,sha256=jnm0HeOalO32T8hqtCK89pKFbJPLz-YFYj_G4Pi_q6M,15
4
- fmu_manipulation_toolbox/assembly.py,sha256=p8c8l2BLexns21ADr8WhmedLO015Oma1tOHEYZwvgpk,25900
5
- fmu_manipulation_toolbox/checker.py,sha256=lE2MpH4BAKCDjUvbr06N56u7ao8hWXaJgMKaLvmhFTQ,2272
6
- fmu_manipulation_toolbox/cli.py,sha256=2p5T1qp7kTcMlScwmvXyUfEmAIGSJsld96ObY216QMA,10616
7
- fmu_manipulation_toolbox/fmu_container.py,sha256=V6-pcAdkj380h16Gbxe0kmzfw1n8GDoqmpI270v2ZsE,32079
8
- fmu_manipulation_toolbox/fmu_operations.py,sha256=zxsbwnfctmTv-wU37GiiaX3CFM7LmvXAVDCNpdVyRZo,15886
9
- fmu_manipulation_toolbox/gui.py,sha256=3y_3CjPr-R-Oa5DTCm0LLnOLVG0_IFjadpNjACAmayQ,29222
10
- fmu_manipulation_toolbox/gui_style.py,sha256=uzEruJumnC5Vf2cfHXVa_c-SHAQoTvDWemro3-b9Mpc,6492
11
- fmu_manipulation_toolbox/help.py,sha256=aklKiLrsE0adSzQ5uoEB1sBDmI6s4l231gavu4XxxzA,5856
12
- fmu_manipulation_toolbox/version.py,sha256=OhBLkZ1-nhC77kyvffPNAf6m8OZe1bYTnNf_PWs1NvM,392
13
- fmu_manipulation_toolbox/resources/checkbox-checked-disabled.png,sha256=FWIuyrXlaNLLePHfXj7j9ca5rT8Hgr14KCe1EqTCZyk,2288
14
- fmu_manipulation_toolbox/resources/checkbox-checked-hover.png,sha256=KNlV-d_aJNTTvUVXKGT9DBY30sIs2LwocLJrFKNKv8k,2419
15
- fmu_manipulation_toolbox/resources/checkbox-checked.png,sha256=gzyFqvRFsZixVh6ZlV4SMWUKzglY1rSn7SvJUKMVvtk,2411
16
- fmu_manipulation_toolbox/resources/checkbox-unchecked-disabled.png,sha256=KNdiE8zJ8H-mH81spHL8Ck-V87dj-fPPPrPNZFRv3wA,1783
17
- fmu_manipulation_toolbox/resources/checkbox-unchecked-hover.png,sha256=7XT54vwzDfSK-i6oJ5BBKGXKz8duRRVtoUzaOlWX0WE,1797
18
- fmu_manipulation_toolbox/resources/checkbox-unchecked.png,sha256=w3MG3RwFeTwkVOAFi8ZBs6yNlmtVnXxXY5atNyvLw54,1793
19
- fmu_manipulation_toolbox/resources/container.png,sha256=DnMSCl4hlZqYuLDJpE4EnKIhYYXRbUZ7C_Q2HmAOaHU,16682
20
- fmu_manipulation_toolbox/resources/drop_fmu.png,sha256=Q7yWe3hzBYuou2xlPN9Yg9lgQYFSVuYxGnp_SRwkVe0,10344
21
- fmu_manipulation_toolbox/resources/fmu.png,sha256=QrNZ5PRaana0r-7pbluYf20m8ngzOZEZWi-MPSQG1eU,47050
22
- fmu_manipulation_toolbox/resources/fmu_manipulation_toolbox.png,sha256=iuztmrW9f3Ayi4fe_WdkYZbI1VXrCa1HVasfIhW5J18,38023
23
- fmu_manipulation_toolbox/resources/help.png,sha256=WrIbjmlgIqdo6UWYj6L6gG-BCGWlu4qma8HRgRk8k7o,1822
24
- fmu_manipulation_toolbox/resources/icon-round.png,sha256=j7jk-9NVQQZJMNazjpj8WeC1q6ptXwTaiO38kPoDEnE,83754
25
- fmu_manipulation_toolbox/resources/icon.png,sha256=Ovui-UDBARqdTlVQwTn5Ud8seSsVh9pdElwLq5s6xKg,69976
26
- fmu_manipulation_toolbox/resources/icon_fmu.png,sha256=EuygB2xcoM2WAfKKdyKG_UvTL8coM4CkpHSIsSCe_Ks,5189
27
- fmu_manipulation_toolbox/resources/license.txt,sha256=5ODuU8g8pIkK-NMWXu_rjZ6k7gM7b-N2rmg87-2Kmqw,1583
28
- fmu_manipulation_toolbox/resources/mask.png,sha256=px1U4hQGL0AmZ4BQPknOVREpMpTSejbah3ntkpqAzFA,3008
29
- fmu_manipulation_toolbox/resources/model.png,sha256=EAf_HnZJe8zYGZygerG1MMt2U-tMMZlifzXPj4_iORA,208788
30
- fmu_manipulation_toolbox/resources/fmi-2.0/fmi2Annotation.xsd,sha256=OGfyJtaJntKypX5KDpuZ-nV1oYLZ6HV16pkpKOmYox4,2731
31
- fmu_manipulation_toolbox/resources/fmi-2.0/fmi2AttributeGroups.xsd,sha256=HwyV7LBse-PQSv4z1xjmtzPU3Hjnv4mluq9YdSBNHMQ,3704
32
- fmu_manipulation_toolbox/resources/fmi-2.0/fmi2ModelDescription.xsd,sha256=JM4j_9q-pc40XYHb28jfT3iV3aYM5JLqD5aRjO72K1E,18939
33
- fmu_manipulation_toolbox/resources/fmi-2.0/fmi2ScalarVariable.xsd,sha256=hYZGmhvHBuycWMGe1Gt9xQY82c4Ek_5wAO1P2xu5txQ,9675
34
- fmu_manipulation_toolbox/resources/fmi-2.0/fmi2Type.xsd,sha256=8A0hl2wb1suoxv47xezkmvVTyJM2ZJp5RPQ2xQ_SjlY,3883
35
- fmu_manipulation_toolbox/resources/fmi-2.0/fmi2Unit.xsd,sha256=pB9Pe-yBMGZN-JQAu6VB_lXS99kz23mwiUSY74ONZd4,5403
36
- fmu_manipulation_toolbox/resources/fmi-2.0/fmi2VariableDependency.xsd,sha256=Tc9RWKqvUXpB1qsoU64DAHO4Gfu5DotrQJ3Ece7GnTU,4647
37
- fmu_manipulation_toolbox/resources/linux32/client_sm.so,sha256=xVdY2zy13pa2DcvFiweSNpp7E6DiONqeoBdlcJHrW_k,35940
38
- fmu_manipulation_toolbox/resources/linux32/server_sm,sha256=1TLGqNPyM5UVOrCfzNqWyF6ClLksY3EiY3CSsrnp6c0,22836
39
- fmu_manipulation_toolbox/resources/linux64/client_sm.so,sha256=EhY1XHo1YcQn6yqZ7wk5okqtZyp0MrcCsGcudqE-aIM,37000
40
- fmu_manipulation_toolbox/resources/linux64/container.so,sha256=diiqk5qF2doso3lYvb1qL-B062HY7-qgf55RItP9d3U,50152
41
- fmu_manipulation_toolbox/resources/linux64/server_sm,sha256=ulfoPvmaYe9nInYcVEyj7mD9zDzGk56OUoWx1mPKLiE,22768
42
- fmu_manipulation_toolbox/resources/win32/client_sm.dll,sha256=ttt3rSF4hqNhxIEiXaJx95-_9pPD44r1gjK5ky76bMA,17920
43
- fmu_manipulation_toolbox/resources/win32/server_sm.exe,sha256=Xh_YAy8OfLXKVhGuxPl940YzEePiU65HKOLkAHUzKsk,15872
44
- fmu_manipulation_toolbox/resources/win64/client_sm.dll,sha256=cRO6IW_i5mom29FLhWIrYp0aesyZPh-slQJrDe0tOLU,22016
45
- fmu_manipulation_toolbox/resources/win64/container.dll,sha256=ZLKDYR10jE17Yr2ZtIJTUdk2b_4ObLxA4zAcqfFDc50,40960
46
- fmu_manipulation_toolbox/resources/win64/server_sm.exe,sha256=pMmVbYV5G3j1fxqVUY32h2f6CJQCtURG_w10sjsrMgA,19456
47
- fmu_manipulation_toolbox-1.8.4.2rc1.dist-info/licenses/LICENSE.txt,sha256=c_862mzyk6ownO3Gt6cVs0-53IXLi_-ZEQFNDVabESw,1285
48
- fmu_manipulation_toolbox-1.8.4.2rc1.dist-info/METADATA,sha256=pZQUBDsxkfGn94TulBQLpB2bYife9duUIo9XF9edx-4,1160
49
- fmu_manipulation_toolbox-1.8.4.2rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
50
- fmu_manipulation_toolbox-1.8.4.2rc1.dist-info/entry_points.txt,sha256=jCPLMBdS-eOvmRfDv7n0wHZSbJHccHviW03mz5vwO-Q,124
51
- fmu_manipulation_toolbox-1.8.4.2rc1.dist-info/top_level.txt,sha256=9D_h-5BMjSqf9z-XFkbJL_bMppR2XNYW3WNuPkXou0k,25
52
- fmu_manipulation_toolbox-1.8.4.2rc1.dist-info/RECORD,,
@@ -1,3 +0,0 @@
1
- [console_scripts]
2
- fmucontainer = fmu_manipulation_toolbox.cli:fmucontainer
3
- fmutool = fmu_manipulation_toolbox.__main__:main