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 +1 -1
- PySimultan2/__init__.py +0 -1
- PySimultan2/data_model.py +48 -21
- PySimultan2/default_types.py +11 -3
- PySimultan2/files.py +27 -3
- PySimultan2/utils.py +4 -1
- {pysimultan-0.5.9.4.dist-info → pysimultan-0.5.9.6.dist-info}/METADATA +1 -1
- {pysimultan-0.5.9.4.dist-info → pysimultan-0.5.9.6.dist-info}/RECORD +10 -10
- {pysimultan-0.5.9.4.dist-info → pysimultan-0.5.9.6.dist-info}/WHEEL +0 -0
- {pysimultan-0.5.9.4.dist-info → pysimultan-0.5.9.6.dist-info}/licenses/LICENSE.txt +0 -0
PySimultan2/__about__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
version = '0.5.9.
|
1
|
+
version = '0.5.9.6'
|
PySimultan2/__init__.py
CHANGED
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 =
|
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(
|
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 =
|
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,
|
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(
|
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,
|
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,
|
537
|
-
target_dir: Union[ResourceDirectoryEntry,
|
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 =
|
548
|
+
filename = SystemFileInfo(filename)
|
548
549
|
elif isinstance(filename, PythonFileInfo):
|
549
|
-
filename =
|
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,
|
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,
|
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.
|
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
|
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
|
-
|
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 =
|
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,
|
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(
|
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,
|
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,
|
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
|
-
|
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]:
|
PySimultan2/default_types.py
CHANGED
@@ -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
|
-
|
566
|
-
|
567
|
-
|
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,
|
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=
|
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.
|
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=
|
3
|
-
PySimultan2/__init__.py,sha256=
|
4
|
-
PySimultan2/data_model.py,sha256=
|
5
|
-
PySimultan2/default_types.py,sha256=
|
6
|
-
PySimultan2/files.py,sha256=
|
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=
|
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.
|
79
|
-
pysimultan-0.5.9.
|
80
|
-
pysimultan-0.5.9.
|
81
|
-
pysimultan-0.5.9.
|
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,,
|
File without changes
|
File without changes
|