ovito 3.14.0__cp313-cp313-win_amd64.whl → 3.14.1__cp313-cp313-win_amd64.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.

Potentially problematic release.


This version of ovito might be problematic. Click here for more details.

Files changed (32) hide show
  1. ovito/data/__init__.pyi +46 -0
  2. ovito/data/_property_class.py +19 -4
  3. ovito/data/_property_container.py +210 -36
  4. ovito/io/ase/__init__.py +1 -1
  5. ovito/pipeline/__init__.pyi +2 -1
  6. ovito/pipeline/_modifier_interface.py +1 -1
  7. ovito/pipeline/_pipeline_source_interface.py +1 -1
  8. ovito/plugins/anari_library_visrtx.dll +0 -0
  9. ovito/plugins/libcrypto-3-x64.dll +0 -0
  10. ovito/plugins/libssl-3-x64.dll +0 -0
  11. ovito/plugins/ovito_bindings.pyd +0 -0
  12. ovito/plugins/ssh.dll +0 -0
  13. {ovito-3.14.0.dist-info → ovito-3.14.1.dist-info}/METADATA +1 -1
  14. {ovito-3.14.0.dist-info → ovito-3.14.1.dist-info}/RECORD +32 -32
  15. {ovito-3.14.0.data → ovito-3.14.1.data}/data/etc/jupyter/nbconfig/notebook.d/jupyter-ovito.json +0 -0
  16. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/labextensions/jupyter-ovito/package.json +0 -0
  17. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/labextensions/jupyter-ovito/static/212.a91d8c3b2f0512f1a27a.js +0 -0
  18. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/labextensions/jupyter-ovito/static/212.a91d8c3b2f0512f1a27a.js.LICENSE.txt +0 -0
  19. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/labextensions/jupyter-ovito/static/261.7f7ef969c49c49fa7b56.js +0 -0
  20. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/labextensions/jupyter-ovito/static/406.626f8de2687e0a1e52c7.js +0 -0
  21. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/labextensions/jupyter-ovito/static/486.a609121e89fefbcc13d9.js +0 -0
  22. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/labextensions/jupyter-ovito/static/486.a609121e89fefbcc13d9.js.LICENSE.txt +0 -0
  23. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/labextensions/jupyter-ovito/static/968.ec4930f7e55ef707366b.js +0 -0
  24. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/labextensions/jupyter-ovito/static/remoteEntry.20fbded037a6d6e82936.js +0 -0
  25. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/labextensions/jupyter-ovito/static/style.js +0 -0
  26. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/labextensions/jupyter-ovito/static/third-party-licenses.json +0 -0
  27. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/nbextensions/jupyter-ovito/extension.js +0 -0
  28. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/nbextensions/jupyter-ovito/index.js +0 -0
  29. {ovito-3.14.0.data → ovito-3.14.1.data}/data/share/jupyter/nbextensions/jupyter-ovito/index.js.LICENSE.txt +0 -0
  30. {ovito-3.14.0.dist-info → ovito-3.14.1.dist-info}/WHEEL +0 -0
  31. {ovito-3.14.0.dist-info → ovito-3.14.1.dist-info}/entry_points.txt +0 -0
  32. {ovito-3.14.0.dist-info → ovito-3.14.1.dist-info}/top_level.txt +0 -0
ovito/data/__init__.pyi CHANGED
@@ -41,6 +41,7 @@ import ovito.pipeline
41
41
  import numpy
42
42
  from ovito import ArrayLike
43
43
  from numpy.typing import NDArray, DTypeLike
44
+ import numbers
44
45
  import enum
45
46
  import os
46
47
  from dataclasses import dataclass
@@ -1042,6 +1043,7 @@ OVITO has several concrete implementations of the abstract :py:class:`PropertyCo
1042
1043
  * :py:class:`VoxelGrid`
1043
1044
  * :py:class:`DataTable`
1044
1045
  * :py:class:`Lines`
1046
+ * :py:class:`Vectors`
1045
1047
  * :py:attr:`SurfaceMesh.vertices`
1046
1048
  * :py:attr:`SurfaceMesh.faces`
1047
1049
  * :py:attr:`SurfaceMesh.regions`"""
@@ -1062,6 +1064,45 @@ OVITO has several concrete implementations of the abstract :py:class:`PropertyCo
1062
1064
  def __delitem__(self, key: str) -> None:
1063
1065
  ...
1064
1066
 
1067
+ def append(self, new_row: Mapping[str, numbers.Number | Sequence[numbers.Number] | ArrayLike], strict: bool=True) -> int:
1068
+ """Appends a new row of data to the end of the :py:class:`PropertyContainer` by incrementing the :py:attr:`count` by one.
1069
+ The data of the new element is provided as a dictionary of key-value pairs, where the keys are the property names in the container and the values are the corresponding property values.
1070
+ If the container type does not support appending elements, a ``RuntimeError`` is raised.
1071
+
1072
+ :param new_row: A dictionary mapping property names to their values for the new row.
1073
+ :param strict: If set to ``True`` (default), a strict checking of the keys in *new_row* is performed.
1074
+ :returns: The zero-based index of the newly added row.
1075
+
1076
+ When the `strict` parameter is set to ``True`` (default), the dictionary keys must match the container's property names exactly.
1077
+ In other words, you have to specify a value for every existing property in the container (and *only* those properties).
1078
+ If any keys are missing or extra, a ``KeyError`` is raised.
1079
+
1080
+ When `strict` is set to ``False``:
1081
+
1082
+ * Missing keys are ignored, and the corresponding property values are initialized to 0.
1083
+ * For extra keys, new properties are added to the container and initialized to 0 for all existing elements.
1084
+ * The *dtype* and number of vector components of new properties are inferred from the provided values.
1085
+
1086
+ Example usage of the :py:meth:`append` method:
1087
+
1088
+ ```python
1089
+ print(sorted(data.particles.keys()))
1090
+ # >>> ['Force', 'Particle Identifier', 'Particle Type', 'Position', 'peatom']
1091
+ print(data.particles.count)
1092
+ # >>> 7071
1093
+ data.particles_.append({"Force": (1.2, -1.2, 3.1),
1094
+ "Particle Identifier": 7072,
1095
+ "Particle Type": 2,
1096
+ "Position": (31.2, 33.0, 29.8),
1097
+ "peatom": -4.32})
1098
+ print(data.particles.count)
1099
+ # -> 7072
1100
+ data.particles_.append({"Charge": -0.33, "Gradient 2D": (1.3, 1.2)}, strict=False)
1101
+ print(sorted(data.particles.keys()))
1102
+ # >>> ['Charge', 'Force', 'Gradient 2D', 'Particle Identifier', 'Particle Type', 'Position', 'peatom']
1103
+ ```"""
1104
+ ...
1105
+
1065
1106
  def create_property(self, name: str, dtype: Optional[DTypeLike]=None, components: Optional[Union[int, Sequence[str]]]=None, data: Optional[ArrayLike]=None) -> Property:
1066
1107
  """Adds a new property with the given *name* to the container and optionally initializes its element-wise values with *data*.
1067
1108
  If a property with the given *name* already exists in the container, that existing property is returned
@@ -1084,6 +1125,8 @@ predefined names for the container type:
1084
1125
  * `SurfaceMesh.vertices`: List of standard mesh vertex properties
1085
1126
  * `SurfaceMesh.faces`: List of standard mesh face properties
1086
1127
  * `SurfaceMesh.regions`: List of standard mesh region properties
1128
+ * :py:class:`Vectors`: List of standard vector properties
1129
+ * :py:class:`Lines`: List of standard line properties
1087
1130
 
1088
1131
  The length of the provided *data* array must match the number of elements in the container, which is given by :py:attr:`PropertyContainer.count`.
1089
1132
  If the property to be created is a vectorial property (having :math:`M>1` components), the initial data
@@ -1994,6 +2037,7 @@ OVITO has several concrete implementations of the abstract :py:class:`PropertyCo
1994
2037
  * :py:class:`VoxelGrid`
1995
2038
  * :py:class:`DataTable`
1996
2039
  * :py:class:`Lines`
2040
+ * :py:class:`Vectors`
1997
2041
  * :py:attr:`SurfaceMesh.vertices`
1998
2042
  * :py:attr:`SurfaceMesh.faces`
1999
2043
  * :py:attr:`SurfaceMesh.regions`"""
@@ -2030,6 +2074,7 @@ OVITO has several concrete implementations of the abstract :py:class:`PropertyCo
2030
2074
  * :py:class:`VoxelGrid`
2031
2075
  * :py:class:`DataTable`
2032
2076
  * :py:class:`Lines`
2077
+ * :py:class:`Vectors`
2033
2078
  * :py:attr:`SurfaceMesh.vertices`
2034
2079
  * :py:attr:`SurfaceMesh.faces`
2035
2080
  * :py:attr:`SurfaceMesh.regions`"""
@@ -2066,6 +2111,7 @@ OVITO has several concrete implementations of the abstract :py:class:`PropertyCo
2066
2111
  * :py:class:`VoxelGrid`
2067
2112
  * :py:class:`DataTable`
2068
2113
  * :py:class:`Lines`
2114
+ * :py:class:`Vectors`
2069
2115
  * :py:attr:`SurfaceMesh.vertices`
2070
2116
  * :py:attr:`SurfaceMesh.faces`
2071
2117
  * :py:attr:`SurfaceMesh.regions`"""
@@ -1,34 +1,49 @@
1
1
  from . import Property
2
2
  from ._ovito_ndarray_adapter import add_ndarray_interface
3
3
 
4
+
4
5
  # Give the Property class a Numpy-like interface.
5
6
  add_ndarray_interface(Property)
6
7
 
8
+
7
9
  # Returns a NumPy array wrapper for a property.
8
10
  # For backward compatibility with OVITO 2.9.0:
9
11
  def _Property_array(self):
10
12
  # This attribute returns a NumPy array, which provides read access to the per-element data stored in this property object.
11
13
  return self.__array__()
14
+
15
+
12
16
  Property.array = property(_Property_array)
13
17
 
18
+
14
19
  # Returns a NumPy array wrapper for a property with write access.
15
20
  # For backward compatibility with OVITO 2.9.0:
16
21
  def _Property_marray(self):
17
- with self:
22
+ with self:
18
23
  return self.__array__()
19
24
 
25
+
20
26
  # This is needed to enable the augmented assignment operators (+=, -=, etc.) for the 'marray' property.
21
27
  # For backward compatibility with OVITO 2.9.0:
22
28
  def _Property_marray_assign(self, other):
23
29
  if not hasattr(other, "__array_interface__"):
24
- raise ValueError("Only objects supporting the array interface can be assigned to the 'marray' property.")
30
+ raise ValueError(
31
+ "Only objects supporting the array interface can be assigned to the 'marray' property."
32
+ )
25
33
  o = other.__array_interface__
26
34
  s = self.__array_interface__
27
- if o["shape"] != s["shape"] or o["typestr"] != s["typestr"] or o["data"] != s["data"]:
28
- raise ValueError("Assignment to the 'marray' property is restricted. Left and right-hand side must be identical.")
35
+ if (
36
+ o["shape"] != s["shape"]
37
+ or o["typestr"] != s["typestr"]
38
+ or o["data"] != s["data"]
39
+ ):
40
+ raise ValueError(
41
+ "Assignment to the 'marray' property is restricted. Left and right-hand side must be identical."
42
+ )
29
43
  # Assume that the data has been changed in the meantime.
30
44
  self.notify_object_changed()
31
45
 
46
+
32
47
  # For backward compatibility with OVITO 2.9.0:
33
48
  Property.marray = property(_Property_marray, _Property_marray_assign)
34
49
  Property.get_type_by_id = lambda self, id: self.type_by_id(id)
@@ -5,17 +5,20 @@ import warnings
5
5
  from typing import Optional, Union
6
6
  import numpy
7
7
  import numpy.typing
8
-
9
8
  from . import Property, PropertyContainer
10
9
 
11
10
  # Give the PropertyContainer class a dict-like interface for accessing properties by name:
12
11
  collections.abc.Mapping.register(PropertyContainer)
13
12
 
13
+
14
14
  # Implementation of the printing method for the PropertyContainer class.
15
15
  def _PropertyContainer__str__(self):
16
16
  return str(dict(self))
17
+
18
+
17
19
  PropertyContainer.__str__ = _PropertyContainer__str__
18
20
 
21
+
19
22
  # Assigns the property to the container.
20
23
  # This is needed to make statements of the following kind work:
21
24
  #
@@ -28,69 +31,106 @@ PropertyContainer.__str__ = _PropertyContainer__str__
28
31
  # invoking this __setitem__() special method.
29
32
  def _PropertyContainer__setitem__(self, key, value):
30
33
  if not isinstance(value, Property):
31
- raise ValueError("Expected a Property object. PropertyContainer only accepts Property objects as dictionary values.")
32
- if key.endswith('_'):
34
+ raise ValueError(
35
+ "Expected a Property object. PropertyContainer only accepts Property objects as dictionary values."
36
+ )
37
+ if key.endswith("_"):
33
38
  key = key[:-1]
34
39
  if value.name != key:
35
- raise ValueError("Can only assign a Property whose name matches the key string. Consider using PropertyContainer.create_property() method instead.")
40
+ raise ValueError(
41
+ "Can only assign a Property whose name matches the key string. Consider using PropertyContainer.create_property() method instead."
42
+ )
36
43
  # Accept only the existing property as new dictionary value:
37
44
  if self.get(key) is not value:
38
- raise ValueError("Can only re-assign an existing Property instance to the PropertyContainer but not a new instance. Consider using PropertyContainer.create_property() method instead if you want to assign a new property or replace the values of an existing property in the container.")
45
+ raise ValueError(
46
+ "Can only re-assign an existing Property instance to the PropertyContainer but not a new instance. Consider using PropertyContainer.create_property() method instead if you want to assign a new property or replace the values of an existing property in the container."
47
+ )
39
48
  # The following check is not needed as long as we only accept the existing property:
40
- #if not self.is_safe_to_modify:
49
+ # if not self.is_safe_to_modify:
41
50
  # raise ValueError("Property assignment is only possible for a container that itself is mutable. "
42
51
  # "Make sure you are working with a mutable version of the {} object.".format(self.__class__.__name__))
52
+
53
+
43
54
  PropertyContainer.__setitem__ = _PropertyContainer__setitem__
44
55
 
56
+
45
57
  # Removes the property with the given name from the container.
46
58
  def _PropertyContainer__delitem__(self, key):
47
59
  for p in self.properties:
48
60
  if p.name == key:
49
61
  self._remove_property(p)
50
62
  return
51
- raise KeyError(f"{self.__class__.__name__} data object does not contain the property '{key}'.")
63
+ raise KeyError(
64
+ f"{self.__class__.__name__} data object does not contain the property '{key}'."
65
+ )
66
+
67
+
52
68
  PropertyContainer.__delitem__ = _PropertyContainer__delitem__
53
69
 
70
+
54
71
  # Returns the list of names of all properties in the PropertyContainer.
55
72
  def _PropertyContainer_keys(self):
56
73
  return collections.abc.KeysView(self)
74
+
75
+
57
76
  PropertyContainer.keys = _PropertyContainer_keys
58
77
 
78
+
59
79
  # Returns the list of name-property pairs in the PropertyContainer.
60
80
  def _PropertyContainer_items(self):
61
81
  return collections.abc.ItemsView(self)
82
+
83
+
62
84
  PropertyContainer.items = _PropertyContainer_items
63
85
 
86
+
64
87
  # Returns the list Property objects in the PropertyContainer.
65
88
  def _PropertyContainer_values(self):
66
89
  return self.properties
90
+
91
+
67
92
  PropertyContainer.values = _PropertyContainer_values
68
93
 
94
+
69
95
  # Internal helper function for registering standard property accessor fields for a PropertyContainer subclass.
70
- def create_property_accessor(property_name, doc = None):
96
+ def create_property_accessor(property_name, doc=None):
71
97
  base_property_name = property_name
72
98
  # Remove the leading underscore to get the actual property name.
73
- if base_property_name.endswith('_'):
99
+ if base_property_name.endswith("_"):
74
100
  base_property_name = base_property_name[:-1]
101
+
75
102
  def getter(self):
76
103
  return self.get_(base_property_name)
104
+
77
105
  else:
106
+
78
107
  def getter(self) -> Optional[Property]:
79
108
  return self.get(property_name)
109
+
80
110
  def setter(self, val):
81
111
  # Detect trivial case where the property object is assigned to itself:
82
- if isinstance(val, Property) and val in self.properties and val.name == base_property_name:
112
+ if (
113
+ isinstance(val, Property)
114
+ and val in self.properties
115
+ and val.name == base_property_name
116
+ ):
83
117
  return
84
118
  self.create_property(base_property_name, data=val)
119
+
85
120
  return property(getter, setter, doc=doc)
121
+
122
+
86
123
  PropertyContainer._create_property_accessor = staticmethod(create_property_accessor)
87
124
 
125
+
88
126
  # Implementation of the PropertyContainer.create_property() method.
89
- def _PropertyContainer_create_property(self,
90
- name: str,
91
- dtype: Optional[numpy.typing.DTypeLike] = None,
92
- components: Optional[Union[int, collections.abc.Sequence[str]]] = None,
93
- data: Optional[numpy.typing.ArrayLike] = None) -> Property:
127
+ def _PropertyContainer_create_property(
128
+ self,
129
+ name: str,
130
+ dtype: Optional[numpy.typing.DTypeLike] = None,
131
+ components: Optional[Union[int, collections.abc.Sequence[str]]] = None,
132
+ data: Optional[numpy.typing.ArrayLike] = None,
133
+ ) -> Property:
94
134
  """
95
135
  Adds a new property with the given *name* to the container and optionally initializes its element-wise values with *data*.
96
136
  If a property with the given *name* already exists in the container, that existing property is returned
@@ -113,6 +153,8 @@ def _PropertyContainer_create_property(self,
113
153
  * :py:attr:`SurfaceMesh.vertices <ovito.data.SurfaceMesh.vertices>`: :ref:`List of standard mesh vertex properties <surface-mesh-vertex-properties-list>`
114
154
  * :py:attr:`SurfaceMesh.faces <ovito.data.SurfaceMesh.faces>`: :ref:`List of standard mesh face properties <surface-mesh-face-properties-list>`
115
155
  * :py:attr:`SurfaceMesh.regions <ovito.data.SurfaceMesh.regions>`: :ref:`List of standard mesh region properties <surface-mesh-region-properties-list>`
156
+ * :py:class:`~ovito.data.Vectors`: :ref:`List of standard vector properties <vectors-properties-list>`
157
+ * :py:class:`~ovito.data.Lines`: :ref:`List of standard line properties <lines-properties-list>`
116
158
 
117
159
  The length of the provided *data* array must match the number of elements in the container, which is given by :py:attr:`PropertyContainer.count`.
118
160
  If the property to be created is a vectorial property (having :math:`M>1` components), the initial data
@@ -182,29 +224,43 @@ def _PropertyContainer_create_property(self,
182
224
 
183
225
  if property_type != 0:
184
226
  if component_count is not None:
185
- raise ValueError(f"'{property_name}' is the name of a standard property. When creating such a predefined property with a fixed data layout, you may not exlicitly specify the component count or list of vector components.")
227
+ raise ValueError(
228
+ f"'{property_name}' is the name of a standard property. When creating such a predefined property with a fixed data layout, you may not explicitly specify the component count or list of vector components."
229
+ )
186
230
  if dtype is not None:
187
- raise ValueError(f"'{property_name}' is the name of a standard property. When creating such a predefined property with a fixed data layout, you may not explicitly specify a data type.")
231
+ raise ValueError(
232
+ f"'{property_name}' is the name of a standard property. When creating such a predefined property with a fixed data layout, you may not explicitly specify a data type."
233
+ )
188
234
  else:
189
235
  if dtype is None:
190
236
  if data is None:
191
- raise ValueError("Must provide either a 'data' array or a data type (dtype).")
237
+ raise ValueError(
238
+ "Must provide either a 'data' array or a data type (dtype)."
239
+ )
192
240
  if data is not None:
193
241
  data = numpy.asanyarray(data)
194
242
  elif component_count is None:
195
243
  component_count = 1
196
244
  if component_count is None:
197
245
  if data.ndim < 1 or data.ndim > 2:
198
- raise ValueError("Provided data array must be either 1 or 2-dimensional (or specify no. of components explicitly)")
199
- component_count = data.shape[1] if data.ndim==2 else 1
246
+ raise ValueError(
247
+ "Provided data array must be either 1 or 2-dimensional (or specify no. of components explicitly)"
248
+ )
249
+ component_count = data.shape[1] if data.ndim == 2 else 1
200
250
  if dtype is None:
201
251
  dtype = data.dtype
202
252
  if component_count < 1:
203
- raise ValueError(f"Invalid number of vector components specified for a user-defined property: {component_count}")
253
+ raise ValueError(
254
+ f"Invalid number of vector components specified for a user-defined property: {component_count}"
255
+ )
204
256
  if not property_name:
205
- raise ValueError(f"Invalid name for a property: '{property_name}'. Property name must not be empty.")
206
- if '.' in property_name:
207
- raise ValueError(f"Invalid name for a property: '{property_name}'. Name contains illegal character '.'")
257
+ raise ValueError(
258
+ f"Invalid name for a property: '{property_name}'. Property name must not be empty."
259
+ )
260
+ if "." in property_name:
261
+ raise ValueError(
262
+ f"Invalid name for a property: '{property_name}'. Name contains illegal character '.'"
263
+ )
208
264
 
209
265
  # Translate data type from Python to Qt metatype id.
210
266
  if dtype in (int, numpy.int32):
@@ -218,7 +274,9 @@ def _PropertyContainer_create_property(self,
218
274
  elif dtype in (float, numpy.float64):
219
275
  dtype = Property.DataType.Float64
220
276
  else:
221
- raise TypeError("Invalid property dtype. Supported dtypes are: 'int', 'int8', 'int32', 'int64', 'float', 'float32', and 'float64'.")
277
+ raise TypeError(
278
+ "Invalid property dtype. Supported dtypes are: 'int', 'int8', 'int32', 'int64', 'float', 'float32', and 'float64'."
279
+ )
222
280
 
223
281
  # Validate user-defined property name and component names.
224
282
  try:
@@ -230,40 +288,72 @@ def _PropertyContainer_create_property(self,
230
288
  warnings.warn(str(exc), DeprecationWarning, stacklevel=2)
231
289
 
232
290
  # Check whether property already exists in the container.
233
- existing_prop = self.get_standard_property(property_type) if property_type != 0 else self.get_user_property(property_name)
291
+ existing_prop = (
292
+ self.get_standard_property(property_type)
293
+ if property_type != 0
294
+ else self.get_user_property(property_name)
295
+ )
234
296
 
235
297
  if existing_prop is None:
236
298
 
237
- if data is not None and isinstance(data, collections.abc.Sized) and (not isinstance(data, numpy.ndarray) or data.ndim != 0):
299
+ if (
300
+ data is not None
301
+ and isinstance(data, collections.abc.Sized)
302
+ and (not isinstance(data, numpy.ndarray) or data.ndim != 0)
303
+ ):
238
304
  element_count_hint = len(data)
239
305
  else:
240
306
  element_count_hint = self.count
241
307
 
242
308
  # If property does not exist yet in the container, create and add a new Property instance.
243
309
  if property_type != 0:
244
- prop = self.create_standard_property(property_type, data, element_count_hint)
310
+ prop = self.create_standard_property(
311
+ property_type, data, element_count_hint
312
+ )
245
313
  else:
246
- prop = self.create_user_property(property_name, dtype, component_count, data, element_count_hint, component_names)
314
+ prop = self.create_user_property(
315
+ property_name,
316
+ dtype,
317
+ component_count,
318
+ data,
319
+ element_count_hint,
320
+ component_names,
321
+ )
247
322
  else:
248
323
  # Make sure the data layout of the existing property is compatible with the requested layout.
249
- if component_count is not None and existing_prop.component_count != component_count:
250
- raise ValueError(f"Existing property '{existing_prop.name}' has {existing_prop.component_count} vector component(s), but {component_count} component(s) have been requested for the new property.")
324
+ if (
325
+ component_count is not None
326
+ and existing_prop.component_count != component_count
327
+ ):
328
+ raise ValueError(
329
+ f"Existing property '{existing_prop.name}' has {existing_prop.component_count} vector component(s), but {component_count} component(s) have been requested for the new property."
330
+ )
251
331
  if dtype is not None and existing_prop.data_type != dtype:
252
332
  from ovito.qt_compat import QtCore
253
- raise ValueError(f"Existing property '{existing_prop.name}' has data type '{QtCore.QMetaType.typeName(existing_prop.data_type)}', but data type '{QtCore.QMetaType.typeName(dtype)}' has been requested for the new property.")
333
+
334
+ raise ValueError(
335
+ f"Existing property '{existing_prop.name}' has data type '{QtCore.QMetaType.typeName(existing_prop.data_type)}', but data type '{QtCore.QMetaType.typeName(dtype)}' has been requested for the new property."
336
+ )
254
337
 
255
338
  # Adjust container's element count to the provided data array length in case the count is still zero (the default).
256
- if data is not None and hasattr(data, '__iter__') and self.count == 0:
339
+ if data is not None and hasattr(data, "__iter__") and self.count == 0:
257
340
  self.count = len(data)
258
341
  # Note: Have to look up the property in the container again now, because changing the element count likely replaces all property objects with copies.
259
- existing_prop = self.get_standard_property(property_type) if property_type != 0 else self.get(property_name)
342
+ existing_prop = (
343
+ self.get_standard_property(property_type)
344
+ if property_type != 0
345
+ else self.get(property_name)
346
+ )
260
347
 
261
348
  # Make a copy of the existing property if necessary so that we can safely modify it. Then overwrite its contents if the user has provided new values.
262
349
  prop = self._assign_property_contents(existing_prop, data)
263
350
 
264
351
  return prop
352
+
353
+
265
354
  PropertyContainer.create_property = _PropertyContainer_create_property
266
355
 
356
+
267
357
  # Implementation of the PropertyContainer.delete_elements() method.
268
358
  def _PropertyContainer_delete_elements(self, mask: numpy.typing.ArrayLike):
269
359
  """
@@ -281,11 +371,16 @@ def _PropertyContainer_delete_elements(self, mask: numpy.typing.ArrayLike):
281
371
  The effect of this statement is the same as for applying the :py:class:`~ovito.modifiers.DeleteSelectedModifier` to the particles list.
282
372
  """
283
373
  mask_arr = numpy.asanyarray(mask)
284
- if mask_arr.shape != (self.count, ):
285
- raise ValueError(f"Mask array must be a 1-d array of length {self.count}, matching the element count in the PropertyContainer.")
374
+ if mask_arr.shape != (self.count,):
375
+ raise ValueError(
376
+ f"Mask array must be a 1-d array of length {self.count}, matching the element count in the PropertyContainer."
377
+ )
286
378
  return self._delete_elements(mask_arr)
379
+
380
+
287
381
  PropertyContainer.delete_elements = _PropertyContainer_delete_elements
288
382
 
383
+
289
384
  # Implementation of the PropertyContainer.delete_indices() method.
290
385
  def _PropertyContainer_delete_indices(self, indices: collections.abc.Iterable[int]):
291
386
  """
@@ -300,4 +395,83 @@ def _PropertyContainer_delete_indices(self, indices: collections.abc.Iterable[in
300
395
  :lines: 25-25
301
396
  """
302
397
  return self._delete_indices(indices)
398
+
399
+
303
400
  PropertyContainer.delete_indices = _PropertyContainer_delete_indices
401
+
402
+
403
+ def _property_append(
404
+ self,
405
+ new_row: collections.abc.Mapping[str, numbers.Number | collections.abc.Sequence[numbers.Number]],
406
+ strict: bool = True,
407
+ ) -> int:
408
+ """
409
+ Appends a new row of data to the end of the :py:class:`PropertyContainer` by incrementing the :py:attr:`count` by one.
410
+ The data of the new element is provided as a dictionary of key-value pairs, where the keys are the property names in the container and the values are the corresponding property values.
411
+ If the container type does not support appending elements, a ``RuntimeError`` is raised.
412
+
413
+ :param new_row: A dictionary mapping property names to their values for the new row.
414
+ :param strict: If set to ``True`` (default), a strict checking of the keys in *new_row* is performed.
415
+ :returns: The zero-based index of the newly added row.
416
+
417
+ When the `strict` parameter is set to ``True`` (default), the dictionary keys must match the container's property names exactly.
418
+ In other words, you have to specify a value for every existing property in the container (and *only* those properties).
419
+ If any keys are missing or extra, a ``KeyError`` is raised.
420
+
421
+ When `strict` is set to ``False``:
422
+
423
+ * Missing keys are ignored, and the corresponding property values are initialized to 0.
424
+ * For extra keys, new properties are added to the container and initialized to 0 for all existing elements.
425
+ * The *dtype* and number of vector components of new properties are inferred from the provided values.
426
+
427
+ Example usage of the :py:meth:`!append` method:
428
+
429
+ .. literalinclude:: ../example_snippets/property_container.py
430
+ :lines: 60-73
431
+ """
432
+
433
+ # Check that this container support item appending.
434
+ self.check_appendability()
435
+
436
+ if not isinstance(new_row, collections.abc.Mapping):
437
+ raise TypeError("new_row must be a mapping (dict-like object).")
438
+
439
+ # Validate keys
440
+ if strict and set(new_row.keys()) != set(self.keys()):
441
+ raise KeyError(
442
+ f"In strict mode, keys provided in the new_row dictionary must match keys in the PropertyContainer exactly. The keys in the PropertyContainer are: {sorted(list(self.keys()))}. Alternatively, you can set the strict parameter to False."
443
+ )
444
+
445
+ # Extend the current container by 1
446
+ self.count += 1
447
+
448
+ try:
449
+ # Transfer the data
450
+ for key, value in new_row.items():
451
+ prop = self.get_(key, require=False)
452
+ if prop is None:
453
+ # Insert new property by key
454
+ if self.standard_property_type_id(key) != 0:
455
+ prop = self.create_property(key)
456
+ else:
457
+ if isinstance(value, collections.abc.Sequence):
458
+ components = len(value)
459
+ if components == 0:
460
+ raise ValueError(
461
+ "Cannot create a property with zero components."
462
+ )
463
+ itemType = type(value[0])
464
+ else:
465
+ itemType = type(value)
466
+ components = 1
467
+ prop = self.create_property(key, itemType, components=components)
468
+ # Set the value of the last element
469
+ prop[-1] = value
470
+ except Exception:
471
+ # Reset the count if anything went wrong
472
+ self.count -= 1
473
+ # Re-raise the exception
474
+ raise
475
+ return self.count - 1
476
+
477
+ PropertyContainer.append = _property_append
ovito/io/ase/__init__.py CHANGED
@@ -121,7 +121,7 @@ def ase_to_ovito(atoms: 'ase.atoms.Atoms', data_collection: Optional[ovito.data.
121
121
  tarray[i] = types.add_type_name(sym, particles).id
122
122
 
123
123
  # Check for computed properties - forces, energies, stresses
124
- calc = atoms.get_calculator()
124
+ calc = atoms.calc if hasattr(atoms, "calc") else atoms.get_calculator() # get_calculator() is deprecated since ASE 3.20.0
125
125
  if calc is not None:
126
126
  for name, ptype in [('forces', 'Force'),
127
127
  ('energies', 'Potential Energy'),
@@ -22,6 +22,7 @@ import ovito.modifiers
22
22
  from ovito import ArrayLike
23
23
  import enum
24
24
  import abc
25
+ import os
25
26
  from dataclasses import dataclass
26
27
 
27
28
  @dataclass(kw_only=True)
@@ -304,7 +305,7 @@ A typical use case is assigning the radii and names to particle types loaded fro
304
305
  pipeline.modifiers.append(setup_atom_types)
305
306
  ```"""
306
307
 
307
- def load(self, location: Union[str, Sequence[str]], **params: Any) -> None:
308
+ def load(self, location: Union[str, os.PathLike, Sequence[str]], **params: Any) -> None:
308
309
  """Sets a new input file, from which this pipeline source will retrieve its data.
309
310
 
310
311
  The function accepts additional keyword arguments, which are forwarded to the format-specific file reader
@@ -58,7 +58,7 @@ class ModifierInterface(traits.api.HasTraits):
58
58
  """
59
59
  return super().compute(frame)
60
60
 
61
- # Event trait is is fired whenver the number of trajectory frames the modifier generates changes.
61
+ # Event trait is is fired whenever the number of trajectory frames the modifier generates changes.
62
62
  _trajectory_length_changed_event = traits.api.Event(descr='Requests recomputation of the number of output animation frames')
63
63
 
64
64
  def notify_trajectory_length_changed(self):
@@ -28,7 +28,7 @@ class PipelineSourceInterface(traits.api.HasTraits):
28
28
 
29
29
  """
30
30
 
31
- # Event trait is is fired whenver the number of trajectory frames the source generates changes.
31
+ # Event trait is is fired whenever the number of trajectory frames the source generates changes.
32
32
  _trajectory_length_changed_event = traits.api.Event(descr='Requests recomputation of the number of animation frames')
33
33
 
34
34
  def notify_trajectory_length_changed(self):
Binary file
Binary file
Binary file
Binary file
ovito/plugins/ssh.dll CHANGED
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ovito
3
- Version: 3.14.0
3
+ Version: 3.14.1
4
4
  Summary: A scientific data visualization and analysis software for particle-based simulations
5
5
  Author-email: "OVITO GmbH, Germany" <mail@ovito.org>
6
6
  License-Expression: MIT
@@ -44,7 +44,7 @@ ovito/_extensions/scripts/readers/__init__.py,sha256=1p3M7BMfAU-gHAESvZn8HvskfMT
44
44
  ovito/_extensions/scripts/writers/ASE Trajectory.py,sha256=qwdGDmXCHzJGOrjgU_YzD6i260CQM0J8-9dHZiojrjo,1555
45
45
  ovito/_extensions/scripts/writers/__init__.py,sha256=KLnPEbV6yq8oKwmyOSJttDez2hFBGVme7YAW26a20AQ,416
46
46
  ovito/data/__init__.py,sha256=GeCW_PAQWPeQI60agPJm1vgIgcRG6XkAKng_OdaJGtM,2186
47
- ovito/data/__init__.pyi,sha256=kaE8yZaJutsV6ewtGaWQzD5JLCrE89JEBbgmu0LiiCw,263852
47
+ ovito/data/__init__.pyi,sha256=zAPxZDiEcbPl9RYZTJfBJ4b7ZxLmpDDnGbxvLFScQs4,266332
48
48
  ovito/data/_bonds_class.py,sha256=tMzpLk0HoiKLEMhXd_8enURg8ir-xYVnsEEE739b3rs,4351
49
49
  ovito/data/_cutoff_neighbor_finder.py,sha256=Qg885pSSL--wqQuePIIEPE-CVNcVhpIs1ECXXS7Jd5U,10686
50
50
  ovito/data/_data_collection.py,sha256=pThm3xXkRHjMHMxnM1zqJnAOXc5NjlPEjMPLfiiCLFM,12675
@@ -54,8 +54,8 @@ ovito/data/_lines.py,sha256=2YMpyI-NAK2ypdTOZymyAlHOx8nCTZrqkl3hs1h0DJ4,3811
54
54
  ovito/data/_nearest_neighbor_finder.py,sha256=Y6noThJEAvZZeCKUbCMkTCq1w9PJ7ESxRERCcakQ2UY,10928
55
55
  ovito/data/_ovito_ndarray_adapter.py,sha256=IN3ohPIV5VKSSx9ktqkE5fiSL5l8av7BwBJUgPOVxSY,8439
56
56
  ovito/data/_particles_class.py,sha256=MBGadUCnMoyk9TU9M2EdFv7xxlvfhvLx0d7O9XD3oQs,14836
57
- ovito/data/_property_class.py,sha256=TqTBLsSD7ePc-HwXaCXP6IlrUkxTeyS58LR6b7D0RzU,1751
58
- ovito/data/_property_container.py,sha256=1agUBSHBGZJc2Btb3EFkANfPI4AcLxmOAKrmckcYdt4,17390
57
+ ovito/data/_property_class.py,sha256=0CxLWIqy2lN890MQNWmw6qAHizv4t6ssWKKV9gJQiLw,1848
58
+ ovito/data/_property_container.py,sha256=_tBMWC3F4BH_6s3ia8bMQ4M91Nc0WZcFxQPxlhr4h6A,21977
59
59
  ovito/data/_ptm_neighbor_finder.py,sha256=9D8GJQYIc-P3rZtoKQ3IttawN4iKUBKCo6xzlEK5dzY,3414
60
60
  ovito/data/_simulation_cell.py,sha256=OaIlJCQczYPkIgINYR9_wZ2zI5USVM-tOHhzgxgNteY,7408
61
61
  ovito/data/_vectors.py,sha256=cV5-S1WIlXmVUKki5sziGqCDxDx6xIkoBRdhgM8DFh8,3060
@@ -71,7 +71,7 @@ ovito/io/_export_file_func.py,sha256=jw6zV9ZpfkSSMtjRw6Dpw8RLdHz4ll7_3PWwsAIyyb0
71
71
  ovito/io/_file_reader_interface.py,sha256=f4J9KKB3W5rMmOoZ28xBlO4uBnUJ9fhg9r1SydOj088,5895
72
72
  ovito/io/_file_writer_interface.py,sha256=WzZGjatNPeZAnIo6QaWoI7jScr3OjKZ4FHa82yQtZu0,6264
73
73
  ovito/io/_import_file_func.py,sha256=LVWibl2r_AlqsADajppokxZbvEiONlCrIAf-5YEiuxE,12003
74
- ovito/io/ase/__init__.py,sha256=ifJtaXGiEDHR_4KOmulg5n54pe0pxdncH0_p7S2yIrw,6838
74
+ ovito/io/ase/__init__.py,sha256=UAB4Xkuo7qT3ZCbiWsefqSeWUGAdijrTH9H27-D1w-k,6930
75
75
  ovito/io/ase/__init__.pyi,sha256=899gDlEHWlTph06E9Rkklp4IB7hEuQ4N-WsamCsHVgY,3010
76
76
  ovito/io/lammps/__init__.py,sha256=exssf6Xxky-7j0p8MbmG8wfVpJ1hf1wHseSTAu3B0Kk,5652
77
77
  ovito/io/lammps/__init__.pyi,sha256=Cek7_UDBWHmwMG8-KYAp_WFNCzHyHakh5sWdL7eCDAU,3766
@@ -104,18 +104,18 @@ ovito/nonpublic/_lammps_data_io.py,sha256=NchvGhkU5OBx1pqkPaFjay3LbwGNK2mVe6HD1A
104
104
  ovito/nonpublic/_render_settings.py,sha256=4ZE7jgzhEADG1wH-izyIQhdFZ_9uL4bxXfvUcon27mQ,1858
105
105
  ovito/nonpublic/_viewport_configuration.py,sha256=V7XMWPuE8yg8Ol4WU5HZEpbCsSHXyyhnKhGstS85Gjg,658
106
106
  ovito/pipeline/__init__.py,sha256=nQX0UwLcpei7VnWQsWZM_S8EKDYNf33GUX6Yjlb_XZI,1321
107
- ovito/pipeline/__init__.pyi,sha256=DAZqaIH1nGkV6cy81sHbzLo33MtDrRkjn0LPxWKGveg,51475
107
+ ovito/pipeline/__init__.pyi,sha256=2Y0rxyjxRmWEJyWpvYprvPtCb-na0XrfCI_MbxP8gj4,51499
108
108
  ovito/pipeline/_file_source.py,sha256=aUbT-O7ZUrRUnx0xXJS-SCFimUjie-APtw7iuWVUFFA,7079
109
- ovito/pipeline/_modifier_interface.py,sha256=8-1nZ_6cmFZm95mYdAgkao0srIFAZPor8Vp8o_0OLuQ,11745
109
+ ovito/pipeline/_modifier_interface.py,sha256=Pm5fzuforfykCGDY8L5fD2LVAtGZAILCrCxa7k6ejHc,11746
110
110
  ovito/pipeline/_pipeline_class.py,sha256=cFa7zNwhHuYX7g8O7pAqV1bmGaffgsjkJ8ZP7J54XMk,14077
111
111
  ovito/pipeline/_pipeline_node.py,sha256=I5PvVGUzZJj2bAjyv3QegJOD8q1h-mcuzeZV52XavSk,1636
112
- ovito/pipeline/_pipeline_source_interface.py,sha256=kKwOn-vDUvKPuCYcQrSqBoo389VTXcl29x72uqRWymw,4093
112
+ ovito/pipeline/_pipeline_source_interface.py,sha256=FY3bb_1VLR6643arpvuZ0G3SF6ZM9tE8Rm366TLxSbo,4094
113
113
  ovito/plugins/OpenImageDenoise.dll,sha256=r0u9mea3x2E23nPIFQeQaWqtSssyU0CgoWcidHCgasg,85504
114
114
  ovito/plugins/OpenImageDenoise_core.dll,sha256=fM5YYT_ntNcOgI7Tm7GHaBZ_m3nC05-hi1wx0ewBpf8,47530496
115
115
  ovito/plugins/OpenImageDenoise_device_cpu.dll,sha256=27daHquP9s7Q-bziDF199VSSkM10Z4GDrrXcID6Vg7g,494592
116
116
  ovito/plugins/__init__.py,sha256=dpdiBpNwzk02ljt69MvY3haQAsMt1hiP9Xx91OkAxqM,5764
117
117
  ovito/plugins/anari.dll,sha256=8NpDkp2DdOWrwuqjlCEckxedcNrUB_beg-XTMbQ98BY,41984
118
- ovito/plugins/anari_library_visrtx.dll,sha256=qxiDbOJiE4_J9i9bxDWlja0ycvP6kPlVhuhupUaLCvM,54048768
118
+ ovito/plugins/anari_library_visrtx.dll,sha256=hS99lUh6XBMLTXHLSMvbmgS507pCJ05AyoaOxvZknnM,54049280
119
119
  ovito/plugins/avcodec-61.dll,sha256=WzSrZWjyP0nL27M70ubotelv06y-AQvIGzTal8_6Fn8,7873024
120
120
  ovito/plugins/avfilter-10.dll,sha256=Ns7CRa7UNhIl6POS2ovXtM5osIxtaCDTGsIzcBifXFU,4075520
121
121
  ovito/plugins/avformat-61.dll,sha256=MNGEitFbEe0y2oL0ZnZyaPC3qXLKQfgH5yoBwsaJXRw,2299904
@@ -124,8 +124,8 @@ ovito/plugins/cudart64_12.dll,sha256=wsmpwiqby6kOJhgllog2eHszEDgEeiZ3DP-3pYPCg0Q
124
124
  ovito/plugins/embree4.dll,sha256=QNKxXSq3jb0-iwSzSRf4OnBzDRG7ADGiX5ATif-n2fM,25335296
125
125
  ovito/plugins/hdf5.dll,sha256=oMyjRZsd9XDfVIrlV4ORALaPHbUmC2O7f6gCY0B6VTY,3338240
126
126
  ovito/plugins/hdf5_hl.dll,sha256=Dz4WdzP5izgt7Rh6j6vGpAXw5MNZpzpeGQVl0fovGUM,121344
127
- ovito/plugins/libcrypto-3-x64.dll,sha256=tNZ0LV_MOaRxnv5LMkBmta1m3p6RWQwFpvRfVFtNfGU,5235712
128
- ovito/plugins/libssl-3-x64.dll,sha256=4RxbdtyufaXEPdnYhmWw6DZ88JT_9JmXJvypfeMrZwk,781824
127
+ ovito/plugins/libcrypto-3-x64.dll,sha256=JH0BsKnolaSZV9PxPMeZtNnUvmWSAA_BFyVtxYaXabs,5237760
128
+ ovito/plugins/libssl-3-x64.dll,sha256=iVkqbrFCGvtIa1ayyh06jHRsKYq_IbAK3D-8i_txyeo,780800
129
129
  ovito/plugins/netcdf.dll,sha256=1DQNxVRkxf6izmIuEQ_LG93twsrP42Pw3NufiUMYK08,1034240
130
130
  ovito/plugins/openvkl.dll,sha256=PUxCiHBsqIiuU51PJFht8phJswiaMsLvt1kwnTMd3S0,193024
131
131
  ovito/plugins/openvkl_module_cpu_device.dll,sha256=ZfalKyCv0Sdi3_M564bn6uD4XcRlx3vETDrUAtdH5S4,26112
@@ -134,9 +134,9 @@ ovito/plugins/openvkl_module_cpu_device_8.dll,sha256=t7F5YkyYjy0Fc3mrRsBjorY5Rj-
134
134
  ovito/plugins/ospray.dll,sha256=dqN09zQerBAoI0_w4tuy_oKd0k_9ZBjS4zVCw1ob_tQ,211456
135
135
  ovito/plugins/ospray_module_cpu.dll,sha256=S06HMaalVTj8GDcdtAgbG7qSoY3clcnrmkBxOgsA0YY,9701376
136
136
  ovito/plugins/ospray_module_denoiser.dll,sha256=3I2ysZBqqKjFO13HI_evkbwZphndT16AfSWdmyoY7Ck,53760
137
- ovito/plugins/ovito_bindings.pyd,sha256=tKYdSiDlSHqHAkrXapx2da-nHXJdMU1WSrTUKPQCDGA,21102080
137
+ ovito/plugins/ovito_bindings.pyd,sha256=VEcSiBaPvZCD1RaxrdcDv1dBSwU8pI22MsHIAnaRFz4,21118976
138
138
  ovito/plugins/rkcommon.dll,sha256=FP8ZSmMde6BuwCi7UQRYtX5hjK8h2YSRewBrbgXjEps,136192
139
- ovito/plugins/ssh.dll,sha256=_l3Dcr7qlekHEShaI4T3jmcoKqR5UY9r5_64WaNF0KQ,346624
139
+ ovito/plugins/ssh.dll,sha256=9tJOHv7xPJezqDSx72Lh6pV99rtu9Rj_UtQqTlsCkFE,350208
140
140
  ovito/plugins/swresample-5.dll,sha256=IT-mpgX9mvZhWPmZ5z-3BQlA5082Qa-6QGSSaoyo34Y,230912
141
141
  ovito/plugins/swscale-8.dll,sha256=s5tFydFqpB4fsUdr6xbf31os9-Bp0kWU2Yn_e1yZUzA,744448
142
142
  ovito/plugins/tbb12.dll,sha256=YmmCLrELneLmOBL9UrlsTZPVrVODV2AZL1yJLjfY5S0,339336
@@ -151,23 +151,23 @@ ovito/vis/_dislocation_vis.py,sha256=fqdALxEFKi4g7PxpFm4N5ZOUyvT8OVrDDwUHbohjfkQ
151
151
  ovito/vis/_viewport.py,sha256=daqHwCDdpeorqWu0yjRjXnBdJQFlHHnfmywKdJPO-pI,14498
152
152
  ovito/vis/_viewport_create_jupyter_widget.py,sha256=v7oSYt9Jd0Yc5-fCEm7mWjNduIKSl29Xb4KKmxe8OiQ,632
153
153
  ovito/vis/_viewport_overlay_interface.py,sha256=qTUSpouKA6sEvboGLUnHln54T4335_DG1d4P6HOeq9M,26673
154
- ovito-3.14.0.data/data/etc/jupyter/nbconfig/notebook.d/jupyter-ovito.json,sha256=ur_rRIOdKiN6HHcJnwSqJmL3z02Qrri7AfFSwTEER3Y,78
155
- ovito-3.14.0.data/data/share/jupyter/labextensions/jupyter-ovito/package.json,sha256=lSzylvZ9COm1Nk3gNmDsG2iPBCMEr7TWiL2W_3EFTes,5356
156
- ovito-3.14.0.data/data/share/jupyter/labextensions/jupyter-ovito/static/212.a91d8c3b2f0512f1a27a.js,sha256=rVqO1EEpTwF2Wm-TDFdp3rZbpUGco4vaSMifpto_IS4,646723
157
- ovito-3.14.0.data/data/share/jupyter/labextensions/jupyter-ovito/static/212.a91d8c3b2f0512f1a27a.js.LICENSE.txt,sha256=WlkM2QXJOY0Ixiqf5LCX7H_CdipOt5KYV8ip2FEecX8,92
158
- ovito-3.14.0.data/data/share/jupyter/labextensions/jupyter-ovito/static/261.7f7ef969c49c49fa7b56.js,sha256=f375acScSfp7VnLQ1_KxNCNstAmi4GUbc9oW9ej9LKM,304
159
- ovito-3.14.0.data/data/share/jupyter/labextensions/jupyter-ovito/static/406.626f8de2687e0a1e52c7.js,sha256=Ym-N4mh-Ch5Sx7ZrKfBPhtvwsOanA-d6PkT8XjaIc0c,230656
160
- ovito-3.14.0.data/data/share/jupyter/labextensions/jupyter-ovito/static/486.a609121e89fefbcc13d9.js,sha256=k1e9catKz7grg-BM9de8rWyMis8Jpln06uKB1ihndDY,70494
161
- ovito-3.14.0.data/data/share/jupyter/labextensions/jupyter-ovito/static/486.a609121e89fefbcc13d9.js.LICENSE.txt,sha256=0z77300wm_pESBmVUTcf-B1fV2YbeB-vedJWVU4DhZU,336
162
- ovito-3.14.0.data/data/share/jupyter/labextensions/jupyter-ovito/static/968.ec4930f7e55ef707366b.js,sha256=7Ekw9-Ve9wc2azd0HKPpH7stBKVy3jbOLrPotpe_6Zc,56726
163
- ovito-3.14.0.data/data/share/jupyter/labextensions/jupyter-ovito/static/remoteEntry.20fbded037a6d6e82936.js,sha256=IPve0Dem1ugpNu3FV2XMSNTKCOtkCJu9yt93ea4xSO4,7386
164
- ovito-3.14.0.data/data/share/jupyter/labextensions/jupyter-ovito/static/style.js,sha256=-CQt0ZTPaCTvrRiLcznxflAbfvIKlOVzjOos-muaXQ8,118
165
- ovito-3.14.0.data/data/share/jupyter/labextensions/jupyter-ovito/static/third-party-licenses.json,sha256=-b9NN21Lgw--CkTtP9y3RcohV3L2MYsGIDpgZlDAhhM,5802
166
- ovito-3.14.0.data/data/share/jupyter/nbextensions/jupyter-ovito/extension.js,sha256=6jGtI8C5z7cjmII51rcQa-bgN-Hw2rsdGM9gAQfl7Xg,324
167
- ovito-3.14.0.data/data/share/jupyter/nbextensions/jupyter-ovito/index.js,sha256=_c__hqxu5nZ6gO8il_ilytV7NjXOJitY3wNKNBq8hEw,851400
168
- ovito-3.14.0.data/data/share/jupyter/nbextensions/jupyter-ovito/index.js.LICENSE.txt,sha256=vXSfdCv-VyJaPCZwz8ppxmu1U7OsjgRBXrnE3Ovabs4,429
169
- ovito-3.14.0.dist-info/METADATA,sha256=EdwMx9U8Wf-C0wmig5pYlx4gzryASwcPiLlaAZsUTLY,2366
170
- ovito-3.14.0.dist-info/WHEEL,sha256=qV0EIPljj1XC_vuSatRWjn02nZIz3N1t8jsZz7HBr2U,101
171
- ovito-3.14.0.dist-info/entry_points.txt,sha256=lW-u-1opGho2K7OiaiGv0qp9rfwd6iF-fF7vXacH-6o,641
172
- ovito-3.14.0.dist-info/top_level.txt,sha256=0tFsUJTGWdGujHIJslwurR1vDrOk080U4u24BAbLlKQ,12
173
- ovito-3.14.0.dist-info/RECORD,,
154
+ ovito-3.14.1.data/data/etc/jupyter/nbconfig/notebook.d/jupyter-ovito.json,sha256=ur_rRIOdKiN6HHcJnwSqJmL3z02Qrri7AfFSwTEER3Y,78
155
+ ovito-3.14.1.data/data/share/jupyter/labextensions/jupyter-ovito/package.json,sha256=lSzylvZ9COm1Nk3gNmDsG2iPBCMEr7TWiL2W_3EFTes,5356
156
+ ovito-3.14.1.data/data/share/jupyter/labextensions/jupyter-ovito/static/212.a91d8c3b2f0512f1a27a.js,sha256=rVqO1EEpTwF2Wm-TDFdp3rZbpUGco4vaSMifpto_IS4,646723
157
+ ovito-3.14.1.data/data/share/jupyter/labextensions/jupyter-ovito/static/212.a91d8c3b2f0512f1a27a.js.LICENSE.txt,sha256=WlkM2QXJOY0Ixiqf5LCX7H_CdipOt5KYV8ip2FEecX8,92
158
+ ovito-3.14.1.data/data/share/jupyter/labextensions/jupyter-ovito/static/261.7f7ef969c49c49fa7b56.js,sha256=f375acScSfp7VnLQ1_KxNCNstAmi4GUbc9oW9ej9LKM,304
159
+ ovito-3.14.1.data/data/share/jupyter/labextensions/jupyter-ovito/static/406.626f8de2687e0a1e52c7.js,sha256=Ym-N4mh-Ch5Sx7ZrKfBPhtvwsOanA-d6PkT8XjaIc0c,230656
160
+ ovito-3.14.1.data/data/share/jupyter/labextensions/jupyter-ovito/static/486.a609121e89fefbcc13d9.js,sha256=k1e9catKz7grg-BM9de8rWyMis8Jpln06uKB1ihndDY,70494
161
+ ovito-3.14.1.data/data/share/jupyter/labextensions/jupyter-ovito/static/486.a609121e89fefbcc13d9.js.LICENSE.txt,sha256=0z77300wm_pESBmVUTcf-B1fV2YbeB-vedJWVU4DhZU,336
162
+ ovito-3.14.1.data/data/share/jupyter/labextensions/jupyter-ovito/static/968.ec4930f7e55ef707366b.js,sha256=7Ekw9-Ve9wc2azd0HKPpH7stBKVy3jbOLrPotpe_6Zc,56726
163
+ ovito-3.14.1.data/data/share/jupyter/labextensions/jupyter-ovito/static/remoteEntry.20fbded037a6d6e82936.js,sha256=IPve0Dem1ugpNu3FV2XMSNTKCOtkCJu9yt93ea4xSO4,7386
164
+ ovito-3.14.1.data/data/share/jupyter/labextensions/jupyter-ovito/static/style.js,sha256=-CQt0ZTPaCTvrRiLcznxflAbfvIKlOVzjOos-muaXQ8,118
165
+ ovito-3.14.1.data/data/share/jupyter/labextensions/jupyter-ovito/static/third-party-licenses.json,sha256=-b9NN21Lgw--CkTtP9y3RcohV3L2MYsGIDpgZlDAhhM,5802
166
+ ovito-3.14.1.data/data/share/jupyter/nbextensions/jupyter-ovito/extension.js,sha256=6jGtI8C5z7cjmII51rcQa-bgN-Hw2rsdGM9gAQfl7Xg,324
167
+ ovito-3.14.1.data/data/share/jupyter/nbextensions/jupyter-ovito/index.js,sha256=_c__hqxu5nZ6gO8il_ilytV7NjXOJitY3wNKNBq8hEw,851400
168
+ ovito-3.14.1.data/data/share/jupyter/nbextensions/jupyter-ovito/index.js.LICENSE.txt,sha256=vXSfdCv-VyJaPCZwz8ppxmu1U7OsjgRBXrnE3Ovabs4,429
169
+ ovito-3.14.1.dist-info/METADATA,sha256=EvUwhPcwBLOP6zhZ571bDfasYo__ALXmuB4Y8sdu0fE,2366
170
+ ovito-3.14.1.dist-info/WHEEL,sha256=qV0EIPljj1XC_vuSatRWjn02nZIz3N1t8jsZz7HBr2U,101
171
+ ovito-3.14.1.dist-info/entry_points.txt,sha256=lW-u-1opGho2K7OiaiGv0qp9rfwd6iF-fF7vXacH-6o,641
172
+ ovito-3.14.1.dist-info/top_level.txt,sha256=0tFsUJTGWdGujHIJslwurR1vDrOk080U4u24BAbLlKQ,12
173
+ ovito-3.14.1.dist-info/RECORD,,
File without changes