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 CHANGED
@@ -1 +1 @@
1
- version = '0.4.7'
1
+ version = '0.4.9'
@@ -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
- typed_data.append(typed_object)
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
- # @lru_cache(maxsize=500)
171
- def create_python_object(self, component, cls=None, data_model=None, *args, **kwargs):
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
- c_slots = [x.Target.Key for x in component.Slots.Items]
187
- c_slot = list(set(c_slots) & set(self.registered_classes.keys()))
188
- if len(c_slot) == 0:
189
- if c_slots[0] not in self.registered_classes.keys() and self.load_undefined:
190
- self.register(c_slots[0], SimultanObject)
191
- c_slot = [c_slots[0]]
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]
@@ -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, create=True))
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.7
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 pysimultan-api
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=EXLXxXcwrzEc6_sD7Rj1mFJyQXofYegqzwczrtGZZUw,19
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=CM8L00-RRwUrU_wuhPAIgWJ_-Z0zLCbxo8rkxDzEoe8,10916
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=aU9zUJph7QcInIZq0W-Vqoy4DYr0CEs-VsXwPMK_cxU,7976
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.7.dist-info/METADATA,sha256=9PcCjKXasMhL1RrV9bLtZr8TaynqhDK22xXVpvsjtZo,1657
79
- pysimultan-0.4.7.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
80
- pysimultan-0.4.7.dist-info/licenses/LICENSE.txt,sha256=pmSr98k6N005KMojnZxzLGRuRlDjDx3PUrK1lFj53HA,1126
81
- pysimultan-0.4.7.dist-info/RECORD,,
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,,