vispy 0.15.0__cp313-cp313-manylinux_2_17_x86_64.manylinux2014_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-x86_64-linux-gnu.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
vispy/io/wavefront.py
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
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
|
+
# This module was taken from visvis
|
|
5
|
+
"""This module produces functionality to read and write wavefront (.OBJ) files.
|
|
6
|
+
|
|
7
|
+
See `wikipedia <http://en.wikipedia.org/wiki/Wavefront_.obj_file>`_ for more details.
|
|
8
|
+
|
|
9
|
+
The wavefront format is quite powerful and allows a wide variety of surfaces
|
|
10
|
+
to be described.
|
|
11
|
+
|
|
12
|
+
This implementation does only supports mesh stuff, so no nurbs etc. Further,
|
|
13
|
+
material properties are ignored, although this might be implemented later,
|
|
14
|
+
|
|
15
|
+
The classes are written with compatibility of Python3 in mind.
|
|
16
|
+
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import numpy as np
|
|
20
|
+
import time
|
|
21
|
+
from gzip import GzipFile
|
|
22
|
+
from os import path as op
|
|
23
|
+
|
|
24
|
+
from ..geometry import _calculate_normals
|
|
25
|
+
from ..util import logger
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class WavefrontReader(object):
|
|
29
|
+
|
|
30
|
+
def __init__(self, f):
|
|
31
|
+
self._f = f
|
|
32
|
+
|
|
33
|
+
# Original vertices, normals and texture coords.
|
|
34
|
+
# These are not necessarily of the same length.
|
|
35
|
+
self._v = []
|
|
36
|
+
self._vn = []
|
|
37
|
+
self._vt = []
|
|
38
|
+
|
|
39
|
+
# Final vertices, normals and texture coords.
|
|
40
|
+
# All three lists are of the same length, as opengl wants it.
|
|
41
|
+
self._vertices = []
|
|
42
|
+
self._normals = []
|
|
43
|
+
self._texcords = []
|
|
44
|
+
|
|
45
|
+
# The faces, indices to vertex/normal/texcords arrays.
|
|
46
|
+
self._faces = []
|
|
47
|
+
|
|
48
|
+
# Dictionary to keep track of processed face data, so we can
|
|
49
|
+
# convert the original v/vn/vn to the final vertices/normals/texcords.
|
|
50
|
+
self._facemap = {}
|
|
51
|
+
|
|
52
|
+
@classmethod
|
|
53
|
+
def read(cls, fname):
|
|
54
|
+
"""Entry point for reading OBJ files.
|
|
55
|
+
|
|
56
|
+
Parameters
|
|
57
|
+
----------
|
|
58
|
+
fname : str
|
|
59
|
+
The name of the file to read.
|
|
60
|
+
|
|
61
|
+
"""
|
|
62
|
+
# Open file
|
|
63
|
+
fmt = op.splitext(fname)[1].lower()
|
|
64
|
+
assert fmt in ('.obj', '.gz')
|
|
65
|
+
opener = open if fmt == '.obj' else GzipFile
|
|
66
|
+
with opener(fname, 'rb') as f:
|
|
67
|
+
try:
|
|
68
|
+
reader = WavefrontReader(f)
|
|
69
|
+
while True:
|
|
70
|
+
reader.readLine()
|
|
71
|
+
except EOFError:
|
|
72
|
+
pass
|
|
73
|
+
|
|
74
|
+
# Done
|
|
75
|
+
t0 = time.time()
|
|
76
|
+
mesh = reader.finish()
|
|
77
|
+
logger.debug('reading mesh took ' +
|
|
78
|
+
str(time.time() - t0) +
|
|
79
|
+
' seconds')
|
|
80
|
+
return mesh
|
|
81
|
+
|
|
82
|
+
def readLine(self):
|
|
83
|
+
"""The method that reads a line and processes it."""
|
|
84
|
+
# Read line
|
|
85
|
+
line = self._f.readline().decode('ascii', 'ignore')
|
|
86
|
+
if not line:
|
|
87
|
+
raise EOFError()
|
|
88
|
+
line = line.strip()
|
|
89
|
+
|
|
90
|
+
if line.startswith('v '):
|
|
91
|
+
# self._vertices.append( *self.readTuple(line) )
|
|
92
|
+
self._v.append(self.readTuple(line))
|
|
93
|
+
elif line.startswith('vt '):
|
|
94
|
+
self._vt.append(self.readTuple(line, 3))
|
|
95
|
+
elif line.startswith('vn '):
|
|
96
|
+
self._vn.append(self.readTuple(line))
|
|
97
|
+
elif line.startswith('f '):
|
|
98
|
+
self._faces.append(self.readFace(line))
|
|
99
|
+
elif line.startswith('#'):
|
|
100
|
+
pass # Comment
|
|
101
|
+
elif line.startswith('mtllib '):
|
|
102
|
+
logger.warning('Notice reading .OBJ: material properties are '
|
|
103
|
+
'ignored.')
|
|
104
|
+
elif any(line.startswith(x) for x in ('g ', 's ', 'o ', 'usemtl ')):
|
|
105
|
+
pass # Ignore groups and smoothing groups, obj names, material
|
|
106
|
+
elif not line.strip():
|
|
107
|
+
pass
|
|
108
|
+
else:
|
|
109
|
+
logger.warning('Notice reading .OBJ: ignoring %s command.'
|
|
110
|
+
% line.strip())
|
|
111
|
+
|
|
112
|
+
def readTuple(self, line, n=3):
|
|
113
|
+
"""Reads a tuple of numbers. e.g. vertices, normals or teture coords."""
|
|
114
|
+
numbers = [num for num in line.split(' ') if num]
|
|
115
|
+
return [float(num) for num in numbers[1:n + 1]]
|
|
116
|
+
|
|
117
|
+
def readFace(self, line):
|
|
118
|
+
"""Each face consists of three or more sets of indices. Each set
|
|
119
|
+
consists of 1, 2 or 3 indices to vertices/normals/texcords.
|
|
120
|
+
"""
|
|
121
|
+
# Get parts (skip first)
|
|
122
|
+
indexSets = [num for num in line.split(' ') if num][1:]
|
|
123
|
+
|
|
124
|
+
final_face = []
|
|
125
|
+
for indexSet in indexSets:
|
|
126
|
+
|
|
127
|
+
# Did we see this exact index earlier? If so, it's easy
|
|
128
|
+
final_index = self._facemap.get(indexSet)
|
|
129
|
+
if final_index is not None:
|
|
130
|
+
final_face.append(final_index)
|
|
131
|
+
continue
|
|
132
|
+
|
|
133
|
+
# If not, we need to sync the vertices/normals/texcords ...
|
|
134
|
+
|
|
135
|
+
# Get and store final index
|
|
136
|
+
final_index = len(self._vertices)
|
|
137
|
+
final_face.append(final_index)
|
|
138
|
+
self._facemap[indexSet] = final_index
|
|
139
|
+
|
|
140
|
+
# What indices were given?
|
|
141
|
+
indices = [i for i in indexSet.split('/')]
|
|
142
|
+
|
|
143
|
+
# Store new set of vertex/normal/texcords.
|
|
144
|
+
# If there is a single face that does not specify the texcord
|
|
145
|
+
# index, the texcords are ignored. Likewise for the normals.
|
|
146
|
+
if True:
|
|
147
|
+
vertex_index = self._absint(indices[0], len(self._v))
|
|
148
|
+
self._vertices.append(self._v[vertex_index])
|
|
149
|
+
if self._texcords is not None:
|
|
150
|
+
if len(indices) > 1 and indices[1]:
|
|
151
|
+
texcord_index = self._absint(indices[1], len(self._vt))
|
|
152
|
+
self._texcords.append(self._vt[texcord_index])
|
|
153
|
+
else:
|
|
154
|
+
if self._texcords:
|
|
155
|
+
logger.warning('Ignoring texture coordinates because '
|
|
156
|
+
'it is not specified for all faces.')
|
|
157
|
+
self._texcords = None
|
|
158
|
+
if self._normals is not None:
|
|
159
|
+
if len(indices) > 2 and indices[2]:
|
|
160
|
+
normal_index = self._absint(indices[2], len(self._vn))
|
|
161
|
+
self._normals.append(self._vn[normal_index])
|
|
162
|
+
else:
|
|
163
|
+
if self._normals:
|
|
164
|
+
logger.warning('Ignoring normals because it is not '
|
|
165
|
+
'specified for all faces.')
|
|
166
|
+
self._normals = None
|
|
167
|
+
|
|
168
|
+
# Check face
|
|
169
|
+
if self._faces and len(self._faces[0]) != len(final_face):
|
|
170
|
+
raise RuntimeError(
|
|
171
|
+
'Vispy requires that all faces are either triangles or quads.')
|
|
172
|
+
|
|
173
|
+
# Done
|
|
174
|
+
return final_face
|
|
175
|
+
|
|
176
|
+
def _absint(self, i, ref):
|
|
177
|
+
i = int(i)
|
|
178
|
+
if i > 0:
|
|
179
|
+
return i - 1
|
|
180
|
+
else:
|
|
181
|
+
return ref + i
|
|
182
|
+
|
|
183
|
+
def _calculate_normals(self):
|
|
184
|
+
vertices, faces = self._vertices, self._faces
|
|
185
|
+
if faces is None:
|
|
186
|
+
# ensure it's always 2D so we can use our methods
|
|
187
|
+
faces = np.arange(0, vertices.size, dtype=np.uint32)[:, np.newaxis]
|
|
188
|
+
normals = _calculate_normals(vertices, faces)
|
|
189
|
+
return normals
|
|
190
|
+
|
|
191
|
+
def finish(self):
|
|
192
|
+
"""Converts gathere lists to numpy arrays and creates
|
|
193
|
+
BaseMesh instance.
|
|
194
|
+
"""
|
|
195
|
+
self._vertices = np.array(self._vertices, 'float32')
|
|
196
|
+
if self._faces:
|
|
197
|
+
self._faces = np.array(self._faces, 'uint32')
|
|
198
|
+
else:
|
|
199
|
+
# Use vertices only
|
|
200
|
+
self._vertices = np.array(self._v, 'float32')
|
|
201
|
+
self._faces = None
|
|
202
|
+
if self._normals:
|
|
203
|
+
self._normals = np.array(self._normals, 'float32')
|
|
204
|
+
else:
|
|
205
|
+
self._normals = self._calculate_normals()
|
|
206
|
+
if self._texcords:
|
|
207
|
+
self._texcords = np.array(self._texcords, 'float32')
|
|
208
|
+
else:
|
|
209
|
+
self._texcords = None
|
|
210
|
+
|
|
211
|
+
return self._vertices, self._faces, self._normals, self._texcords
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
class WavefrontWriter(object):
|
|
215
|
+
|
|
216
|
+
def __init__(self, f):
|
|
217
|
+
self._f = f
|
|
218
|
+
|
|
219
|
+
@classmethod
|
|
220
|
+
def write(cls, fname, vertices, faces, normals,
|
|
221
|
+
texcoords, name='', reshape_faces=True):
|
|
222
|
+
"""This classmethod is the entry point for writing mesh data to OBJ.
|
|
223
|
+
|
|
224
|
+
Parameters
|
|
225
|
+
----------
|
|
226
|
+
fname : string
|
|
227
|
+
The filename to write to. Must end with ".obj" or ".gz".
|
|
228
|
+
vertices : numpy array
|
|
229
|
+
The vertex data
|
|
230
|
+
faces : numpy array
|
|
231
|
+
The face data
|
|
232
|
+
texcoords : numpy array
|
|
233
|
+
The texture coordinate per vertex
|
|
234
|
+
name : str
|
|
235
|
+
The name of the object (e.g. 'teapot')
|
|
236
|
+
reshape_faces : bool
|
|
237
|
+
Reshape the `faces` array to (Nf, 3). Set to `False`
|
|
238
|
+
if you need to write a mesh with non triangular faces.
|
|
239
|
+
"""
|
|
240
|
+
# Open file
|
|
241
|
+
fmt = op.splitext(fname)[1].lower()
|
|
242
|
+
if fmt not in ('.obj', '.gz'):
|
|
243
|
+
raise ValueError('Filename must end with .obj or .gz, not "%s"'
|
|
244
|
+
% (fmt,))
|
|
245
|
+
opener = open if fmt == '.obj' else GzipFile
|
|
246
|
+
f = opener(fname, 'wb')
|
|
247
|
+
try:
|
|
248
|
+
writer = WavefrontWriter(f)
|
|
249
|
+
writer.writeMesh(vertices, faces, normals,
|
|
250
|
+
texcoords, name, reshape_faces=reshape_faces)
|
|
251
|
+
except EOFError:
|
|
252
|
+
pass
|
|
253
|
+
finally:
|
|
254
|
+
f.close()
|
|
255
|
+
|
|
256
|
+
def writeLine(self, text):
|
|
257
|
+
"""Simple writeLine function to write a line of code to the file.
|
|
258
|
+
The encoding is done here, and a newline character is added.
|
|
259
|
+
"""
|
|
260
|
+
text += '\n'
|
|
261
|
+
self._f.write(text.encode('ascii'))
|
|
262
|
+
|
|
263
|
+
def writeTuple(self, val, what):
|
|
264
|
+
"""Writes a tuple of numbers (on one line)."""
|
|
265
|
+
# Limit to three values. so RGBA data drops the alpha channel
|
|
266
|
+
# Format can handle up to 3 texcords
|
|
267
|
+
val = val[:3]
|
|
268
|
+
# Make string
|
|
269
|
+
val = ' '.join([str(v) for v in val])
|
|
270
|
+
# Write line
|
|
271
|
+
self.writeLine('%s %s' % (what, val))
|
|
272
|
+
|
|
273
|
+
def writeFace(self, val, what='f'):
|
|
274
|
+
"""Write the face info to the net line."""
|
|
275
|
+
# OBJ counts from 1
|
|
276
|
+
val = [v + 1 for v in val]
|
|
277
|
+
# Make string
|
|
278
|
+
if self._hasValues and self._hasNormals:
|
|
279
|
+
val = ' '.join(['%i/%i/%i' % (v, v, v) for v in val])
|
|
280
|
+
elif self._hasNormals:
|
|
281
|
+
val = ' '.join(['%i//%i' % (v, v) for v in val])
|
|
282
|
+
elif self._hasValues:
|
|
283
|
+
val = ' '.join(['%i/%i' % (v, v) for v in val])
|
|
284
|
+
else:
|
|
285
|
+
val = ' '.join(['%i' % v for v in val])
|
|
286
|
+
# Write line
|
|
287
|
+
self.writeLine('%s %s' % (what, val))
|
|
288
|
+
|
|
289
|
+
def writeMesh(self, vertices, faces, normals, values,
|
|
290
|
+
name='', reshape_faces=True):
|
|
291
|
+
"""Write the given mesh instance."""
|
|
292
|
+
# Store properties
|
|
293
|
+
self._hasNormals = normals is not None
|
|
294
|
+
self._hasValues = values is not None
|
|
295
|
+
self._hasFaces = faces is not None
|
|
296
|
+
|
|
297
|
+
# Get faces and number of vertices
|
|
298
|
+
if faces is None:
|
|
299
|
+
faces = np.arange(len(vertices))
|
|
300
|
+
reshape_faces = True
|
|
301
|
+
|
|
302
|
+
if reshape_faces:
|
|
303
|
+
Nfaces = faces.size // 3
|
|
304
|
+
faces = faces.reshape((Nfaces, 3))
|
|
305
|
+
else:
|
|
306
|
+
is_triangular = np.array([len(f) == 3
|
|
307
|
+
for f in faces])
|
|
308
|
+
if not(np.all(is_triangular)):
|
|
309
|
+
logger.warning('''Faces doesn't appear to be triangular,
|
|
310
|
+
be advised the file cannot be read back in vispy''')
|
|
311
|
+
# Number of vertices
|
|
312
|
+
N = vertices.shape[0]
|
|
313
|
+
|
|
314
|
+
# Get string with stats
|
|
315
|
+
stats = []
|
|
316
|
+
stats.append('%i vertices' % N)
|
|
317
|
+
if self._hasValues:
|
|
318
|
+
stats.append('%i texcords' % N)
|
|
319
|
+
else:
|
|
320
|
+
stats.append('no texcords')
|
|
321
|
+
if self._hasNormals:
|
|
322
|
+
stats.append('%i normals' % N)
|
|
323
|
+
else:
|
|
324
|
+
stats.append('no normals')
|
|
325
|
+
stats.append('%i faces' % faces.shape[0])
|
|
326
|
+
|
|
327
|
+
# Write header
|
|
328
|
+
self.writeLine('# Wavefront OBJ file')
|
|
329
|
+
self.writeLine('# Created by vispy.')
|
|
330
|
+
self.writeLine('#')
|
|
331
|
+
if name:
|
|
332
|
+
self.writeLine('# object %s' % name)
|
|
333
|
+
else:
|
|
334
|
+
self.writeLine('# unnamed object')
|
|
335
|
+
self.writeLine('# %s' % ', '.join(stats))
|
|
336
|
+
self.writeLine('')
|
|
337
|
+
|
|
338
|
+
# Write data
|
|
339
|
+
if True:
|
|
340
|
+
for i in range(N):
|
|
341
|
+
self.writeTuple(vertices[i], 'v')
|
|
342
|
+
if self._hasNormals:
|
|
343
|
+
for i in range(N):
|
|
344
|
+
self.writeTuple(normals[i], 'vn')
|
|
345
|
+
if self._hasValues:
|
|
346
|
+
for i in range(N):
|
|
347
|
+
self.writeTuple(values[i], 'vt')
|
|
348
|
+
if True:
|
|
349
|
+
for i in range(faces.shape[0]):
|
|
350
|
+
self.writeFace(faces[i])
|
vispy/plot/__init__.py
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
This module provides functions for displaying data from a command-line
|
|
6
|
+
interface.
|
|
7
|
+
|
|
8
|
+
**NOTE**: This module is still experimental, and under development.
|
|
9
|
+
It currently lacks axes, but that is a high-priority target for
|
|
10
|
+
the next release.
|
|
11
|
+
|
|
12
|
+
Usage
|
|
13
|
+
-----
|
|
14
|
+
To use `vispy.plot` typically the main class `Fig` is first instantiated::
|
|
15
|
+
|
|
16
|
+
>>> from vispy.plot import Fig
|
|
17
|
+
>>> fig = Fig()
|
|
18
|
+
|
|
19
|
+
And then `PlotWidget` instances are automatically created by accessing
|
|
20
|
+
the ``fig`` instance::
|
|
21
|
+
|
|
22
|
+
>>> ax_left = fig[0, 0]
|
|
23
|
+
>>> ax_right = fig[0, 1]
|
|
24
|
+
|
|
25
|
+
Then plots are accomplished via methods of the `PlotWidget` instances::
|
|
26
|
+
|
|
27
|
+
>>> import numpy as np
|
|
28
|
+
>>> data = np.random.randn(2, 10)
|
|
29
|
+
>>> ax_left.plot(data)
|
|
30
|
+
>>> ax_right.histogram(data[1])
|
|
31
|
+
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from .fig import Fig # noqa
|
|
35
|
+
from .plotwidget import PlotWidget # noqa
|
|
36
|
+
from ..scene import * # noqa
|
vispy/plot/fig.py
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
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 ..scene import SceneCanvas
|
|
6
|
+
from .plotwidget import PlotWidget
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Fig(SceneCanvas):
|
|
10
|
+
"""Create a figure window
|
|
11
|
+
|
|
12
|
+
Parameters
|
|
13
|
+
----------
|
|
14
|
+
bgcolor : instance of Color
|
|
15
|
+
Color to use for the background.
|
|
16
|
+
size : tuple
|
|
17
|
+
Size of the figure window in pixels.
|
|
18
|
+
show : bool
|
|
19
|
+
If True, show the window.
|
|
20
|
+
**kwargs : dict
|
|
21
|
+
Keywoard arguments to pass to `SceneCanvas` base class.
|
|
22
|
+
|
|
23
|
+
Notes
|
|
24
|
+
-----
|
|
25
|
+
You can create a Figure, PlotWidget, and diagonal line plot like this::
|
|
26
|
+
|
|
27
|
+
>>> from vispy.plot import Fig
|
|
28
|
+
>>> fig = Fig()
|
|
29
|
+
>>> ax = fig[0, 0] # this creates a PlotWidget
|
|
30
|
+
>>> ax.plot([[0, 1], [1, 0]])
|
|
31
|
+
|
|
32
|
+
See the gallery for many other examples.
|
|
33
|
+
|
|
34
|
+
See Also
|
|
35
|
+
--------
|
|
36
|
+
PlotWidget : the axis widget for plotting
|
|
37
|
+
SceneCanvas : the super class
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def __init__(self, bgcolor='w', size=(800, 600), show=True,
|
|
41
|
+
keys='interactive', **kwargs):
|
|
42
|
+
self._plot_widgets = []
|
|
43
|
+
self._grid = None # initialize before the freeze occurs
|
|
44
|
+
super(Fig, self).__init__(bgcolor=bgcolor, keys=keys,
|
|
45
|
+
show=show, size=size, **kwargs)
|
|
46
|
+
self._grid = self.central_widget.add_grid()
|
|
47
|
+
self._grid._default_class = PlotWidget
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def plot_widgets(self):
|
|
51
|
+
"""List of the associated PlotWidget instances"""
|
|
52
|
+
return tuple(self._plot_widgets)
|
|
53
|
+
|
|
54
|
+
def __getitem__(self, idxs):
|
|
55
|
+
"""Get an axis"""
|
|
56
|
+
pw = self._grid.__getitem__(idxs)
|
|
57
|
+
self._plot_widgets += [pw]
|
|
58
|
+
return pw
|