vispy 0.15.0__cp313-cp313-win_amd64.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.cp313-win_amd64.pyd +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 +5 -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
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, _cross_2d, _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,162 @@
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
+ def _cross_2d(x, y):
11
+ """Compute the z-component of the cross product of (arrays of) 2D vectors.
12
+
13
+ This is meant to replicate the 2D functionality of np.cross(), which is
14
+ deprecated in numpy 2.0.
15
+
16
+ x and y must have broadcastable shapes, with the last dimension being 2.
17
+
18
+ Parameters
19
+ ----------
20
+ x : array
21
+ Input array 1, shape (..., 2).
22
+ y : array
23
+ Input array 2, shape (..., 2).
24
+
25
+ Returns
26
+ -------
27
+ z : array
28
+ z-component of cross products of x and y.
29
+
30
+ See: https://github.com/numpy/numpy/issues/26620
31
+ """
32
+ if x.shape[-1] != 2 or y.shape[-1] != 2:
33
+ raise ValueError("Input arrays must have shape (..., 2)")
34
+
35
+ return x[..., 0] * y[..., 1] - x[..., 1] * y[..., 0]
36
+
37
+
38
+ def _fast_cross_3d(x, y):
39
+ """Compute cross product between list of 3D vectors
40
+
41
+ Much faster than np.cross() when the number of cross products
42
+ becomes large (>500). This is because np.cross() methods become
43
+ less memory efficient at this stage.
44
+
45
+ Parameters
46
+ ----------
47
+ x : array
48
+ Input array 1.
49
+ y : array
50
+ Input array 2.
51
+
52
+ Returns
53
+ -------
54
+ z : array
55
+ Cross product of x and y.
56
+
57
+ Notes
58
+ -----
59
+ x and y must both be 2D row vectors. One must have length 1, or both
60
+ lengths must match.
61
+ """
62
+ assert x.ndim == 2
63
+ assert y.ndim == 2
64
+ assert x.shape[1] == 3
65
+ assert y.shape[1] == 3
66
+ assert (x.shape[0] == 1 or y.shape[0] == 1) or x.shape[0] == y.shape[0]
67
+ if max([x.shape[0], y.shape[0]]) >= 500:
68
+ return np.c_[x[:, 1] * y[:, 2] - x[:, 2] * y[:, 1],
69
+ x[:, 2] * y[:, 0] - x[:, 0] * y[:, 2],
70
+ x[:, 0] * y[:, 1] - x[:, 1] * y[:, 0]]
71
+ else:
72
+ return np.cross(x, y)
73
+
74
+
75
+ ###############################################################################
76
+ # These fast normal calculation routines are adapted from mne-python
77
+
78
+ def _calculate_normals(rr, tris):
79
+ """Efficiently compute vertex normals for triangulated surface"""
80
+ # ensure highest precision for our summation/vectorization "trick"
81
+ rr = rr.astype(np.float64)
82
+ # first, compute triangle normals
83
+ r1 = rr[tris[:, 0], :]
84
+ r2 = rr[tris[:, 1], :]
85
+ r3 = rr[tris[:, 2], :]
86
+ tri_nn = _fast_cross_3d((r2 - r1), (r3 - r1))
87
+
88
+ # Triangle normals and areas
89
+ size = np.sqrt(np.sum(tri_nn * tri_nn, axis=1))
90
+ size[size == 0] = 1.0 # prevent ugly divide-by-zero
91
+ tri_nn /= size[:, np.newaxis]
92
+
93
+ npts = len(rr)
94
+
95
+ # the following code replaces this, but is faster (vectorized):
96
+ #
97
+ # for p, verts in enumerate(tris):
98
+ # nn[verts, :] += tri_nn[p, :]
99
+ #
100
+ nn = np.zeros((npts, 3))
101
+ for verts in tris.T: # note this only loops 3x (number of verts per tri)
102
+ for idx in range(3): # x, y, z
103
+ nn[:, idx] += np.bincount(verts.astype(np.int32),
104
+ tri_nn[:, idx], minlength=npts)
105
+ size = np.sqrt(np.sum(nn * nn, axis=1))
106
+ size[size == 0] = 1.0 # prevent ugly divide-by-zero
107
+ nn /= size[:, np.newaxis]
108
+ return nn
109
+
110
+
111
+ def resize(image, shape, kind='linear'):
112
+ """Resize an image
113
+
114
+ Parameters
115
+ ----------
116
+ image : ndarray
117
+ Array of shape (N, M, ...).
118
+ shape : tuple
119
+ 2-element shape.
120
+ kind : str
121
+ Interpolation, either "linear" or "nearest".
122
+
123
+ Returns
124
+ -------
125
+ scaled_image : ndarray
126
+ New image, will have dtype np.float64.
127
+ """
128
+ image = np.array(image, float)
129
+ shape = np.array(shape, int)
130
+ if shape.ndim != 1 or shape.size != 2:
131
+ raise ValueError('shape must have two elements')
132
+ if image.ndim < 2:
133
+ raise ValueError('image must have two dimensions')
134
+ if not isinstance(kind, str) or kind not in ('nearest', 'linear'):
135
+ raise ValueError('mode must be "nearest" or "linear"')
136
+
137
+ r = np.linspace(0, image.shape[0] - 1, shape[0])
138
+ c = np.linspace(0, image.shape[1] - 1, shape[1])
139
+ if kind == 'linear':
140
+ r_0 = np.floor(r).astype(int)
141
+ c_0 = np.floor(c).astype(int)
142
+ r_1 = r_0 + 1
143
+ c_1 = c_0 + 1
144
+
145
+ top = (r_1 - r)[:, np.newaxis]
146
+ bot = (r - r_0)[:, np.newaxis]
147
+ lef = (c - c_0)[np.newaxis, :]
148
+ rig = (c_1 - c)[np.newaxis, :]
149
+
150
+ c_1 = np.minimum(c_1, image.shape[1] - 1)
151
+ r_1 = np.minimum(r_1, image.shape[0] - 1)
152
+ for arr in (top, bot, lef, rig):
153
+ arr.shape = arr.shape + (1,) * (image.ndim - 2)
154
+ out = top * rig * image[r_0][:, c_0, ...]
155
+ out += bot * rig * image[r_1][:, c_0, ...]
156
+ out += top * lef * image[r_0][:, c_1, ...]
157
+ out += bot * lef * image[r_1][:, c_1, ...]
158
+ else: # kind == 'nearest'
159
+ r = np.round(r).astype(int)
160
+ c = np.round(c).astype(int)
161
+ out = image[r][:, c, ...]
162
+ return out