vispy 0.15.0__cp312-cp312-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.

Files changed (521) 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 +1003 -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 +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -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 +162 -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 +700 -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 +594 -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 +568 -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 +1824 -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 +1046 -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 +105 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -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 +183 -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 +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -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 +32 -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 +21 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -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 +162 -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 +801 -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 +161 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +701 -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 +819 -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_gridlines.py +30 -0
  477. vispy/visuals/tests/test_histogram.py +24 -0
  478. vispy/visuals/tests/test_image.py +392 -0
  479. vispy/visuals/tests/test_image_complex.py +36 -0
  480. vispy/visuals/tests/test_infinite_line.py +53 -0
  481. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  482. vispy/visuals/tests/test_isosurface.py +22 -0
  483. vispy/visuals/tests/test_linear_region.py +152 -0
  484. vispy/visuals/tests/test_markers.py +54 -0
  485. vispy/visuals/tests/test_mesh.py +261 -0
  486. vispy/visuals/tests/test_mesh_normals.py +218 -0
  487. vispy/visuals/tests/test_polygon.py +112 -0
  488. vispy/visuals/tests/test_rectangle.py +163 -0
  489. vispy/visuals/tests/test_regular_polygon.py +111 -0
  490. vispy/visuals/tests/test_scalable_textures.py +196 -0
  491. vispy/visuals/tests/test_sdf.py +73 -0
  492. vispy/visuals/tests/test_spectrogram.py +42 -0
  493. vispy/visuals/tests/test_surface_plot.py +57 -0
  494. vispy/visuals/tests/test_text.py +95 -0
  495. vispy/visuals/tests/test_volume.py +542 -0
  496. vispy/visuals/tests/test_windbarb.py +33 -0
  497. vispy/visuals/text/__init__.py +7 -0
  498. vispy/visuals/text/_sdf_cpu.cpython-312-darwin.so +0 -0
  499. vispy/visuals/text/_sdf_cpu.pyx +112 -0
  500. vispy/visuals/text/_sdf_gpu.py +316 -0
  501. vispy/visuals/text/text.py +675 -0
  502. vispy/visuals/transforms/__init__.py +34 -0
  503. vispy/visuals/transforms/_util.py +191 -0
  504. vispy/visuals/transforms/base_transform.py +233 -0
  505. vispy/visuals/transforms/chain.py +300 -0
  506. vispy/visuals/transforms/interactive.py +98 -0
  507. vispy/visuals/transforms/linear.py +564 -0
  508. vispy/visuals/transforms/nonlinear.py +398 -0
  509. vispy/visuals/transforms/tests/__init__.py +0 -0
  510. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  511. vispy/visuals/transforms/transform_system.py +339 -0
  512. vispy/visuals/tube.py +173 -0
  513. vispy/visuals/visual.py +923 -0
  514. vispy/visuals/volume.py +1366 -0
  515. vispy/visuals/windbarb.py +291 -0
  516. vispy/visuals/xyz_axis.py +34 -0
  517. vispy-0.15.0.dist-info/METADATA +243 -0
  518. vispy-0.15.0.dist-info/RECORD +521 -0
  519. vispy-0.15.0.dist-info/WHEEL +6 -0
  520. vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
  521. vispy-0.15.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,60 @@
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 struct
6
+
7
+ from .base_filter import Filter
8
+
9
+
10
+ class PickingFilter(Filter):
11
+ """Filter used to color visuals by a picking ID.
12
+
13
+ Note that the ID color uses the alpha channel, so this may not be used
14
+ with blending enabled.
15
+ """
16
+
17
+ FRAG_SHADER = """
18
+ void picking_filter() {
19
+ if( $enabled == 0 )
20
+ return;
21
+ if( gl_FragColor.a == 0.0 )
22
+ discard;
23
+ gl_FragColor = $id_color;
24
+ }
25
+ """
26
+
27
+ def __init__(self, id_=None):
28
+ super(PickingFilter, self).__init__(fcode=self.FRAG_SHADER, fpos=10)
29
+
30
+ self.id = id_
31
+ self.enabled = False
32
+
33
+ @property
34
+ def id(self):
35
+ return self._id
36
+
37
+ @id.setter
38
+ def id(self, id):
39
+ if id < 1:
40
+ raise ValueError('Picking ID must be integer > 0.')
41
+ id_color = struct.unpack('<4B', struct.pack('<I', id))
42
+ self.fshader['id_color'] = [x/255. for x in id_color]
43
+ self._id = id
44
+ self._id_color = id_color
45
+
46
+ @property
47
+ def enabled(self):
48
+ return self._enabled
49
+
50
+ @enabled.setter
51
+ def enabled(self, e):
52
+ self._enabled = e
53
+ self.fshader['enabled'] = 1 if e is True else 0
54
+
55
+ @property
56
+ def color(self):
57
+ """The RGBA color that will be drawn to the framebuffer for visuals
58
+ that use this filter.
59
+ """
60
+ return self._id_color
@@ -0,0 +1,3 @@
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.
@@ -0,0 +1,70 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ import numpy as np
5
+
6
+ from vispy.geometry import create_plane
7
+ from vispy.scene.visuals import Markers, Mesh
8
+ from vispy.testing import requires_application, TestingCanvas
9
+ from vispy.visuals.filters import FacePickingFilter, MarkerPickingFilter
10
+
11
+
12
+ def test_empty_mesh_face_picking():
13
+ mesh = Mesh()
14
+ filter = FacePickingFilter()
15
+ mesh.attach(filter)
16
+ filter.enabled = True
17
+
18
+
19
+ @requires_application()
20
+ def test_mesh_face_picking():
21
+ vertices, faces, _ = create_plane(125, 125)
22
+ vertices = vertices["position"]
23
+ vertices[:, :2] += 125 / 2
24
+ mesh = Mesh(vertices=vertices, faces=faces)
25
+ filter = FacePickingFilter()
26
+ mesh.attach(filter)
27
+
28
+ with TestingCanvas(size=(125, 125)) as c:
29
+ view = c.central_widget.add_view()
30
+ view.add(mesh)
31
+ filter.enabled = True
32
+ mesh.update_gl_state(blend=False)
33
+ picking_render = c.render(bgcolor=(0, 0, 0, 0), alpha=True)
34
+
35
+ # unpack the IDs
36
+ ids = picking_render.view(np.uint32)
37
+ # the plane is made up of two triangles and nearly fills the view
38
+ # pick one point on each triangle
39
+ assert ids[125 // 2, 125 // 4] == 1
40
+ assert ids[125 // 2, 3 * 125 // 4] == 2
41
+
42
+
43
+ def test_empty_markers_picking():
44
+ markers = Markers()
45
+ filter = MarkerPickingFilter()
46
+ markers.attach(filter)
47
+ filter.enabled = True
48
+
49
+
50
+ @requires_application()
51
+ def test_markers_picking():
52
+ markers = Markers(
53
+ pos=np.array([[-0.5, -0.5], [0.5, 0.5]]),
54
+ size=5,
55
+ )
56
+ filter = MarkerPickingFilter()
57
+ markers.attach(filter)
58
+
59
+ with TestingCanvas(size=(125, 125)) as c:
60
+ view = c.central_widget.add_view(camera="panzoom")
61
+ view.camera.rect = (-1, -1, 2, 2)
62
+ view.add(markers)
63
+
64
+ filter.enabled = True
65
+ markers.update_gl_state(blend=False)
66
+ picking_render = c.render(bgcolor=(0, 0, 0, 0), alpha=True)
67
+ ids = picking_render.view(np.uint32)
68
+
69
+ assert ids[3 * 125 // 4, 125 // 4] == 1
70
+ assert ids[125 // 4, 3 * 125 // 4] == 2
@@ -0,0 +1,16 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+
5
+ from vispy.visuals.mesh import MeshVisual
6
+ from vispy.visuals.filters import WireframeFilter
7
+
8
+
9
+ def test_empty_mesh_wireframe():
10
+ """Test that an empty mesh does not cause issues with wireframe filter"""
11
+ mesh = MeshVisual()
12
+ wf = WireframeFilter()
13
+ mesh.attach(wf)
14
+
15
+ # trigger update of filter
16
+ wf.enabled = True
@@ -0,0 +1 @@
1
+ """Repository of common GLSL functions."""
@@ -0,0 +1,133 @@
1
+ # Copyright (c) 2014, Nicolas P. Rougier. All Rights Reserved.
2
+ # Distributed under the (new) BSD License.
3
+
4
+ """Antialiasing GLSL functions."""
5
+
6
+
7
+ # -----------------------------------------------------------------------------
8
+ # Stroke
9
+ # -----------------------------------------------------------------------------
10
+
11
+ """Compute antialiased fragment color for a stroke line.
12
+
13
+ Inputs:
14
+
15
+ - distance (float): Signed distance to border (in pixels).
16
+
17
+
18
+ Template variables:
19
+
20
+ - linewidth (float): Stroke line width (in pixels).
21
+ - antialias (float): Stroke antialiased area (in pixels).
22
+ - stroke (vec4): Stroke color.
23
+
24
+
25
+ Outputs:
26
+
27
+ - color (vec4): The final color.
28
+
29
+ """
30
+ ANTIALIAS_STROKE = """
31
+ vec4 stroke(float distance)
32
+ {
33
+ vec4 frag_color;
34
+ float t = $linewidth/2.0 - $antialias;
35
+ float signed_distance = distance;
36
+ float border_distance = abs(signed_distance) - t;
37
+ float alpha = border_distance/$antialias;
38
+ alpha = exp(-alpha*alpha);
39
+
40
+ if( border_distance < 0.0 )
41
+ frag_color = $stroke;
42
+ else
43
+ frag_color = vec4($stroke.rgb, $stroke.a * alpha);
44
+
45
+ return frag_color;
46
+ }
47
+ """
48
+
49
+
50
+ # -----------------------------------------------------------------------------
51
+ # Stroke
52
+ # -----------------------------------------------------------------------------
53
+
54
+ """Compute antialiased fragment color for an outlined shape.
55
+
56
+ Inputs:
57
+
58
+ - distance (float): Signed distance to border (in pixels).
59
+
60
+ Template variables:
61
+
62
+ - linewidth (float): Stroke line width (in pixels).
63
+ - antialias (float): Stroke antialiased area (in pixels).
64
+ - stroke (vec4): Stroke color.
65
+ - fill (vec4): Fill color.
66
+
67
+ Outputs:
68
+
69
+ - color (vec4): The final color.
70
+
71
+ """
72
+ ANTIALIAS_OUTLINE = """
73
+ vec4 outline(float distance)
74
+ {
75
+ vec4 frag_color;
76
+ float t = $linewidth/2.0 - $antialias;
77
+ float signed_distance = distance;
78
+ float border_distance = abs(signed_distance) - t;
79
+ float alpha = border_distance/$antialias;
80
+ alpha = exp(-alpha*alpha);
81
+
82
+ if( border_distance < 0.0 )
83
+ frag_color = $stroke;
84
+ else if( signed_distance < 0.0 )
85
+ frag_color = mix($fill, $stroke, sqrt(alpha));
86
+ else
87
+ frag_color = vec4($stroke.rgb, $stroke.a * alpha);
88
+ return frag_color;
89
+ }
90
+ """
91
+
92
+
93
+ # -----------------------------------------------------------------------------
94
+ # Filled
95
+ # -----------------------------------------------------------------------------
96
+
97
+ """Compute antialiased fragment color for a filled shape.
98
+
99
+ Inputs:
100
+
101
+ - distance (float): Signed distance to border (in pixels).
102
+
103
+ Template variables:
104
+
105
+ - linewidth (float): Stroke line width (in pixels).
106
+ - antialias (float): Stroke antialiased area (in pixels).
107
+ - fill (vec4): Fill color.
108
+
109
+ Outputs:
110
+
111
+ - color (vec4): The final color.
112
+
113
+ """
114
+ ANTIALIAS_FILLED = """
115
+ vec4 filled(float distance)
116
+ {
117
+ vec4 frag_color;
118
+ float t = $linewidth/2.0 - $antialias;
119
+ float signed_distance = distance;
120
+ float border_distance = abs(signed_distance) - t;
121
+ float alpha = border_distance/$antialias;
122
+ alpha = exp(-alpha*alpha);
123
+
124
+ if( border_distance < 0.0 )
125
+ frag_color = $fill;
126
+ else if( signed_distance < 0.0 )
127
+ frag_color = $fill;
128
+ else
129
+ frag_color = vec4($fill.rgb, alpha * $fill.a);
130
+
131
+ return frag_color;
132
+ }
133
+ """
@@ -0,0 +1,63 @@
1
+ """Color-related GLSL functions."""
2
+
3
+
4
+ # -----------------------------------------------------------------------------
5
+ # Colormaps
6
+ # -----------------------------------------------------------------------------
7
+
8
+ """Texture lookup for a discrete color map stored in a 1*ncolors 2D texture.
9
+
10
+ The `get_color()` function returns a RGB color from an index integer
11
+ referring to the colormap.
12
+
13
+
14
+ Inputs:
15
+
16
+ - index (int): The color index.
17
+
18
+ Template variables:
19
+
20
+ - $ncolors (int): The number of colors in the colormap.
21
+ - $colormap (2D texture sampler): The sampler for the 2D 1*ncolors colormap texture.
22
+
23
+ Outputs:
24
+
25
+ - color (vec3): The color.
26
+
27
+ """
28
+ COLORMAP_TEXTURE = """
29
+ vec3 get_color(int index) {
30
+ float x = (float(index) + .5) / float($ncolors);
31
+ return texture2D($colormap, vec2(x, .5)).rgb;
32
+ }
33
+ """
34
+
35
+
36
+ # -----------------------------------------------------------------------------
37
+ # Color space transformations
38
+ # -----------------------------------------------------------------------------
39
+
40
+ # From http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl
41
+ # TODO: unit tests
42
+ HSV_TO_RGB = """
43
+ vec3 hsv_to_rgb(vec3 c)
44
+ {
45
+ vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
46
+ vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
47
+ return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
48
+ }
49
+ """
50
+
51
+
52
+ RGB_TO_HSV = """
53
+ vec3 rgb_to_hsv(vec3 c)
54
+ {
55
+ vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
56
+ vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
57
+ vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
58
+
59
+ float d = q.x - min(q.w, q.y);
60
+ float e = 1.0e-10;
61
+ return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
62
+ }
63
+ """
@@ -0,0 +1 @@
1
+ from .graph import GraphVisual # noqa
@@ -0,0 +1,240 @@
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
+ Graph Visual
6
+ ============
7
+
8
+ This visual can be used to visualise graphs or networks.
9
+ """
10
+
11
+ from ..visual import CompoundVisual
12
+ from ..line import ArrowVisual
13
+ from ..markers import MarkersVisual
14
+ from . import layouts
15
+
16
+
17
+ class GraphVisual(CompoundVisual):
18
+ """Visual for displaying graphs or networks.
19
+
20
+ Parameters
21
+ ----------
22
+ adjacency_mat : array or sparse
23
+ The adjacency matrix of the graph.
24
+ directed : bool
25
+ Whether the graph is directed or not. If True, then this visual will
26
+ draw arrows for the directed edges.
27
+ layout : str
28
+ They layout to use.
29
+ animate : bool
30
+ Whether or not to animate.
31
+ line_color : str or :class:`vispy.color.colormap.ColorMap`
32
+ The color to use for the edges.
33
+ line_width : number
34
+ The edge thickness.
35
+ arrow_type : str
36
+ The kind of arrow head to use. See :class:`vispy.visuals.ArrowHead`
37
+ for more information.
38
+ arrow_size : number
39
+ The size of the arrow head.
40
+ node_symbol : string
41
+ The marker to use for nodes. See
42
+ :class:`vispy.visuals.MarkersVisual` for more information.
43
+ node_size : number
44
+ The size of the node
45
+ border_color : str or :class:`vispy.color.colormap.ColorMap`
46
+ The border color for nodes.
47
+ face_color : str or :class:`vispy.color.colormap.ColorMap`
48
+ The face color for nodes.
49
+ border_width : number
50
+ The border size for nodes.
51
+
52
+ See Also
53
+ --------
54
+ ArrowVisual, MarkersVisual
55
+
56
+ """
57
+
58
+ _arrow_attributes = ('arrow_type', 'arrow_size')
59
+ _arrow_kwargs = ('line_color', 'line_width')
60
+ _node_kwargs = ('node_symbol', 'node_size', 'border_color', 'face_color',
61
+ 'border_width')
62
+
63
+ _arrow_kw_trans = dict(line_color='color', line_width='width')
64
+ _node_kw_trans = dict(node_symbol='symbol', node_size='size',
65
+ border_color='edge_color', border_width='edge_width')
66
+ _node_properties_args = ()
67
+
68
+ def __init__(self, adjacency_mat=None, directed=False, layout=None,
69
+ animate=False, line_color=None, line_width=None,
70
+ arrow_type=None, arrow_size=None, node_symbol=None,
71
+ node_size=None, border_color=None, face_color=None,
72
+ border_width=None):
73
+
74
+ self._edges = ArrowVisual(method='gl', connect='segments')
75
+ self._nodes = MarkersVisual()
76
+
77
+ self._arrow_data = {}
78
+ self._node_data = {}
79
+ self._node_properties = {}
80
+
81
+ self._adjacency_mat = None
82
+
83
+ self._layout = None
84
+ self._layout_iter = None
85
+ self.layout = layout
86
+
87
+ self._directed = directed
88
+ self.directed = directed
89
+
90
+ self._animate = False
91
+ self.animate = animate
92
+
93
+ CompoundVisual.__init__(self, [self._edges, self._nodes])
94
+
95
+ self.set_data(adjacency_mat, line_color=line_color,
96
+ line_width=line_width, arrow_type=arrow_type,
97
+ arrow_size=arrow_size, node_symbol=node_symbol,
98
+ node_size=node_size, border_color=border_color,
99
+ face_color=face_color, border_width=border_width)
100
+
101
+ @property
102
+ def adjacency_matrix(self):
103
+ return self._adjacency_mat
104
+
105
+ @property
106
+ def layout(self):
107
+ return self._layout
108
+
109
+ @layout.setter
110
+ def layout(self, value):
111
+ if isinstance(value, str):
112
+ self._layout = layouts.get_layout(value)
113
+ else:
114
+ assert callable(value)
115
+ self._layout = value
116
+
117
+ self._layout_iter = None
118
+
119
+ @property
120
+ def directed(self):
121
+ return self._directed
122
+
123
+ @directed.setter
124
+ def directed(self, value):
125
+ self._directed = bool(value)
126
+
127
+ @property
128
+ def animate(self):
129
+ return self._animate
130
+
131
+ @animate.setter
132
+ def animate(self, value):
133
+ self._animate = bool(value)
134
+
135
+ def animate_layout(self):
136
+ if self._layout_iter is None:
137
+ if self._adjacency_mat is None:
138
+ raise ValueError("No adjacency matrix set yet. An adjacency "
139
+ "matrix is required to calculate the layout.")
140
+
141
+ self._layout_iter = iter(self._layout(self._adjacency_mat,
142
+ self._directed))
143
+
144
+ try:
145
+ node_vertices, line_vertices, arrows = next(self._layout_iter)
146
+ except StopIteration:
147
+ return True
148
+
149
+ self._nodes.set_data(pos=node_vertices, **self._node_data)
150
+ for k, v in self._node_properties.items():
151
+ setattr(self._nodes, k, v)
152
+
153
+ self._edges.set_data(pos=line_vertices, arrows=arrows,
154
+ **self._arrow_data)
155
+
156
+ return False
157
+
158
+ def set_final_layout(self):
159
+ if self._layout_iter is None:
160
+ if self._adjacency_mat is None:
161
+ raise ValueError("No adjacency matrix set yet. An adjacency "
162
+ "matrix is required to calculate the layout.")
163
+
164
+ self._layout_iter = iter(self._layout(self._adjacency_mat,
165
+ self._directed))
166
+
167
+ # Calculate the final position of the nodes and lines
168
+ node_vertices = None
169
+ line_vertices = None
170
+ arrows = None
171
+ for node_vertices, line_vertices, arrows in self._layout_iter:
172
+ pass
173
+
174
+ self._nodes.set_data(pos=node_vertices, **self._node_data)
175
+ for k, v in self._node_properties.items():
176
+ setattr(self._nodes, k, v)
177
+
178
+ self._edges.set_data(pos=line_vertices, arrows=arrows,
179
+ **self._arrow_data)
180
+
181
+ def reset_layout(self):
182
+ self._layout_iter = None
183
+
184
+ def set_data(self, adjacency_mat=None, **kwargs):
185
+ """Set the data
186
+
187
+ Parameters
188
+ ----------
189
+ adjacency_mat : ndarray | None
190
+ The adjacency matrix.
191
+ **kwargs : dict
192
+ Keyword arguments to pass to the arrows.
193
+ """
194
+ if adjacency_mat is not None:
195
+ if adjacency_mat.shape[0] != adjacency_mat.shape[1]:
196
+ raise ValueError("Adjacency matrix should be square.")
197
+
198
+ self._adjacency_mat = adjacency_mat
199
+
200
+ for k in self._arrow_attributes:
201
+ if k in kwargs:
202
+ translated = (self._arrow_kw_trans[k] if k in
203
+ self._arrow_kw_trans else k)
204
+
205
+ setattr(self._edges, translated, kwargs.pop(k))
206
+
207
+ arrow_kwargs = {}
208
+ for k in self._arrow_kwargs:
209
+ if k in kwargs:
210
+ translated = (self._arrow_kw_trans[k] if k in
211
+ self._arrow_kw_trans else k)
212
+
213
+ arrow_kwargs[translated] = kwargs.pop(k)
214
+
215
+ node_kwargs = {}
216
+ for k in self._node_kwargs:
217
+ if k in kwargs:
218
+ translated = (self._node_kw_trans[k] if k in
219
+ self._node_kw_trans else k)
220
+
221
+ node_kwargs[translated] = kwargs.pop(k)
222
+
223
+ if len(kwargs) > 0:
224
+ raise TypeError("%s.set_data() got invalid keyword arguments: %s"
225
+ % (self.__class__.__name__, list(kwargs.keys())))
226
+
227
+ # some attributes should be set as properties
228
+ node_properties = {}
229
+ for k, v in list(node_kwargs.items()):
230
+ if k in (self._node_properties_args):
231
+ node_properties[k] = node_kwargs.pop(k)
232
+
233
+ # The actual data is set in GraphVisual.animate_layout or
234
+ # GraphVisual.set_final_layout
235
+ self._arrow_data = arrow_kwargs
236
+ self._node_data = node_kwargs
237
+ self._node_properties = node_properties
238
+
239
+ if not self._animate:
240
+ self.set_final_layout()
@@ -0,0 +1,55 @@
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 inspect
6
+
7
+ from .random import random
8
+ from .circular import circular
9
+ from .force_directed import fruchterman_reingold
10
+ from .networkx_layout import NetworkxCoordinates
11
+
12
+
13
+ _layout_map = {
14
+ 'random': random,
15
+ 'circular': circular,
16
+ 'force_directed': fruchterman_reingold,
17
+ 'spring_layout': fruchterman_reingold,
18
+ "networkx_layout": NetworkxCoordinates,
19
+ }
20
+
21
+ AVAILABLE_LAYOUTS = tuple(_layout_map.keys())
22
+
23
+
24
+ def get_layout(name, *args, **kwargs):
25
+ """
26
+ Retrieve a graph layout
27
+
28
+ Some graph layouts accept extra options. Please refer to their
29
+ documentation for more information.
30
+
31
+ Parameters
32
+ ----------
33
+ name : string
34
+ The name of the layout. The variable `AVAILABLE_LAYOUTS`
35
+ contains all available layouts.
36
+ *args
37
+ Positional arguments which are passed to the layout.
38
+ **kwargs
39
+ Keyword arguments which are passed to the layout.
40
+
41
+ Returns
42
+ -------
43
+ layout : callable
44
+ The callable generator which will calculate the graph layout
45
+ """
46
+ if name not in _layout_map:
47
+ raise KeyError("Graph layout '%s' not found. Should be one of %s"
48
+ % (name, AVAILABLE_LAYOUTS))
49
+
50
+ layout = _layout_map[name]
51
+
52
+ if inspect.isclass(layout):
53
+ layout = layout(*args, **kwargs)
54
+
55
+ return layout
@@ -0,0 +1,49 @@
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
+ Circular Layout
6
+ ===============
7
+
8
+ This module contains several graph layouts which rely heavily on circles.
9
+ """
10
+
11
+ import numpy as np
12
+
13
+ from ..util import _straight_line_vertices, issparse
14
+
15
+
16
+ def circular(adjacency_mat, directed=False):
17
+ """Places all nodes on a single circle.
18
+
19
+ Parameters
20
+ ----------
21
+ adjacency_mat : matrix or sparse
22
+ The graph adjacency matrix
23
+ directed : bool
24
+ Whether the graph is directed. If this is True, is will also
25
+ generate the vertices for arrows, which can be passed to an
26
+ ArrowVisual.
27
+
28
+ Yields
29
+ ------
30
+ (node_vertices, line_vertices, arrow_vertices) : tuple
31
+ Yields the node and line vertices in a tuple. This layout only yields a
32
+ single time, and has no builtin animation
33
+ """
34
+ if issparse(adjacency_mat):
35
+ adjacency_mat = adjacency_mat.tocoo()
36
+
37
+ num_nodes = adjacency_mat.shape[0]
38
+
39
+ t = np.linspace(0, 2 * np.pi, num_nodes, endpoint=False)
40
+
41
+ # Visual coordinate system is between 0 and 1, so generate a circle with
42
+ # radius 0.5 and center it at the point (0.5, 0.5).
43
+ node_coords = (0.5 * np.array([np.cos(t), np.sin(t)]) + 0.5).T
44
+ node_coords = node_coords.astype(np.float32)
45
+
46
+ line_vertices, arrows = _straight_line_vertices(adjacency_mat,
47
+ node_coords, directed)
48
+
49
+ yield node_coords, line_vertices, arrows