PySimultan 0.4.7__py3-none-any.whl → 0.4.9__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/object_mapper.py +61 -22
- PySimultan2/taxonomy_maps.py +2 -1
- {pysimultan-0.4.7.dist-info → pysimultan-0.4.9.dist-info}/METADATA +32 -2
- {pysimultan-0.4.7.dist-info → pysimultan-0.4.9.dist-info}/RECORD +7 -7
- {pysimultan-0.4.7.dist-info → pysimultan-0.4.9.dist-info}/WHEEL +0 -0
- {pysimultan-0.4.7.dist-info → pysimultan-0.4.9.dist-info}/licenses/LICENSE.txt +0 -0
PySimultan2/__about__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
version = '0.4.
|
1
|
+
version = '0.4.9'
|
PySimultan2/object_mapper.py
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
+
from typing import Optional, Type, TYPE_CHECKING, Union
|
1
2
|
from copy import copy
|
2
3
|
from collections import UserList
|
3
4
|
from colorlog import getLogger
|
5
|
+
from weakref import WeakSet
|
4
6
|
|
7
|
+
from . import config
|
5
8
|
from .data_model import data_models
|
6
|
-
from .utils import
|
9
|
+
from .utils import create_python_object, add_properties
|
7
10
|
from .default_types import ComponentList, component_list_map, ComponentDictionary, component_dict_map
|
8
11
|
|
9
12
|
from .simultan_object import SimultanObject
|
@@ -16,6 +19,9 @@ from .geometry.geometry_base import (SimultanLayer, SimultanVertex, SimultanEdge
|
|
16
19
|
|
17
20
|
from .taxonomy_maps import TaxonomyMap, Content
|
18
21
|
|
22
|
+
if TYPE_CHECKING:
|
23
|
+
from .data_model import DataModel
|
24
|
+
|
19
25
|
logger = getLogger('PySimultan')
|
20
26
|
|
21
27
|
default_registered_classes = {'ComponentList': ComponentList,
|
@@ -145,7 +151,8 @@ class PythonMapper(object):
|
|
145
151
|
|
146
152
|
for component in component_list:
|
147
153
|
typed_object = self.create_python_object(component, data_model=data_model)
|
148
|
-
|
154
|
+
if typed_object is not None:
|
155
|
+
typed_data.append(typed_object)
|
149
156
|
return typed_data
|
150
157
|
|
151
158
|
def create_python_geometry_object(self, component, data_model=None, *args, **kwargs):
|
@@ -167,9 +174,11 @@ class PythonMapper(object):
|
|
167
174
|
else:
|
168
175
|
self.create_python_object(component, data_model, *args, **kwargs)
|
169
176
|
|
170
|
-
|
171
|
-
|
172
|
-
|
177
|
+
def get_mapped_class_from_component(self,
|
178
|
+
component,
|
179
|
+
data_model: Optional['DataModel'] = None,
|
180
|
+
*args,
|
181
|
+
**kwargs) -> Optional[Type[SimultanObject]]:
|
173
182
|
if component is None:
|
174
183
|
return None
|
175
184
|
|
@@ -182,24 +191,54 @@ class PythonMapper(object):
|
|
182
191
|
):
|
183
192
|
self.create_python_geometry_object(component, data_model, *args, **kwargs)
|
184
193
|
|
194
|
+
c_slots = [x.Target.Key for x in component.Slots.Items]
|
195
|
+
c_slot = list(set(c_slots) & set(self.registered_classes.keys()))
|
196
|
+
if len(c_slot) == 0:
|
197
|
+
if c_slots[0] not in self.registered_classes.keys() and self.load_undefined:
|
198
|
+
|
199
|
+
def new_init(self, *args, **kwargs):
|
200
|
+
"""
|
201
|
+
Init method for undefined classes
|
202
|
+
:param self:
|
203
|
+
:param args:
|
204
|
+
:param kwargs:
|
205
|
+
:return:
|
206
|
+
"""
|
207
|
+
pass
|
208
|
+
|
209
|
+
new_cls = type(c_slots[0],
|
210
|
+
(object,),
|
211
|
+
{'__init__': new_init}
|
212
|
+
)
|
213
|
+
|
214
|
+
self.register(c_slots[0], new_cls)
|
215
|
+
c_slot = [c_slots[0]]
|
216
|
+
self.undefined_registered_classes[c_slot[0]] = new_cls
|
217
|
+
# self.create_mapped_class(c_slot[0], self.registered_classes[c_slot[0]])
|
218
|
+
elif c_slots[0] not in self.registered_classes.keys() and not self.load_undefined:
|
219
|
+
logger.debug(f'Component {component} has no registered taxonomy: {c_slots}')
|
220
|
+
return
|
221
|
+
elif len(c_slot) > 1:
|
222
|
+
num_superclasses = [len(self.registered_classes[x].__mro__) for x in c_slot]
|
223
|
+
c_slot = [c_slot[num_superclasses.index(max(num_superclasses))]]
|
224
|
+
|
225
|
+
if c_slot[0] not in self.mapped_classes.keys():
|
226
|
+
self.create_mapped_class(c_slot[0], self.registered_classes[c_slot[0]])
|
227
|
+
|
228
|
+
cls = self.mapped_classes[c_slot[0]]
|
229
|
+
|
230
|
+
return cls
|
231
|
+
|
232
|
+
# @lru_cache(maxsize=500)
|
233
|
+
def create_python_object(self, component, cls=None, data_model=None, *args, **kwargs) -> Optional[SimultanObject]:
|
234
|
+
|
185
235
|
if cls is None:
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
self.undefined_registered_classes[c_slot[0]] = SimultanObject
|
193
|
-
self.create_mapped_class(c_slot[0], self.registered_classes[c_slot[0]])
|
194
|
-
elif len(c_slot) > 1:
|
195
|
-
num_superclasses = [len(self.registered_classes[x].__mro__) for x in c_slot]
|
196
|
-
c_slot = [c_slot[num_superclasses.index(max(num_superclasses))]]
|
197
|
-
# raise Warning(f'Component {component} has more than one registered taxonomy: {c_slot}')
|
198
|
-
|
199
|
-
if c_slot[0] not in self.mapped_classes.keys():
|
200
|
-
self.create_mapped_class(c_slot[0], self.registered_classes[c_slot[0]])
|
201
|
-
|
202
|
-
cls = self.mapped_classes[c_slot[0]]
|
236
|
+
cls = self.get_mapped_class_from_component(component,
|
237
|
+
data_model,
|
238
|
+
*args, **kwargs)
|
239
|
+
|
240
|
+
if cls is None:
|
241
|
+
return None
|
203
242
|
|
204
243
|
if component is not None and component.Id in cls._cls_instances_dict.keys():
|
205
244
|
return cls._cls_instances_dict[component.Id]
|
PySimultan2/taxonomy_maps.py
CHANGED
@@ -170,7 +170,8 @@ class TaxonomyMap(object):
|
|
170
170
|
return self._taxonomies[data_model]
|
171
171
|
|
172
172
|
def get_slot(self, data_model: 'DataModel'):
|
173
|
-
return SimTaxonomyEntryReference(self.get_or_create_simultan_taxonomy_entry(data_model=data_model,
|
173
|
+
return SimTaxonomyEntryReference(self.get_or_create_simultan_taxonomy_entry(data_model=data_model,
|
174
|
+
create=True))
|
174
175
|
|
175
176
|
@cache
|
176
177
|
def get_content_by_property_name(self, property_name: str):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: PySimultan
|
3
|
-
Version: 0.4.
|
3
|
+
Version: 0.4.9
|
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
|
@@ -42,9 +42,39 @@ Description-Content-Type: text/markdown
|
|
42
42
|
## Installation
|
43
43
|
|
44
44
|
```console
|
45
|
-
pip install
|
45
|
+
pip install PySimultan
|
46
46
|
```
|
47
47
|
|
48
48
|
## License
|
49
49
|
|
50
50
|
`pysimultan-api` is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.
|
51
|
+
|
52
|
+
|
53
|
+
### Usage
|
54
|
+
|
55
|
+
```python
|
56
|
+
from PySimultan2 import DataModel, Content, TaxonomyMap, PythonMapper
|
57
|
+
```
|
58
|
+
|
59
|
+
|
60
|
+
## FreeCAD support
|
61
|
+
|
62
|
+
PySimultanUI looks for a FreeCAD version in C:\Program Files\FreeCAD. If you don't have FreeCAD installed, you can
|
63
|
+
download it from the FreeCAD website or use the FreeCAD version provided in the FreeCAD-Bundle repository.
|
64
|
+
Go to https://github.com/FreeCAD/FreeCAD-Bundle/releases/tag/weekly-builds and download the latest version
|
65
|
+
of FreeCAD for your OS. The version must be compiled with the same python version you are using (e.g. py311).
|
66
|
+
|
67
|
+
Extract the zip file to C:\Program Files\FreeCAD
|
68
|
+
|
69
|
+
The directory structure should look like this:
|
70
|
+
|
71
|
+
```
|
72
|
+
C:\Program Files\FreeCAD
|
73
|
+
│ ...
|
74
|
+
│ FreeCAD_weekly-builds-37730-conda-Windows-x86_64-py311
|
75
|
+
│ │ bin
|
76
|
+
│ │ lib
|
77
|
+
│ │ ...
|
78
|
+
│
|
79
|
+
|
80
|
+
```
|
@@ -1,12 +1,12 @@
|
|
1
|
-
PySimultan2/__about__.py,sha256=
|
1
|
+
PySimultan2/__about__.py,sha256=gGpYIcr8fwdgEn5xSczdDNlnQ7U-Hl42ws4fZif-nuQ,19
|
2
2
|
PySimultan2/__init__.py,sha256=cabTN1Oz8xtFM31ouBKg5lwLqW5vtexDP669PYyNLnA,3224
|
3
3
|
PySimultan2/data_model.py,sha256=CHLfdOFF1blU-TBcn9vK98ejNRMrXUS-hvQEkZI9y4U,27016
|
4
4
|
PySimultan2/default_types.py,sha256=v_4awsUURLbu4Sfw7J_7BoQKirXbKdU9s7-wqgA4nNE,23112
|
5
5
|
PySimultan2/files.py,sha256=gx3BA6WYjNVplqqes7jkPopp6O50pgLvantXgmitx54,12657
|
6
6
|
PySimultan2/multi_values.py,sha256=ZFXlTLuZo32x7_7diYAp2XEjp5uwgHLgNOzN7v74-5I,13650
|
7
|
-
PySimultan2/object_mapper.py,sha256=
|
7
|
+
PySimultan2/object_mapper.py,sha256=T15f-XBDAh9Bnr74-JBPUj0-lyzZ4OwDXnC7Yu009qA,12333
|
8
8
|
PySimultan2/simultan_object.py,sha256=Plr9nwgRmKzdkTO7l8ksWekEow9pT-MgjjAfLlChgDI,17208
|
9
|
-
PySimultan2/taxonomy_maps.py,sha256=
|
9
|
+
PySimultan2/taxonomy_maps.py,sha256=IYpIat6ZJi5MyCbsjAxWvVOWDRp_VvSMWUY3CApKSik,8061
|
10
10
|
PySimultan2/utils.py,sha256=J3T7KDfONFeLWBulXmGMCaaOu5sfkDSHmI92JWO8dW4,62553
|
11
11
|
PySimultan2/geometry/__init__.py,sha256=nJolTD1i5J8qUkOQa-r3D20aq3Co3sN31Xc0n4wJpJo,248
|
12
12
|
PySimultan2/geometry/geometry_base.py,sha256=jOTNMISGLRjUUjVfPZ64A2Fp4oinv42polIct9bgIY4,23417
|
@@ -75,7 +75,7 @@ PySimultan2/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
75
75
|
PySimultan2/resources/assimp.dll,sha256=HwfDwXqoPDTFRyoQpA3qmgZoUdFtziJkV5fNtktEZEU,6081536
|
76
76
|
PySimultan2/resources/defaultsettings.xml,sha256=s6Tk1tubLz5UYqXZWpD42EDHzedemRY1nEneoIVcUfg,392
|
77
77
|
PySimultan2/resources/setup.bat,sha256=fjvvYfVM6TalS-QTSiKAbAId5nTsk8kGGo06ba-wWaY,32
|
78
|
-
pysimultan-0.4.
|
79
|
-
pysimultan-0.4.
|
80
|
-
pysimultan-0.4.
|
81
|
-
pysimultan-0.4.
|
78
|
+
pysimultan-0.4.9.dist-info/METADATA,sha256=RsCYTnTlEZ9VIAt9wpsKNJtr25vcK7VE6ZKs-pZPGEc,2482
|
79
|
+
pysimultan-0.4.9.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
|
80
|
+
pysimultan-0.4.9.dist-info/licenses/LICENSE.txt,sha256=pmSr98k6N005KMojnZxzLGRuRlDjDx3PUrK1lFj53HA,1126
|
81
|
+
pysimultan-0.4.9.dist-info/RECORD,,
|
File without changes
|
File without changes
|