diplotocus 0.3.3__tar.gz → 0.3.5__tar.gz
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.
- {diplotocus-0.3.3 → diplotocus-0.3.5}/PKG-INFO +2 -2
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/api/core.rst +1 -1
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/index.rst +1 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/notebooks/animations.ipynb +16 -9
- {diplotocus-0.3.3 → diplotocus-0.3.5}/readme.md +1 -1
- diplotocus-0.3.5/src/diplotocus/_version.py +1 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/animations.py +45 -56
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/core.py +59 -21
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus.egg-info/PKG-INFO +2 -2
- diplotocus-0.3.3/src/diplotocus/_version.py +0 -1
- {diplotocus-0.3.3 → diplotocus-0.3.5}/.gitattributes +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/.gitignore +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/.readthedocs.yaml +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/LICENSE +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/Makefile +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/_static/force-light.css +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/_static/force-light.js +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/make.bat +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/requirements.txt +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/Web_GUI.png +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/anim_draw.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/anim_morph.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/anim_rotate.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/anim_scale.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/anim_sequence.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/anim_translate.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/anim_tween.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/axis_alpha.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/axis_limits.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/axis_move.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/axis_zoom.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/button.svg +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/cubicBezier.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/customEase.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/demo.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInBack.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInBounce.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInCirc.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInCubic.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInElastic.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInExpo.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInOutBack.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInOutBounce.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInOutCirc.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInOutCubic.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInOutElastic.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInOutExpo.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInOutQuad.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInOutQuart.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInOutQuint.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInOutSine.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInQuad.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInQuart.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInQuint.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeInSine.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeLinear.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeOutBack.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeOutBounce.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeOutCirc.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeOutCubic.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeOutElastic.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeOutExpo.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeOutQuad.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeOutQuart.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeOutQuint.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/easeOutSine.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/favicon.ico +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/fig_height_ratio.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/fig_width_ratio.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/force-light.css +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/force-light.js +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/logo.mp4 +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/_static/logo.svg +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/api/index.rst +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/conf.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/notebooks/GUI.ipynb +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/notebooks/easings.ipynb +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/notebooks/index.ipynb +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/notebooks/installation.ipynb +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/notebooks/logo.ipynb +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/notebooks/plot_objects.ipynb +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/notebooks/quick-start.ipynb +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/docs/source/notebooks/timeline.ipynb +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/logo.png +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/pyproject.toml +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/setup.cfg +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/GUI.html +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/__init__.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/app.js +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/server.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/src/bg.png +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/src/btn/btn_bg_Draw.png +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/src/btn/btn_bg_Morph.png +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/src/btn/btn_bg_Rotate.png +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/src/btn/btn_bg_Scale.png +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/src/btn/btn_bg_Sequence.png +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/src/btn/btn_bg_Translate.png +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/src/btn/btn_bg_Tween.png +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/src/btn/btn_bg_default.png +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/src/favicon.ico +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/src/logo_bg.png +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/GUI/style.css +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/__init__.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus/easings.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus.egg-info/SOURCES.txt +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus.egg-info/dependency_links.txt +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus.egg-info/requires.txt +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/src/diplotocus.egg-info/top_level.txt +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/tests/test.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/tests/test10.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/tests/test2.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/tests/test3.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/tests/test4.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/tests/test5.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/tests/test6.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/tests/test7.py +0 -0
- {diplotocus-0.3.3 → diplotocus-0.3.5}/tests/test8.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: diplotocus
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.5
|
|
4
4
|
Summary: A python package to generate animations of matplotlib objects.
|
|
5
5
|
Author-email: Tristan Boin <tristan.boin@obspm.fr>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -19,7 +19,7 @@ Dynamic: license-file
|
|
|
19
19
|
<img width="300" src="https://github.com/titanbin/Diplotocus/blob/main/logo.png?raw=true" />
|
|
20
20
|
</p>
|
|
21
21
|
|
|
22
|
-
[](https://diplotocus.readthedocs.io) [](https://github.com/titanbin/Diplotocus/blob/main/
|
|
22
|
+
[](https://diplotocus.readthedocs.io) [](https://github.com/titanbin/Diplotocus/blob/main/LICENSE) [](https://pypi.org/project/diplotocus/)
|
|
23
23
|
|
|
24
24
|
**Diplotocus** is a python package designed to render animations of matplotlib objects, in a *timeline* style.
|
|
25
25
|
|
|
@@ -14,7 +14,14 @@
|
|
|
14
14
|
"\n",
|
|
15
15
|
"Once animations have been set on plot objects, they have to be rendered via `Timeline.animate(plot_objs)` ([See Timeline](timeline)).\n",
|
|
16
16
|
"\n",
|
|
17
|
-
"## Animations of plot objects"
|
|
17
|
+
"## Animations of plot objects\n",
|
|
18
|
+
"\n",
|
|
19
|
+
"### Plot\n",
|
|
20
|
+
"\n",
|
|
21
|
+
"```{eval-rst}\n",
|
|
22
|
+
".. automethod:: diplotocus.animations.plotObject.plot\n",
|
|
23
|
+
" :noindex:\n",
|
|
24
|
+
"```"
|
|
18
25
|
]
|
|
19
26
|
},
|
|
20
27
|
{
|
|
@@ -25,7 +32,7 @@
|
|
|
25
32
|
"### Translate\n",
|
|
26
33
|
"\n",
|
|
27
34
|
"```{eval-rst}\n",
|
|
28
|
-
".. automethod:: diplotocus.animations.
|
|
35
|
+
".. automethod:: diplotocus.animations.plotObject.translate\n",
|
|
29
36
|
" :noindex:\n",
|
|
30
37
|
"```"
|
|
31
38
|
]
|
|
@@ -102,7 +109,7 @@
|
|
|
102
109
|
"### Rotate\n",
|
|
103
110
|
"\n",
|
|
104
111
|
"```{eval-rst}\n",
|
|
105
|
-
".. automethod:: diplotocus.animations.
|
|
112
|
+
".. automethod:: diplotocus.animations.plotObject.rotate\n",
|
|
106
113
|
" :noindex:\n",
|
|
107
114
|
"```"
|
|
108
115
|
]
|
|
@@ -179,7 +186,7 @@
|
|
|
179
186
|
"### Scale\n",
|
|
180
187
|
"\n",
|
|
181
188
|
"```{eval-rst}\n",
|
|
182
|
-
".. automethod:: diplotocus.animations.
|
|
189
|
+
".. automethod:: diplotocus.animations.plotObject.scale\n",
|
|
183
190
|
" :noindex:\n",
|
|
184
191
|
"```"
|
|
185
192
|
]
|
|
@@ -256,12 +263,12 @@
|
|
|
256
263
|
"### Tween\n",
|
|
257
264
|
"\n",
|
|
258
265
|
"```{eval-rst}\n",
|
|
259
|
-
".. automethod:: diplotocus.animations.
|
|
266
|
+
".. automethod:: diplotocus.animations.plotObject.tween\n",
|
|
260
267
|
" :noindex:\n",
|
|
261
268
|
"```\n",
|
|
262
269
|
"\n",
|
|
263
270
|
"```{eval-rst}\n",
|
|
264
|
-
".. automethod:: diplotocus.animations.
|
|
271
|
+
".. automethod:: diplotocus.animations.plotObject.tweens\n",
|
|
265
272
|
" :noindex:\n",
|
|
266
273
|
"```\n",
|
|
267
274
|
"\n",
|
|
@@ -345,7 +352,7 @@
|
|
|
345
352
|
"### Morph\n",
|
|
346
353
|
"\n",
|
|
347
354
|
"```{eval-rst}\n",
|
|
348
|
-
".. automethod:: diplotocus.animations.
|
|
355
|
+
".. automethod:: diplotocus.animations.plotObject.morph\n",
|
|
349
356
|
" :noindex:\n",
|
|
350
357
|
"```"
|
|
351
358
|
]
|
|
@@ -426,7 +433,7 @@
|
|
|
426
433
|
"### Draw\n",
|
|
427
434
|
"\n",
|
|
428
435
|
"```{eval-rst}\n",
|
|
429
|
-
".. automethod:: diplotocus.animations.
|
|
436
|
+
".. automethod:: diplotocus.animations.plotObject.draw\n",
|
|
430
437
|
" :noindex:\n",
|
|
431
438
|
"```"
|
|
432
439
|
]
|
|
@@ -504,7 +511,7 @@
|
|
|
504
511
|
"### Sequence\n",
|
|
505
512
|
"\n",
|
|
506
513
|
"```{eval-rst}\n",
|
|
507
|
-
".. automethod:: diplotocus.animations.
|
|
514
|
+
".. automethod:: diplotocus.animations.plotObject.sequence\n",
|
|
508
515
|
" :noindex:\n",
|
|
509
516
|
"```"
|
|
510
517
|
]
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<img width="300" src="https://github.com/titanbin/Diplotocus/blob/main/logo.png?raw=true" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
|
-
[](https://diplotocus.readthedocs.io) [](https://github.com/titanbin/Diplotocus/blob/main/
|
|
5
|
+
[](https://diplotocus.readthedocs.io) [](https://github.com/titanbin/Diplotocus/blob/main/LICENSE) [](https://pypi.org/project/diplotocus/)
|
|
6
6
|
|
|
7
7
|
**Diplotocus** is a python package designed to render animations of matplotlib objects, in a *timeline* style.
|
|
8
8
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.3.5"
|
|
@@ -32,16 +32,12 @@ def to_np_array(obj):
|
|
|
32
32
|
obj = np.ravel(obj)
|
|
33
33
|
return obj
|
|
34
34
|
|
|
35
|
-
class
|
|
35
|
+
class plotObject:
|
|
36
36
|
"""
|
|
37
|
-
A parent
|
|
37
|
+
A parent plotObject object for all plotting objects.
|
|
38
38
|
|
|
39
39
|
Parameters
|
|
40
40
|
----------
|
|
41
|
-
duration : float
|
|
42
|
-
Duration of the animation
|
|
43
|
-
delay : float, default=0
|
|
44
|
-
Delay before starting
|
|
45
41
|
easing : callable, optional
|
|
46
42
|
Easing function
|
|
47
43
|
axis : matplotlib.axes.Axes, optional
|
|
@@ -332,6 +328,29 @@ class Animation:
|
|
|
332
328
|
ends[i] = list(mpl.colors.to_rgba_array(ends[i])[0])
|
|
333
329
|
return properties,starts,ends
|
|
334
330
|
|
|
331
|
+
def plot(self,duration,delay=0,easing=None,persistent=True):
|
|
332
|
+
"""Plot the plot object as-is without animation.
|
|
333
|
+
|
|
334
|
+
Parameters
|
|
335
|
+
----------
|
|
336
|
+
duration : float
|
|
337
|
+
the number of frames the animation runs from.
|
|
338
|
+
delay : float, default=0
|
|
339
|
+
the number of frames after what the animation starts playing.
|
|
340
|
+
easing : callable, optional
|
|
341
|
+
the easing used for this animation. If None, a linear easing is applied.
|
|
342
|
+
"""
|
|
343
|
+
self.anims.append({
|
|
344
|
+
'name':'plot',
|
|
345
|
+
'duration':duration,
|
|
346
|
+
'delay':delay,
|
|
347
|
+
'easing':easing,
|
|
348
|
+
'persistent':persistent,
|
|
349
|
+
'played':False
|
|
350
|
+
})
|
|
351
|
+
self.compute_timings()
|
|
352
|
+
return self
|
|
353
|
+
|
|
335
354
|
def tween(self,property,start,end,duration,delay=0,easing=None,persistent=True):
|
|
336
355
|
"""Animate a change in a property of the plot object.
|
|
337
356
|
|
|
@@ -839,7 +858,7 @@ class Animation:
|
|
|
839
858
|
cy = 0.5 * (bbox.y0 + bbox.y1)
|
|
840
859
|
return (cx,cy)
|
|
841
860
|
|
|
842
|
-
class axis_zoom(
|
|
861
|
+
class axis_zoom(plotObject):
|
|
843
862
|
"""
|
|
844
863
|
Zooms into the axis given a zoom value.
|
|
845
864
|
|
|
@@ -855,11 +874,6 @@ class axis_zoom(Animation):
|
|
|
855
874
|
Easing function
|
|
856
875
|
axis : matplotlib.axes.Axes, optional
|
|
857
876
|
Axis to plot on
|
|
858
|
-
|
|
859
|
-
Example
|
|
860
|
-
--------
|
|
861
|
-
Zoom 2 times in 100 frames:
|
|
862
|
-
>>> axis_zoom(zoom=2,duration=100)
|
|
863
877
|
"""
|
|
864
878
|
def __init__(self,zoom,duration,delay=0,easing=None,axis=None,*args,**kwargs):
|
|
865
879
|
super().__init__(axis=axis,*args, **kwargs)
|
|
@@ -896,7 +910,7 @@ class axis_zoom(Animation):
|
|
|
896
910
|
self.axis.set_xlim(x_range[0],x_range[1])
|
|
897
911
|
self.axis.set_ylim(y_range[0],y_range[1])
|
|
898
912
|
|
|
899
|
-
class axis_limits(
|
|
913
|
+
class axis_limits(plotObject):
|
|
900
914
|
"""
|
|
901
915
|
Reframe axis to the given limits (on the x-axis, y-axis or both depending on passed arguments)
|
|
902
916
|
|
|
@@ -914,11 +928,6 @@ class axis_limits(Animation):
|
|
|
914
928
|
Easing function
|
|
915
929
|
axis : matplotlib.axes.Axes, optional
|
|
916
930
|
Axis to plot on
|
|
917
|
-
|
|
918
|
-
Example
|
|
919
|
-
--------
|
|
920
|
-
Reframe x-axis to limits [0-2] in 100 frames:
|
|
921
|
-
>>> axis_limits(xlim=(0,2),duration=100)
|
|
922
931
|
"""
|
|
923
932
|
def __init__(self,duration,xlim=None,ylim=None,delay=0,easing=None,axis=None,*args,**kwargs):
|
|
924
933
|
if xlim is None and ylim is None:
|
|
@@ -957,7 +966,7 @@ class axis_limits(Animation):
|
|
|
957
966
|
ylim_top = anim['start_ylim'][1] + (anim['ylim'][1] - anim['start_ylim'][1])*t
|
|
958
967
|
self.axis.set_ylim(ylim_bottom,ylim_top)
|
|
959
968
|
|
|
960
|
-
class axis_move(
|
|
969
|
+
class axis_move(plotObject):
|
|
961
970
|
"""
|
|
962
971
|
Move the center of the axis to a given position.
|
|
963
972
|
|
|
@@ -973,11 +982,6 @@ class axis_move(Animation):
|
|
|
973
982
|
Easing function
|
|
974
983
|
axis : matplotlib.axes.Axes, optional
|
|
975
984
|
Axis to plot on
|
|
976
|
-
|
|
977
|
-
Example
|
|
978
|
-
--------
|
|
979
|
-
Recenter the axis to (-1,-1) in 100 frames:
|
|
980
|
-
>>> axis_move(pos=(-1,-1),duration=100)
|
|
981
985
|
"""
|
|
982
986
|
def __init__(self,end_pos,duration,start_pos=None,delay=0,easing=None,axis=None,*args,**kwargs):
|
|
983
987
|
super().__init__(axis=axis,*args, **kwargs)
|
|
@@ -1013,7 +1017,7 @@ class axis_move(Animation):
|
|
|
1013
1017
|
self.axis.set_xlim(pos_x-width/2,pos_x+width/2)
|
|
1014
1018
|
self.axis.set_ylim(pos_y-height/2,pos_y+height/2)
|
|
1015
1019
|
|
|
1016
|
-
class axis_alpha(
|
|
1020
|
+
class axis_alpha(plotObject):
|
|
1017
1021
|
"""
|
|
1018
1022
|
Change the opacity of the axis.
|
|
1019
1023
|
|
|
@@ -1031,11 +1035,6 @@ class axis_alpha(Animation):
|
|
|
1031
1035
|
Easing function
|
|
1032
1036
|
axis : matplotlib.axes.Axes, optional
|
|
1033
1037
|
Axis to plot on
|
|
1034
|
-
|
|
1035
|
-
Example
|
|
1036
|
-
--------
|
|
1037
|
-
Make the axis appear in 100 frames
|
|
1038
|
-
>>> axis_alpha(start_alpha=0,end_alpha=1,duration=100)
|
|
1039
1038
|
"""
|
|
1040
1039
|
def __init__(self,start_alpha,end_alpha,duration,delay=0,alpha_objs=True,easing=None,axis=None,*args,**kwargs):
|
|
1041
1040
|
super().__init__(axis=axis,*args, **kwargs)
|
|
@@ -1099,7 +1098,7 @@ class axis_alpha(Animation):
|
|
|
1099
1098
|
for txt in leg.get_texts():
|
|
1100
1099
|
txt.set_alpha(alpha)
|
|
1101
1100
|
|
|
1102
|
-
class fig_width_ratio(
|
|
1101
|
+
class fig_width_ratio(plotObject):
|
|
1103
1102
|
"""
|
|
1104
1103
|
Resize subplots' widths.
|
|
1105
1104
|
|
|
@@ -1117,11 +1116,6 @@ class fig_width_ratio(Animation):
|
|
|
1117
1116
|
Easing function
|
|
1118
1117
|
axis : matplotlib.axes.Axes, optional
|
|
1119
1118
|
Axis to plot on
|
|
1120
|
-
|
|
1121
|
-
Example
|
|
1122
|
-
--------
|
|
1123
|
-
Resize 2 subplots from equal widths to a ratio of 2:1 in 100 frames:
|
|
1124
|
-
>>> fig_width_ratio(start_widths=(1,1),end_widths=(1,2),duration=100)
|
|
1125
1119
|
"""
|
|
1126
1120
|
def __init__(self,start_widths,end_widths,duration,delay=0,easing=None,axis=None,*args,**kwargs):
|
|
1127
1121
|
super().__init__(axis=axis,*args, **kwargs)
|
|
@@ -1175,7 +1169,7 @@ class fig_width_ratio(Animation):
|
|
|
1175
1169
|
if row[i].axison == False:
|
|
1176
1170
|
row[i].set_axis_on()
|
|
1177
1171
|
|
|
1178
|
-
class fig_height_ratio(
|
|
1172
|
+
class fig_height_ratio(plotObject):
|
|
1179
1173
|
"""
|
|
1180
1174
|
Resize subplots' heights.
|
|
1181
1175
|
|
|
@@ -1193,11 +1187,6 @@ class fig_height_ratio(Animation):
|
|
|
1193
1187
|
Easing function
|
|
1194
1188
|
axis : matplotlib.axes.Axes, optional
|
|
1195
1189
|
Axis to plot on
|
|
1196
|
-
|
|
1197
|
-
Example
|
|
1198
|
-
--------
|
|
1199
|
-
Resize 2 subplots from equal heights to a ratio of 2:1 in 100 frames:
|
|
1200
|
-
>>> fig_width_ratio(start_heights=(1,1),end_heights=(1,2),duration=100)
|
|
1201
1190
|
"""
|
|
1202
1191
|
def __init__(self,start_heights,end_heights,duration,delay=0,easing=None,axis=None,*args,**kwargs):
|
|
1203
1192
|
super().__init__(axis=axis,*args, **kwargs)
|
|
@@ -1251,7 +1240,7 @@ class fig_height_ratio(Animation):
|
|
|
1251
1240
|
if column[i].axison == False:
|
|
1252
1241
|
column[i].set_axis_on()
|
|
1253
1242
|
|
|
1254
|
-
class scatter(
|
|
1243
|
+
class scatter(plotObject):
|
|
1255
1244
|
"""
|
|
1256
1245
|
A scatter plot of *y* vs. *x* with varying marker size and/or color.
|
|
1257
1246
|
|
|
@@ -1481,7 +1470,7 @@ class scatter(Animation):
|
|
|
1481
1470
|
kwargs['c'] = c.reshape(1,-1)
|
|
1482
1471
|
self.obj = self.axis.scatter(data_x,data_y,**kwargs)
|
|
1483
1472
|
|
|
1484
|
-
class plot(
|
|
1473
|
+
class plot(plotObject):
|
|
1485
1474
|
"""
|
|
1486
1475
|
Plot y versus x as lines and/or markers.
|
|
1487
1476
|
|
|
@@ -1797,7 +1786,7 @@ class plot(Animation):
|
|
|
1797
1786
|
kwargs['alpha'] = kwargs['alpha'][0]
|
|
1798
1787
|
self.obj = self.axis.plot(data_x,data_y,**kwargs)
|
|
1799
1788
|
|
|
1800
|
-
class step(
|
|
1789
|
+
class step(plotObject):
|
|
1801
1790
|
"""
|
|
1802
1791
|
Make a step plot.
|
|
1803
1792
|
|
|
@@ -1877,7 +1866,7 @@ class step(Animation):
|
|
|
1877
1866
|
|
|
1878
1867
|
self.obj = self.axis.step(data_x,data_y,**kwargs)
|
|
1879
1868
|
|
|
1880
|
-
class fill_between(
|
|
1869
|
+
class fill_between(plotObject):
|
|
1881
1870
|
"""
|
|
1882
1871
|
Fill the area between two horizontal curves.
|
|
1883
1872
|
|
|
@@ -2045,7 +2034,7 @@ class fill_between(Animation):
|
|
|
2045
2034
|
def function(self,data_x,data_y,x,kwargs):
|
|
2046
2035
|
self.obj = self.axis.fill_between(x=data_x,**kwargs)
|
|
2047
2036
|
|
|
2048
|
-
class fill_betweenx(
|
|
2037
|
+
class fill_betweenx(plotObject):
|
|
2049
2038
|
"""
|
|
2050
2039
|
Fill the area between two vertical curves.
|
|
2051
2040
|
|
|
@@ -2213,7 +2202,7 @@ class fill_betweenx(Animation):
|
|
|
2213
2202
|
def function(self,data_x,data_y,x,kwargs):
|
|
2214
2203
|
self.obj = self.axis.fill_betweenx(y=data_x,**kwargs)
|
|
2215
2204
|
|
|
2216
|
-
class axvline(
|
|
2205
|
+
class axvline(plotObject):
|
|
2217
2206
|
"""
|
|
2218
2207
|
Add a vertical line spanning the whole or fraction of the Axes.
|
|
2219
2208
|
|
|
@@ -2352,7 +2341,7 @@ class axvline(Animation):
|
|
|
2352
2341
|
if len(data_x) > 0:
|
|
2353
2342
|
self.obj = [self.axis.axvline(data_x,**kwargs)]
|
|
2354
2343
|
|
|
2355
|
-
class axhline(
|
|
2344
|
+
class axhline(plotObject):
|
|
2356
2345
|
"""
|
|
2357
2346
|
Add a horizontal line spanning the whole or fraction of the Axes.
|
|
2358
2347
|
|
|
@@ -2430,7 +2419,7 @@ class axhline(Animation):
|
|
|
2430
2419
|
if len(data_x) > 0:
|
|
2431
2420
|
self.obj = [self.axis.axhline(data_x,**kwargs)]
|
|
2432
2421
|
|
|
2433
|
-
class errorbar(
|
|
2422
|
+
class errorbar(plotObject):
|
|
2434
2423
|
"""
|
|
2435
2424
|
Plot y versus x as lines and/or markers with attached errorbars.
|
|
2436
2425
|
|
|
@@ -2667,7 +2656,7 @@ class errorbar(Animation):
|
|
|
2667
2656
|
obj = [obj.lines[0]] + list(obj.lines[1]) + list(obj.lines[2])
|
|
2668
2657
|
self.obj = obj
|
|
2669
2658
|
|
|
2670
|
-
class hist(
|
|
2659
|
+
class hist(plotObject):
|
|
2671
2660
|
"""
|
|
2672
2661
|
Compute and plot a histogram.
|
|
2673
2662
|
|
|
@@ -2922,7 +2911,7 @@ class hist(Animation):
|
|
|
2922
2911
|
|
|
2923
2912
|
h,edges,self.obj = self.axis.hist(data_x,**kwargs)
|
|
2924
2913
|
|
|
2925
|
-
class hist2d(
|
|
2914
|
+
class hist2d(plotObject):
|
|
2926
2915
|
"""
|
|
2927
2916
|
Make a 2D histogram plot.
|
|
2928
2917
|
|
|
@@ -3079,7 +3068,7 @@ class hist2d(Animation):
|
|
|
3079
3068
|
self.axis.set_xlim(old_xlim)
|
|
3080
3069
|
self.axis.set_ylim(old_ylim)
|
|
3081
3070
|
|
|
3082
|
-
class contourf(
|
|
3071
|
+
class contourf(plotObject):
|
|
3083
3072
|
"""
|
|
3084
3073
|
Plot filled contours.
|
|
3085
3074
|
|
|
@@ -3428,14 +3417,14 @@ class contourf(Animation):
|
|
|
3428
3417
|
self.axis.set_xlim(old_xlim)
|
|
3429
3418
|
self.axis.set_ylim(old_ylim)
|
|
3430
3419
|
|
|
3431
|
-
class text(
|
|
3420
|
+
class text(plotObject):
|
|
3432
3421
|
"""
|
|
3433
3422
|
Add text to the Axes.
|
|
3434
3423
|
|
|
3435
3424
|
Add the text *s* to the Axes at location *x*, *y* in data coordinates,
|
|
3436
3425
|
with a default ``horizontalalignment`` on the ``left`` and
|
|
3437
3426
|
``verticalalignment`` at the ``baseline``.
|
|
3438
|
-
|
|
3427
|
+
|
|
3439
3428
|
Parameters
|
|
3440
3429
|
----------
|
|
3441
3430
|
x, y : float
|
|
@@ -3607,7 +3596,7 @@ class text(Animation):
|
|
|
3607
3596
|
self.path = patch.get_path()
|
|
3608
3597
|
self.obj = patch
|
|
3609
3598
|
|
|
3610
|
-
class svg(
|
|
3599
|
+
class svg(plotObject):
|
|
3611
3600
|
"""A vector SVG object.
|
|
3612
3601
|
|
|
3613
3602
|
Parameters
|
|
@@ -59,11 +59,22 @@ def status_message(start_msg, end_msg):
|
|
|
59
59
|
#----------------------------------------------
|
|
60
60
|
|
|
61
61
|
def load_project(path):
|
|
62
|
+
"""Load a project.
|
|
63
|
+
|
|
64
|
+
Parameters
|
|
65
|
+
----------
|
|
66
|
+
path : str
|
|
67
|
+
the path to the project file.
|
|
68
|
+
|
|
69
|
+
Returns
|
|
70
|
+
----------
|
|
71
|
+
(Timeline,list of plot objects)
|
|
72
|
+
"""
|
|
62
73
|
tl = pickle.load(open(path, 'rb'))
|
|
63
|
-
|
|
74
|
+
plot_objects = tl.plot_objects
|
|
64
75
|
tl.x = 0
|
|
65
76
|
tl.clean_all()
|
|
66
|
-
return tl,
|
|
77
|
+
return tl,plot_objects
|
|
67
78
|
|
|
68
79
|
class Timeline:
|
|
69
80
|
"""Create and manage an animation timeline.
|
|
@@ -117,11 +128,11 @@ class Timeline:
|
|
|
117
128
|
self.ax = np.array(self.ax)
|
|
118
129
|
if isinstance(self.ax,np.ndarray):
|
|
119
130
|
if isinstance(self.ax[0],np.ndarray):
|
|
120
|
-
self.
|
|
131
|
+
self.set_main_axis(self.ax[0,0])
|
|
121
132
|
else:
|
|
122
|
-
self.
|
|
133
|
+
self.set_main_axis(self.ax[0])
|
|
123
134
|
else:
|
|
124
|
-
self.
|
|
135
|
+
self.set_main_axis(self.ax)
|
|
125
136
|
if xlim is not None:
|
|
126
137
|
self.main_axis.set_xlim(*xlim)
|
|
127
138
|
if ylim is not None:
|
|
@@ -133,7 +144,7 @@ class Timeline:
|
|
|
133
144
|
self.x = 0
|
|
134
145
|
self.timeline_str = ''
|
|
135
146
|
self.transparent = transparent
|
|
136
|
-
self.
|
|
147
|
+
self.plot_objects = []
|
|
137
148
|
if in_notebook() == False:
|
|
138
149
|
namespace = sys._getframe(1).f_globals['__file__']
|
|
139
150
|
self.full_path = '/'.join(namespace.split('/')[:-1])
|
|
@@ -142,7 +153,24 @@ class Timeline:
|
|
|
142
153
|
if noaxis:
|
|
143
154
|
self.main_axis.set_axis_off()
|
|
144
155
|
|
|
156
|
+
def set_main_axis(self,ax):
|
|
157
|
+
"""Set the default axis to plot objects on
|
|
158
|
+
|
|
159
|
+
Parameters
|
|
160
|
+
----------
|
|
161
|
+
ax : matplotlib.axes.Axes, optional
|
|
162
|
+
Axis to set as default
|
|
163
|
+
"""
|
|
164
|
+
self.main_axis = ax
|
|
165
|
+
|
|
145
166
|
def set_axis_color(self,color):
|
|
167
|
+
"""Set the color of axes
|
|
168
|
+
|
|
169
|
+
Parameters
|
|
170
|
+
----------
|
|
171
|
+
color : color or array-like, optional
|
|
172
|
+
The color to set the axes
|
|
173
|
+
"""
|
|
146
174
|
if isinstance(self.ax,np.ndarray) == False:
|
|
147
175
|
axes = (self.ax,)
|
|
148
176
|
else:
|
|
@@ -175,24 +203,24 @@ class Timeline:
|
|
|
175
203
|
if p.get_animated():
|
|
176
204
|
p.remove()
|
|
177
205
|
|
|
178
|
-
def plot(self,
|
|
179
|
-
if isinstance(
|
|
180
|
-
|
|
206
|
+
def plot(self,plot_objects,x=0,easing=None,debug=False):
|
|
207
|
+
if isinstance(plot_objects,plotObject):
|
|
208
|
+
plot_objects = (plot_objects,)
|
|
181
209
|
|
|
182
|
-
for
|
|
183
|
-
if
|
|
184
|
-
objects = np.ravel(
|
|
210
|
+
for plot_object in plot_objects:
|
|
211
|
+
if plot_object.obj is not None and ((plot_object.x_min <= x < plot_object.x_max) or (x >= plot_object.x_max and plot_object.persistent == False)):
|
|
212
|
+
objects = np.ravel(plot_object.obj)
|
|
185
213
|
for obj in objects:
|
|
186
214
|
try:
|
|
187
215
|
obj.remove()
|
|
188
216
|
except:
|
|
189
217
|
pass
|
|
190
218
|
|
|
191
|
-
|
|
219
|
+
plot_object.initialize(self)
|
|
192
220
|
#only plot if within an anim or if last one is persistent
|
|
193
221
|
last_anim = None
|
|
194
222
|
closest_dist = np.inf
|
|
195
|
-
for anim in
|
|
223
|
+
for anim in plot_object.anims:
|
|
196
224
|
anim_x_max = anim['duration']+anim['delay']
|
|
197
225
|
if anim_x_max > x:
|
|
198
226
|
continue
|
|
@@ -204,19 +232,19 @@ class Timeline:
|
|
|
204
232
|
if last_anim is not None:
|
|
205
233
|
is_within_anim = last_anim['persistent'] == True
|
|
206
234
|
if is_within_anim == False:
|
|
207
|
-
for anim in
|
|
235
|
+
for anim in plot_object.anims:
|
|
208
236
|
anim_x_min = anim['delay']
|
|
209
237
|
anim_x_max = anim['duration']+anim['delay']
|
|
210
238
|
if anim_x_min <= x < anim_x_max:
|
|
211
239
|
is_within_anim = True
|
|
212
240
|
break
|
|
213
241
|
if is_within_anim:
|
|
214
|
-
|
|
242
|
+
plot_object.apply(x,easing)
|
|
215
243
|
prev_x = self.x
|
|
216
244
|
self.x = x
|
|
217
245
|
self.save_plot(debug)
|
|
218
|
-
for
|
|
219
|
-
|
|
246
|
+
for plot_object in plot_objects:
|
|
247
|
+
plot_object.clean(x,clear_anims=False)
|
|
220
248
|
self.x = prev_x
|
|
221
249
|
|
|
222
250
|
def animate(self,plot_objects,easing=None,debug=False):
|
|
@@ -224,14 +252,14 @@ class Timeline:
|
|
|
224
252
|
|
|
225
253
|
Parameters
|
|
226
254
|
----------
|
|
227
|
-
plot_objects :
|
|
255
|
+
plot_objects : plotObject or sequence of plotObject
|
|
228
256
|
a single plot object (e.g. `scatter`, `plot`, `hist`...) or a list of plot objects.
|
|
229
257
|
easing : easing
|
|
230
258
|
an easing override used while rendering.
|
|
231
259
|
debug : bool
|
|
232
260
|
if True, skip writing frame images to disk.
|
|
233
261
|
"""
|
|
234
|
-
if isinstance(plot_objects,
|
|
262
|
+
if isinstance(plot_objects,plotObject):
|
|
235
263
|
plot_objects = (plot_objects,)
|
|
236
264
|
self.animations = deepcopy(np.array(plot_objects))
|
|
237
265
|
|
|
@@ -250,11 +278,14 @@ class Timeline:
|
|
|
250
278
|
loop = tqdm(loop)
|
|
251
279
|
|
|
252
280
|
for x in loop:
|
|
253
|
-
self.plot(
|
|
281
|
+
self.plot(plot_objects=plot_objects,x=x,easing=easing,debug=debug)
|
|
254
282
|
for animation in plot_objects:
|
|
255
283
|
for anim in animation.anims:
|
|
256
284
|
anim['played'] = True
|
|
257
285
|
self.x = x_max
|
|
286
|
+
for animation in plot_objects:
|
|
287
|
+
if self.x >= animation.x_max and animation.persistent == False:
|
|
288
|
+
animation.clean(animation.x_max - 2, clear_anims=False)
|
|
258
289
|
|
|
259
290
|
def wait(self,duration):
|
|
260
291
|
"""Pause the animation for a number of frames.
|
|
@@ -354,5 +385,12 @@ class Timeline:
|
|
|
354
385
|
""".format(video_fn,rand_id)))
|
|
355
386
|
|
|
356
387
|
def save_project(self,path):
|
|
388
|
+
"""Save the current Timeline and associated plot objects to a project file.
|
|
389
|
+
|
|
390
|
+
Parameters
|
|
391
|
+
----------
|
|
392
|
+
path : str
|
|
393
|
+
The path to save the project file to.
|
|
394
|
+
"""
|
|
357
395
|
with open(path, 'wb') as f:
|
|
358
396
|
pickle.dump(self, f)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: diplotocus
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.5
|
|
4
4
|
Summary: A python package to generate animations of matplotlib objects.
|
|
5
5
|
Author-email: Tristan Boin <tristan.boin@obspm.fr>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -19,7 +19,7 @@ Dynamic: license-file
|
|
|
19
19
|
<img width="300" src="https://github.com/titanbin/Diplotocus/blob/main/logo.png?raw=true" />
|
|
20
20
|
</p>
|
|
21
21
|
|
|
22
|
-
[](https://diplotocus.readthedocs.io) [](https://github.com/titanbin/Diplotocus/blob/main/
|
|
22
|
+
[](https://diplotocus.readthedocs.io) [](https://github.com/titanbin/Diplotocus/blob/main/LICENSE) [](https://pypi.org/project/diplotocus/)
|
|
23
23
|
|
|
24
24
|
**Diplotocus** is a python package designed to render animations of matplotlib objects, in a *timeline* style.
|
|
25
25
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.3.3"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|