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 +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
|