vispy 0.15.0__cp313-cp313-macosx_10_13_x86_64.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 +1003 -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 +1213 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +378 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1522 -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 +162 -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 +700 -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 +594 -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 +568 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1824 -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 +1046 -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 +105 -0
- vispy/scene/cameras/base_camera.py +551 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +311 -0
- vispy/scene/cameras/perspective.py +338 -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 +183 -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 +448 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +494 -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 +32 -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 +21 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +487 -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 +162 -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 +801 -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 +161 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +701 -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 +819 -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_gridlines.py +30 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +392 -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 +196 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_surface_plot.py +57 -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-313-darwin.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +112 -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 +1366 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.15.0.dist-info/METADATA +243 -0
- vispy-0.15.0.dist-info/RECORD +521 -0
- vispy-0.15.0.dist-info/WHEEL +6 -0
- vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
- vispy-0.15.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,192 @@
|
|
|
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 __future__ import division
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
|
|
9
|
+
from .mesh import MeshVisual
|
|
10
|
+
from ..geometry import MeshData
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SurfacePlotVisual(MeshVisual):
|
|
14
|
+
"""Displays a surface plot on a regular x,y grid
|
|
15
|
+
|
|
16
|
+
Parameters
|
|
17
|
+
----------
|
|
18
|
+
x : ndarray | None
|
|
19
|
+
1D/2D array of values specifying the x positions of vertices in the
|
|
20
|
+
grid. In case 1D array given as input, the values will be replicated
|
|
21
|
+
to fill the 2D array of size(z). If None, values will be assumed to
|
|
22
|
+
be integers.
|
|
23
|
+
y : ndarray | None
|
|
24
|
+
1D/2D array of values specifying the y positions of vertices in the
|
|
25
|
+
grid. In case 1D array given as input, the values will be replicated
|
|
26
|
+
to fill the 2D array of size(z). If None, values will be assumed to
|
|
27
|
+
be integers.
|
|
28
|
+
z : ndarray
|
|
29
|
+
2D array of height values for each grid vertex.
|
|
30
|
+
colors : ndarray
|
|
31
|
+
(width, height, 4) array of vertex colors.
|
|
32
|
+
|
|
33
|
+
Notes
|
|
34
|
+
-----
|
|
35
|
+
All arguments are optional.
|
|
36
|
+
|
|
37
|
+
Note that if vertex positions are updated, the normal vectors for each
|
|
38
|
+
triangle must be recomputed. This is somewhat expensive if the surface
|
|
39
|
+
was initialized with smooth=False and very expensive if smooth=True.
|
|
40
|
+
For faster performance, initialize with compute_normals=False and use
|
|
41
|
+
per-vertex colors or a material that does not require normals.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(self, x=None, y=None, z=None, colors=None, **kwargs):
|
|
45
|
+
# The x, y, z, and colors arguments are passed to set_data().
|
|
46
|
+
# All other keyword arguments are passed to MeshVisual.__init__().
|
|
47
|
+
self._x = None
|
|
48
|
+
self._y = None
|
|
49
|
+
self._z = None
|
|
50
|
+
self.__vertices = None
|
|
51
|
+
self.__faces = None
|
|
52
|
+
self.__meshdata = MeshData()
|
|
53
|
+
kwargs.setdefault('shading', 'smooth')
|
|
54
|
+
MeshVisual.__init__(self, **kwargs)
|
|
55
|
+
self.set_data(x, y, z, colors)
|
|
56
|
+
|
|
57
|
+
def _update_x_data(self, x):
|
|
58
|
+
if x is not None:
|
|
59
|
+
if self._x is None or len(x) != len(self._x):
|
|
60
|
+
self.__vertices = None
|
|
61
|
+
self._x = x
|
|
62
|
+
|
|
63
|
+
def _update_y_data(self, y):
|
|
64
|
+
if y is not None:
|
|
65
|
+
if self._y is None or len(y) != len(self._y):
|
|
66
|
+
self.__vertices = None
|
|
67
|
+
self._y = y
|
|
68
|
+
|
|
69
|
+
def _update_z_data(self, z):
|
|
70
|
+
if z is not None:
|
|
71
|
+
if self._x is not None and z.shape[0] != len(self._x):
|
|
72
|
+
raise TypeError('Z values must have shape (len(x), len(y))')
|
|
73
|
+
if self._y is not None and z.shape[1] != self._y.shape[-1]:
|
|
74
|
+
raise TypeError('Z values must have shape (len(x), len(y)) or (x.shape[0], y.shape[1])')
|
|
75
|
+
self._z = z
|
|
76
|
+
if (self.__vertices is not None and
|
|
77
|
+
self._z.shape != self.__vertices.shape[:2]):
|
|
78
|
+
self.__vertices = None
|
|
79
|
+
|
|
80
|
+
def _update_mesh_vertices(self, x_is_new, y_is_new, z_is_new):
|
|
81
|
+
new_vertices = False
|
|
82
|
+
update_vertices = False
|
|
83
|
+
update_faces = False
|
|
84
|
+
|
|
85
|
+
# Generate vertex and face array
|
|
86
|
+
if self.__vertices is None:
|
|
87
|
+
self.__vertices = np.empty((self._z.shape[0], self._z.shape[1], 3),
|
|
88
|
+
dtype=np.float32)
|
|
89
|
+
self.__faces = self._generate_faces()
|
|
90
|
+
new_vertices = True
|
|
91
|
+
update_faces = True
|
|
92
|
+
|
|
93
|
+
# Copy x, y, z data into vertex array
|
|
94
|
+
if new_vertices or x_is_new:
|
|
95
|
+
if not x_is_new and self._x is None:
|
|
96
|
+
x = np.arange(self._z.shape[0])
|
|
97
|
+
else:
|
|
98
|
+
x = self._x
|
|
99
|
+
if x.ndim == 1:
|
|
100
|
+
x = x.reshape(len(x), 1)
|
|
101
|
+
# Copy the 2D data into the appropriate slice
|
|
102
|
+
self.__vertices[:, :, 0] = x
|
|
103
|
+
update_vertices = True
|
|
104
|
+
|
|
105
|
+
if new_vertices or y_is_new:
|
|
106
|
+
if not y_is_new and self._y is None:
|
|
107
|
+
y = np.arange(self._z.shape[1])
|
|
108
|
+
else:
|
|
109
|
+
y = self._y
|
|
110
|
+
if y.ndim == 1:
|
|
111
|
+
y = y.reshape(1, len(y))
|
|
112
|
+
# Copy the 2D data into the appropriate slice
|
|
113
|
+
self.__vertices[:, :, 1] = y
|
|
114
|
+
update_vertices = True
|
|
115
|
+
|
|
116
|
+
if new_vertices or z_is_new:
|
|
117
|
+
self.__vertices[..., 2] = self._z
|
|
118
|
+
update_vertices = True
|
|
119
|
+
return update_faces, update_vertices
|
|
120
|
+
|
|
121
|
+
def _prepare_mesh_colors(self, colors):
|
|
122
|
+
if colors is None:
|
|
123
|
+
return
|
|
124
|
+
colors = np.asarray(colors)
|
|
125
|
+
if colors.ndim == 3:
|
|
126
|
+
# convert (width, height, 4) to (num_verts, 4)
|
|
127
|
+
vert_shape = self.__vertices.shape
|
|
128
|
+
num_vertices = vert_shape[0] * vert_shape[1]
|
|
129
|
+
colors = colors.reshape(num_vertices, colors.shape[-1])
|
|
130
|
+
return colors
|
|
131
|
+
|
|
132
|
+
def set_data(self, x=None, y=None, z=None, colors=None):
|
|
133
|
+
"""Update the data in this surface plot.
|
|
134
|
+
|
|
135
|
+
Parameters
|
|
136
|
+
----------
|
|
137
|
+
x : ndarray | None
|
|
138
|
+
1D/2D array of values specifying the x positions of vertices in
|
|
139
|
+
the grid. In case 1D array given as input, the values will be
|
|
140
|
+
replicated to fill the 2D array of size(z). If None, values will be
|
|
141
|
+
assumed to be integers.
|
|
142
|
+
y : ndarray | None
|
|
143
|
+
1D/2D array of values specifying the x positions of vertices in
|
|
144
|
+
the grid. In case 1D array given as input, the values will be
|
|
145
|
+
replicated to fill the 2D array of size(z). If None, values will be
|
|
146
|
+
assumed to be integers.
|
|
147
|
+
z : ndarray
|
|
148
|
+
2D array of height values for each grid vertex.
|
|
149
|
+
colors : ndarray
|
|
150
|
+
(width, height, 4) array of vertex colors.
|
|
151
|
+
"""
|
|
152
|
+
self._update_x_data(x)
|
|
153
|
+
self._update_y_data(y)
|
|
154
|
+
self._update_z_data(z)
|
|
155
|
+
|
|
156
|
+
if self._z is None:
|
|
157
|
+
# no mesh data to plot so no need to update
|
|
158
|
+
return
|
|
159
|
+
|
|
160
|
+
update_faces, update_vertices = self._update_mesh_vertices(
|
|
161
|
+
x is not None,
|
|
162
|
+
y is not None,
|
|
163
|
+
z is not None
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
colors = self._prepare_mesh_colors(colors)
|
|
167
|
+
update_colors = colors is not None
|
|
168
|
+
if update_colors:
|
|
169
|
+
self.__meshdata.set_vertex_colors(colors)
|
|
170
|
+
if update_faces:
|
|
171
|
+
self.__meshdata.set_faces(self.__faces)
|
|
172
|
+
if update_vertices:
|
|
173
|
+
self.__meshdata.set_vertices(
|
|
174
|
+
self.__vertices.reshape(self.__vertices.shape[0] *
|
|
175
|
+
self.__vertices.shape[1], 3))
|
|
176
|
+
if update_faces or update_vertices or update_colors:
|
|
177
|
+
MeshVisual.set_data(self, meshdata=self.__meshdata)
|
|
178
|
+
|
|
179
|
+
def _generate_faces(self):
|
|
180
|
+
cols = self._z.shape[1] - 1
|
|
181
|
+
rows = self._z.shape[0] - 1
|
|
182
|
+
faces = np.empty((cols * rows * 2, 3), dtype=np.uint)
|
|
183
|
+
rowtemplate1 = (np.arange(cols).reshape(cols, 1) +
|
|
184
|
+
np.array([[0, 1, cols + 1]]))
|
|
185
|
+
rowtemplate2 = (np.arange(cols).reshape(cols, 1) +
|
|
186
|
+
np.array([[cols + 1, 1, cols + 2]]))
|
|
187
|
+
for row in range(rows):
|
|
188
|
+
start = row * cols * 2
|
|
189
|
+
faces[start:start + cols] = rowtemplate1 + row * (cols + 1)
|
|
190
|
+
faces[start + cols:start + (cols * 2)] =\
|
|
191
|
+
rowtemplate2 + row * (cols + 1)
|
|
192
|
+
return faces
|
|
File without changes
|
|
@@ -0,0 +1,109 @@
|
|
|
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.visuals.line.arrow import ARROW_TYPES
|
|
8
|
+
from vispy.scene import visuals, transforms
|
|
9
|
+
from vispy.testing import (requires_application, TestingCanvas,
|
|
10
|
+
run_tests_if_main, assert_raises, SkipTest, IS_TRAVIS_CI)
|
|
11
|
+
from vispy.testing.image_tester import assert_image_approved
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
vertices = np.array([
|
|
15
|
+
[25, 25],
|
|
16
|
+
[25, 75],
|
|
17
|
+
[50, 25],
|
|
18
|
+
[50, 75],
|
|
19
|
+
[75, 25],
|
|
20
|
+
[75, 75]
|
|
21
|
+
]).astype(np.float32)
|
|
22
|
+
|
|
23
|
+
vertices += 0.33
|
|
24
|
+
|
|
25
|
+
arrows = np.array([
|
|
26
|
+
vertices[:2],
|
|
27
|
+
vertices[3:1:-1],
|
|
28
|
+
vertices[4:],
|
|
29
|
+
vertices[-1:-3:-1]
|
|
30
|
+
]).reshape((4, 4))
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@requires_application()
|
|
34
|
+
def test_arrow_draw():
|
|
35
|
+
"""Test drawing arrows without transforms"""
|
|
36
|
+
with TestingCanvas() as c:
|
|
37
|
+
if IS_TRAVIS_CI and c.app.backend_name.lower() == 'pyqt4':
|
|
38
|
+
# TODO: Fix this (issue #1042
|
|
39
|
+
raise SkipTest('Travis fails due to FB stack problem')
|
|
40
|
+
for arrow_type in ARROW_TYPES:
|
|
41
|
+
arrow = visuals.Arrow(pos=vertices, arrow_type=arrow_type,
|
|
42
|
+
arrows=arrows, arrow_size=10, color='red',
|
|
43
|
+
connect="segments", parent=c.scene)
|
|
44
|
+
|
|
45
|
+
assert_image_approved(c.render(), 'visuals/arrow_type_%s.png' %
|
|
46
|
+
arrow_type)
|
|
47
|
+
|
|
48
|
+
arrow.parent = None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@requires_application()
|
|
52
|
+
def test_arrow_transform_draw():
|
|
53
|
+
"""Tests the ArrowVisual when a transform is applied"""
|
|
54
|
+
with TestingCanvas() as c:
|
|
55
|
+
if IS_TRAVIS_CI and c.app.backend_name.lower() == 'pyqt4':
|
|
56
|
+
# TODO: Fix this (issue #1042
|
|
57
|
+
raise SkipTest('Travis fails due to FB stack problem')
|
|
58
|
+
for arrow_type in ARROW_TYPES:
|
|
59
|
+
arrow = visuals.Arrow(pos=vertices, arrow_type=arrow_type,
|
|
60
|
+
arrows=arrows, arrow_size=10, color='red',
|
|
61
|
+
connect="segments", parent=c.scene)
|
|
62
|
+
arrow.transform = transforms.STTransform(scale=(0.5, 0.75),
|
|
63
|
+
translate=(-20, -20))
|
|
64
|
+
|
|
65
|
+
assert_image_approved(c.render(),
|
|
66
|
+
'visuals/arrow_transform_type_%s.png' %
|
|
67
|
+
arrow_type)
|
|
68
|
+
|
|
69
|
+
arrow.parent = None
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@requires_application()
|
|
73
|
+
def test_arrow_reactive():
|
|
74
|
+
"""Tests the reactive behaviour of the ArrowVisual properties."""
|
|
75
|
+
with TestingCanvas() as c:
|
|
76
|
+
arrow = visuals.Arrow(pos=vertices, arrows=arrows,
|
|
77
|
+
connect="segments", parent=c.scene)
|
|
78
|
+
|
|
79
|
+
arrow.arrow_type = "stealth"
|
|
80
|
+
assert_image_approved(c.render(), 'visuals/arrow_reactive1.png')
|
|
81
|
+
|
|
82
|
+
arrow.arrow_size = 20
|
|
83
|
+
assert_image_approved(c.render(), 'visuals/arrow_reactive2.png')
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@requires_application()
|
|
87
|
+
def test_arrow_attributes():
|
|
88
|
+
"""Tests if the ArrowVisual performs the required checks for attributes."""
|
|
89
|
+
with TestingCanvas() as c:
|
|
90
|
+
arrow = visuals.Arrow(pos=vertices, arrow_type="stealth",
|
|
91
|
+
arrows=arrows, arrow_size=10, color='red',
|
|
92
|
+
connect="segments", parent=c.scene)
|
|
93
|
+
|
|
94
|
+
def size_test():
|
|
95
|
+
arrow.arrow_size = 0.0
|
|
96
|
+
|
|
97
|
+
def type_test():
|
|
98
|
+
arrow.arrow_type = "random_non_existent"
|
|
99
|
+
|
|
100
|
+
assert_raises(
|
|
101
|
+
ValueError, size_test
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
assert_raises(
|
|
105
|
+
ValueError, type_test
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
"""Tests for AxisVisual"""
|
|
8
|
+
|
|
9
|
+
from numpy.testing import assert_allclose, assert_array_equal
|
|
10
|
+
|
|
11
|
+
from vispy import scene
|
|
12
|
+
from vispy.scene import visuals
|
|
13
|
+
from vispy.testing import (requires_application, TestingCanvas,
|
|
14
|
+
run_tests_if_main)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@requires_application()
|
|
18
|
+
def test_axis():
|
|
19
|
+
with TestingCanvas() as c:
|
|
20
|
+
axis = visuals.Axis(pos=[[-1.0, 0], [1.0, 0]], parent=c.scene)
|
|
21
|
+
c.draw_visual(axis)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@requires_application()
|
|
25
|
+
def test_axis_zero_domain():
|
|
26
|
+
# Regression test for a bug that caused an overflow error when the domain
|
|
27
|
+
# min was same as max
|
|
28
|
+
with TestingCanvas() as c:
|
|
29
|
+
axis = visuals.Axis(pos=[[-1.0, 0], [1.0, 0]], domain=(0.5, 0.5), parent=c.scene)
|
|
30
|
+
c.draw_visual(axis)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@requires_application()
|
|
34
|
+
def test_rotation_angle():
|
|
35
|
+
|
|
36
|
+
# Make sure the rotation angle calculation is correct
|
|
37
|
+
|
|
38
|
+
canvas = scene.SceneCanvas(keys=None, size=(800, 600), show=True)
|
|
39
|
+
view = canvas.central_widget.add_view()
|
|
40
|
+
view.camera = scene.cameras.TurntableCamera(parent=view.scene,
|
|
41
|
+
fov=0., distance=4.0,
|
|
42
|
+
elevation=0, azimuth=0, roll=0.)
|
|
43
|
+
|
|
44
|
+
axis1 = visuals.Axis(pos=[[-1.0, 0], [1.0, 0]], parent=view.scene)
|
|
45
|
+
assert_allclose(axis1._rotation_angle, 0)
|
|
46
|
+
|
|
47
|
+
axis2 = visuals.Axis(pos=[[-3**0.5/2., -0.5], [3**0.5/2., 0.5]], parent=view.scene)
|
|
48
|
+
assert_allclose(axis2._rotation_angle, 0.)
|
|
49
|
+
|
|
50
|
+
view.camera.elevation = 90.
|
|
51
|
+
|
|
52
|
+
assert_allclose(axis1._rotation_angle, 0)
|
|
53
|
+
assert_allclose(axis2._rotation_angle, -30, rtol=1e-3)
|
|
54
|
+
|
|
55
|
+
view.camera.elevation = 45.
|
|
56
|
+
|
|
57
|
+
assert_allclose(axis1._rotation_angle, 0)
|
|
58
|
+
assert_allclose(axis2._rotation_angle, -22.207653, rtol=1e-3)
|
|
59
|
+
|
|
60
|
+
view.camera.fov = 20.
|
|
61
|
+
|
|
62
|
+
assert_allclose(axis1._rotation_angle, 0)
|
|
63
|
+
# OSX Travis has some small differences...sometimes
|
|
64
|
+
assert_allclose(axis2._rotation_angle, -17.056795, rtol=0.05)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@requires_application()
|
|
68
|
+
def test_text_position():
|
|
69
|
+
|
|
70
|
+
# Test the labels text and position of the axis depending on its domain
|
|
71
|
+
|
|
72
|
+
canvas = scene.SceneCanvas(keys=None, size=(800, 600), show=True)
|
|
73
|
+
view = canvas.central_widget.add_view()
|
|
74
|
+
view.camera = scene.cameras.PanZoomCamera(parent=view.scene)
|
|
75
|
+
|
|
76
|
+
# tick length and label margin to 0 for nice values
|
|
77
|
+
axis1 = visuals.Axis(pos=[[-1.0, 0], [1.0, 0]], domain=(0., 1.25),
|
|
78
|
+
major_tick_length=0, tick_label_margin=0,
|
|
79
|
+
parent=view.scene)
|
|
80
|
+
|
|
81
|
+
canvas.draw_visual(axis1)
|
|
82
|
+
assert_allclose(axis1._text.pos[:, 0], (-1, -0.2, 0.6))
|
|
83
|
+
assert_array_equal(axis1._text.text, ('0', '0.5', '1'))
|
|
84
|
+
|
|
85
|
+
# Flip the axis domain
|
|
86
|
+
axis1.domain = (1.25, 0.)
|
|
87
|
+
canvas.draw_visual(axis1)
|
|
88
|
+
# Text should be unchanged and positions mirrored
|
|
89
|
+
assert_allclose(axis1._text.pos[:, 0], (1, 0.2, -0.6))
|
|
90
|
+
assert_array_equal(axis1._text.text, ('0', '0.5', '1'))
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@requires_application()
|
|
94
|
+
def test_tick_position():
|
|
95
|
+
|
|
96
|
+
# Test the position of the ticks depending on the axis domain
|
|
97
|
+
|
|
98
|
+
canvas = scene.SceneCanvas(keys=None, size=(800, 600), show=True)
|
|
99
|
+
view = canvas.central_widget.add_view()
|
|
100
|
+
view.camera = scene.cameras.PanZoomCamera(parent=view.scene)
|
|
101
|
+
|
|
102
|
+
axis1 = visuals.Axis(pos=[[-1.0, 0], [1.0, 0]], domain=(0., 1.25), parent=view.scene)
|
|
103
|
+
|
|
104
|
+
canvas.draw_visual(axis1)
|
|
105
|
+
# Get a nice array of x ticks positions
|
|
106
|
+
x_ticks_positions = axis1._ticks.pos[::2, ::2].flatten()
|
|
107
|
+
# Compare major ticks first
|
|
108
|
+
assert_allclose(x_ticks_positions[:3], (-1, -0.2, 0.6))
|
|
109
|
+
# Then minor ticks
|
|
110
|
+
assert_allclose(x_ticks_positions[3:], (-0.84, -0.68, -0.52, -0.36, -0.04, 0.12, 0.28, 0.44, 0.76, 0.92))
|
|
111
|
+
|
|
112
|
+
# Flip the axis domain
|
|
113
|
+
axis1.domain = (1.25, 0.)
|
|
114
|
+
canvas.draw_visual(axis1)
|
|
115
|
+
x_ticks_positions = axis1._ticks.pos[::2, ::2].flatten()
|
|
116
|
+
# Positions should be mirrored
|
|
117
|
+
assert_allclose(x_ticks_positions[:3], (1, 0.2, -0.6))
|
|
118
|
+
assert_allclose(x_ticks_positions[3:], (0.84, 0.68, 0.52, 0.36, 0.04, -0.12, -0.28, -0.44, -0.76, -0.92))
|
|
119
|
+
|
|
120
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# *Very* basic collections tests
|
|
2
|
+
|
|
3
|
+
from vispy.visuals.collections import (PathCollection, PointCollection,
|
|
4
|
+
PolygonCollection, SegmentCollection,
|
|
5
|
+
TriangleCollection)
|
|
6
|
+
from vispy.testing import requires_application, TestingCanvas
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@requires_application()
|
|
10
|
+
def test_init():
|
|
11
|
+
"""Test collection initialization"""
|
|
12
|
+
with TestingCanvas():
|
|
13
|
+
for coll in (PathCollection, PointCollection, PolygonCollection,
|
|
14
|
+
SegmentCollection, TriangleCollection):
|
|
15
|
+
coll()
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Tests for ColorbarVisual
|
|
5
|
+
All images are of size (100,100) to keep a small file size
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from vispy.scene import visuals
|
|
9
|
+
from vispy.testing import (requires_application, TestingCanvas,
|
|
10
|
+
run_tests_if_main, raises)
|
|
11
|
+
from vispy.testing.image_tester import assert_image_approved
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def create_colorbar(pos, size, orientation, label='label string here'):
|
|
15
|
+
colorbar = visuals.ColorBar(pos=pos,
|
|
16
|
+
size=size,
|
|
17
|
+
orientation=orientation,
|
|
18
|
+
label=label,
|
|
19
|
+
cmap='autumn',
|
|
20
|
+
border_color='white',
|
|
21
|
+
border_width=2)
|
|
22
|
+
|
|
23
|
+
colorbar.label.color = 'white'
|
|
24
|
+
colorbar.label.font_size = 5
|
|
25
|
+
|
|
26
|
+
colorbar.ticks[0].color = 'white'
|
|
27
|
+
colorbar.ticks[0].font_size = 5
|
|
28
|
+
|
|
29
|
+
colorbar.ticks[1].color = 'white'
|
|
30
|
+
colorbar.ticks[1].font_size = 5
|
|
31
|
+
|
|
32
|
+
return colorbar
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@requires_application()
|
|
36
|
+
def test_colorbar_draw():
|
|
37
|
+
"""Test drawing Colorbar without transform using ColorbarVisual"""
|
|
38
|
+
with TestingCanvas() as c:
|
|
39
|
+
colorbar_top = create_colorbar(pos=(50, 50),
|
|
40
|
+
size=(60, 4),
|
|
41
|
+
orientation='top')
|
|
42
|
+
|
|
43
|
+
c.draw_visual(colorbar_top)
|
|
44
|
+
assert_image_approved(c.render(), 'visuals/colorbar/top.png')
|
|
45
|
+
colorbar_top.parent = None
|
|
46
|
+
|
|
47
|
+
colorbar_bottom = create_colorbar(pos=(50, 50),
|
|
48
|
+
size=(60, 4),
|
|
49
|
+
orientation='bottom')
|
|
50
|
+
|
|
51
|
+
c.draw_visual(colorbar_bottom)
|
|
52
|
+
assert_image_approved(c.render(), 'visuals/colorbar/bottom.png')
|
|
53
|
+
colorbar_bottom.parent = None
|
|
54
|
+
|
|
55
|
+
colorbar_left = create_colorbar(pos=(50, 50),
|
|
56
|
+
size=(60, 4),
|
|
57
|
+
orientation='left')
|
|
58
|
+
|
|
59
|
+
c.draw_visual(colorbar_left)
|
|
60
|
+
assert_image_approved(c.render(), 'visuals/colorbar/left.png')
|
|
61
|
+
colorbar_left.parent = None
|
|
62
|
+
|
|
63
|
+
colorbar_right = create_colorbar(pos=(50, 50),
|
|
64
|
+
size=(60, 4),
|
|
65
|
+
orientation='right')
|
|
66
|
+
|
|
67
|
+
c.draw_visual(colorbar_right)
|
|
68
|
+
assert_image_approved(c.render(), 'visuals/colorbar/right.png')
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@requires_application()
|
|
72
|
+
def test_reactive_draw():
|
|
73
|
+
"""Test reactive RectPolygon attributes"""
|
|
74
|
+
with TestingCanvas() as c:
|
|
75
|
+
colorbar = create_colorbar(pos=(50, 50),
|
|
76
|
+
size=(60, 4),
|
|
77
|
+
orientation='top')
|
|
78
|
+
c.draw_visual(colorbar)
|
|
79
|
+
|
|
80
|
+
colorbar.cmap = "ice"
|
|
81
|
+
assert_image_approved(c.render(),
|
|
82
|
+
'visuals/colorbar/reactive_cmap.png')
|
|
83
|
+
|
|
84
|
+
colorbar.clim = (-20, 20)
|
|
85
|
+
assert_image_approved(c.render(),
|
|
86
|
+
'visuals/colorbar/reactive_clim.png')
|
|
87
|
+
|
|
88
|
+
colorbar.label.text = "new label"
|
|
89
|
+
assert_image_approved(c.render(),
|
|
90
|
+
'visuals/colorbar/reactive_label.png')
|
|
91
|
+
|
|
92
|
+
colorbar.ticks[0].color = "red"
|
|
93
|
+
colorbar.ticks[1].color = "blue"
|
|
94
|
+
assert_image_approved(c.render(),
|
|
95
|
+
'visuals/colorbar/reactive_ticks.png')
|
|
96
|
+
|
|
97
|
+
colorbar.border_width = 0
|
|
98
|
+
assert_image_approved(c.render(),
|
|
99
|
+
'visuals/colorbar/reactive_border_width.png')
|
|
100
|
+
|
|
101
|
+
colorbar.border_width = 5
|
|
102
|
+
colorbar.border_color = "red"
|
|
103
|
+
assert_image_approved(c.render(),
|
|
104
|
+
'visuals/colorbar/reactive_border_color.png')
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@requires_application()
|
|
108
|
+
def test_attributes():
|
|
109
|
+
"""Test if attribute checks are in place"""
|
|
110
|
+
with TestingCanvas():
|
|
111
|
+
|
|
112
|
+
# initialize with major axis < minor axis
|
|
113
|
+
with raises(ValueError):
|
|
114
|
+
create_colorbar(pos=(50, 50),
|
|
115
|
+
size=(1, 30),
|
|
116
|
+
orientation='top')
|
|
117
|
+
|
|
118
|
+
# set major axis to 0
|
|
119
|
+
with raises(ValueError):
|
|
120
|
+
create_colorbar(pos=(50, 50),
|
|
121
|
+
size=(0, 1),
|
|
122
|
+
orientation='right')
|
|
123
|
+
|
|
124
|
+
# set negative major axis
|
|
125
|
+
with raises(ValueError):
|
|
126
|
+
create_colorbar(pos=(50, 50),
|
|
127
|
+
size=(-10, 1),
|
|
128
|
+
orientation='right')
|
|
129
|
+
|
|
130
|
+
# set negative minor axis
|
|
131
|
+
with raises(ValueError):
|
|
132
|
+
create_colorbar(pos=(50, 50),
|
|
133
|
+
size=(1, -10),
|
|
134
|
+
orientation='right')
|
|
135
|
+
|
|
136
|
+
# set minor axis to 0
|
|
137
|
+
with raises(ValueError):
|
|
138
|
+
create_colorbar(pos=(50, 50),
|
|
139
|
+
size=(1, 0),
|
|
140
|
+
orientation='right')
|
|
141
|
+
|
|
142
|
+
# set invalid orientation
|
|
143
|
+
with raises(ValueError):
|
|
144
|
+
create_colorbar(pos=(50, 50),
|
|
145
|
+
size=(60, 4),
|
|
146
|
+
orientation='top-invalid')
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
@requires_application()
|
|
150
|
+
def test_colorbar_label_change():
|
|
151
|
+
with TestingCanvas() as c:
|
|
152
|
+
colorbar = create_colorbar(pos=(50, 50),
|
|
153
|
+
size=(60, 4),
|
|
154
|
+
orientation='top')
|
|
155
|
+
colorbar.cmap = "ice"
|
|
156
|
+
orig_text_vis = colorbar.label
|
|
157
|
+
colorbar.label = "New Label"
|
|
158
|
+
assert colorbar.label.text == "New Label"
|
|
159
|
+
assert colorbar.label is orig_text_vis
|
|
160
|
+
|
|
161
|
+
c.draw_visual(colorbar)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
@requires_application()
|
|
165
|
+
def test_colorbar_label_as_textvisual():
|
|
166
|
+
with TestingCanvas() as c:
|
|
167
|
+
label = visuals.Text("my label")
|
|
168
|
+
colorbar = create_colorbar(pos=(50, 50),
|
|
169
|
+
size=(60, 4),
|
|
170
|
+
orientation='top',
|
|
171
|
+
label=label)
|
|
172
|
+
colorbar.cmap = "ice"
|
|
173
|
+
assert colorbar.label.text == "my label"
|
|
174
|
+
assert colorbar.label is label
|
|
175
|
+
|
|
176
|
+
c.draw_visual(colorbar)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
run_tests_if_main()
|