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.

Files changed (519) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +968 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1134 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +352 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1542 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +134 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +698 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +506 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +566 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1816 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1045 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +106 -0
  274. vispy/scene/cameras/base_camera.py +538 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +308 -0
  278. vispy/scene/cameras/perspective.py +333 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +173 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +446 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +473 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +17 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +4 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +485 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +163 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +796 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +105 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +688 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +810 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_histogram.py +24 -0
  477. vispy/visuals/tests/test_image.py +390 -0
  478. vispy/visuals/tests/test_image_complex.py +36 -0
  479. vispy/visuals/tests/test_infinite_line.py +53 -0
  480. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  481. vispy/visuals/tests/test_isosurface.py +22 -0
  482. vispy/visuals/tests/test_linear_region.py +152 -0
  483. vispy/visuals/tests/test_markers.py +54 -0
  484. vispy/visuals/tests/test_mesh.py +261 -0
  485. vispy/visuals/tests/test_mesh_normals.py +218 -0
  486. vispy/visuals/tests/test_polygon.py +112 -0
  487. vispy/visuals/tests/test_rectangle.py +163 -0
  488. vispy/visuals/tests/test_regular_polygon.py +111 -0
  489. vispy/visuals/tests/test_scalable_textures.py +180 -0
  490. vispy/visuals/tests/test_sdf.py +73 -0
  491. vispy/visuals/tests/test_spectrogram.py +42 -0
  492. vispy/visuals/tests/test_text.py +95 -0
  493. vispy/visuals/tests/test_volume.py +542 -0
  494. vispy/visuals/tests/test_windbarb.py +33 -0
  495. vispy/visuals/text/__init__.py +7 -0
  496. vispy/visuals/text/_sdf_cpu.cpython-311-darwin.so +0 -0
  497. vispy/visuals/text/_sdf_cpu.pyx +110 -0
  498. vispy/visuals/text/_sdf_gpu.py +316 -0
  499. vispy/visuals/text/text.py +675 -0
  500. vispy/visuals/transforms/__init__.py +34 -0
  501. vispy/visuals/transforms/_util.py +191 -0
  502. vispy/visuals/transforms/base_transform.py +233 -0
  503. vispy/visuals/transforms/chain.py +300 -0
  504. vispy/visuals/transforms/interactive.py +98 -0
  505. vispy/visuals/transforms/linear.py +564 -0
  506. vispy/visuals/transforms/nonlinear.py +398 -0
  507. vispy/visuals/transforms/tests/__init__.py +0 -0
  508. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  509. vispy/visuals/transforms/transform_system.py +339 -0
  510. vispy/visuals/tube.py +173 -0
  511. vispy/visuals/visual.py +923 -0
  512. vispy/visuals/volume.py +1335 -0
  513. vispy/visuals/windbarb.py +291 -0
  514. vispy/visuals/xyz_axis.py +34 -0
  515. vispy-0.14.0.dist-info/LICENSE.txt +36 -0
  516. vispy-0.14.0.dist-info/METADATA +218 -0
  517. vispy-0.14.0.dist-info/RECORD +519 -0
  518. vispy-0.14.0.dist-info/WHEEL +5 -0
  519. vispy-0.14.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] != len(self._y):
74
+ raise TypeError('Z values must have shape (len(x), len(y))')
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, 3)
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()