PySimultan 0.4.8__py3-none-any.whl → 0.4.10__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
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,,