PySimultan 0.5.9.4__py3-none-any.whl → 0.5.9.6__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
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,,