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
vispy/ext/gdi32plus.py ADDED
@@ -0,0 +1,206 @@
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
+ # Adapted from Pyglet
8
+
9
+ import atexit
10
+ from functools import partial
11
+ import struct
12
+
13
+ from ctypes import (windll, Structure, POINTER, byref, WINFUNCTYPE,
14
+ c_uint, c_float, c_int, c_ulong, c_uint64,
15
+ c_void_p, c_uint32, c_wchar, c_wchar_p)
16
+ from ctypes.wintypes import (LONG, BYTE, HFONT, HGDIOBJ, BOOL, UINT, INT,
17
+ DWORD, LPARAM)
18
+
19
+ try:
20
+ import _winreg as winreg
21
+ except ImportError:
22
+ import winreg # noqa, analysis:ignore
23
+
24
+ _64_bit = (8 * struct.calcsize("P")) == 64
25
+
26
+ LF_FACESIZE = 32
27
+ FW_BOLD = 700
28
+ FW_NORMAL = 400
29
+ ANTIALIASED_QUALITY = 4
30
+ FontStyleBold = 1
31
+ FontStyleItalic = 2
32
+ UnitPixel = 2
33
+ UnitPoint = 3
34
+ DEFAULT_CHARSET = 1
35
+ ANSI_CHARSET = 0
36
+ TRUETYPE_FONTTYPE = 4
37
+ GM_ADVANCED = 2
38
+ CSIDL_FONTS = 0x0014
39
+
40
+ PixelFormat24bppRGB = 137224
41
+ PixelFormat32bppRGB = 139273
42
+ PixelFormat32bppARGB = 2498570
43
+
44
+ DriverStringOptionsCmapLookup = 1
45
+ DriverStringOptionsRealizedAdvance = 4
46
+ TextRenderingHintAntiAlias = 4
47
+ TextRenderingHintAntiAliasGridFit = 3
48
+ ImageLockModeRead = 1
49
+ StringFormatFlagsMeasureTrailingSpaces = 0x00000800
50
+ StringFormatFlagsNoClip = 0x00004000
51
+ StringFormatFlagsNoFitBlackBox = 0x00000004
52
+
53
+ INT_PTR = c_int
54
+ REAL = c_float
55
+ TCHAR = c_wchar
56
+ UINT32 = c_uint32
57
+ HDC = c_void_p
58
+ PSTR = c_uint64 if _64_bit else c_uint
59
+
60
+ HORZSIZE = 4
61
+ VERTSIZE = 6
62
+
63
+ HORZRES = 8
64
+ VERTRES = 10
65
+
66
+
67
+ # gdi32
68
+
69
+ class POINT(Structure):
70
+ _fields_ = [('x', LONG), ('y', LONG)]
71
+
72
+
73
+ class RECT(Structure):
74
+ _fields_ = [('left', LONG), ('top', LONG),
75
+ ('right', LONG), ('bottom', LONG)]
76
+
77
+
78
+ class PANOSE(Structure):
79
+ _fields_ = [
80
+ ('bFamilyType', BYTE), ('bSerifStyle', BYTE), ('bWeight', BYTE),
81
+ ('bProportion', BYTE), ('bContrast', BYTE), ('bStrokeVariation', BYTE),
82
+ ('bArmStyle', BYTE), ('bLetterform', BYTE), ('bMidline', BYTE),
83
+ ('bXHeight', BYTE)]
84
+
85
+
86
+ class TEXTMETRIC(Structure):
87
+ _fields_ = [
88
+ ('tmHeight', LONG), ('tmAscent', LONG), ('tmDescent', LONG),
89
+ ('tmInternalLeading', LONG), ('tmExternalLeading', LONG),
90
+ ('tmAveCharWidth', LONG), ('tmMaxCharWidth', LONG),
91
+ ('tmWeight', LONG), ('tmOverhang', LONG),
92
+ ('tmDigitizedAspectX', LONG), ('tmDigitizedAspectY', LONG),
93
+ ('tmFirstChar', TCHAR), ('tmLastChar', TCHAR),
94
+ ('tmDefaultChar', TCHAR), ('tmBreakChar', TCHAR),
95
+ ('tmItalic', BYTE), ('tmUnderlined', BYTE),
96
+ ('tmStruckOut', BYTE), ('tmPitchAndFamily', BYTE),
97
+ ('tmCharSet', BYTE)]
98
+
99
+
100
+ class OUTLINETEXTMETRIC(Structure):
101
+ _fields_ = [
102
+ ('otmSize', UINT), ('otmTextMetrics', TEXTMETRIC),
103
+ ('otmMysteryBytes', BYTE), ('otmPanoseNumber', PANOSE),
104
+ ('otmMysteryByte', BYTE),
105
+ ('otmfsSelection', UINT), ('otmfsType', UINT),
106
+ ('otmsCharSlopeRise', INT), ('otmsCharSlopeRun', INT),
107
+ ('otmItalicAngle', INT), ('otmEMSquare', UINT), ('otmAscent', INT),
108
+ ('otmDescent', INT), ('otmLineGap', UINT), ('otmsCapEmHeight', UINT),
109
+ ('otmsXHeight', UINT), ('otmrcFontBox', RECT), ('otmMacAscent', INT),
110
+ ('otmMacDescent', INT), ('otmMacLineGap', UINT),
111
+ ('otmusMinimumPPEM', UINT), ('otmptSubscriptSize', POINT),
112
+ ('otmptSubscriptOffset', POINT), ('otmptSuperscriptSize', POINT),
113
+ ('otmptSuperscriptOffset', POINT), ('otmsStrikeoutSize', UINT),
114
+ ('otmsStrikeoutPosition', INT), ('otmsUnderscoreSize', INT),
115
+ ('otmsUnderscorePosition', INT), ('otmpFamilyName', PSTR),
116
+ ('otmpFaceName', PSTR), ('otmpStyleName', PSTR),
117
+ ('otmpFullName', PSTR), ('junk', (BYTE) * 1024)] # room for strs
118
+
119
+
120
+ class LOGFONT(Structure):
121
+ _fields_ = [
122
+ ('lfHeight', LONG), ('lfWidth', LONG), ('lfEscapement', LONG),
123
+ ('lfOrientation', LONG), ('lfWeight', LONG), ('lfItalic', BYTE),
124
+ ('lfUnderline', BYTE), ('lfStrikeOut', BYTE), ('lfCharSet', BYTE),
125
+ ('lfOutPrecision', BYTE), ('lfClipPrecision', BYTE),
126
+ ('lfQuality', BYTE), ('lfPitchAndFamily', BYTE),
127
+ ('lfFaceName', (TCHAR * LF_FACESIZE))]
128
+
129
+
130
+ gdi32 = windll.gdi32
131
+
132
+ gdi32.CreateFontIndirectW.restype = HFONT
133
+ gdi32.CreateFontIndirectW.argtypes = [POINTER(LOGFONT)]
134
+
135
+ gdi32.SelectObject.restype = HGDIOBJ
136
+ gdi32.SelectObject.argtypes = [HDC, HGDIOBJ]
137
+
138
+ gdi32.SetGraphicsMode.restype = INT
139
+ gdi32.SetGraphicsMode.argtypes = [HDC, INT]
140
+
141
+ gdi32.GetTextMetricsW.restype = BOOL
142
+ gdi32.GetTextMetricsW.argtypes = [HDC, POINTER(TEXTMETRIC)]
143
+
144
+ FONTENUMPROC = WINFUNCTYPE(INT, POINTER(LOGFONT), POINTER(TEXTMETRIC),
145
+ DWORD, c_void_p)
146
+ gdi32.EnumFontFamiliesExW.restype = INT
147
+ gdi32.EnumFontFamiliesExW.argtypes = [HDC, POINTER(LOGFONT),
148
+ FONTENUMPROC, LPARAM, DWORD]
149
+
150
+ gdi32.GetOutlineTextMetricsW.restype = UINT
151
+ gdi32.GetOutlineTextMetricsW.argtypes = [HDC, UINT,
152
+ POINTER(OUTLINETEXTMETRIC)]
153
+
154
+
155
+ gdi32.GetDeviceCaps.argtypes = [HDC, INT]
156
+ gdi32.GetDeviceCaps.restype = INT
157
+
158
+ user32 = windll.user32
159
+
160
+ user32.GetDC.restype = HDC # HDC
161
+ user32.GetDC.argtypes = [UINT32] # HWND
162
+
163
+ user32.ReleaseDC.argtypes = [c_void_p, HDC]
164
+
165
+ try:
166
+ user32.SetProcessDPIAware.argtypes = []
167
+ except AttributeError:
168
+ pass # not present on XP
169
+
170
+
171
+ # gdiplus
172
+
173
+ class GdiplusStartupInput(Structure):
174
+ _fields_ = [
175
+ ('GdiplusVersion', UINT32), ('DebugEventCallback', c_void_p),
176
+ ('SuppressBackgroundThread', BOOL), ('SuppressExternalCodecs', BOOL)]
177
+
178
+
179
+ class GdiplusStartupOutput(Structure):
180
+ _fields = [('NotificationHookProc', c_void_p),
181
+ ('NotificationUnhookProc', c_void_p)]
182
+
183
+ gdiplus = windll.gdiplus
184
+
185
+ gdiplus.GdipCreateFontFamilyFromName.restype = c_int
186
+ gdiplus.GdipCreateFontFamilyFromName.argtypes = [c_wchar_p, c_void_p, c_void_p]
187
+
188
+ gdiplus.GdipNewPrivateFontCollection.restype = c_int
189
+ gdiplus.GdipNewPrivateFontCollection.argtypes = [c_void_p]
190
+
191
+ gdiplus.GdipPrivateAddFontFile.restype = c_int
192
+ gdiplus.GdipPrivateAddFontFile.argtypes = [c_void_p, c_wchar_p]
193
+
194
+ gdiplus.GdipGetFamilyName.restype = c_int
195
+ gdiplus.GdipGetFamilyName.argtypes = [c_void_p, c_wchar_p, c_int]
196
+
197
+
198
+ def gdiplus_init():
199
+ token = c_ulong()
200
+ startup_in = GdiplusStartupInput()
201
+ startup_in.GdiplusVersion = 1
202
+ startup_out = GdiplusStartupOutput()
203
+ gdiplus.GdiplusStartup(byref(token), byref(startup_in), byref(startup_out))
204
+ atexit.register(partial(gdiplus.GdiplusShutdown, token))
205
+
206
+ gdiplus_init()
vispy/ext/osmesa.py ADDED
@@ -0,0 +1,105 @@
1
+ # -*- coding: utf-8 -*-
2
+ # vispy: testskip
3
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+
6
+ """A ctypes-based API to OSMesa"""
7
+ from __future__ import print_function
8
+ import os
9
+ import ctypes
10
+ import ctypes.util
11
+ from ctypes import c_int as _c_int, c_uint as _c_uint, c_void_p
12
+
13
+ # See vispy/gloo/gl/_constants.py for reference
14
+ GL_RGBA = 6408
15
+ GL_UNSIGNED_BYTE = 5121
16
+ GL_VERSION = 7938
17
+
18
+ _osmesa_file = None
19
+ if 'OSMESA_LIBRARY' in os.environ:
20
+ if os.path.exists(os.environ['OSMESA_LIBRARY']):
21
+ _osmesa_file = os.path.realpath(os.environ['OSMESA_LIBRARY'])
22
+
23
+ # Else, try to find it
24
+ if _osmesa_file is None:
25
+ _osmesa_file = ctypes.util.find_library('OSMesa')
26
+
27
+ # Else, we failed and exit
28
+ if _osmesa_file is None:
29
+ raise OSError('OSMesa library not found')
30
+
31
+ # Load it
32
+ _lib = ctypes.CDLL(_osmesa_file)
33
+
34
+ # Constants
35
+ OSMESA_RGBA = GL_RGBA
36
+
37
+ # Functions
38
+
39
+ # GLAPI OSMesaContext GLAPIENTRY
40
+ # OSMesaCreateContext( GLenum format, OSMesaContext sharelist );
41
+ _lib.OSMesaCreateContext.argtypes = _c_int, c_void_p
42
+ _lib.OSMesaCreateContext.restype = c_void_p
43
+ # GLAPI void GLAPIENTRY
44
+ # OSMesaDestroyContext( OSMesaContext ctx );
45
+ _lib.OSMesaDestroyContext.argtypes = c_void_p,
46
+ # GLAPI GLboolean GLAPIENTRY
47
+ # OSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type,
48
+ # GLsizei width, GLsizei height );
49
+ _lib.OSMesaMakeCurrent.argtypes = c_void_p, c_void_p, _c_int, _c_int, _c_int
50
+ _lib.OSMesaMakeCurrent.restype = _c_int
51
+ # GLAPI OSMesaContext GLAPIENTRY
52
+ # OSMesaGetCurrentContext( void );
53
+ _lib.OSMesaGetCurrentContext.restype = c_void_p
54
+
55
+
56
+ def allocate_pixels_buffer(width, height):
57
+ """Helper function to allocate a buffer to contain an image of
58
+ width * height suitable for OSMesaMakeCurrent
59
+ """
60
+ # Seems like OSMesa has some trouble with non-RGBA buffers, so enforce
61
+ # RGBA
62
+ return (_c_uint * width * height * 4)()
63
+
64
+
65
+ def OSMesaCreateContext():
66
+ return ctypes.cast(_lib.OSMesaCreateContext(OSMESA_RGBA, None), c_void_p)
67
+
68
+
69
+ def OSMesaDestroyContext(context):
70
+ _lib.OSMesaDestroyContext(context)
71
+
72
+
73
+ def OSMesaMakeCurrent(context, buffer, width, height):
74
+ ret = _lib.OSMesaMakeCurrent(context, buffer, GL_UNSIGNED_BYTE,
75
+ width, height)
76
+ return ret != 0
77
+
78
+
79
+ def OSMesaGetCurrentContext():
80
+ return c_void_p(_lib.OSMesaGetCurrentContext())
81
+
82
+ if __name__ == '__main__':
83
+ """This test basic OSMesa functionality"""
84
+ # If you have OSMesa installed alongside normal OpenGL, execute with
85
+ # VISPY_GL_LIB=/opt/osmesa_llvmpipe/lib/libGLESv2.so \
86
+ # LD_LIBRARY_PATH=/opt/osmesa_llvmpipe/lib/ \
87
+ # OSMESA_LIBRARY=/opt/osmesa_llvmpipe/lib/libOSMesa.so \
88
+ # python vispy/ext/osmesa.py
89
+ context = OSMesaCreateContext()
90
+ w, h = 640, 480
91
+ pixels = allocate_pixels_buffer(w, h)
92
+ ok = OSMesaMakeCurrent(context, pixels, 640, 480)
93
+ if not ok:
94
+ raise RuntimeError('Failed OSMesaMakeCurrent')
95
+ if not (OSMesaGetCurrentContext().value == context.value):
96
+ raise RuntimeError('OSMesa context not correctly attached')
97
+
98
+ _lib.glGetString.argtypes = (ctypes.c_uint,)
99
+ _lib.glGetString.restype = ctypes.c_char_p
100
+
101
+ print("OpenGL version : ", _lib.glGetString(GL_VERSION))
102
+
103
+ OSMesaDestroyContext(context)
104
+ if OSMesaGetCurrentContext().value is not None:
105
+ raise RuntimeError('Failed to destroy OSMesa context')
@@ -0,0 +1,23 @@
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 implements classes and methods for handling geometric data."""
6
+
7
+ from __future__ import division
8
+
9
+ __all__ = ['MeshData', 'PolygonData', 'Rect', 'Triangulation', 'triangulate',
10
+ 'create_arrow', 'create_box', 'create_cone', 'create_cube',
11
+ 'create_cylinder', 'create_grid_mesh', 'create_plane',
12
+ 'create_sphere', 'resize']
13
+
14
+ from .polygon import PolygonData # noqa
15
+ from .meshdata import MeshData # noqa
16
+ from .rect import Rect # noqa
17
+ from .triangulation import Triangulation, triangulate # noqa
18
+ from .torusknot import TorusKnot # noqa
19
+ from .calculations import (_calculate_normals, _fast_cross_3d, # noqa
20
+ resize) # noqa
21
+ from .generation import (create_arrow, create_box, create_cone, # noqa
22
+ create_cube, create_cylinder, create_grid_mesh, # noqa
23
+ create_plane, create_sphere) # noqa
@@ -0,0 +1,171 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Debugging system for Triangulation class. Displays stepwise visual
4
+ representation of the algorithm.
5
+
6
+ This system currently requires pyqtgraph for its visual output.
7
+ """
8
+ from __future__ import division
9
+
10
+ import numpy as np
11
+ import time
12
+
13
+ from ..util.geometry.triangulation import Triangulation
14
+
15
+
16
+ class DebugTriangulation(Triangulation):
17
+ """Visualize triangulation process stepwise to aid in debugging.
18
+
19
+ *interval* specifies the diration to wait before drawing each update in
20
+ the triangulation procedure. Negative values cause the display to wait
21
+ until the user clicks on the window for each update.
22
+
23
+ *skip* causes the display to immediately process the first N events
24
+ before pausing.
25
+ """
26
+
27
+ def __init__(self, pts, edges, interval=0.01, skip=0):
28
+ self.interval = interval
29
+ self.iteration = 0
30
+ self.skip = skip
31
+
32
+ Triangulation.__init__(self, pts, edges)
33
+
34
+ # visual #debugging: draw edges, front, triangles
35
+ self.win = pg.plot()
36
+ self.graph = pg.GraphItem(pos=pts.copy(), adj=edges.copy(),
37
+ pen={'width': 3, 'color': (0, 100, 0)})
38
+ self.win.addItem(self.graph)
39
+ self.front_line = pg.PlotCurveItem(pen={'width': 2,
40
+ 'dash': [5, 5],
41
+ 'color': 'y'})
42
+ self.win.addItem(self.front_line)
43
+ self.tri_shapes = {}
44
+
45
+ self.nextStep = False
46
+ self.win.scene().sigMouseClicked.connect(self.mouseClicked)
47
+
48
+ def mouseClicked(self):
49
+ self.nextStep = True
50
+
51
+ def draw_state(self):
52
+ global app
53
+ print("State %s" % self.iteration)
54
+ self.iteration += 1
55
+ if self.iteration <= self.skip:
56
+ return
57
+
58
+ front_pts = self.pts[np.array(self.front)]
59
+ self.front_line.setData(front_pts[:, 0], front_pts[:, 1])
60
+ self.graph.setData(pos=self.pts, adj=self.edges)
61
+
62
+ # Auto-advance on timer
63
+ if self.interval < 0:
64
+ # Advance once per click
65
+ while True:
66
+ app.processEvents()
67
+ time.sleep(0.01)
68
+ if self.nextStep:
69
+ self.nextStep = False
70
+ break
71
+ else:
72
+ # sleep, but keep ui responsive
73
+ for i in range(int(self.interval / 0.01)):
74
+ app.processEvents()
75
+ time.sleep(0.01)
76
+
77
+ def draw_tri(self, tri, source=None):
78
+ # assign triangle color based on the source that generated it
79
+ color = {
80
+ None: (0, 255, 255, 50),
81
+ 'smooth1': (0, 255, 0, 50),
82
+ 'fill_hull': (255, 255, 0, 50),
83
+ 'edge_event': (100, 100, 255, 100),
84
+ }[source]
85
+
86
+ tpts = self.pts[np.array(tri)]
87
+ path = pg.arrayToQPath(tpts[:, 0], tpts[:, 1])
88
+ shape = pg.QtGui.QGraphicsPathItem(path)
89
+ shape.setPen(pg.mkPen(255, 255, 255, 100))
90
+ brush = pg.mkBrush(color)
91
+ shape.setBrush(brush)
92
+ self.win.addItem(shape)
93
+ self.tri_shapes[tri] = shape
94
+ self.draw_state()
95
+
96
+ def undraw_tri(self, tri):
97
+ shape = self.tri_shapes.pop(tri)
98
+ self.win.removeItem(shape)
99
+ self.draw_state()
100
+
101
+ def add_tri(self, *args, **kwargs):
102
+ Triangulation._add_tri(self, *args, **kwargs)
103
+ self.draw_tri(list(self.tris.keys())[-1],
104
+ source=kwargs.get('source', None))
105
+
106
+ def remove_tri(self, *args, **kwargs):
107
+ k = Triangulation._remove_tri(self, *args, **kwargs)
108
+ self.undraw_tri(k)
109
+
110
+ def edge_event(self, *args, **kwargs):
111
+ self.draw_state()
112
+ Triangulation._edge_event(self, *args, **kwargs)
113
+ self.draw_state()
114
+
115
+
116
+ if __name__ == '__main__':
117
+ import pyqtgraph as pg
118
+
119
+ app = pg.mkQApp()
120
+
121
+ # user input data - points and constraining edges
122
+
123
+ #
124
+ # Test 1
125
+ #
126
+ pts = [(0, 0),
127
+ (10, 0),
128
+ (10, 10),
129
+ (20, 10),
130
+ (20, 20),
131
+ (25, 20),
132
+ (25, 25),
133
+ (20, 25),
134
+ (20, 20),
135
+ (10, 17),
136
+ (5, 25),
137
+ (9, 30),
138
+ (6, 15),
139
+ (15, 12.5),
140
+ (0, 5)]
141
+ num_pts = len(pts)
142
+ edges = [(i, (i+1) % num_pts) for i in range(num_pts)]
143
+ pts += [(21, 21),
144
+ (24, 21),
145
+ (24, 24),
146
+ (21, 24)]
147
+ edges += [(num_pts, num_pts + 1),
148
+ (num_pts + 1, num_pts + 2),
149
+ (num_pts + 2, num_pts + 3),
150
+ (num_pts + 3, num_pts)]
151
+
152
+ pts = np.array(pts, dtype=float)
153
+ edges = np.array(edges, dtype=int)
154
+
155
+ # t = DebugTriangulation(pts, edges, interval=-1, skip=19570)
156
+ # t.triangulate()
157
+
158
+ # make lines that are entirely vertical / horizontal
159
+ np.random.seed(1)
160
+ N = 100
161
+ pts = [[0, 0]]
162
+ for i in range(N - 1):
163
+ p = pts[-1][:]
164
+ p[i % 2] += np.random.normal()
165
+ pts.append(p)
166
+ pts = np.array(pts)
167
+ edges = np.zeros((N, 2), dtype=int)
168
+ edges[:, 0] = np.arange(N)
169
+ edges[:, 1] = np.arange(1, N + 1) % N
170
+ t = DebugTriangulation(pts, edges)
171
+ t.triangulate()
@@ -0,0 +1,134 @@
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
+ """Miscellaneous functions"""
6
+
7
+ import numpy as np
8
+
9
+
10
+ ###############################################################################
11
+ # These fast normal calculation routines are adapted from mne-python
12
+
13
+ def _fast_cross_3d(x, y):
14
+ """Compute cross product between list of 3D vectors
15
+
16
+ Much faster than np.cross() when the number of cross products
17
+ becomes large (>500). This is because np.cross() methods become
18
+ less memory efficient at this stage.
19
+
20
+ Parameters
21
+ ----------
22
+ x : array
23
+ Input array 1.
24
+ y : array
25
+ Input array 2.
26
+
27
+ Returns
28
+ -------
29
+ z : array
30
+ Cross product of x and y.
31
+
32
+ Notes
33
+ -----
34
+ x and y must both be 2D row vectors. One must have length 1, or both
35
+ lengths must match.
36
+ """
37
+ assert x.ndim == 2
38
+ assert y.ndim == 2
39
+ assert x.shape[1] == 3
40
+ assert y.shape[1] == 3
41
+ assert (x.shape[0] == 1 or y.shape[0] == 1) or x.shape[0] == y.shape[0]
42
+ if max([x.shape[0], y.shape[0]]) >= 500:
43
+ return np.c_[x[:, 1] * y[:, 2] - x[:, 2] * y[:, 1],
44
+ x[:, 2] * y[:, 0] - x[:, 0] * y[:, 2],
45
+ x[:, 0] * y[:, 1] - x[:, 1] * y[:, 0]]
46
+ else:
47
+ return np.cross(x, y)
48
+
49
+
50
+ def _calculate_normals(rr, tris):
51
+ """Efficiently compute vertex normals for triangulated surface"""
52
+ # ensure highest precision for our summation/vectorization "trick"
53
+ rr = rr.astype(np.float64)
54
+ # first, compute triangle normals
55
+ r1 = rr[tris[:, 0], :]
56
+ r2 = rr[tris[:, 1], :]
57
+ r3 = rr[tris[:, 2], :]
58
+ tri_nn = _fast_cross_3d((r2 - r1), (r3 - r1))
59
+
60
+ # Triangle normals and areas
61
+ size = np.sqrt(np.sum(tri_nn * tri_nn, axis=1))
62
+ size[size == 0] = 1.0 # prevent ugly divide-by-zero
63
+ tri_nn /= size[:, np.newaxis]
64
+
65
+ npts = len(rr)
66
+
67
+ # the following code replaces this, but is faster (vectorized):
68
+ #
69
+ # for p, verts in enumerate(tris):
70
+ # nn[verts, :] += tri_nn[p, :]
71
+ #
72
+ nn = np.zeros((npts, 3))
73
+ for verts in tris.T: # note this only loops 3x (number of verts per tri)
74
+ for idx in range(3): # x, y, z
75
+ nn[:, idx] += np.bincount(verts.astype(np.int32),
76
+ tri_nn[:, idx], minlength=npts)
77
+ size = np.sqrt(np.sum(nn * nn, axis=1))
78
+ size[size == 0] = 1.0 # prevent ugly divide-by-zero
79
+ nn /= size[:, np.newaxis]
80
+ return nn
81
+
82
+
83
+ def resize(image, shape, kind='linear'):
84
+ """Resize an image
85
+
86
+ Parameters
87
+ ----------
88
+ image : ndarray
89
+ Array of shape (N, M, ...).
90
+ shape : tuple
91
+ 2-element shape.
92
+ kind : str
93
+ Interpolation, either "linear" or "nearest".
94
+
95
+ Returns
96
+ -------
97
+ scaled_image : ndarray
98
+ New image, will have dtype np.float64.
99
+ """
100
+ image = np.array(image, float)
101
+ shape = np.array(shape, int)
102
+ if shape.ndim != 1 or shape.size != 2:
103
+ raise ValueError('shape must have two elements')
104
+ if image.ndim < 2:
105
+ raise ValueError('image must have two dimensions')
106
+ if not isinstance(kind, str) or kind not in ('nearest', 'linear'):
107
+ raise ValueError('mode must be "nearest" or "linear"')
108
+
109
+ r = np.linspace(0, image.shape[0] - 1, shape[0])
110
+ c = np.linspace(0, image.shape[1] - 1, shape[1])
111
+ if kind == 'linear':
112
+ r_0 = np.floor(r).astype(int)
113
+ c_0 = np.floor(c).astype(int)
114
+ r_1 = r_0 + 1
115
+ c_1 = c_0 + 1
116
+
117
+ top = (r_1 - r)[:, np.newaxis]
118
+ bot = (r - r_0)[:, np.newaxis]
119
+ lef = (c - c_0)[np.newaxis, :]
120
+ rig = (c_1 - c)[np.newaxis, :]
121
+
122
+ c_1 = np.minimum(c_1, image.shape[1] - 1)
123
+ r_1 = np.minimum(r_1, image.shape[0] - 1)
124
+ for arr in (top, bot, lef, rig):
125
+ arr.shape = arr.shape + (1,) * (image.ndim - 2)
126
+ out = top * rig * image[r_0][:, c_0, ...]
127
+ out += bot * rig * image[r_1][:, c_0, ...]
128
+ out += top * lef * image[r_0][:, c_1, ...]
129
+ out += bot * lef * image[r_1][:, c_1, ...]
130
+ else: # kind == 'nearest'
131
+ r = np.round(r).astype(int)
132
+ c = np.round(c).astype(int)
133
+ out = image[r][:, c, ...]
134
+ return out