PySimultan 0.4.8__py3-none-any.whl → 0.4.10__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.8'
1
+ version = '0.4.10'
PySimultan2/data_model.py CHANGED
@@ -674,6 +674,10 @@ class DataModel:
674
674
  sim_taxonomy: SimTaxonomy = None) -> SimTaxonomyEntry:
675
675
  return get_or_create_taxonomy_entry(name, key, description, sim_taxonomy, data_model=self, create=True)
676
676
 
677
+ def get_root_components(self, mapper: 'PythonMapper'):
678
+ mapper.current_data_model = self
679
+ return mapper.get_typed_data(self, component_list=self.data.Items, create_all=False)
680
+
677
681
  def __del__(self):
678
682
  self.cleanup()
679
683
 
@@ -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,
@@ -50,7 +56,7 @@ class PythonMapper(object):
50
56
  EdgeLoop: SimultanEdgeLoop}
51
57
 
52
58
  self.re_register = False
53
- self.load_undefined = True
59
+ self.load_undefined = False
54
60
 
55
61
  def register(self, taxonomy, cls, taxonomy_map=None):
56
62
  if not self.re_register and taxonomy in self.registered_classes.keys():
@@ -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,33 +191,54 @@ class PythonMapper(object):
182
191
  ):
183
192
  self.create_python_geometry_object(component, data_model, *args, **kwargs)
184
193
 
185
- 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
-
191
- def new_init(self, *args, **kwargs):
192
- pass
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
193
231
 
194
- new_cls = type(c_slots[0],
195
- (object,),
196
- {'__init__': new_init}
197
- )
198
-
199
- self.register(c_slots[0], new_cls)
200
- c_slot = [c_slots[0]]
201
- self.undefined_registered_classes[c_slot[0]] = new_cls
202
- # self.create_mapped_class(c_slot[0], self.registered_classes[c_slot[0]])
203
- elif len(c_slot) > 1:
204
- num_superclasses = [len(self.registered_classes[x].__mro__) for x in c_slot]
205
- c_slot = [c_slot[num_superclasses.index(max(num_superclasses))]]
206
- # raise Warning(f'Component {component} has more than one registered taxonomy: {c_slot}')
232
+ # @lru_cache(maxsize=500)
233
+ def create_python_object(self, component, cls=None, data_model=None, *args, **kwargs) -> Optional[SimultanObject]:
207
234
 
208
- if c_slot[0] not in self.mapped_classes.keys():
209
- self.create_mapped_class(c_slot[0], self.registered_classes[c_slot[0]])
235
+ if cls is None:
236
+ cls = self.get_mapped_class_from_component(component,
237
+ data_model,
238
+ *args, **kwargs)
210
239
 
211
- cls = self.mapped_classes[c_slot[0]]
240
+ if cls is None:
241
+ return None
212
242
 
213
243
  if component is not None and component.Id in cls._cls_instances_dict.keys():
214
244
  return cls._cls_instances_dict[component.Id]
@@ -259,6 +289,7 @@ class PythonMapper(object):
259
289
  new_mapper.registered_classes = self.registered_classes
260
290
  new_mapper.taxonomy_maps = self.taxonomy_maps
261
291
  new_mapper.registered_geometry_classes = self.registered_geometry_classes
292
+ new_mapper.load_undefined = self.load_undefined
262
293
  return new_mapper
263
294
 
264
295
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: PySimultan
3
- Version: 0.4.8
3
+ Version: 0.4.10
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,10 +1,10 @@
1
- PySimultan2/__about__.py,sha256=GsPj5qnDEXOmHojoKYA64xByfBNGOIpPpbmrDmCXpAE,19
1
+ PySimultan2/__about__.py,sha256=uGUI89PexfWbfIBjG7h1-NiGB_zMz-AA673uKu8hQGE,20
2
2
  PySimultan2/__init__.py,sha256=cabTN1Oz8xtFM31ouBKg5lwLqW5vtexDP669PYyNLnA,3224
3
- PySimultan2/data_model.py,sha256=CHLfdOFF1blU-TBcn9vK98ejNRMrXUS-hvQEkZI9y4U,27016
3
+ PySimultan2/data_model.py,sha256=3O6O2Lw0lQJtlwNa7_NuTjp4gpdHiusjXHyWtmmHtlU,27214
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=8E06yH5Vz_EaCeJX7UpwGn2cggg7WjhBRR8MHXT420Q,11190
7
+ PySimultan2/object_mapper.py,sha256=nsLuGT0brMqlSoqxsbTHQQxEdoWvoTVM0APpF4MOdTE,12391
8
8
  PySimultan2/simultan_object.py,sha256=Plr9nwgRmKzdkTO7l8ksWekEow9pT-MgjjAfLlChgDI,17208
9
9
  PySimultan2/taxonomy_maps.py,sha256=IYpIat6ZJi5MyCbsjAxWvVOWDRp_VvSMWUY3CApKSik,8061
10
10
  PySimultan2/utils.py,sha256=J3T7KDfONFeLWBulXmGMCaaOu5sfkDSHmI92JWO8dW4,62553
@@ -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.8.dist-info/METADATA,sha256=j_R11uOAuRYWfnvDzoOoyaDfw1LkE3ABfgvKrIRk7h4,1657
79
- pysimultan-0.4.8.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
80
- pysimultan-0.4.8.dist-info/licenses/LICENSE.txt,sha256=pmSr98k6N005KMojnZxzLGRuRlDjDx3PUrK1lFj53HA,1126
81
- pysimultan-0.4.8.dist-info/RECORD,,
78
+ pysimultan-0.4.10.dist-info/METADATA,sha256=Ga4tRspSlIDPakK5JGea9Ft8APQmCEl-sIm4BuU03Ag,2483
79
+ pysimultan-0.4.10.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
80
+ pysimultan-0.4.10.dist-info/licenses/LICENSE.txt,sha256=pmSr98k6N005KMojnZxzLGRuRlDjDx3PUrK1lFj53HA,1126
81
+ pysimultan-0.4.10.dist-info/RECORD,,