PySimultan 0.4.21__py3-none-any.whl → 0.5.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. PySimultan2/__about__.py +1 -1
  2. PySimultan2/__init__.py +1 -0
  3. PySimultan2/data_model.py +185 -80
  4. PySimultan2/default_types.py +135 -25
  5. PySimultan2/files.py +55 -5
  6. PySimultan2/object_mapper.py +58 -7
  7. PySimultan2/resources/ComponentBuilder.dll +0 -0
  8. PySimultan2/resources/ComponentBuilder.runtimeconfig.json +2 -1
  9. PySimultan2/resources/ComponentBuilder.xml +47 -1
  10. PySimultan2/resources/SIMULTAN.AutoUpdate.Client.dll +0 -0
  11. PySimultan2/resources/SIMULTAN.AutoUpdate.DataTransferLibrary.dll +0 -0
  12. PySimultan2/resources/SIMULTAN.Lang.dll +0 -0
  13. PySimultan2/resources/SIMULTAN.Lang.xml +94 -7
  14. PySimultan2/resources/SIMULTAN.Plugins.dll +0 -0
  15. PySimultan2/resources/SIMULTAN.UI.dll +0 -0
  16. PySimultan2/resources/SIMULTAN.UI.xml +136 -43
  17. PySimultan2/resources/SIMULTAN.dll +0 -0
  18. PySimultan2/resources/SIMULTAN.xml +364 -97
  19. PySimultan2/resources/System.Collections.Immutable.dll +0 -0
  20. PySimultan2/resources/System.Reflection.Metadata.dll +0 -0
  21. PySimultan2/resources/System.Reflection.MetadataLoadContext.dll +0 -0
  22. PySimultan2/resources/componentmanager.user +0 -0
  23. PySimultan2/simultan_object.py +64 -15
  24. PySimultan2/taxonomy_maps.py +20 -12
  25. PySimultan2/type_setter_lookup.py +46 -33
  26. PySimultan2/utils.py +49 -14
  27. {pysimultan-0.4.21.dist-info → pysimultan-0.5.0.dist-info}/METADATA +2 -3
  28. {pysimultan-0.4.21.dist-info → pysimultan-0.5.0.dist-info}/RECORD +30 -32
  29. {pysimultan-0.4.21.dist-info → pysimultan-0.5.0.dist-info}/WHEEL +1 -1
  30. PySimultan2/resources/GeometryViewer.dll +0 -0
  31. PySimultan2/resources/GeometryViewer.dll.config +0 -42
  32. PySimultan2/resources/GeometryViewer.xml +0 -6425
  33. PySimultan2/resources/SitePlanner.dll +0 -0
  34. PySimultan2/resources/SitePlanner.dll.config +0 -11
  35. PySimultan2/resources/SitePlanner.xml +0 -2736
  36. {pysimultan-0.4.21.dist-info → pysimultan-0.5.0.dist-info}/licenses/LICENSE.txt +0 -0
@@ -7,6 +7,8 @@ import pandas as pd
7
7
  import colorlog
8
8
  from typing import Union, List, Type, Set, Tuple, Any, Optional
9
9
 
10
+ from reactivex import return_value
11
+
10
12
  from .utils import (sort_slots, create_simultan_component_for_taxonomy, create_mapped_python_object,
11
13
  set_property_to_sim_component, set_property_to_parameter, set_property_to_file_info,
12
14
  set_property_to_list, set_property_to_value_field, set_property_to_unknown_type,
@@ -139,11 +141,19 @@ class ComponentList(SimultanObject):
139
141
 
140
142
  def append(self, values: Union[SimultanObject, List]):
141
143
 
144
+ return_val = []
145
+
146
+ as_list = True
142
147
  if not isinstance(values, Iterable):
148
+ as_list = False
143
149
  values = [values]
144
150
 
145
151
  for i, value in enumerate(values, start=len(self.data)):
146
- self._set_value(value, i)
152
+ return_val.append(self._set_value(value, i))
153
+
154
+ if not as_list:
155
+ return return_val[0]
156
+ return return_val
147
157
 
148
158
  def _update_slot_extensions(self, index: int):
149
159
 
@@ -160,6 +170,9 @@ class ComponentList(SimultanObject):
160
170
 
161
171
  def _set_value(self, value, i):
162
172
 
173
+ if isinstance(value, FileInfo):
174
+ raise ValueError(f'FileInfos cannot be added to ComponentLists')
175
+
163
176
  if isinstance(value, SimultanObject):
164
177
  slot = value._wrapped_obj.Slots.Items[0]
165
178
 
@@ -171,6 +184,9 @@ class ComponentList(SimultanObject):
171
184
  self.add_referenced_component(value._wrapped_obj,
172
185
  slot_extension=str(i),
173
186
  slot=slot)
187
+
188
+ return value
189
+
174
190
  else:
175
191
  new_val = create_mapped_python_object(value,
176
192
  data_model=self._data_model,
@@ -193,6 +209,8 @@ class ComponentList(SimultanObject):
193
209
  slot_extension=str(i),
194
210
  slot=taxonomy_entry)
195
211
 
212
+ return new_val
213
+
196
214
  def __setitem__(self, i, value):
197
215
  if isinstance(i, slice):
198
216
  for j, val in enumerate(value):
@@ -210,7 +228,7 @@ class ComponentList(SimultanObject):
210
228
  self._set_value(value, i)
211
229
 
212
230
  def extend(self, values: List):
213
- self.append(values)
231
+ return self.append(values)
214
232
 
215
233
  def remove(self, value: SimultanObject):
216
234
  self.discard(value)
@@ -292,6 +310,41 @@ class ComponentList(SimultanObject):
292
310
  self._wrapped_obj.Components.Clear()
293
311
  self._wrapped_obj.ReferencedComponents.Clear()
294
312
 
313
+ def to_json(self) -> dict[Any: Any]:
314
+
315
+ return_val = [None] * len(self.data)
316
+
317
+ for i, val in enumerate(self.data):
318
+
319
+ if hasattr(val, 'json_ref'):
320
+ return_val[i] = val.json_ref()
321
+ elif isinstance(val, list):
322
+ return_val[i] = [v.json_ref() if hasattr(v, 'json_ref') else v for v in val]
323
+ elif isinstance(val, dict):
324
+ return_val[i] = {k: v.json_ref() if hasattr(v, 'json_ref') else v for k, v in val.items()}
325
+ elif isinstance(val, np.ndarray):
326
+ return_val[i] = val.tolist()
327
+ else:
328
+ return_val[i] = val
329
+
330
+ return {
331
+ str(self.id): {
332
+ 'name': self.name,
333
+ 'taxonomies': self.taxonomy_keys,
334
+ 'items': return_val
335
+ }
336
+ }
337
+
338
+ def json_ref(self):
339
+ return {"$ref": {
340
+ "$type": 'ComponentList',
341
+ "$taxonomies": self.taxonomy_keys,
342
+ "$id": {'local_id': self.id.LocalId,
343
+ 'global_id': str(self.id.GlobalId)
344
+ },
345
+ "length": len(self)
346
+ }
347
+ }
295
348
 
296
349
  component_list_map = TaxonomyMap(taxonomy_name='PySimultan',
297
350
  taxonomy_key='PySimultan',
@@ -319,9 +372,11 @@ class ComponentDictionary(SimultanObject):
319
372
  self._dict = {}
320
373
  super().__init__(*args, **kwargs)
321
374
  self.component_policy = kwargs.get('component_policy', 'subcomponent') # component add policy of the content/parameter/property, 'reference' or 'subcomponent'
375
+ self._generate_internal_dict()
322
376
 
323
377
  def __load_init__(self, *args, **kwargs):
324
378
  self._dict = {}
379
+ self._generate_internal_dict()
325
380
 
326
381
  @classmethod
327
382
  def create_from_values(cls,
@@ -348,15 +403,20 @@ class ComponentDictionary(SimultanObject):
348
403
  for key, value in values.items():
349
404
  new_component_dict[key] = value
350
405
 
406
+ new_component_dict._generate_internal_dict()
407
+
351
408
  return new_component_dict
352
409
 
353
410
  def __getitem__(self, key, *args, **kwargs):
354
411
 
355
412
  comp_dict = object.__getattribute__(self, '_dict')
356
413
 
357
- if kwargs.get('check_dict', True) and comp_dict is not None and key in object.__getattribute__(self,
358
- '_dict').keys():
359
- return object.__getattribute__(self, '_dict').get(key, None)
414
+ if (kwargs.get('check_dict', False) and comp_dict is not None and
415
+ (key in comp_dict.keys() or '__dict_key__' + key in comp_dict.keys())):
416
+ if key in comp_dict.keys():
417
+ return comp_dict.get(key, None)
418
+ else:
419
+ return comp_dict.get('__dict_key__' + key, None)
360
420
  else:
361
421
  # data_model = config.default_data_model
362
422
  # obj = get_component_taxonomy_entry(self._wrapped_obj, key)
@@ -401,10 +461,16 @@ class ComponentDictionary(SimultanObject):
401
461
  logger.error(f'Could not get value for key {key} ({text_or_key}) in {self}:\n{e}')
402
462
  raise ValueError(f'Could not get value for key {key} ({text_or_key}) in {self}:\n{e}')
403
463
 
404
- self._dict[key] = get_obj_value(val,
405
- data_model=data_model,
406
- object_mapper=object_mapper)
407
- return self._dict[key]
464
+ val = get_obj_value(val,
465
+ data_model=data_model,
466
+ object_mapper=object_mapper)
467
+
468
+ if val is not None:
469
+ if key.startswith('__dict_key__'):
470
+ key = key.replace('__dict_key__', '')
471
+ self._dict[key] = val
472
+
473
+ return self._dict.get(key, None)
408
474
 
409
475
  def __setitem__(self, key, value):
410
476
 
@@ -450,27 +516,32 @@ class ComponentDictionary(SimultanObject):
450
516
  return
451
517
 
452
518
  from .type_setter_lookup import type_setter_fcn_lookup_dict
453
- setter_fcn = type_setter_fcn_lookup_dict.get(type(value), set_property_to_unknown_type)
519
+ setter_fcn = type_setter_fcn_lookup_dict.get(value, set_property_to_unknown_type)
454
520
 
455
521
  setter_fcn(*fcn_arg_list)
456
522
  item = self.__getitem__(key, check_dict=False)
457
523
 
458
- self._dict[key] = item
524
+ if key.startswith('__dict_key__'):
525
+ self._dict[key.replace('__dict_key__', '')] = item
526
+ else:
527
+ self._dict[key] = item
459
528
 
460
529
  def __delitem__(self, key):
461
530
  self[key] = None
462
531
  del self._dict[key]
463
532
 
464
533
  def items(self):
534
+ if self._dict is None or not self._dict:
535
+ self._generate_internal_dict()
465
536
  return self._dict.items()
466
537
 
467
538
  def keys(self):
468
- if not self._dict:
539
+ if not self._dict or not self._dict:
469
540
  self._generate_internal_dict()
470
541
  return self._dict.keys()
471
542
 
472
543
  def values(self):
473
- if not self._dict:
544
+ if not self._dict or not self._dict:
474
545
  self._generate_internal_dict()
475
546
  return self._dict.values()
476
547
 
@@ -478,22 +549,26 @@ class ComponentDictionary(SimultanObject):
478
549
  comp_dict = {}
479
550
 
480
551
  for parameter in self._wrapped_obj.Parameters.Items:
481
- comp_dict[parameter.NameTaxonomyEntry.TextOrKey] = get_obj_value(parameter,
482
- data_model=self._data_model,
483
- object_mapper=self._object_mapper)
552
+ key = parameter.NameTaxonomyEntry.TextOrKey.replace('__dict_key__', '')
553
+ comp_dict[key] = get_obj_value(parameter,
554
+ data_model=self._data_model,
555
+ object_mapper=self._object_mapper)
484
556
  for component in self._wrapped_obj.Components.Items:
485
- comp_dict[component.Slot.SlotBase.Target.Key] = get_obj_value(component.Component,
486
- data_model=self._data_model,
487
- object_mapper=self._object_mapper)
557
+ key = component.Slot.SlotBase.Target.Key.replace('__dict_key__', '')
558
+ comp_dict[key] = get_obj_value(component.Component,
559
+ data_model=self._data_model,
560
+ object_mapper=self._object_mapper)
488
561
  for ref_component in self._wrapped_obj.ReferencedComponents.Items:
489
- comp_dict[ref_component.Slot.SlotBase.Target.Key] = get_obj_value(ref_component.Target,
490
- data_model=self._data_model,
491
- object_mapper=self._object_mapper)
562
+ key = ref_component.Slot.SlotBase.Target.Key.replace('__dict_key__', '')
563
+ comp_dict[key] = get_obj_value(ref_component.Target,
564
+ data_model=self._data_model,
565
+ object_mapper=self._object_mapper)
492
566
  for ref_asset in self._wrapped_obj.ReferencedAssets.Items:
493
567
  for tag in ref_asset.Resource.Tags:
494
- comp_dict[tag.Target.Key] = get_obj_value(ref_asset.Target,
495
- data_model=self._data_model,
496
- object_mapper=self._object_mapper)
568
+ key = tag.Target.Key.replace('__dict_key__', '')
569
+ comp_dict[key] = get_obj_value(ref_asset.Target,
570
+ data_model=self._data_model,
571
+ object_mapper=self._object_mapper)
497
572
 
498
573
  object.__setattr__(self, '_dict', comp_dict)
499
574
 
@@ -525,5 +600,40 @@ class ComponentDictionary(SimultanObject):
525
600
  for key, value in other.items():
526
601
  self[key] = value
527
602
 
603
+ def to_json(self) -> dict:
604
+
605
+ return_value = {}
606
+
607
+ for key, value in self.items():
608
+ if isinstance(value, SimultanObject):
609
+ return_value[key] = value.to_json()
610
+ elif isinstance(value, list):
611
+ return_value[key] = [v.json_ref() if hasattr(v, 'json_ref') else v for v in value]
612
+ elif isinstance(value, dict):
613
+ return_value[key] = {k: v.json_ref() if hasattr(v, 'json_ref') else v for k, v in value.items()}
614
+ elif isinstance(value, np.ndarray):
615
+ return_value[key] = value.tolist()
616
+ else:
617
+ return_value[key] = value
618
+
619
+ return {
620
+ str(self.id): {
621
+ 'name': self.name,
622
+ 'taxonomies': self.taxonomy_keys,
623
+ 'items': return_value
624
+ }
625
+ }
626
+
627
+ def json_ref(self):
628
+ return {"$ref": {
629
+ "$type": 'ComponentDictionary',
630
+ "$taxonomies": self.taxonomy_keys,
631
+ "$id": {'local_id': self.id.LocalId,
632
+ 'global_id': str(self.id.GlobalId)
633
+ },
634
+ "length": len(self)
635
+ }
636
+ }
637
+
528
638
 
529
639
  component_dict_map = ComponentDictionary._taxonomy_map
PySimultan2/files.py CHANGED
@@ -81,9 +81,17 @@ def add_asset_to_component(comp: [SimComponent, SimultanObject],
81
81
  wrapped_obj = comp if isinstance(comp, SimComponent) else comp._wrapped_obj
82
82
 
83
83
  if tag is not None:
84
- add_tag_to_resource(asset, tag)
84
+ try:
85
+ add_tag_to_resource(asset, tag)
86
+ except Exception as e:
87
+ logger.error(f'Error adding tag to asset {asset}: {e} ')
88
+ raise e
85
89
 
86
- return ComponentMapping.AddAsset(wrapped_obj, asset, content_id)
90
+ try:
91
+ return ComponentMapping.AddAsset(wrapped_obj, asset, content_id)
92
+ except Exception as e:
93
+ logger.error(f'Error adding asset {asset} to component: {e}')
94
+ raise e
87
95
 
88
96
 
89
97
  def remove_asset_from_component(comp: Union[SimComponent, SimultanObject],
@@ -187,7 +195,9 @@ class FileInfo(object, metaclass=MetaMock):
187
195
  _cls_instances = {}
188
196
 
189
197
  @classmethod
190
- def from_string(cls, filename: str, content: str, *args, **kwargs) -> FileInfo:
198
+ def from_string(cls,
199
+ filename: str,
200
+ content: str, *args, **kwargs) -> FileInfo:
191
201
  """
192
202
  Create a file info object from a string.
193
203
  :param filename: Name of the file to be created. E.g. 'new_file.txt'
@@ -237,6 +247,13 @@ class FileInfo(object, metaclass=MetaMock):
237
247
  self.args = args
238
248
  self.kwargs = kwargs
239
249
 
250
+ @property
251
+ def key(self) -> int:
252
+ try:
253
+ return self.resource_entry.Key
254
+ except Exception as e:
255
+ return None
256
+
240
257
  @property
241
258
  def resource_entry(self) -> Union[ResourceFileEntry, ContainedResourceFileEntry, None]:
242
259
  if self._resource_entry is None:
@@ -258,8 +275,13 @@ class FileInfo(object, metaclass=MetaMock):
258
275
  self._resource_entry = value
259
276
 
260
277
  @property
261
- def file_size(self) -> int:
262
- return os.path.getsize(self.file_path)
278
+ def file_size(self) -> Optional[int]:
279
+ try:
280
+ return os.path.getsize(self.file_path)
281
+ except FileNotFoundError:
282
+ raise FileNotFoundError(f'File not found: {self.file_path}')
283
+ except Exception as e:
284
+ raise e
263
285
 
264
286
  @property
265
287
  def last_modified(self) -> datetime:
@@ -269,6 +291,10 @@ class FileInfo(object, metaclass=MetaMock):
269
291
  def resource_entry(self, value):
270
292
  self._resource_entry = value
271
293
 
294
+ @property
295
+ def filename(self) -> str:
296
+ return self.resource_entry.File.Name
297
+
272
298
  @property
273
299
  def name(self) -> str:
274
300
  return os.path.basename(self.file_path)
@@ -317,6 +343,9 @@ class FileInfo(object, metaclass=MetaMock):
317
343
  def __exit__(self, *args):
318
344
  self.file_obj.close()
319
345
 
346
+ def __repr__(self):
347
+ return f'FileInfo({self.file_path})'
348
+
320
349
  def get_content(self, encoding='utf-8') -> Optional[Union[str, dict[str, str]]]:
321
350
  """
322
351
  Get the content of the file.
@@ -373,3 +402,24 @@ class FileInfo(object, metaclass=MetaMock):
373
402
  if self.resource_entry is not None:
374
403
  self.data_model.delete_resource(self.resource_entry)
375
404
  os.remove(self.file_path)
405
+
406
+ def to_json(self) -> dict:
407
+
408
+ obj_dict = {
409
+ 'key': self.key,
410
+ 'name': self.name,
411
+ 'file_path': self.file_path,
412
+ 'file_size': self.file_size,
413
+ 'last_modified': self.last_modified,
414
+ 'encoding': self.encoding,
415
+ 'is_zip': self.is_zip,
416
+ }
417
+
418
+ return obj_dict
419
+
420
+ def json_ref(self):
421
+ return {"$ref": {
422
+ "$type": 'FileInfo',
423
+ "$key": str(self.key)
424
+ }
425
+ }
@@ -1,4 +1,4 @@
1
- from typing import Optional, Type, TYPE_CHECKING, Union
1
+ from typing import Optional, Type, TYPE_CHECKING, Union, Any
2
2
  from copy import copy
3
3
  from collections import UserList
4
4
  from colorlog import getLogger
@@ -72,10 +72,20 @@ class PythonMapper(object):
72
72
  def mapped_classes(self, value):
73
73
  self._mapped_classes = value
74
74
 
75
- def register(self, taxonomy, cls, taxonomy_map=None):
76
- if not self.re_register and taxonomy in self.registered_classes.keys():
75
+ def register(self,
76
+ taxonomy,
77
+ cls,
78
+ re_register=False,
79
+ taxonomy_map=None):
80
+ if not (self.re_register or re_register) and taxonomy in self.registered_classes.keys():
77
81
  return
78
82
 
83
+ if taxonomy in self.mapped_classes.keys():
84
+ try:
85
+ del self.mapped_classes[taxonomy]
86
+ except KeyError:
87
+ pass
88
+
79
89
  if taxonomy_map is None:
80
90
  taxonomy_map = TaxonomyMap(taxonomy_name='PySimultan',
81
91
  taxonomy_key='PySimultan',
@@ -171,7 +181,11 @@ class PythonMapper(object):
171
181
  typed_data.append(typed_object)
172
182
  return typed_data
173
183
 
174
- def create_python_geometry_object(self, component, data_model=None, *args, **kwargs):
184
+ def create_python_geometry_object(self,
185
+ component: Union[Layer, Vertex, Edge, PEdge, Face, Volume, EdgeLoop],
186
+ data_model: 'DataModel' = None,
187
+ *args,
188
+ **kwargs):
175
189
 
176
190
  if component is None:
177
191
  return None
@@ -191,7 +205,7 @@ class PythonMapper(object):
191
205
  self.create_python_object(component, data_model, *args, **kwargs)
192
206
 
193
207
  def get_mapped_class_from_component(self,
194
- component,
208
+ component: Union[SimComponent, Layer, Vertex, Edge, PEdge, Face, Volume, EdgeLoop],
195
209
  data_model: Optional['DataModel'] = None,
196
210
  *args,
197
211
  **kwargs) -> Optional[Type[SimultanObject]]:
@@ -205,7 +219,10 @@ class PythonMapper(object):
205
219
  if isinstance(component,
206
220
  (Layer, Vertex, Edge, PEdge, Face, Volume, EdgeLoop)
207
221
  ):
208
- self.create_python_geometry_object(component, data_model, *args, **kwargs)
222
+ self.create_python_geometry_object(component,
223
+ data_model,
224
+ *args,
225
+ **kwargs)
209
226
 
210
227
  c_slots = [x.Target.Key for x in component.Slots.Items]
211
228
  c_slot = list(set(c_slots) & set(self.registered_classes.keys()))
@@ -266,6 +283,21 @@ class PythonMapper(object):
266
283
  *args,
267
284
  **kwargs)
268
285
 
286
+ def create_mapped_python_object(self,
287
+ obj: Any,
288
+ data_model=None,
289
+ add_to_data_model=True,
290
+ *args,
291
+ **kwargs) -> Optional[SimultanObject]:
292
+
293
+ from .utils import create_mapped_python_object
294
+ return create_mapped_python_object(obj,
295
+ object_mapper=self,
296
+ data_model=data_model,
297
+ add_to_data_model=add_to_data_model,
298
+ *args,
299
+ **kwargs)
300
+
269
301
  def get_typed_data_with_taxonomy(self, taxonomy: str, data_model=None, first=False):
270
302
 
271
303
  tax_components = data_model.find_components_with_taxonomy(taxonomy=taxonomy, first=first)
@@ -307,7 +339,9 @@ class PythonMapper(object):
307
339
  new_val = create_mapped_python_object(obj, self, data_model)
308
340
  return new_val
309
341
 
310
- def copy(self):
342
+ def copy(self,
343
+ *args,
344
+ **kwargs) -> 'PythonMapper':
311
345
  new_mapper = PythonMapper()
312
346
  new_mapper.registered_classes = self.registered_classes
313
347
  new_mapper.taxonomy_maps = self.taxonomy_maps
@@ -315,6 +349,23 @@ class PythonMapper(object):
315
349
  new_mapper.load_undefined = self.load_undefined
316
350
  return new_mapper
317
351
 
352
+ def __add__(self, other: 'PythonMapper') -> 'PythonMapper':
353
+ new_mapper = self.copy()
354
+ new_mapper.registered_classes.update(other.registered_classes)
355
+ new_mapper.taxonomy_maps.update(other.taxonomy_maps)
356
+ new_mapper.registered_geometry_classes.update(other.registered_geometry_classes)
357
+ return new_mapper
358
+
359
+ def get_mapped_class_for_python_type(self, python_type: type) -> Optional[Type[SimultanObject]]:
360
+ try:
361
+ key = list(filter(lambda x: self.registered_classes[x] == python_type,
362
+ self.registered_classes)
363
+ )[0]
364
+ mapped_cls = self.get_mapped_class(key)
365
+ return mapped_cls
366
+ except IndexError:
367
+ return None
368
+
318
369
 
319
370
  if config.get_default_mapper() is None:
320
371
  config.set_default_mapper(PythonMapper())
Binary file
@@ -12,7 +12,8 @@
12
12
  }
13
13
  ],
14
14
  "configProperties": {
15
- "System.Reflection.Metadata.MetadataUpdater.IsSupported": false
15
+ "System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
16
+ "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true
16
17
  }
17
18
  }
18
19
  }
@@ -2875,6 +2875,12 @@
2875
2875
  Invoked when the selection in this list has changed
2876
2876
  </summary>
2877
2877
  </member>
2878
+ <member name="E:ComponentBuilder.ViewNEW.Components.ComponentListVM.TreeViewContextMenuOpening">
2879
+ <summary>
2880
+ Context menu opening event on all the elements in the component list.
2881
+ Useful to inject custom menu items in plugins.
2882
+ </summary>
2883
+ </member>
2878
2884
  <member name="P:ComponentBuilder.ViewNEW.Components.ComponentListVM.SuperviseCommand">
2879
2885
  <summary>
2880
2886
  Command for supervising a component (only available when user has supervise privilege)
@@ -10206,11 +10212,21 @@
10206
10212
  Command for exporting the project as JSON
10207
10213
  </summary>
10208
10214
  </member>
10209
- <member name="P:ComponentBuilder.ViewNEW.JSONExportRibbon.JSONExportRibbonVM.ExportSelectedNetworksCommand">
10215
+ <member name="P:ComponentBuilder.ViewNEW.JSONExportRibbon.JSONExportRibbonVM.ExportJSONSelectedNetworksCommand">
10210
10216
  <summary>
10211
10217
  Command for selection networks to export
10212
10218
  </summary>
10213
10219
  </member>
10220
+ <member name="P:ComponentBuilder.ViewNEW.JSONExportRibbon.JSONExportRibbonVM.ExportXMICommand">
10221
+ <summary>
10222
+ Command for exporting the whole project in XMI format
10223
+ </summary>
10224
+ </member>
10225
+ <member name="P:ComponentBuilder.ViewNEW.JSONExportRibbon.JSONExportRibbonVM.ExportXMISelectedNetworksCommand">
10226
+ <summary>
10227
+ Command for selecting a network and exporting it to XMI
10228
+ </summary>
10229
+ </member>
10214
10230
  <member name="M:ComponentBuilder.ViewNEW.JSONExportRibbon.JSONExportRibbonVM.#ctor(ComponentBuilder.ViewNEW.MainWindowContent.MainWindowVM,SIMULTAN.Utils.IServicesProvider)">
10215
10231
  <summary>
10216
10232
  Initializes a new instance of the ExcelToolsRibbonVM class
@@ -19163,5 +19179,35 @@
19163
19179
  <member name="P:ComponentBuilder.WinUtils.WinSynchronizationContext.InvokeRequired">
19164
19180
  <inheritdoc/>
19165
19181
  </member>
19182
+ <member name="T:XamlGeneratedNamespace.GeneratedInternalTypeHelper">
19183
+ <summary>
19184
+ GeneratedInternalTypeHelper
19185
+ </summary>
19186
+ </member>
19187
+ <member name="M:XamlGeneratedNamespace.GeneratedInternalTypeHelper.CreateInstance(System.Type,System.Globalization.CultureInfo)">
19188
+ <summary>
19189
+ CreateInstance
19190
+ </summary>
19191
+ </member>
19192
+ <member name="M:XamlGeneratedNamespace.GeneratedInternalTypeHelper.GetPropertyValue(System.Reflection.PropertyInfo,System.Object,System.Globalization.CultureInfo)">
19193
+ <summary>
19194
+ GetPropertyValue
19195
+ </summary>
19196
+ </member>
19197
+ <member name="M:XamlGeneratedNamespace.GeneratedInternalTypeHelper.SetPropertyValue(System.Reflection.PropertyInfo,System.Object,System.Object,System.Globalization.CultureInfo)">
19198
+ <summary>
19199
+ SetPropertyValue
19200
+ </summary>
19201
+ </member>
19202
+ <member name="M:XamlGeneratedNamespace.GeneratedInternalTypeHelper.CreateDelegate(System.Type,System.Object,System.String)">
19203
+ <summary>
19204
+ CreateDelegate
19205
+ </summary>
19206
+ </member>
19207
+ <member name="M:XamlGeneratedNamespace.GeneratedInternalTypeHelper.AddEventHandler(System.Reflection.EventInfo,System.Object,System.Delegate)">
19208
+ <summary>
19209
+ AddEventHandler
19210
+ </summary>
19211
+ </member>
19166
19212
  </members>
19167
19213
  </doc>
Binary file