PySimultan 0.5.9.4__py3-none-any.whl → 0.5.9.6__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.
PySimultan2/__about__.py CHANGED
@@ -1 +1 @@
1
- version = '0.5.9.4'
1
+ version = '0.5.9.6'
PySimultan2/__init__.py CHANGED
@@ -29,7 +29,6 @@ def setup_logging():
29
29
 
30
30
  logger = colorlog.getLogger('PySimultan')
31
31
  logger.addHandler(handler)
32
- logger.setLevel('DEBUG')
33
32
 
34
33
  return logger
35
34
 
PySimultan2/data_model.py CHANGED
@@ -38,6 +38,7 @@ from System.Security import SecureString
38
38
  from SIMULTAN.Data import SimId
39
39
  from System import Guid
40
40
  from System.IO import DirectoryInfo
41
+ from System.IO import FileInfo as SystemFileInfo
41
42
  from System.IO import *
42
43
  from System.Security import *
43
44
  from System.Security.Cryptography import *
@@ -99,7 +100,7 @@ class DataModel:
99
100
  SimultanUsers.SimUserRole.ADMINISTRATOR)
100
101
 
101
102
  tempPath = Path.GetTempPath()
102
- projectFile = FileInfo(project_path)
103
+ projectFile = SystemFileInfo(project_path)
103
104
  projectData = ExtendedProjectData()
104
105
 
105
106
  projectData.UsersManager.EncryptionKey = encryptionKey
@@ -249,7 +250,7 @@ class DataModel:
249
250
  def project(self):
250
251
  if (self._project is None) and (self.project_path is not None) and (self.project_data_manager is not None):
251
252
  logger.debug('loading project')
252
- self.project = ZipProjectIO.Load(FileInfo(self.project_path), self.project_data_manager)
253
+ self.project = ZipProjectIO.Load(SystemFileInfo(self.project_path), self.project_data_manager)
253
254
  exit_code = ZipProjectIO.AuthenticateUserAfterLoading(self.project,
254
255
  self.project_data_manager,
255
256
  self.service_provider)
@@ -474,7 +475,7 @@ class DataModel:
474
475
  """
475
476
  self.get_file_infos.cache_clear()
476
477
  geo_resource = self.add_geometry_resource(file_name)
477
- file_info = FileInfo(geo_resource.CurrentFullPath)
478
+ file_info = SystemFileInfo(geo_resource.CurrentFullPath)
478
479
  try:
479
480
  model = SimGeoIO.Load(file_info, self.inst, self.serv)
480
481
  self.models_dict[geo_resource.Key] = model
@@ -508,7 +509,7 @@ class DataModel:
508
509
 
509
510
  def add_empty_resource(self,
510
511
  filename: str,
511
- target_dir: Union[ResourceDirectoryEntry, FileInfo, str] = None) -> ResourceEntry:
512
+ target_dir: Union[ResourceDirectoryEntry, SystemFileInfo, str] = None) -> ResourceEntry:
512
513
  """
513
514
  Add an empty resource to the project
514
515
  :param filename: name of the new resource
@@ -519,12 +520,12 @@ class DataModel:
519
520
 
520
521
  self.get_file_infos.cache_clear()
521
522
  if target_dir is None:
522
- return self.project.AddEmptyResource(FileInfo(str(filename)))
523
+ return self.project.AddEmptyResource(SystemFileInfo(str(filename)))
523
524
  else:
524
525
 
525
526
  if isinstance(target_dir, ResourceDirectoryEntry):
526
527
  target_dir = target_dir.CurrentFullPath
527
- if isinstance(target_dir, FileInfo):
528
+ if isinstance(target_dir, SystemFileInfo):
528
529
  target_dir = target_dir.FullPath
529
530
 
530
531
  return self.project.AddEmptyResource(FileInfo(
@@ -533,8 +534,8 @@ class DataModel:
533
534
  )
534
535
 
535
536
  def add_resource_file(self,
536
- filename: Union[str, FileInfo, PythonFileInfo],
537
- target_dir: Union[ResourceDirectoryEntry, FileInfo, str] = None) -> ResourceEntry:
537
+ filename: Union[str, SystemFileInfo, PythonFileInfo],
538
+ target_dir: Union[ResourceDirectoryEntry, SystemFileInfo, str] = None) -> ResourceEntry:
538
539
 
539
540
  """
540
541
  Add a file as resource to the project which already exists in the project folder
@@ -544,9 +545,9 @@ class DataModel:
544
545
  """
545
546
 
546
547
  if isinstance(filename, str):
547
- filename = FileInfo(filename)
548
+ filename = SystemFileInfo(filename)
548
549
  elif isinstance(filename, PythonFileInfo):
549
- filename = FileInfo(filename.full_path)
550
+ filename = SystemFileInfo(filename.full_path)
550
551
 
551
552
  if target_dir is None:
552
553
  # check if file is already in project folder
@@ -562,7 +563,7 @@ class DataModel:
562
563
  target_dir = DirectoryInfo(target_dir)
563
564
  elif isinstance(target_dir, ResourceDirectoryEntry):
564
565
  target_dir = DirectoryInfo(target_dir.CurrentFullPath)
565
- elif isinstance(target_dir, FileInfo):
566
+ elif isinstance(target_dir, SystemFileInfo):
566
567
  pass
567
568
 
568
569
  # check if file is already in project folder
@@ -573,7 +574,7 @@ class DataModel:
573
574
  return self.project_data_manager.AssetManager.GetResource(key)
574
575
 
575
576
  def add_resource(self,
576
- filename: Union[str, FileInfo],
577
+ filename: Union[str, SystemFileInfo],
577
578
  target_dir: Optional[Union[DirectoryInfo, ResourceDirectoryEntry, str]] = None,
578
579
  tag: Union[SimTaxonomyEntry, SimTaxonomyEntryReference] = None) -> ResourceEntry:
579
580
  """
@@ -586,18 +587,33 @@ class DataModel:
586
587
 
587
588
  del_copy = False
588
589
 
589
- existing_files = [x.Name for x in self.project_data_manager.AssetManager.Resources]
590
+ existing_files = [x.current_full_path for x in self.project_data_manager.AssetManager.Resources]
590
591
  try:
591
592
  act_filename = filename.replace('\\', os.sep)
592
593
  except TypeError:
593
594
  act_filename = filename
594
595
 
595
- if os.path.basename(act_filename) in existing_files:
596
+ if not act_filename.startswith(self.project.ProjectUnpackFolder.FullPath) and target_dir is None:
597
+ target_dir_str = self.project.ProjectUnpackFolder.FullPath
598
+ elif target_dir is not None:
599
+ if isinstance(target_dir, ResourceDirectoryEntry):
600
+ target_dir_str = target_dir.CurrentFullPath
601
+ elif isinstance(target_dir, SystemFileInfo):
602
+ target_dir_str = target_dir.FullPath
603
+ elif isinstance(target_dir, str):
604
+ target_dir_str = target_dir
605
+ elif isinstance(target_dir, DirectoryInfo):
606
+ target_dir_str = target_dir.FullPath
607
+
608
+ full_filename = os.path.join(target_dir_str, os.path.basename(act_filename))
609
+
610
+ if full_filename in existing_files:
596
611
  # create copy with running counter in temp dir and use this file:
597
612
  counter = 1
598
613
  while True:
599
614
  new_filename = os.path.basename(filename) + f'({str(counter)})'
600
- if new_filename not in existing_files and not os.path.exists(new_filename):
615
+ full_filename = os.path.join(target_dir_str, new_filename)
616
+ if full_filename not in existing_files and not os.path.exists(new_filename):
601
617
  break
602
618
  counter += 1
603
619
  shutil.copy(filename, os.path.join(os.path.dirname(filename), new_filename))
@@ -605,7 +621,7 @@ class DataModel:
605
621
  del_copy = True
606
622
 
607
623
  if isinstance(filename, (str, PosixPath, WindowsPath)):
608
- filename = FileInfo(str(filename))
624
+ filename = SystemFileInfo(str(filename))
609
625
 
610
626
  if target_dir is None:
611
627
  resource = self.project.CopyResourceAsContainedFileEntry(filename,
@@ -616,7 +632,7 @@ class DataModel:
616
632
  target_dir = DirectoryInfo(target_dir)
617
633
  elif isinstance(target_dir, ResourceDirectoryEntry):
618
634
  target_dir = DirectoryInfo(target_dir.CurrentFullPath)
619
- elif isinstance(target_dir, FileInfo):
635
+ elif isinstance(target_dir, SystemFileInfo):
620
636
  pass
621
637
 
622
638
  resource = self.project.CopyResourceAsContainedFileEntry(filename,
@@ -626,7 +642,7 @@ class DataModel:
626
642
  if del_copy:
627
643
  os.remove(str(filename))
628
644
 
629
- # file_id = self.project_data_manager.AssetManager.AddResourceEntry(FileInfo(filename))
645
+ # file_id = self.project_data_manager.AssetManager.AddResourceEntry(SystemFileInfo(filename))
630
646
  # return self.project_data_manager.AssetManager.Resources[file_id]
631
647
  if tag is not None:
632
648
  add_tag_to_resource(resource, tag)
@@ -639,14 +655,14 @@ class DataModel:
639
655
  logger.error(f'Error while adding resource {filename} to project {self.project_path}: {e}')
640
656
  raise e
641
657
 
642
- def delete_resource(self, resource: Union[ResourceEntry, FileInfo, ContainedResourceFileEntry]):
658
+ def delete_resource(self, resource: Union[ResourceEntry, SystemFileInfo, ContainedResourceFileEntry]):
643
659
  """
644
660
  Delete a resource from the project and the project folder
645
661
  :param resource: resource to delete
646
662
  :return:
647
663
  """
648
664
 
649
- if isinstance(resource, FileInfo):
665
+ if isinstance(resource, SystemFileInfo):
650
666
  resource = resource.resource_entry
651
667
 
652
668
  success = self.project.DeleteResource(resource)
@@ -859,7 +875,18 @@ class DataModel:
859
875
 
860
876
  @lru_cache()
861
877
  def get_file_infos(self) -> list[PythonFileInfo]:
862
- return [PythonFileInfo(resource_entry=asset) for asset in self.assets]
878
+ file_infos = []
879
+ for asset in self.assets:
880
+ if isinstance(asset, ResourceFileEntry):
881
+ file_infos.append(PythonFileInfo(resource_entry=asset))
882
+ return file_infos
883
+
884
+ def get_directory_infos(self) -> list[PythonDirectoryInfo]:
885
+ dir_infos = []
886
+ for asset in self.assets:
887
+ if isinstance(asset, ResourceDirectoryEntry):
888
+ dir_infos.append(PythonDirectoryInfo(resource_entry=asset, data_model=self))
889
+ return dir_infos
863
890
 
864
891
  def get_file_info_by_key(self,
865
892
  key: int) -> Optional[PythonFileInfo]:
@@ -17,6 +17,9 @@ from SIMULTAN.Data.Components import (ComponentWalker, SimComponent, SimBoolPara
17
17
  SimEnumParameter, SimIntegerParameter, SimStringParameter, ComponentMapping,
18
18
  SimSlot, SimComponentVisibility, SimChildComponentEntry, SimDefaultSlots,
19
19
  SimParameterOperations, SimComponentReference)
20
+
21
+ from SIMULTAN.Data.Assets import DocumentAsset
22
+
20
23
  from .files import FileInfo
21
24
 
22
25
  from . import config
@@ -562,9 +565,14 @@ class ComponentDictionary(SimultanObject):
562
565
  for ref_asset in self._wrapped_obj.ReferencedAssets.Items:
563
566
  for tag in ref_asset.Resource.Tags:
564
567
  key = tag.Target.Key.replace('__dict_key__', '')
565
- comp_dict[key] = get_obj_value(ref_asset.Target,
566
- data_model=self._data_model,
567
- object_mapper=self._object_mapper)
568
+ if isinstance(ref_asset, DocumentAsset):
569
+ comp_dict[key] = get_obj_value(ref_asset.Resource,
570
+ data_model=self._data_model,
571
+ object_mapper=self._object_mapper)
572
+ else:
573
+ comp_dict[key] = get_obj_value(ref_asset.Target,
574
+ data_model=self._data_model,
575
+ object_mapper=self._object_mapper)
568
576
 
569
577
  object.__setattr__(self, '_dict', comp_dict)
570
578
 
PySimultan2/files.py CHANGED
@@ -20,6 +20,7 @@ from SIMULTAN.Data.Taxonomy import SimTaxonomyEntry, SimTaxonomyEntryReference,
20
20
  from SIMULTAN.Data.Components import SimComponent, ComponentMapping
21
21
 
22
22
  from System.IO import DirectoryInfo as SystemDirectoryInfo
23
+ from System.IO import FileInfo as SystemFileInfo
23
24
 
24
25
  # from .config import default_data_model
25
26
 
@@ -436,6 +437,21 @@ class FileInfo(object, metaclass=MetaMock):
436
437
  def __repr__(self):
437
438
  return f'FileInfo({self.file_path})'
438
439
 
440
+ def move(self, new_directory_path: Union[str, DirectoryInfo]) -> FileInfo:
441
+
442
+ if isinstance(new_directory_path, str):
443
+ new_directory_path = DirectoryInfo.from_existing_directory(new_directory_path,
444
+ data_model=self.data_model)
445
+
446
+ # check if file can be moved
447
+ try:
448
+ self.resource_entry.ChangeLocation(SystemDirectoryInfo(new_directory_path.full_path),
449
+ '1',
450
+ True)
451
+ except Exception as e:
452
+ logger.error(f'Error moving file: {e}')
453
+ raise e
454
+
439
455
  def get_content(self, encoding='utf-8') -> Optional[Union[str, dict[str, str]]]:
440
456
  """
441
457
  Get the content of the file.
@@ -455,14 +471,19 @@ class FileInfo(object, metaclass=MetaMock):
455
471
  else:
456
472
  return
457
473
 
458
- def copy(self, new_file_path: Optional) -> FileInfo:
474
+ def copy(self,
475
+ new_file_path: Union[str, DirectoryInfo]) -> FileInfo:
459
476
  """
460
477
  Copy the file to a new location.
461
478
  :param new_file_path: New file path.
462
479
  :return: FileInfo
463
480
  """
481
+ if isinstance(new_file_path, DirectoryInfo):
482
+ new_file_path = os.path.join(new_file_path.full_path, self.filename)
483
+
464
484
  shutil.copy(self.full_path, new_file_path)
465
- return FileInfo(new_file_path)
485
+ return FileInfo.from_existing_file(file_path=new_file_path,
486
+ data_model=self.data_model)
466
487
 
467
488
  def write_content(self, content: str, encoding='utf-8') -> None:
468
489
  """
@@ -693,10 +714,13 @@ class DirectoryInfo(object, metaclass=DirectoryInfoMetaMock):
693
714
 
694
715
  return res
695
716
 
717
+ def file_exists(self, filename: str) -> bool:
718
+ return any(x for x in self.files if x.resource_entry.Name == filename)
719
+
696
720
  def get_file(self, filename: str) -> Optional[FileInfo]:
697
721
  resource = next((x for x in self.files if x.resource_entry.Name == filename), None)
698
722
  if resource is not None:
699
- return FileInfo(resource_entry=entry,
723
+ return FileInfo(resource_entry=resource,
700
724
  data_model=self.data_model)
701
725
  else:
702
726
  return None
PySimultan2/utils.py CHANGED
@@ -21,7 +21,7 @@ from SIMULTAN.Data.MultiValues import (SimMultiValueField3D, SimMultiValueField3
21
21
  SimMultiValueBigTableHeader, SimMultiValueBigTableParameterSource)
22
22
 
23
23
  from SIMULTAN.Data.Assets import (ResourceEntry, ResourceFileEntry, ContainedResourceFileEntry, Asset,
24
- LinkedResourceFileEntry, ResourceDirectoryEntry)
24
+ LinkedResourceFileEntry, ResourceDirectoryEntry, DocumentAsset)
25
25
  from SIMULTAN.Data.Geometry import Face, Edge, Vertex, Volume
26
26
 
27
27
  from .multi_values import (simultan_multi_value_field_3d_to_numpy, set_parameter_to_value_field,
@@ -695,10 +695,13 @@ def get_component_taxonomy_entry(component, taxonomy: str):
695
695
  return param
696
696
 
697
697
  for referenced_asset in component.ReferencedAssets:
698
+ if referenced_asset.Resource is None:
699
+ return None
698
700
  resource_taxonomy_keys = [x.Target.Key for x in referenced_asset.Resource.Tags]
699
701
  if taxonomy in resource_taxonomy_keys:
700
702
  return referenced_asset.Resource
701
703
 
704
+
702
705
  if obj is None:
703
706
  return None
704
707
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PySimultan
3
- Version: 0.5.9.4
3
+ Version: 0.5.9.6
4
4
  Project-URL: Documentation, https://github.com/Bühler Maximilian/PySimultan2#readme
5
5
  Project-URL: Issues, https://github.com/Bühler Maximilian/PySimultan2/issues
6
6
  Project-URL: Source, https://github.com/Bühler Maximilian/PySimultan2
@@ -1,15 +1,15 @@
1
1
  PySimultan2/CHANGELOG.md,sha256=oibgN_OC1p98_zVtpae5CtPZNLLnpQYd3XGIN0ztniU,484
2
- PySimultan2/__about__.py,sha256=wcBZdv_01RfwUsYaNCg6k1n5X_r_lKL6F-5kjjNQTv0,21
3
- PySimultan2/__init__.py,sha256=42YM_zQUXdEjbjmgBI0nWJWsr_G6zNe7TxfFmS37mJk,3275
4
- PySimultan2/data_model.py,sha256=UcscVLbBaEu9UhV2iaGJnrqX51G5PyEQuoXrz41Hq9g,36126
5
- PySimultan2/default_types.py,sha256=K-Eka5BCKk8DT3HU5761Ym_-ZFmu1_Dro0zW0LVGoHA,27157
6
- PySimultan2/files.py,sha256=b9Eii3RPx_zKuD09XUndcUrZPEOjYVf1jv2iWDXoWCo,27608
2
+ PySimultan2/__about__.py,sha256=ptvmvpFwZ_clKafeUlFFn3VFq_2wL5rI09ZmrrGMku8,21
3
+ PySimultan2/__init__.py,sha256=PGVR1uhY01dF5tHyad-znURUZ_LVB95vsjId2BT0aJM,3245
4
+ PySimultan2/data_model.py,sha256=QbxlCb5g2j1Ai-ZFhvstbahLPE5Ll3zaMCLgJC8uolk,37589
5
+ PySimultan2/default_types.py,sha256=P43xVs8ItrxONRwq902-InUmCVXiTYerD0i-PME3KeM,27542
6
+ PySimultan2/files.py,sha256=4wuTfjgOMz6BEEwUDgNmUjfHZj0PYvcuE5-LWz2UEb0,28763
7
7
  PySimultan2/multi_values.py,sha256=ZFXlTLuZo32x7_7diYAp2XEjp5uwgHLgNOzN7v74-5I,13650
8
8
  PySimultan2/object_mapper.py,sha256=_SQye38NmIr4m_-X9CuvUJnVDBmjmUDdPH2bnaxpzKY,18546
9
9
  PySimultan2/simultan_object.py,sha256=akaSUZZWIVfwx1wT5EdOgRR2UeShUthX-LE2Uk6w8CQ,19058
10
10
  PySimultan2/taxonomy_maps.py,sha256=K8lwiBkEnQkx40YZxqSJAHdqwuo6ssvkXLL_GBxVYO0,9271
11
11
  PySimultan2/type_setter_lookup.py,sha256=PGa5_EtV7SM15w3uxy0fA3LiQ0TaS4Ys0LYR5zs8aNk,3748
12
- PySimultan2/utils.py,sha256=1e2sYW1ioV0L9NREbBr03Y2tK1Hx9HxQv1pdXnIPIGY,66740
12
+ PySimultan2/utils.py,sha256=0c49o3p4kTpL70ouI31Rjn1Lzu6XPK_YaX2ZHA8cqMg,66829
13
13
  PySimultan2/geometry/__init__.py,sha256=nJolTD1i5J8qUkOQa-r3D20aq3Co3sN31Xc0n4wJpJo,248
14
14
  PySimultan2/geometry/geometry_base.py,sha256=TwABfQEsqxAIGLqwvqVXEV-GA5sYGBJSJm7e58QmNzM,24015
15
15
  PySimultan2/geometry/utils.py,sha256=J25YsK8sso_UL7xRusItQZvyjtvxdOsSPelBQYFABhY,8519
@@ -75,7 +75,7 @@ PySimultan2/resources/assimp.dll,sha256=HwfDwXqoPDTFRyoQpA3qmgZoUdFtziJkV5fNtktE
75
75
  PySimultan2/resources/componentmanager.user,sha256=hrzr1US4pqkFnLHXcvPkvrgGd7QvlxaV8mhS6fuikEs,760
76
76
  PySimultan2/resources/defaultsettings.xml,sha256=s6Tk1tubLz5UYqXZWpD42EDHzedemRY1nEneoIVcUfg,392
77
77
  PySimultan2/resources/setup.bat,sha256=fjvvYfVM6TalS-QTSiKAbAId5nTsk8kGGo06ba-wWaY,32
78
- pysimultan-0.5.9.4.dist-info/METADATA,sha256=zr46P9K9fw5lYkhxEOCHTx7jToKoKxNi_GHX_ATlJOA,6256
79
- pysimultan-0.5.9.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
80
- pysimultan-0.5.9.4.dist-info/licenses/LICENSE.txt,sha256=pmSr98k6N005KMojnZxzLGRuRlDjDx3PUrK1lFj53HA,1126
81
- pysimultan-0.5.9.4.dist-info/RECORD,,
78
+ pysimultan-0.5.9.6.dist-info/METADATA,sha256=Y4NHrFi0t1XhhoTLncaHgMnwmFZj9FW02HrXjh7R_hI,6256
79
+ pysimultan-0.5.9.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
80
+ pysimultan-0.5.9.6.dist-info/licenses/LICENSE.txt,sha256=pmSr98k6N005KMojnZxzLGRuRlDjDx3PUrK1lFj53HA,1126
81
+ pysimultan-0.5.9.6.dist-info/RECORD,,