vispy 0.14.0__cp311-cp311-macosx_11_0_arm64.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 vispy might be problematic. Click here for more details.
- vispy/__init__.py +33 -0
- vispy/app/__init__.py +15 -0
- vispy/app/_default_app.py +76 -0
- vispy/app/_detect_eventloop.py +148 -0
- vispy/app/application.py +263 -0
- vispy/app/backends/__init__.py +52 -0
- vispy/app/backends/_egl.py +264 -0
- vispy/app/backends/_glfw.py +513 -0
- vispy/app/backends/_jupyter_rfb.py +278 -0
- vispy/app/backends/_offscreen_util.py +121 -0
- vispy/app/backends/_osmesa.py +235 -0
- vispy/app/backends/_pyglet.py +451 -0
- vispy/app/backends/_pyqt4.py +36 -0
- vispy/app/backends/_pyqt5.py +36 -0
- vispy/app/backends/_pyqt6.py +40 -0
- vispy/app/backends/_pyside.py +37 -0
- vispy/app/backends/_pyside2.py +52 -0
- vispy/app/backends/_pyside6.py +53 -0
- vispy/app/backends/_qt.py +968 -0
- vispy/app/backends/_sdl2.py +444 -0
- vispy/app/backends/_template.py +244 -0
- vispy/app/backends/_test.py +8 -0
- vispy/app/backends/_tk.py +800 -0
- vispy/app/backends/_wx.py +476 -0
- vispy/app/backends/tests/__init__.py +0 -0
- vispy/app/backends/tests/test_offscreen_util.py +52 -0
- vispy/app/backends/tests/test_rfb.py +77 -0
- vispy/app/base.py +294 -0
- vispy/app/canvas.py +828 -0
- vispy/app/qt.py +92 -0
- vispy/app/tests/__init__.py +0 -0
- vispy/app/tests/qt-designer.ui +58 -0
- vispy/app/tests/test_app.py +442 -0
- vispy/app/tests/test_backends.py +164 -0
- vispy/app/tests/test_canvas.py +122 -0
- vispy/app/tests/test_context.py +92 -0
- vispy/app/tests/test_qt.py +47 -0
- vispy/app/tests/test_simultaneous.py +134 -0
- vispy/app/timer.py +174 -0
- vispy/color/__init__.py +17 -0
- vispy/color/_color_dict.py +193 -0
- vispy/color/color_array.py +447 -0
- vispy/color/color_space.py +181 -0
- vispy/color/colormap.py +1134 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +352 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1542 -0
- vispy/ext/cubehelix.py +138 -0
- vispy/ext/egl.py +375 -0
- vispy/ext/fontconfig.py +118 -0
- vispy/ext/gdi32plus.py +206 -0
- vispy/ext/osmesa.py +105 -0
- vispy/geometry/__init__.py +23 -0
- vispy/geometry/_triangulation_debugger.py +171 -0
- vispy/geometry/calculations.py +134 -0
- vispy/geometry/curves.py +399 -0
- vispy/geometry/generation.py +643 -0
- vispy/geometry/isocurve.py +175 -0
- vispy/geometry/isosurface.py +465 -0
- vispy/geometry/meshdata.py +698 -0
- vispy/geometry/normals.py +78 -0
- vispy/geometry/parametric.py +56 -0
- vispy/geometry/polygon.py +137 -0
- vispy/geometry/rect.py +210 -0
- vispy/geometry/tests/__init__.py +0 -0
- vispy/geometry/tests/test_calculations.py +23 -0
- vispy/geometry/tests/test_generation.py +56 -0
- vispy/geometry/tests/test_meshdata.py +106 -0
- vispy/geometry/tests/test_triangulation.py +506 -0
- vispy/geometry/torusknot.py +142 -0
- vispy/geometry/triangulation.py +876 -0
- vispy/gloo/__init__.py +56 -0
- vispy/gloo/buffer.py +505 -0
- vispy/gloo/context.py +272 -0
- vispy/gloo/framebuffer.py +257 -0
- vispy/gloo/gl/__init__.py +234 -0
- vispy/gloo/gl/_constants.py +332 -0
- vispy/gloo/gl/_es2.py +986 -0
- vispy/gloo/gl/_gl2.py +1365 -0
- vispy/gloo/gl/_proxy.py +499 -0
- vispy/gloo/gl/_pyopengl2.py +362 -0
- vispy/gloo/gl/dummy.py +24 -0
- vispy/gloo/gl/es2.py +62 -0
- vispy/gloo/gl/gl2.py +98 -0
- vispy/gloo/gl/glplus.py +168 -0
- vispy/gloo/gl/pyopengl2.py +97 -0
- vispy/gloo/gl/tests/__init__.py +0 -0
- vispy/gloo/gl/tests/test_basics.py +282 -0
- vispy/gloo/gl/tests/test_functionality.py +566 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1816 -0
- vispy/gloo/globject.py +101 -0
- vispy/gloo/preprocessor.py +67 -0
- vispy/gloo/program.py +543 -0
- vispy/gloo/tests/__init__.py +0 -0
- vispy/gloo/tests/test_buffer.py +558 -0
- vispy/gloo/tests/test_context.py +119 -0
- vispy/gloo/tests/test_framebuffer.py +195 -0
- vispy/gloo/tests/test_glir.py +307 -0
- vispy/gloo/tests/test_globject.py +35 -0
- vispy/gloo/tests/test_program.py +302 -0
- vispy/gloo/tests/test_texture.py +732 -0
- vispy/gloo/tests/test_use_gloo.py +187 -0
- vispy/gloo/tests/test_util.py +60 -0
- vispy/gloo/tests/test_wrappers.py +261 -0
- vispy/gloo/texture.py +1045 -0
- vispy/gloo/util.py +129 -0
- vispy/gloo/wrappers.py +762 -0
- vispy/glsl/__init__.py +42 -0
- vispy/glsl/antialias/antialias.glsl +7 -0
- vispy/glsl/antialias/cap-butt.glsl +31 -0
- vispy/glsl/antialias/cap-round.glsl +29 -0
- vispy/glsl/antialias/cap-square.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
- vispy/glsl/antialias/cap.glsl +67 -0
- vispy/glsl/antialias/caps.glsl +67 -0
- vispy/glsl/antialias/filled.glsl +50 -0
- vispy/glsl/antialias/outline.glsl +40 -0
- vispy/glsl/antialias/stroke.glsl +43 -0
- vispy/glsl/arrowheads/angle.glsl +99 -0
- vispy/glsl/arrowheads/arrowheads.frag +60 -0
- vispy/glsl/arrowheads/arrowheads.glsl +12 -0
- vispy/glsl/arrowheads/arrowheads.vert +83 -0
- vispy/glsl/arrowheads/curved.glsl +48 -0
- vispy/glsl/arrowheads/inhibitor.glsl +26 -0
- vispy/glsl/arrowheads/stealth.glsl +46 -0
- vispy/glsl/arrowheads/triangle.glsl +97 -0
- vispy/glsl/arrowheads/util.glsl +13 -0
- vispy/glsl/arrows/angle-30.glsl +12 -0
- vispy/glsl/arrows/angle-60.glsl +12 -0
- vispy/glsl/arrows/angle-90.glsl +12 -0
- vispy/glsl/arrows/arrow.frag +39 -0
- vispy/glsl/arrows/arrow.vert +49 -0
- vispy/glsl/arrows/arrows.glsl +17 -0
- vispy/glsl/arrows/common.glsl +187 -0
- vispy/glsl/arrows/curved.glsl +63 -0
- vispy/glsl/arrows/stealth.glsl +50 -0
- vispy/glsl/arrows/triangle-30.glsl +12 -0
- vispy/glsl/arrows/triangle-60.glsl +12 -0
- vispy/glsl/arrows/triangle-90.glsl +12 -0
- vispy/glsl/arrows/util.glsl +98 -0
- vispy/glsl/build_spatial_filters.py +660 -0
- vispy/glsl/collections/agg-fast-path.frag +20 -0
- vispy/glsl/collections/agg-fast-path.vert +78 -0
- vispy/glsl/collections/agg-glyph.frag +60 -0
- vispy/glsl/collections/agg-glyph.vert +33 -0
- vispy/glsl/collections/agg-marker.frag +35 -0
- vispy/glsl/collections/agg-marker.vert +48 -0
- vispy/glsl/collections/agg-path.frag +55 -0
- vispy/glsl/collections/agg-path.vert +166 -0
- vispy/glsl/collections/agg-point.frag +21 -0
- vispy/glsl/collections/agg-point.vert +35 -0
- vispy/glsl/collections/agg-segment.frag +32 -0
- vispy/glsl/collections/agg-segment.vert +75 -0
- vispy/glsl/collections/marker.frag +38 -0
- vispy/glsl/collections/marker.vert +48 -0
- vispy/glsl/collections/raw-path.frag +15 -0
- vispy/glsl/collections/raw-path.vert +24 -0
- vispy/glsl/collections/raw-point.frag +14 -0
- vispy/glsl/collections/raw-point.vert +31 -0
- vispy/glsl/collections/raw-segment.frag +18 -0
- vispy/glsl/collections/raw-segment.vert +26 -0
- vispy/glsl/collections/raw-triangle.frag +13 -0
- vispy/glsl/collections/raw-triangle.vert +26 -0
- vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
- vispy/glsl/collections/sdf-glyph.frag +80 -0
- vispy/glsl/collections/sdf-glyph.vert +59 -0
- vispy/glsl/collections/tick-labels.vert +71 -0
- vispy/glsl/colormaps/autumn.glsl +20 -0
- vispy/glsl/colormaps/blues.glsl +20 -0
- vispy/glsl/colormaps/color-space.glsl +17 -0
- vispy/glsl/colormaps/colormaps.glsl +24 -0
- vispy/glsl/colormaps/cool.glsl +20 -0
- vispy/glsl/colormaps/fire.glsl +21 -0
- vispy/glsl/colormaps/gray.glsl +20 -0
- vispy/glsl/colormaps/greens.glsl +20 -0
- vispy/glsl/colormaps/hot.glsl +22 -0
- vispy/glsl/colormaps/ice.glsl +20 -0
- vispy/glsl/colormaps/icefire.glsl +23 -0
- vispy/glsl/colormaps/parse.py +40 -0
- vispy/glsl/colormaps/reds.glsl +20 -0
- vispy/glsl/colormaps/spring.glsl +20 -0
- vispy/glsl/colormaps/summer.glsl +20 -0
- vispy/glsl/colormaps/user.glsl +22 -0
- vispy/glsl/colormaps/util.glsl +41 -0
- vispy/glsl/colormaps/wheel.glsl +21 -0
- vispy/glsl/colormaps/winter.glsl +20 -0
- vispy/glsl/lines/agg.frag +320 -0
- vispy/glsl/lines/agg.vert +241 -0
- vispy/glsl/markers/arrow.glsl +12 -0
- vispy/glsl/markers/asterisk.glsl +16 -0
- vispy/glsl/markers/chevron.glsl +14 -0
- vispy/glsl/markers/clover.glsl +20 -0
- vispy/glsl/markers/club.glsl +31 -0
- vispy/glsl/markers/cross.glsl +17 -0
- vispy/glsl/markers/diamond.glsl +12 -0
- vispy/glsl/markers/disc.glsl +9 -0
- vispy/glsl/markers/ellipse.glsl +67 -0
- vispy/glsl/markers/hbar.glsl +9 -0
- vispy/glsl/markers/heart.glsl +15 -0
- vispy/glsl/markers/infinity.glsl +15 -0
- vispy/glsl/markers/marker-sdf.frag +74 -0
- vispy/glsl/markers/marker-sdf.vert +41 -0
- vispy/glsl/markers/marker.frag +36 -0
- vispy/glsl/markers/marker.vert +46 -0
- vispy/glsl/markers/markers.glsl +24 -0
- vispy/glsl/markers/pin.glsl +18 -0
- vispy/glsl/markers/ring.glsl +11 -0
- vispy/glsl/markers/spade.glsl +28 -0
- vispy/glsl/markers/square.glsl +10 -0
- vispy/glsl/markers/tag.glsl +11 -0
- vispy/glsl/markers/triangle.glsl +14 -0
- vispy/glsl/markers/vbar.glsl +9 -0
- vispy/glsl/math/circle-through-2-points.glsl +30 -0
- vispy/glsl/math/constants.glsl +48 -0
- vispy/glsl/math/double.glsl +114 -0
- vispy/glsl/math/functions.glsl +20 -0
- vispy/glsl/math/point-to-line-distance.glsl +31 -0
- vispy/glsl/math/point-to-line-projection.glsl +29 -0
- vispy/glsl/math/signed-line-distance.glsl +27 -0
- vispy/glsl/math/signed-segment-distance.glsl +30 -0
- vispy/glsl/misc/regular-grid.frag +244 -0
- vispy/glsl/misc/spatial-filters.frag +1407 -0
- vispy/glsl/misc/viewport-NDC.glsl +20 -0
- vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
- vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
- vispy/glsl/transforms/hammer.glsl +44 -0
- vispy/glsl/transforms/identity.glsl +6 -0
- vispy/glsl/transforms/identity_forward.glsl +23 -0
- vispy/glsl/transforms/identity_inverse.glsl +23 -0
- vispy/glsl/transforms/linear-scale.glsl +127 -0
- vispy/glsl/transforms/log-scale.glsl +126 -0
- vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
- vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
- vispy/glsl/transforms/panzoom.glsl +10 -0
- vispy/glsl/transforms/polar.glsl +41 -0
- vispy/glsl/transforms/position.glsl +44 -0
- vispy/glsl/transforms/power-scale.glsl +139 -0
- vispy/glsl/transforms/projection.glsl +7 -0
- vispy/glsl/transforms/pvm.glsl +13 -0
- vispy/glsl/transforms/rotate.glsl +45 -0
- vispy/glsl/transforms/trackball.glsl +15 -0
- vispy/glsl/transforms/translate.glsl +35 -0
- vispy/glsl/transforms/transverse_mercator.glsl +38 -0
- vispy/glsl/transforms/viewport-clipping.glsl +14 -0
- vispy/glsl/transforms/viewport-transform.glsl +16 -0
- vispy/glsl/transforms/viewport.glsl +50 -0
- vispy/glsl/transforms/x.glsl +24 -0
- vispy/glsl/transforms/y.glsl +19 -0
- vispy/glsl/transforms/z.glsl +14 -0
- vispy/io/__init__.py +20 -0
- vispy/io/_data/spatial-filters.npy +0 -0
- vispy/io/datasets.py +94 -0
- vispy/io/image.py +231 -0
- vispy/io/mesh.py +122 -0
- vispy/io/stl.py +167 -0
- vispy/io/tests/__init__.py +0 -0
- vispy/io/tests/test_image.py +47 -0
- vispy/io/tests/test_io.py +121 -0
- vispy/io/wavefront.py +350 -0
- vispy/plot/__init__.py +36 -0
- vispy/plot/fig.py +58 -0
- vispy/plot/plotwidget.py +522 -0
- vispy/plot/tests/__init__.py +0 -0
- vispy/plot/tests/test_plot.py +46 -0
- vispy/scene/__init__.py +43 -0
- vispy/scene/cameras/__init__.py +27 -0
- vispy/scene/cameras/_base.py +38 -0
- vispy/scene/cameras/arcball.py +106 -0
- vispy/scene/cameras/base_camera.py +538 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +308 -0
- vispy/scene/cameras/perspective.py +333 -0
- vispy/scene/cameras/tests/__init__.py +0 -0
- vispy/scene/cameras/tests/test_cameras.py +27 -0
- vispy/scene/cameras/tests/test_link.py +53 -0
- vispy/scene/cameras/tests/test_perspective.py +122 -0
- vispy/scene/cameras/turntable.py +173 -0
- vispy/scene/canvas.py +639 -0
- vispy/scene/events.py +85 -0
- vispy/scene/node.py +644 -0
- vispy/scene/subscene.py +20 -0
- vispy/scene/tests/__init__.py +0 -0
- vispy/scene/tests/test_canvas.py +119 -0
- vispy/scene/tests/test_node.py +142 -0
- vispy/scene/tests/test_visuals.py +141 -0
- vispy/scene/visuals.py +276 -0
- vispy/scene/widgets/__init__.py +18 -0
- vispy/scene/widgets/anchor.py +25 -0
- vispy/scene/widgets/axis.py +88 -0
- vispy/scene/widgets/colorbar.py +176 -0
- vispy/scene/widgets/console.py +351 -0
- vispy/scene/widgets/grid.py +509 -0
- vispy/scene/widgets/label.py +50 -0
- vispy/scene/widgets/tests/__init__.py +0 -0
- vispy/scene/widgets/tests/test_colorbar.py +47 -0
- vispy/scene/widgets/viewbox.py +199 -0
- vispy/scene/widgets/widget.py +478 -0
- vispy/testing/__init__.py +51 -0
- vispy/testing/_runners.py +446 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +473 -0
- vispy/testing/rendered_array_tester.py +85 -0
- vispy/testing/tests/__init__.py +0 -0
- vispy/testing/tests/test_testing.py +20 -0
- vispy/util/__init__.py +17 -0
- vispy/util/bunch.py +15 -0
- vispy/util/check_environment.py +57 -0
- vispy/util/config.py +490 -0
- vispy/util/dpi/__init__.py +19 -0
- vispy/util/dpi/_linux.py +69 -0
- vispy/util/dpi/_quartz.py +26 -0
- vispy/util/dpi/_win32.py +34 -0
- vispy/util/dpi/tests/__init__.py +0 -0
- vispy/util/dpi/tests/test_dpi.py +16 -0
- vispy/util/eq.py +41 -0
- vispy/util/event.py +774 -0
- vispy/util/fetching.py +276 -0
- vispy/util/filter.py +44 -0
- vispy/util/fonts/__init__.py +14 -0
- vispy/util/fonts/_freetype.py +73 -0
- vispy/util/fonts/_quartz.py +192 -0
- vispy/util/fonts/_triage.py +36 -0
- vispy/util/fonts/_vispy_fonts.py +20 -0
- vispy/util/fonts/_win32.py +105 -0
- vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
- vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
- vispy/util/fonts/tests/__init__.py +0 -0
- vispy/util/fonts/tests/test_font.py +45 -0
- vispy/util/fourier.py +69 -0
- vispy/util/frozen.py +25 -0
- vispy/util/gallery_scraper.py +268 -0
- vispy/util/keys.py +91 -0
- vispy/util/logs.py +358 -0
- vispy/util/osmesa_gl.py +17 -0
- vispy/util/profiler.py +135 -0
- vispy/util/ptime.py +16 -0
- vispy/util/quaternion.py +229 -0
- vispy/util/svg/__init__.py +18 -0
- vispy/util/svg/base.py +20 -0
- vispy/util/svg/color.py +219 -0
- vispy/util/svg/element.py +51 -0
- vispy/util/svg/geometry.py +478 -0
- vispy/util/svg/group.py +66 -0
- vispy/util/svg/length.py +81 -0
- vispy/util/svg/number.py +25 -0
- vispy/util/svg/path.py +332 -0
- vispy/util/svg/shapes.py +57 -0
- vispy/util/svg/style.py +59 -0
- vispy/util/svg/svg.py +40 -0
- vispy/util/svg/transform.py +223 -0
- vispy/util/svg/transformable.py +28 -0
- vispy/util/svg/viewport.py +73 -0
- vispy/util/tests/__init__.py +0 -0
- vispy/util/tests/test_config.py +58 -0
- vispy/util/tests/test_docstring_parameters.py +123 -0
- vispy/util/tests/test_emitter_group.py +262 -0
- vispy/util/tests/test_event_emitter.py +743 -0
- vispy/util/tests/test_fourier.py +35 -0
- vispy/util/tests/test_gallery_scraper.py +112 -0
- vispy/util/tests/test_import.py +127 -0
- vispy/util/tests/test_key.py +22 -0
- vispy/util/tests/test_logging.py +45 -0
- vispy/util/tests/test_run.py +14 -0
- vispy/util/tests/test_transforms.py +42 -0
- vispy/util/tests/test_vispy.py +48 -0
- vispy/util/transforms.py +201 -0
- vispy/util/wrappers.py +155 -0
- vispy/version.py +4 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +485 -0
- vispy/visuals/axis.py +678 -0
- vispy/visuals/border.py +208 -0
- vispy/visuals/box.py +79 -0
- vispy/visuals/collections/__init__.py +30 -0
- vispy/visuals/collections/agg_fast_path_collection.py +219 -0
- vispy/visuals/collections/agg_path_collection.py +197 -0
- vispy/visuals/collections/agg_point_collection.py +52 -0
- vispy/visuals/collections/agg_segment_collection.py +142 -0
- vispy/visuals/collections/array_list.py +401 -0
- vispy/visuals/collections/base_collection.py +482 -0
- vispy/visuals/collections/collection.py +253 -0
- vispy/visuals/collections/path_collection.py +23 -0
- vispy/visuals/collections/point_collection.py +19 -0
- vispy/visuals/collections/polygon_collection.py +25 -0
- vispy/visuals/collections/raw_path_collection.py +119 -0
- vispy/visuals/collections/raw_point_collection.py +113 -0
- vispy/visuals/collections/raw_polygon_collection.py +77 -0
- vispy/visuals/collections/raw_segment_collection.py +112 -0
- vispy/visuals/collections/raw_triangle_collection.py +78 -0
- vispy/visuals/collections/segment_collection.py +19 -0
- vispy/visuals/collections/triangle_collection.py +16 -0
- vispy/visuals/collections/util.py +168 -0
- vispy/visuals/colorbar.py +699 -0
- vispy/visuals/cube.py +41 -0
- vispy/visuals/ellipse.py +163 -0
- vispy/visuals/filters/__init__.py +10 -0
- vispy/visuals/filters/base_filter.py +242 -0
- vispy/visuals/filters/clipper.py +60 -0
- vispy/visuals/filters/clipping_planes.py +122 -0
- vispy/visuals/filters/color.py +181 -0
- vispy/visuals/filters/markers.py +28 -0
- vispy/visuals/filters/mesh.py +796 -0
- vispy/visuals/filters/picking.py +60 -0
- vispy/visuals/filters/tests/__init__.py +3 -0
- vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
- vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
- vispy/visuals/glsl/__init__.py +1 -0
- vispy/visuals/glsl/antialiasing.py +133 -0
- vispy/visuals/glsl/color.py +63 -0
- vispy/visuals/graphs/__init__.py +1 -0
- vispy/visuals/graphs/graph.py +240 -0
- vispy/visuals/graphs/layouts/__init__.py +55 -0
- vispy/visuals/graphs/layouts/circular.py +49 -0
- vispy/visuals/graphs/layouts/force_directed.py +211 -0
- vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
- vispy/visuals/graphs/layouts/random.py +52 -0
- vispy/visuals/graphs/tests/__init__.py +1 -0
- vispy/visuals/graphs/tests/test_layouts.py +139 -0
- vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
- vispy/visuals/graphs/util.py +120 -0
- vispy/visuals/gridlines.py +105 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +688 -0
- vispy/visuals/image_complex.py +130 -0
- vispy/visuals/infinite_line.py +199 -0
- vispy/visuals/instanced_mesh.py +152 -0
- vispy/visuals/isocurve.py +213 -0
- vispy/visuals/isoline.py +241 -0
- vispy/visuals/isosurface.py +113 -0
- vispy/visuals/line/__init__.py +6 -0
- vispy/visuals/line/arrow.py +289 -0
- vispy/visuals/line/dash_atlas.py +90 -0
- vispy/visuals/line/line.py +545 -0
- vispy/visuals/line_plot.py +135 -0
- vispy/visuals/linear_region.py +199 -0
- vispy/visuals/markers.py +810 -0
- vispy/visuals/mesh.py +373 -0
- vispy/visuals/mesh_normals.py +159 -0
- vispy/visuals/plane.py +54 -0
- vispy/visuals/polygon.py +145 -0
- vispy/visuals/rectangle.py +196 -0
- vispy/visuals/regular_polygon.py +56 -0
- vispy/visuals/scrolling_lines.py +197 -0
- vispy/visuals/shaders/__init__.py +17 -0
- vispy/visuals/shaders/compiler.py +206 -0
- vispy/visuals/shaders/expression.py +99 -0
- vispy/visuals/shaders/function.py +788 -0
- vispy/visuals/shaders/multiprogram.py +145 -0
- vispy/visuals/shaders/parsing.py +140 -0
- vispy/visuals/shaders/program.py +161 -0
- vispy/visuals/shaders/shader_object.py +162 -0
- vispy/visuals/shaders/tests/__init__.py +0 -0
- vispy/visuals/shaders/tests/test_function.py +486 -0
- vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
- vispy/visuals/shaders/tests/test_parsing.py +57 -0
- vispy/visuals/shaders/variable.py +272 -0
- vispy/visuals/spectrogram.py +169 -0
- vispy/visuals/sphere.py +80 -0
- vispy/visuals/surface_plot.py +192 -0
- vispy/visuals/tests/__init__.py +0 -0
- vispy/visuals/tests/test_arrows.py +109 -0
- vispy/visuals/tests/test_axis.py +120 -0
- vispy/visuals/tests/test_collections.py +15 -0
- vispy/visuals/tests/test_colorbar.py +179 -0
- vispy/visuals/tests/test_colormap.py +97 -0
- vispy/visuals/tests/test_ellipse.py +122 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +390 -0
- vispy/visuals/tests/test_image_complex.py +36 -0
- vispy/visuals/tests/test_infinite_line.py +53 -0
- vispy/visuals/tests/test_instanced_mesh.py +50 -0
- vispy/visuals/tests/test_isosurface.py +22 -0
- vispy/visuals/tests/test_linear_region.py +152 -0
- vispy/visuals/tests/test_markers.py +54 -0
- vispy/visuals/tests/test_mesh.py +261 -0
- vispy/visuals/tests/test_mesh_normals.py +218 -0
- vispy/visuals/tests/test_polygon.py +112 -0
- vispy/visuals/tests/test_rectangle.py +163 -0
- vispy/visuals/tests/test_regular_polygon.py +111 -0
- vispy/visuals/tests/test_scalable_textures.py +180 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_text.py +95 -0
- vispy/visuals/tests/test_volume.py +542 -0
- vispy/visuals/tests/test_windbarb.py +33 -0
- vispy/visuals/text/__init__.py +7 -0
- vispy/visuals/text/_sdf_cpu.cpython-311-darwin.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +110 -0
- vispy/visuals/text/_sdf_gpu.py +316 -0
- vispy/visuals/text/text.py +675 -0
- vispy/visuals/transforms/__init__.py +34 -0
- vispy/visuals/transforms/_util.py +191 -0
- vispy/visuals/transforms/base_transform.py +233 -0
- vispy/visuals/transforms/chain.py +300 -0
- vispy/visuals/transforms/interactive.py +98 -0
- vispy/visuals/transforms/linear.py +564 -0
- vispy/visuals/transforms/nonlinear.py +398 -0
- vispy/visuals/transforms/tests/__init__.py +0 -0
- vispy/visuals/transforms/tests/test_transforms.py +243 -0
- vispy/visuals/transforms/transform_system.py +339 -0
- vispy/visuals/tube.py +173 -0
- vispy/visuals/visual.py +923 -0
- vispy/visuals/volume.py +1335 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.14.0.dist-info/LICENSE.txt +36 -0
- vispy-0.14.0.dist-info/METADATA +218 -0
- vispy-0.14.0.dist-info/RECORD +519 -0
- vispy-0.14.0.dist-info/WHEEL +5 -0
- vispy-0.14.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
|
|
7
|
+
from vispy.util.fourier import stft, fft_freqs
|
|
8
|
+
from vispy.testing import assert_raises, run_tests_if_main
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_stft():
|
|
12
|
+
"""Test STFT calculation"""
|
|
13
|
+
assert_raises(ValueError, stft, 0)
|
|
14
|
+
assert_raises(ValueError, stft, [], window='foo')
|
|
15
|
+
assert_raises(ValueError, stft, [[]])
|
|
16
|
+
result = stft([])
|
|
17
|
+
assert np.allclose(result, np.zeros_like(result))
|
|
18
|
+
n_fft = 256
|
|
19
|
+
step = 128
|
|
20
|
+
for n_samples, n_estimates in ((256, 1),
|
|
21
|
+
(383, 1), (384, 2),
|
|
22
|
+
(511, 2), (512, 3)):
|
|
23
|
+
result = stft(np.ones(n_samples), n_fft=n_fft, step=step, window=None)
|
|
24
|
+
assert result.shape[1] == n_estimates
|
|
25
|
+
expected = np.zeros(n_fft // 2 + 1)
|
|
26
|
+
expected[0] = 1
|
|
27
|
+
for res in result.T:
|
|
28
|
+
assert np.allclose(expected, np.abs(res))
|
|
29
|
+
assert np.allclose(expected, np.abs(res))
|
|
30
|
+
for n_pts, last_freq in zip((256, 255), (500., 498.)):
|
|
31
|
+
freqs = fft_freqs(n_pts, 1000)
|
|
32
|
+
assert freqs[0] == 0
|
|
33
|
+
assert np.allclose(freqs[-1], last_freq, atol=1e-1)
|
|
34
|
+
|
|
35
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
"""Test the sphinx-gallery custom scraper."""
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
from vispy.testing import TestingCanvas, requires_application
|
|
9
|
+
|
|
10
|
+
import pytest
|
|
11
|
+
|
|
12
|
+
try:
|
|
13
|
+
from sphinx_gallery.gen_gallery import DEFAULT_GALLERY_CONF
|
|
14
|
+
except ImportError:
|
|
15
|
+
pytest.skip("Skipping sphinx-gallery tests", allow_module_level=True)
|
|
16
|
+
|
|
17
|
+
from ..gallery_scraper import VisPyGalleryScraper
|
|
18
|
+
|
|
19
|
+
pytest.importorskip("PyQt5", reason="Gallery scraper only supports PyQt5")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _create_fake_block_vars(canvas):
|
|
23
|
+
block_vars = {
|
|
24
|
+
"example_globals": {
|
|
25
|
+
"canvas": canvas,
|
|
26
|
+
},
|
|
27
|
+
"src_file": "example.py",
|
|
28
|
+
"image_path_iterator": (f"{x}.png" for x in range(10)),
|
|
29
|
+
}
|
|
30
|
+
return block_vars
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _create_fake_gallery_conf(src_dir):
|
|
34
|
+
gallery_conf = {}
|
|
35
|
+
gallery_conf.update(DEFAULT_GALLERY_CONF)
|
|
36
|
+
gallery_conf.update({
|
|
37
|
+
"compress_images": "images",
|
|
38
|
+
"compress_images_args": [],
|
|
39
|
+
"src_dir": src_dir,
|
|
40
|
+
"gallery_dirs": src_dir,
|
|
41
|
+
})
|
|
42
|
+
return gallery_conf
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@requires_application()
|
|
46
|
+
@pytest.mark.parametrize("include_gallery_comment", [False, True])
|
|
47
|
+
def test_single_frame(include_gallery_comment, tmpdir):
|
|
48
|
+
canvas = TestingCanvas()
|
|
49
|
+
block_vars = _create_fake_block_vars(canvas)
|
|
50
|
+
gallery_conf = _create_fake_gallery_conf(str(tmpdir))
|
|
51
|
+
script = "\n# vispy: gallery 30\n" if include_gallery_comment else ""
|
|
52
|
+
with tmpdir.as_cwd():
|
|
53
|
+
with open("example.py", "w") as example_file:
|
|
54
|
+
example_file.write(script)
|
|
55
|
+
scraper = VisPyGalleryScraper()
|
|
56
|
+
rst = scraper(None, block_vars, gallery_conf)
|
|
57
|
+
if include_gallery_comment:
|
|
58
|
+
assert "0.png" in rst
|
|
59
|
+
assert os.path.isfile("0.png")
|
|
60
|
+
else:
|
|
61
|
+
assert "0.png" not in rst
|
|
62
|
+
assert not os.path.isfile("0.png")
|
|
63
|
+
assert not os.path.isfile("1.png") # only one file created
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@requires_application()
|
|
67
|
+
def test_single_animation(tmpdir):
|
|
68
|
+
canvas = TestingCanvas()
|
|
69
|
+
block_vars = _create_fake_block_vars(canvas)
|
|
70
|
+
gallery_conf = _create_fake_gallery_conf(str(tmpdir))
|
|
71
|
+
with tmpdir.as_cwd():
|
|
72
|
+
with open("example.py", "w") as example_file:
|
|
73
|
+
example_file.write("""# vispy: gallery 10:50:5
|
|
74
|
+
""")
|
|
75
|
+
scraper = VisPyGalleryScraper()
|
|
76
|
+
rst = scraper(None, block_vars, gallery_conf)
|
|
77
|
+
assert "0.gif" in rst
|
|
78
|
+
assert os.path.isfile("0.gif")
|
|
79
|
+
assert not os.path.isfile("0.png") # only gif file created
|
|
80
|
+
assert not os.path.isfile("1.png") # only one file created
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
@requires_application()
|
|
84
|
+
@pytest.mark.parametrize(
|
|
85
|
+
"exported_files",
|
|
86
|
+
[
|
|
87
|
+
("example.png",),
|
|
88
|
+
("example.gif",),
|
|
89
|
+
("example1.png", "example2.png"),
|
|
90
|
+
])
|
|
91
|
+
def test_single_export(exported_files, tmpdir):
|
|
92
|
+
canvas = TestingCanvas()
|
|
93
|
+
block_vars = _create_fake_block_vars(canvas)
|
|
94
|
+
gallery_conf = _create_fake_gallery_conf(str(tmpdir))
|
|
95
|
+
with tmpdir.as_cwd():
|
|
96
|
+
# create the files that the example should have created
|
|
97
|
+
for fn in exported_files:
|
|
98
|
+
open(fn, "w").close()
|
|
99
|
+
|
|
100
|
+
with open("example.py", "w") as example_file:
|
|
101
|
+
example_file.write("""# vispy: gallery-exports {}
|
|
102
|
+
""".format(" ".join(exported_files)))
|
|
103
|
+
|
|
104
|
+
scraper = VisPyGalleryScraper()
|
|
105
|
+
rst = scraper(None, block_vars, gallery_conf)
|
|
106
|
+
for idx, fn in enumerate(exported_files):
|
|
107
|
+
# the original file should have been moved
|
|
108
|
+
assert not os.path.isfile(fn)
|
|
109
|
+
# the new name should from the sphinx-gallery iterator
|
|
110
|
+
new_name = str(idx) + os.path.splitext(fn)[1]
|
|
111
|
+
assert os.path.isfile(new_name)
|
|
112
|
+
assert new_name in rst
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
"""Test that importing vispy subpackages do not pull
|
|
5
|
+
in any more vispy submodules than strictly necessary.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import sys
|
|
9
|
+
import os
|
|
10
|
+
|
|
11
|
+
from vispy.testing import (assert_in, assert_not_in, requires_pyopengl,
|
|
12
|
+
run_tests_if_main, assert_equal)
|
|
13
|
+
from vispy.util import run_subprocess
|
|
14
|
+
import vispy
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# minimum that will be imported when importing vispy
|
|
18
|
+
_min_modules = ['vispy', 'vispy.util', 'vispy.ext', 'vispy.version']
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def loaded_vispy_modules(import_module, depth=None, all_modules=False):
|
|
22
|
+
"""Import the given module in subprocess and return loaded modules
|
|
23
|
+
|
|
24
|
+
Import a certain module in a clean subprocess and return the
|
|
25
|
+
vispy modules that are subsequently loaded. The given depth
|
|
26
|
+
indicates the module level (i.e. depth=1 will only yield 'vispy.app'
|
|
27
|
+
but not 'vispy.app.backends').
|
|
28
|
+
"""
|
|
29
|
+
vispy_dir = os.path.dirname(os.path.dirname(vispy.__file__))
|
|
30
|
+
|
|
31
|
+
# Get the loaded modules in a clean interpreter
|
|
32
|
+
code = "import sys, %s; print(', '.join(sys.modules))" % import_module
|
|
33
|
+
res = run_subprocess([sys.executable, '-c', code], cwd=vispy_dir)[0]
|
|
34
|
+
loaded_modules = [name.strip() for name in res.split(',')]
|
|
35
|
+
|
|
36
|
+
if all_modules:
|
|
37
|
+
return loaded_modules
|
|
38
|
+
|
|
39
|
+
# Get only vispy modules at the given depth
|
|
40
|
+
vispy_modules = set()
|
|
41
|
+
for m in loaded_modules:
|
|
42
|
+
# pkg_resources from vispy/__init__.py shows up as vispy.pkg_resources in python 2.7
|
|
43
|
+
if m.startswith('vispy') and '__future__' not in m and 'pkg_resources' not in m:
|
|
44
|
+
if depth:
|
|
45
|
+
parts = m.split('.')
|
|
46
|
+
m = '.'.join(parts[:depth])
|
|
47
|
+
vispy_modules.add(m)
|
|
48
|
+
|
|
49
|
+
return vispy_modules
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_import_nothing():
|
|
53
|
+
"""Not importing vispy should not import any vispy modules."""
|
|
54
|
+
modnames = loaded_vispy_modules('os', 2)
|
|
55
|
+
assert_equal(modnames, set())
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_import_vispy():
|
|
59
|
+
"""Importing vispy should only pull in other vispy.util submodule."""
|
|
60
|
+
modnames = loaded_vispy_modules('vispy', 2)
|
|
61
|
+
assert_equal(modnames, set(_min_modules))
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def test_import_vispy_util():
|
|
65
|
+
"""Importing vispy.util should not pull in other vispy submodules."""
|
|
66
|
+
modnames = loaded_vispy_modules('vispy.util', 2)
|
|
67
|
+
assert_equal(modnames, set(_min_modules))
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_import_vispy_app1():
|
|
71
|
+
"""Importing vispy.app should not pull in other vispy submodules."""
|
|
72
|
+
# Since the introduction of the GLContext to gloo, app depends on gloo
|
|
73
|
+
modnames = loaded_vispy_modules('vispy.app', 2)
|
|
74
|
+
assert_equal(modnames, set(_min_modules + ['vispy.app', 'vispy.gloo',
|
|
75
|
+
'vispy.glsl', 'vispy.color']))
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def test_import_vispy_app2():
|
|
79
|
+
"""Importing vispy.app should not pull in any backend toolkit."""
|
|
80
|
+
allmodnames = loaded_vispy_modules('vispy.app', 2, True)
|
|
81
|
+
assert_not_in('PySide', allmodnames)
|
|
82
|
+
assert_not_in('PySide2', allmodnames)
|
|
83
|
+
assert_not_in('PySide6', allmodnames)
|
|
84
|
+
assert_not_in('PyQt4', allmodnames)
|
|
85
|
+
assert_not_in('PyQt5', allmodnames)
|
|
86
|
+
assert_not_in('PyQt6', allmodnames)
|
|
87
|
+
assert_not_in('pyglet', allmodnames)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def test_import_vispy_gloo():
|
|
91
|
+
"""Importing vispy.gloo should not pull in other vispy submodules."""
|
|
92
|
+
modnames = loaded_vispy_modules('vispy.gloo', 2)
|
|
93
|
+
assert_equal(modnames, set(_min_modules + ['vispy.gloo',
|
|
94
|
+
'vispy.glsl',
|
|
95
|
+
'vispy.color']))
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_import_vispy_no_pyopengl():
|
|
99
|
+
"""Importing vispy.gloo.gl.gl2 should not import PyOpenGL."""
|
|
100
|
+
# vispy.gloo desktop backend
|
|
101
|
+
allmodnames = loaded_vispy_modules('vispy.gloo.gl.gl2', 2, True)
|
|
102
|
+
assert_not_in('OpenGL', allmodnames)
|
|
103
|
+
# vispy.app
|
|
104
|
+
allmodnames = loaded_vispy_modules('vispy.app', 2, True)
|
|
105
|
+
assert_not_in('OpenGL', allmodnames)
|
|
106
|
+
# vispy.scene
|
|
107
|
+
allmodnames = loaded_vispy_modules('vispy.scene', 2, True)
|
|
108
|
+
assert_not_in('OpenGL', allmodnames)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@requires_pyopengl()
|
|
112
|
+
def test_import_vispy_pyopengl():
|
|
113
|
+
"""Importing vispy.gloo.gl.pyopengl2 should import PyOpenGL."""
|
|
114
|
+
allmodnames = loaded_vispy_modules('vispy.gloo.gl.pyopengl2', 2, True)
|
|
115
|
+
assert_in('OpenGL', allmodnames)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def test_import_vispy_scene():
|
|
119
|
+
"""Importing vispy.gloo.gl.desktop should not import PyOpenGL."""
|
|
120
|
+
modnames = loaded_vispy_modules('vispy.scene', 2)
|
|
121
|
+
more_modules = ['vispy.app', 'vispy.gloo', 'vispy.glsl', 'vispy.scene',
|
|
122
|
+
'vispy.color',
|
|
123
|
+
'vispy.io', 'vispy.geometry', 'vispy.visuals']
|
|
124
|
+
assert_equal(modnames, set(_min_modules + more_modules))
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
|
|
5
|
+
from vispy.util.keys import Key, ENTER
|
|
6
|
+
from vispy.testing import (run_tests_if_main, assert_raises, assert_true,
|
|
7
|
+
assert_equal)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_key():
|
|
11
|
+
"""Test basic key functionality"""
|
|
12
|
+
def bad():
|
|
13
|
+
return (ENTER == dict())
|
|
14
|
+
assert_raises(ValueError, bad)
|
|
15
|
+
assert_true(not (ENTER == None)) # noqa
|
|
16
|
+
assert_equal('Return', ENTER)
|
|
17
|
+
print(ENTER.name)
|
|
18
|
+
print(ENTER) # __repr__
|
|
19
|
+
assert_equal(Key('1'), 49) # ASCII code
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
import logging
|
|
5
|
+
|
|
6
|
+
from vispy.util import logger, use_log_level
|
|
7
|
+
from vispy.testing import (assert_in, assert_not_in, run_tests_if_main,
|
|
8
|
+
assert_equal)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_logging():
|
|
12
|
+
"""Test logging context manager"""
|
|
13
|
+
ll = logger.level
|
|
14
|
+
with use_log_level('warning', print_msg=False):
|
|
15
|
+
assert_equal(logger.level, logging.WARN)
|
|
16
|
+
assert_equal(logger.level, ll)
|
|
17
|
+
with use_log_level('debug', print_msg=False):
|
|
18
|
+
assert_equal(logger.level, logging.DEBUG)
|
|
19
|
+
assert_equal(logger.level, ll)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_debug_logging():
|
|
23
|
+
"""Test advanced debugging logging"""
|
|
24
|
+
with use_log_level('debug', 'Selected', True, False) as emit_list:
|
|
25
|
+
logger.debug('Selected foo')
|
|
26
|
+
assert_equal(len(emit_list), 1)
|
|
27
|
+
assert_in('test_logging', emit_list[0]) # can't really parse this location
|
|
28
|
+
|
|
29
|
+
with use_log_level('debug', record=True, print_msg=False) as emit_list:
|
|
30
|
+
logger.debug('foo')
|
|
31
|
+
assert_equal(len(emit_list), 1)
|
|
32
|
+
assert_in('test_logging', emit_list[0])
|
|
33
|
+
|
|
34
|
+
with use_log_level('debug', 'foo', True, False) as emit_list:
|
|
35
|
+
logger.debug('bar')
|
|
36
|
+
assert_equal(len(emit_list), 0)
|
|
37
|
+
|
|
38
|
+
with use_log_level('info', record=True, print_msg=False) as emit_list:
|
|
39
|
+
logger.debug('foo')
|
|
40
|
+
logger.info('bar')
|
|
41
|
+
assert_equal(len(emit_list), 1)
|
|
42
|
+
assert_not_in('unknown', emit_list[0])
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
from vispy.util import run_subprocess
|
|
5
|
+
from vispy.testing import run_tests_if_main, assert_raises
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_run():
|
|
9
|
+
"""Test running subprocesses"""
|
|
10
|
+
bad_name = 'foo_nonexist_test'
|
|
11
|
+
assert_raises(Exception, run_subprocess, [bad_name])
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
import numpy as np
|
|
5
|
+
from numpy.testing import assert_allclose
|
|
6
|
+
|
|
7
|
+
from vispy.util.transforms import (translate, scale, rotate, ortho, frustum,
|
|
8
|
+
perspective)
|
|
9
|
+
from vispy.testing import run_tests_if_main, assert_equal
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_transforms():
|
|
13
|
+
"""Test basic transforms"""
|
|
14
|
+
xfm = np.random.randn(4, 4).astype(np.float32)
|
|
15
|
+
|
|
16
|
+
# Do a series of rotations that should end up into the same orientation
|
|
17
|
+
# again, to ensure the order of computation is all correct
|
|
18
|
+
# i.e. if rotated would return the transposed matrix this would not work
|
|
19
|
+
# out (the translation part would be incorrect)
|
|
20
|
+
new_xfm = xfm.dot(rotate(180, (1, 0, 0)).dot(rotate(-90, (0, 1, 0))))
|
|
21
|
+
new_xfm = new_xfm.dot(rotate(90, (0, 0, 1)).dot(rotate(90, (0, 1, 0))))
|
|
22
|
+
new_xfm = new_xfm.dot(rotate(90, (1, 0, 0)))
|
|
23
|
+
assert_allclose(xfm, new_xfm)
|
|
24
|
+
|
|
25
|
+
new_xfm = translate((1, -1, 1)).dot(translate((-1, 1, -1))).dot(xfm)
|
|
26
|
+
assert_allclose(xfm, new_xfm)
|
|
27
|
+
|
|
28
|
+
new_xfm = scale((1, 2, 3)).dot(scale((1, 1. / 2., 1. / 3.))).dot(xfm)
|
|
29
|
+
assert_allclose(xfm, new_xfm)
|
|
30
|
+
|
|
31
|
+
# These could be more complex...
|
|
32
|
+
xfm = ortho(-1, 1, -1, 1, -1, 1)
|
|
33
|
+
assert_equal(xfm.shape, (4, 4))
|
|
34
|
+
|
|
35
|
+
xfm = frustum(-1, 1, -1, 1, -1, 1)
|
|
36
|
+
assert_equal(xfm.shape, (4, 4))
|
|
37
|
+
|
|
38
|
+
xfm = perspective(1, 1, -1, 1)
|
|
39
|
+
assert_equal(xfm.shape, (4, 4))
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
"""Tests to ensure that base vispy namespace functions correctly,
|
|
5
|
+
including configuration options.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import vispy.app
|
|
9
|
+
from vispy.testing import (requires_application, run_tests_if_main,
|
|
10
|
+
assert_raises, assert_equal, assert_not_equal)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@requires_application('pyside')
|
|
14
|
+
def test_use():
|
|
15
|
+
|
|
16
|
+
# Set default app to None, so we can test the use function
|
|
17
|
+
vispy.app.use_app()
|
|
18
|
+
default_app = vispy.app._default_app.default_app
|
|
19
|
+
vispy.app._default_app.default_app = None
|
|
20
|
+
|
|
21
|
+
app_name = default_app.backend_name.split(' ')[0]
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
# With no arguments, should do nothing
|
|
25
|
+
assert_raises(TypeError, vispy.use)
|
|
26
|
+
assert_equal(vispy.app._default_app.default_app, None)
|
|
27
|
+
|
|
28
|
+
# With only gl args, should do nothing to app
|
|
29
|
+
vispy.use(gl='gl2')
|
|
30
|
+
assert_equal(vispy.app._default_app.default_app, None)
|
|
31
|
+
|
|
32
|
+
# Specify app (one we know works)
|
|
33
|
+
vispy.use(app_name)
|
|
34
|
+
assert_not_equal(vispy.app._default_app.default_app, None)
|
|
35
|
+
|
|
36
|
+
# Again, but now wrong app
|
|
37
|
+
wrong_name = 'glfw' if app_name.lower() != 'glfw' else 'pyqt4'
|
|
38
|
+
assert_raises(RuntimeError, vispy.use, wrong_name)
|
|
39
|
+
|
|
40
|
+
# And both
|
|
41
|
+
vispy.use(app_name, 'gl2')
|
|
42
|
+
|
|
43
|
+
finally:
|
|
44
|
+
# Restore
|
|
45
|
+
vispy.app._default_app.default_app = default_app
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
run_tests_if_main()
|
vispy/util/transforms.py
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Very simple transformation library that is needed for some examples."""
|
|
4
|
+
|
|
5
|
+
from __future__ import division
|
|
6
|
+
|
|
7
|
+
# Note: we use functions (e.g. sin) from math module because they're faster
|
|
8
|
+
|
|
9
|
+
import math
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def translate(offset, dtype=None):
|
|
14
|
+
"""Translate by an offset (x, y, z) .
|
|
15
|
+
|
|
16
|
+
Parameters
|
|
17
|
+
----------
|
|
18
|
+
offset : array-like, shape (3,)
|
|
19
|
+
Translation in x, y, z.
|
|
20
|
+
dtype : dtype | None
|
|
21
|
+
Output type (if None, don't cast).
|
|
22
|
+
|
|
23
|
+
Returns
|
|
24
|
+
-------
|
|
25
|
+
M : ndarray
|
|
26
|
+
Transformation matrix describing the translation.
|
|
27
|
+
"""
|
|
28
|
+
assert len(offset) == 3
|
|
29
|
+
x, y, z = offset
|
|
30
|
+
M = np.array([[1., 0., 0., 0.],
|
|
31
|
+
[0., 1., 0., 0.],
|
|
32
|
+
[0., 0., 1., 0.],
|
|
33
|
+
[x, y, z, 1.0]], dtype)
|
|
34
|
+
return M
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def scale(s, dtype=None):
|
|
38
|
+
"""Non-uniform scaling along the x, y, and z axes
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
s : array-like, shape (3,)
|
|
43
|
+
Scaling in x, y, z.
|
|
44
|
+
dtype : dtype | None
|
|
45
|
+
Output type (if None, don't cast).
|
|
46
|
+
|
|
47
|
+
Returns
|
|
48
|
+
-------
|
|
49
|
+
M : ndarray
|
|
50
|
+
Transformation matrix describing the scaling.
|
|
51
|
+
"""
|
|
52
|
+
assert len(s) == 3
|
|
53
|
+
return np.array(np.diag(np.concatenate([s, (1.,)])), dtype)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def rotate(angle, axis, dtype=None):
|
|
57
|
+
"""The 4x4 rotation matrix for rotation about a vector.
|
|
58
|
+
|
|
59
|
+
Parameters
|
|
60
|
+
----------
|
|
61
|
+
angle : float
|
|
62
|
+
The angle of rotation, in degrees.
|
|
63
|
+
axis : ndarray
|
|
64
|
+
The x, y, z coordinates of the axis direction vector.
|
|
65
|
+
|
|
66
|
+
Returns
|
|
67
|
+
-------
|
|
68
|
+
M : ndarray
|
|
69
|
+
Transformation matrix describing the rotation.
|
|
70
|
+
"""
|
|
71
|
+
angle = np.radians(angle)
|
|
72
|
+
assert len(axis) == 3
|
|
73
|
+
x, y, z = axis / np.linalg.norm(axis)
|
|
74
|
+
c, s = math.cos(angle), math.sin(angle)
|
|
75
|
+
cx, cy, cz = (1 - c) * x, (1 - c) * y, (1 - c) * z
|
|
76
|
+
M = np.array([[cx * x + c, cy * x - z * s, cz * x + y * s, .0],
|
|
77
|
+
[cx * y + z * s, cy * y + c, cz * y - x * s, 0.],
|
|
78
|
+
[cx * z - y * s, cy * z + x * s, cz * z + c, 0.],
|
|
79
|
+
[0., 0., 0., 1.]], dtype).T
|
|
80
|
+
return M
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def ortho(left, right, bottom, top, znear, zfar):
|
|
84
|
+
"""Create orthographic projection matrix
|
|
85
|
+
|
|
86
|
+
Parameters
|
|
87
|
+
----------
|
|
88
|
+
left : float
|
|
89
|
+
Left coordinate of the field of view.
|
|
90
|
+
right : float
|
|
91
|
+
Right coordinate of the field of view.
|
|
92
|
+
bottom : float
|
|
93
|
+
Bottom coordinate of the field of view.
|
|
94
|
+
top : float
|
|
95
|
+
Top coordinate of the field of view.
|
|
96
|
+
znear : float
|
|
97
|
+
Near coordinate of the field of view.
|
|
98
|
+
zfar : float
|
|
99
|
+
Far coordinate of the field of view.
|
|
100
|
+
|
|
101
|
+
Returns
|
|
102
|
+
-------
|
|
103
|
+
M : ndarray
|
|
104
|
+
Orthographic projection matrix (4x4).
|
|
105
|
+
"""
|
|
106
|
+
assert(right != left)
|
|
107
|
+
assert(bottom != top)
|
|
108
|
+
assert(znear != zfar)
|
|
109
|
+
|
|
110
|
+
M = np.zeros((4, 4), dtype=np.float32)
|
|
111
|
+
M[0, 0] = +2.0 / (right - left)
|
|
112
|
+
M[3, 0] = -(right + left) / float(right - left)
|
|
113
|
+
M[1, 1] = +2.0 / (top - bottom)
|
|
114
|
+
M[3, 1] = -(top + bottom) / float(top - bottom)
|
|
115
|
+
M[2, 2] = -2.0 / (zfar - znear)
|
|
116
|
+
M[3, 2] = -(zfar + znear) / float(zfar - znear)
|
|
117
|
+
M[3, 3] = 1.0
|
|
118
|
+
return M
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def frustum(left, right, bottom, top, znear, zfar):
|
|
122
|
+
"""Create view frustum
|
|
123
|
+
|
|
124
|
+
Parameters
|
|
125
|
+
----------
|
|
126
|
+
left : float
|
|
127
|
+
Left coordinate of the field of view.
|
|
128
|
+
right : float
|
|
129
|
+
Right coordinate of the field of view.
|
|
130
|
+
bottom : float
|
|
131
|
+
Bottom coordinate of the field of view.
|
|
132
|
+
top : float
|
|
133
|
+
Top coordinate of the field of view.
|
|
134
|
+
znear : float
|
|
135
|
+
Near coordinate of the field of view.
|
|
136
|
+
zfar : float
|
|
137
|
+
Far coordinate of the field of view.
|
|
138
|
+
|
|
139
|
+
Returns
|
|
140
|
+
-------
|
|
141
|
+
M : ndarray
|
|
142
|
+
View frustum matrix (4x4).
|
|
143
|
+
"""
|
|
144
|
+
assert(right != left)
|
|
145
|
+
assert(bottom != top)
|
|
146
|
+
assert(znear != zfar)
|
|
147
|
+
|
|
148
|
+
M = np.zeros((4, 4), dtype=np.float32)
|
|
149
|
+
M[0, 0] = +2.0 * znear / float(right - left)
|
|
150
|
+
M[2, 0] = (right + left) / float(right - left)
|
|
151
|
+
M[1, 1] = +2.0 * znear / float(top - bottom)
|
|
152
|
+
M[2, 1] = (top + bottom) / float(top - bottom)
|
|
153
|
+
M[2, 2] = -(zfar + znear) / float(zfar - znear)
|
|
154
|
+
M[3, 2] = -2.0 * znear * zfar / float(zfar - znear)
|
|
155
|
+
M[2, 3] = -1.0
|
|
156
|
+
return M
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def perspective(fovy, aspect, znear, zfar):
|
|
160
|
+
"""Create perspective projection matrix
|
|
161
|
+
|
|
162
|
+
Parameters
|
|
163
|
+
----------
|
|
164
|
+
fovy : float
|
|
165
|
+
The field of view along the y axis.
|
|
166
|
+
aspect : float
|
|
167
|
+
Aspect ratio of the view.
|
|
168
|
+
znear : float
|
|
169
|
+
Near coordinate of the field of view.
|
|
170
|
+
zfar : float
|
|
171
|
+
Far coordinate of the field of view.
|
|
172
|
+
|
|
173
|
+
Returns
|
|
174
|
+
-------
|
|
175
|
+
M : ndarray
|
|
176
|
+
Perspective projection matrix (4x4).
|
|
177
|
+
"""
|
|
178
|
+
assert(znear != zfar)
|
|
179
|
+
h = math.tan(fovy / 360.0 * math.pi) * znear
|
|
180
|
+
w = h * aspect
|
|
181
|
+
return frustum(-w, w, -h, h, znear, zfar)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def affine_map(points1, points2):
|
|
185
|
+
"""Find a 3D transformation matrix that maps points1 onto points2.
|
|
186
|
+
|
|
187
|
+
Arguments are specified as arrays of four 3D coordinates, shape (4, 3).
|
|
188
|
+
"""
|
|
189
|
+
A = np.ones((4, 4))
|
|
190
|
+
A[:, :3] = points1
|
|
191
|
+
B = np.ones((4, 4))
|
|
192
|
+
B[:, :3] = points2
|
|
193
|
+
|
|
194
|
+
# solve 3 sets of linear equations to determine
|
|
195
|
+
# transformation matrix elements
|
|
196
|
+
matrix = np.eye(4)
|
|
197
|
+
for i in range(3):
|
|
198
|
+
# solve Ax = B; x is one row of the desired transformation matrix
|
|
199
|
+
matrix[i] = np.linalg.solve(A, B[:, i])
|
|
200
|
+
|
|
201
|
+
return matrix
|