scitex 2.7.0__py3-none-any.whl → 2.8.1__py3-none-any.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.
Files changed (355) hide show
  1. scitex/__init__.py +6 -2
  2. scitex/__version__.py +1 -1
  3. scitex/audio/README.md +52 -0
  4. scitex/audio/__init__.py +384 -0
  5. scitex/audio/__main__.py +129 -0
  6. scitex/audio/_tts.py +334 -0
  7. scitex/audio/engines/__init__.py +44 -0
  8. scitex/audio/engines/base.py +275 -0
  9. scitex/audio/engines/elevenlabs_engine.py +143 -0
  10. scitex/audio/engines/gtts_engine.py +162 -0
  11. scitex/audio/engines/pyttsx3_engine.py +131 -0
  12. scitex/audio/mcp_server.py +757 -0
  13. scitex/bridge/_helpers.py +1 -1
  14. scitex/bridge/_plt_vis.py +1 -1
  15. scitex/bridge/_stats_vis.py +1 -1
  16. scitex/dev/plt/__init__.py +272 -0
  17. scitex/dev/plt/plot_mpl_axhline.py +28 -0
  18. scitex/dev/plt/plot_mpl_axhspan.py +28 -0
  19. scitex/dev/plt/plot_mpl_axvline.py +28 -0
  20. scitex/dev/plt/plot_mpl_axvspan.py +28 -0
  21. scitex/dev/plt/plot_mpl_bar.py +29 -0
  22. scitex/dev/plt/plot_mpl_barh.py +29 -0
  23. scitex/dev/plt/plot_mpl_boxplot.py +28 -0
  24. scitex/dev/plt/plot_mpl_contour.py +31 -0
  25. scitex/dev/plt/plot_mpl_contourf.py +31 -0
  26. scitex/dev/plt/plot_mpl_errorbar.py +30 -0
  27. scitex/dev/plt/plot_mpl_eventplot.py +28 -0
  28. scitex/dev/plt/plot_mpl_fill.py +30 -0
  29. scitex/dev/plt/plot_mpl_fill_between.py +31 -0
  30. scitex/dev/plt/plot_mpl_hexbin.py +28 -0
  31. scitex/dev/plt/plot_mpl_hist.py +28 -0
  32. scitex/dev/plt/plot_mpl_hist2d.py +28 -0
  33. scitex/dev/plt/plot_mpl_imshow.py +29 -0
  34. scitex/dev/plt/plot_mpl_pcolormesh.py +31 -0
  35. scitex/dev/plt/plot_mpl_pie.py +29 -0
  36. scitex/dev/plt/plot_mpl_plot.py +29 -0
  37. scitex/dev/plt/plot_mpl_quiver.py +31 -0
  38. scitex/dev/plt/plot_mpl_scatter.py +28 -0
  39. scitex/dev/plt/plot_mpl_stackplot.py +31 -0
  40. scitex/dev/plt/plot_mpl_stem.py +29 -0
  41. scitex/dev/plt/plot_mpl_step.py +29 -0
  42. scitex/dev/plt/plot_mpl_violinplot.py +28 -0
  43. scitex/dev/plt/plot_sns_barplot.py +29 -0
  44. scitex/dev/plt/plot_sns_boxplot.py +29 -0
  45. scitex/dev/plt/plot_sns_heatmap.py +28 -0
  46. scitex/dev/plt/plot_sns_histplot.py +29 -0
  47. scitex/dev/plt/plot_sns_kdeplot.py +29 -0
  48. scitex/dev/plt/plot_sns_lineplot.py +31 -0
  49. scitex/dev/plt/plot_sns_scatterplot.py +29 -0
  50. scitex/dev/plt/plot_sns_stripplot.py +29 -0
  51. scitex/dev/plt/plot_sns_swarmplot.py +29 -0
  52. scitex/dev/plt/plot_sns_violinplot.py +29 -0
  53. scitex/dev/plt/plot_stx_bar.py +29 -0
  54. scitex/dev/plt/plot_stx_barh.py +29 -0
  55. scitex/dev/plt/plot_stx_box.py +28 -0
  56. scitex/dev/plt/plot_stx_boxplot.py +28 -0
  57. scitex/dev/plt/plot_stx_conf_mat.py +28 -0
  58. scitex/dev/plt/plot_stx_contour.py +31 -0
  59. scitex/dev/plt/plot_stx_ecdf.py +28 -0
  60. scitex/dev/plt/plot_stx_errorbar.py +30 -0
  61. scitex/dev/plt/plot_stx_fill_between.py +31 -0
  62. scitex/dev/plt/plot_stx_fillv.py +28 -0
  63. scitex/dev/plt/plot_stx_heatmap.py +28 -0
  64. scitex/dev/plt/plot_stx_image.py +28 -0
  65. scitex/dev/plt/plot_stx_imshow.py +28 -0
  66. scitex/dev/plt/plot_stx_joyplot.py +28 -0
  67. scitex/dev/plt/plot_stx_kde.py +28 -0
  68. scitex/dev/plt/plot_stx_line.py +28 -0
  69. scitex/dev/plt/plot_stx_mean_ci.py +28 -0
  70. scitex/dev/plt/plot_stx_mean_std.py +28 -0
  71. scitex/dev/plt/plot_stx_median_iqr.py +28 -0
  72. scitex/dev/plt/plot_stx_raster.py +28 -0
  73. scitex/dev/plt/plot_stx_rectangle.py +28 -0
  74. scitex/dev/plt/plot_stx_scatter.py +29 -0
  75. scitex/dev/plt/plot_stx_shaded_line.py +29 -0
  76. scitex/dev/plt/plot_stx_violin.py +28 -0
  77. scitex/dev/plt/plot_stx_violinplot.py +28 -0
  78. scitex/diagram/README.md +197 -0
  79. scitex/diagram/__init__.py +48 -0
  80. scitex/diagram/_compile.py +312 -0
  81. scitex/diagram/_diagram.py +355 -0
  82. scitex/diagram/_presets.py +173 -0
  83. scitex/diagram/_schema.py +182 -0
  84. scitex/diagram/_split.py +278 -0
  85. scitex/fig/__init__.py +352 -0
  86. scitex/{vis → fig}/backend/_parser.py +1 -1
  87. scitex/{vis → fig}/canvas.py +1 -1
  88. scitex/{vis → fig}/editor/__init__.py +5 -2
  89. scitex/{vis → fig}/editor/_dearpygui_editor.py +1 -1
  90. scitex/{vis → fig}/editor/_defaults.py +70 -5
  91. scitex/{vis → fig}/editor/_mpl_editor.py +1 -1
  92. scitex/{vis → fig}/editor/_qt_editor.py +182 -2
  93. scitex/{vis → fig}/editor/_tkinter_editor.py +1 -1
  94. scitex/fig/editor/edit/__init__.py +50 -0
  95. scitex/fig/editor/edit/backend_detector.py +109 -0
  96. scitex/fig/editor/edit/bundle_resolver.py +240 -0
  97. scitex/fig/editor/edit/editor_launcher.py +239 -0
  98. scitex/fig/editor/edit/manual_handler.py +53 -0
  99. scitex/fig/editor/edit/panel_loader.py +232 -0
  100. scitex/fig/editor/edit/path_resolver.py +67 -0
  101. scitex/fig/editor/flask_editor/_bbox.py +1299 -0
  102. scitex/fig/editor/flask_editor/_core.py +1429 -0
  103. scitex/{vis → fig}/editor/flask_editor/_plotter.py +38 -4
  104. scitex/fig/editor/flask_editor/_renderer.py +813 -0
  105. scitex/fig/editor/flask_editor/static/css/base/reset.css +41 -0
  106. scitex/fig/editor/flask_editor/static/css/base/typography.css +16 -0
  107. scitex/fig/editor/flask_editor/static/css/base/variables.css +85 -0
  108. scitex/fig/editor/flask_editor/static/css/components/buttons.css +217 -0
  109. scitex/fig/editor/flask_editor/static/css/components/context-menu.css +93 -0
  110. scitex/fig/editor/flask_editor/static/css/components/dropdown.css +57 -0
  111. scitex/fig/editor/flask_editor/static/css/components/forms.css +112 -0
  112. scitex/fig/editor/flask_editor/static/css/components/modal.css +59 -0
  113. scitex/fig/editor/flask_editor/static/css/components/sections.css +212 -0
  114. scitex/fig/editor/flask_editor/static/css/features/canvas.css +176 -0
  115. scitex/fig/editor/flask_editor/static/css/features/element-inspector.css +190 -0
  116. scitex/fig/editor/flask_editor/static/css/features/loading.css +59 -0
  117. scitex/fig/editor/flask_editor/static/css/features/overlay.css +45 -0
  118. scitex/fig/editor/flask_editor/static/css/features/panel-grid.css +95 -0
  119. scitex/fig/editor/flask_editor/static/css/features/selection.css +101 -0
  120. scitex/fig/editor/flask_editor/static/css/features/statistics.css +138 -0
  121. scitex/fig/editor/flask_editor/static/css/index.css +31 -0
  122. scitex/fig/editor/flask_editor/static/css/layout/container.css +7 -0
  123. scitex/fig/editor/flask_editor/static/css/layout/controls.css +56 -0
  124. scitex/fig/editor/flask_editor/static/css/layout/preview.css +78 -0
  125. scitex/fig/editor/flask_editor/static/js/alignment/axis.js +314 -0
  126. scitex/fig/editor/flask_editor/static/js/alignment/basic.js +107 -0
  127. scitex/fig/editor/flask_editor/static/js/alignment/distribute.js +54 -0
  128. scitex/fig/editor/flask_editor/static/js/canvas/canvas.js +172 -0
  129. scitex/fig/editor/flask_editor/static/js/canvas/dragging.js +258 -0
  130. scitex/fig/editor/flask_editor/static/js/canvas/resize.js +48 -0
  131. scitex/fig/editor/flask_editor/static/js/canvas/selection.js +71 -0
  132. scitex/fig/editor/flask_editor/static/js/core/api.js +288 -0
  133. scitex/fig/editor/flask_editor/static/js/core/state.js +143 -0
  134. scitex/fig/editor/flask_editor/static/js/core/utils.js +245 -0
  135. scitex/fig/editor/flask_editor/static/js/dev/element-inspector.js +992 -0
  136. scitex/fig/editor/flask_editor/static/js/editor/bbox.js +339 -0
  137. scitex/fig/editor/flask_editor/static/js/editor/element-drag.js +286 -0
  138. scitex/fig/editor/flask_editor/static/js/editor/overlay.js +371 -0
  139. scitex/fig/editor/flask_editor/static/js/editor/preview.js +293 -0
  140. scitex/fig/editor/flask_editor/static/js/main.js +426 -0
  141. scitex/fig/editor/flask_editor/static/js/shortcuts/context-menu.js +152 -0
  142. scitex/fig/editor/flask_editor/static/js/shortcuts/keyboard.js +265 -0
  143. scitex/fig/editor/flask_editor/static/js/ui/controls.js +184 -0
  144. scitex/fig/editor/flask_editor/static/js/ui/download.js +57 -0
  145. scitex/fig/editor/flask_editor/static/js/ui/help.js +100 -0
  146. scitex/fig/editor/flask_editor/static/js/ui/theme.js +34 -0
  147. scitex/fig/editor/flask_editor/templates/__init__.py +123 -0
  148. scitex/fig/editor/flask_editor/templates/_html.py +852 -0
  149. scitex/fig/editor/flask_editor/templates/_scripts.py +4933 -0
  150. scitex/fig/editor/flask_editor/templates/_styles.py +1658 -0
  151. scitex/{vis → fig}/io/__init__.py +13 -1
  152. scitex/fig/io/_bundle.py +1058 -0
  153. scitex/{vis → fig}/io/_canvas.py +1 -1
  154. scitex/{vis → fig}/io/_data.py +1 -1
  155. scitex/{vis → fig}/io/_export.py +1 -1
  156. scitex/{vis → fig}/io/_load.py +1 -1
  157. scitex/{vis → fig}/io/_panel.py +1 -1
  158. scitex/{vis → fig}/io/_save.py +1 -1
  159. scitex/{vis → fig}/model/__init__.py +1 -1
  160. scitex/{vis → fig}/model/_annotations.py +1 -1
  161. scitex/{vis → fig}/model/_axes.py +1 -1
  162. scitex/{vis → fig}/model/_figure.py +1 -1
  163. scitex/{vis → fig}/model/_guides.py +1 -1
  164. scitex/{vis → fig}/model/_plot.py +1 -1
  165. scitex/{vis → fig}/model/_styles.py +1 -1
  166. scitex/{vis → fig}/utils/__init__.py +1 -1
  167. scitex/io/__init__.py +22 -26
  168. scitex/io/_bundle.py +493 -0
  169. scitex/io/_flush.py +5 -2
  170. scitex/io/_load.py +98 -0
  171. scitex/io/_load_modules/_H5Explorer.py +5 -2
  172. scitex/io/_load_modules/_canvas.py +2 -2
  173. scitex/io/_load_modules/_image.py +3 -4
  174. scitex/io/_load_modules/_txt.py +4 -2
  175. scitex/io/_metadata.py +34 -324
  176. scitex/io/_metadata_modules/__init__.py +46 -0
  177. scitex/io/_metadata_modules/_embed.py +70 -0
  178. scitex/io/_metadata_modules/_read.py +64 -0
  179. scitex/io/_metadata_modules/_utils.py +79 -0
  180. scitex/io/_metadata_modules/embed_metadata_jpeg.py +74 -0
  181. scitex/io/_metadata_modules/embed_metadata_pdf.py +53 -0
  182. scitex/io/_metadata_modules/embed_metadata_png.py +26 -0
  183. scitex/io/_metadata_modules/embed_metadata_svg.py +62 -0
  184. scitex/io/_metadata_modules/read_metadata_jpeg.py +57 -0
  185. scitex/io/_metadata_modules/read_metadata_pdf.py +51 -0
  186. scitex/io/_metadata_modules/read_metadata_png.py +39 -0
  187. scitex/io/_metadata_modules/read_metadata_svg.py +44 -0
  188. scitex/io/_qr_utils.py +5 -3
  189. scitex/io/_save.py +548 -30
  190. scitex/io/_save_modules/_canvas.py +3 -3
  191. scitex/io/_save_modules/_image.py +5 -9
  192. scitex/io/_save_modules/_tex.py +7 -4
  193. scitex/io/_zip_bundle.py +439 -0
  194. scitex/io/utils/h5_to_zarr.py +11 -9
  195. scitex/msword/__init__.py +255 -0
  196. scitex/msword/profiles.py +357 -0
  197. scitex/msword/reader.py +753 -0
  198. scitex/msword/utils.py +289 -0
  199. scitex/msword/writer.py +362 -0
  200. scitex/plt/__init__.py +5 -2
  201. scitex/plt/_subplots/_AxesWrapper.py +6 -6
  202. scitex/plt/_subplots/_AxisWrapper.py +15 -9
  203. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +36 -0
  204. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +264 -0
  205. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +213 -0
  206. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +128 -0
  207. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +59 -0
  208. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +34 -0
  209. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +593 -0
  210. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +654 -0
  211. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +527 -0
  212. scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +321 -0
  213. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +33 -0
  214. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +152 -0
  215. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +600 -0
  216. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +79 -5
  217. scitex/plt/_subplots/_FigWrapper.py +6 -6
  218. scitex/plt/_subplots/_SubplotsWrapper.py +28 -18
  219. scitex/plt/_subplots/_export_as_csv.py +35 -5
  220. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +8 -0
  221. scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +10 -21
  222. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +18 -7
  223. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +28 -12
  224. scitex/plt/_subplots/_export_as_csv_formatters/_format_matshow.py +10 -4
  225. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py +13 -1
  226. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +12 -2
  227. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +10 -3
  228. scitex/plt/_subplots/_export_as_csv_formatters/_format_quiver.py +10 -4
  229. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +18 -3
  230. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +44 -36
  231. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +14 -2
  232. scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py +11 -5
  233. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +84 -0
  234. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +85 -0
  235. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_conf_mat.py +14 -3
  236. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_contour.py +54 -0
  237. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_ecdf.py +14 -2
  238. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +120 -0
  239. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_heatmap.py +16 -6
  240. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_image.py +29 -19
  241. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_imshow.py +63 -0
  242. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_joyplot.py +22 -5
  243. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_ci.py +18 -14
  244. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_std.py +18 -14
  245. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_median_iqr.py +18 -14
  246. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_raster.py +10 -2
  247. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +51 -0
  248. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter_hist.py +18 -9
  249. scitex/plt/ax/_plot/_stx_ecdf.py +4 -2
  250. scitex/plt/gallery/_generate.py +421 -14
  251. scitex/plt/io/__init__.py +53 -0
  252. scitex/plt/io/_bundle.py +490 -0
  253. scitex/plt/io/_layered_bundle.py +1343 -0
  254. scitex/plt/styles/SCITEX_STYLE.yaml +26 -0
  255. scitex/plt/styles/__init__.py +14 -0
  256. scitex/plt/styles/presets.py +78 -0
  257. scitex/plt/utils/__init__.py +13 -1
  258. scitex/plt/utils/_collect_figure_metadata.py +10 -14
  259. scitex/plt/utils/_configure_mpl.py +6 -18
  260. scitex/plt/utils/_crop.py +32 -14
  261. scitex/plt/utils/_csv_column_naming.py +54 -0
  262. scitex/plt/utils/_figure_mm.py +116 -1
  263. scitex/plt/utils/_hitmap.py +1643 -0
  264. scitex/plt/utils/metadata/__init__.py +25 -0
  265. scitex/plt/utils/metadata/_core.py +9 -10
  266. scitex/plt/utils/metadata/_dimensions.py +6 -3
  267. scitex/plt/utils/metadata/_editable_export.py +405 -0
  268. scitex/plt/utils/metadata/_geometry_extraction.py +570 -0
  269. scitex/schema/__init__.py +109 -16
  270. scitex/schema/_canvas.py +1 -1
  271. scitex/schema/_plot.py +1015 -0
  272. scitex/schema/_stats.py +2 -2
  273. scitex/stats/__init__.py +117 -0
  274. scitex/stats/io/__init__.py +29 -0
  275. scitex/stats/io/_bundle.py +156 -0
  276. scitex/tex/__init__.py +4 -0
  277. scitex/tex/_export.py +890 -0
  278. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/METADATA +11 -1
  279. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/RECORD +294 -170
  280. scitex/io/memo.md +0 -2827
  281. scitex/plt/REQUESTS.md +0 -191
  282. scitex/plt/_subplots/TODO.md +0 -53
  283. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +0 -559
  284. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +0 -1609
  285. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +0 -447
  286. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_between.json +0 -110
  287. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_betweenx.json +0 -88
  288. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fill_between.json +0 -103
  289. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fillv.json +0 -106
  290. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/bar.json +0 -92
  291. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/barh.json +0 -92
  292. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/boxplot.json +0 -92
  293. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_bar.json +0 -84
  294. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_barh.json +0 -84
  295. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_box.json +0 -83
  296. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_boxplot.json +0 -93
  297. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violin.json +0 -91
  298. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violinplot.json +0 -91
  299. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/violinplot.json +0 -91
  300. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contour.json +0 -97
  301. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contourf.json +0 -98
  302. scitex/plt/templates/research-master/scitex/vis/gallery/contour/stx_contour.json +0 -84
  303. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist.json +0 -101
  304. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist2d.json +0 -96
  305. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_ecdf.json +0 -95
  306. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_joyplot.json +0 -95
  307. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_kde.json +0 -93
  308. scitex/plt/templates/research-master/scitex/vis/gallery/grid/imshow.json +0 -95
  309. scitex/plt/templates/research-master/scitex/vis/gallery/grid/matshow.json +0 -95
  310. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_conf_mat.json +0 -83
  311. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_heatmap.json +0 -92
  312. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_image.json +0 -121
  313. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_imshow.json +0 -84
  314. scitex/plt/templates/research-master/scitex/vis/gallery/line/plot.json +0 -110
  315. scitex/plt/templates/research-master/scitex/vis/gallery/line/step.json +0 -92
  316. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_line.json +0 -95
  317. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_shaded_line.json +0 -96
  318. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/hexbin.json +0 -95
  319. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/scatter.json +0 -95
  320. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stem.json +0 -92
  321. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stx_scatter.json +0 -84
  322. scitex/plt/templates/research-master/scitex/vis/gallery/special/pie.json +0 -94
  323. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_raster.json +0 -109
  324. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_rectangle.json +0 -108
  325. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/errorbar.json +0 -93
  326. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_errorbar.json +0 -84
  327. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_ci.json +0 -96
  328. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_std.json +0 -96
  329. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_median_iqr.json +0 -96
  330. scitex/plt/templates/research-master/scitex/vis/gallery/vector/quiver.json +0 -99
  331. scitex/plt/templates/research-master/scitex/vis/gallery/vector/streamplot.json +0 -100
  332. scitex/vis/__init__.py +0 -177
  333. scitex/vis/editor/_edit.py +0 -390
  334. scitex/vis/editor/flask_editor/_bbox.py +0 -529
  335. scitex/vis/editor/flask_editor/_core.py +0 -168
  336. scitex/vis/editor/flask_editor/_renderer.py +0 -393
  337. scitex/vis/editor/flask_editor/templates/__init__.py +0 -33
  338. scitex/vis/editor/flask_editor/templates/_html.py +0 -513
  339. scitex/vis/editor/flask_editor/templates/_scripts.py +0 -1261
  340. scitex/vis/editor/flask_editor/templates/_styles.py +0 -739
  341. /scitex/{vis → fig}/README.md +0 -0
  342. /scitex/{vis → fig}/backend/__init__.py +0 -0
  343. /scitex/{vis → fig}/backend/_export.py +0 -0
  344. /scitex/{vis → fig}/backend/_render.py +0 -0
  345. /scitex/{vis → fig}/docs/CANVAS_ARCHITECTURE.md +0 -0
  346. /scitex/{vis → fig}/editor/_flask_editor.py +0 -0
  347. /scitex/{vis → fig}/editor/flask_editor/__init__.py +0 -0
  348. /scitex/{vis → fig}/editor/flask_editor/_utils.py +0 -0
  349. /scitex/{vis → fig}/io/_directory.py +0 -0
  350. /scitex/{vis → fig}/model/_plot_types.py +0 -0
  351. /scitex/{vis → fig}/utils/_defaults.py +0 -0
  352. /scitex/{vis → fig}/utils/_validate.py +0 -0
  353. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/WHEEL +0 -0
  354. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/entry_points.txt +0 -0
  355. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/licenses/LICENSE +0 -0
scitex/fig/__init__.py ADDED
@@ -0,0 +1,352 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: 2025-12-08
4
+ # File: ./src/scitex/vis/__init__.py
5
+ """
6
+ SciTeX Visualization Module (scitex.fig)
7
+
8
+ Canvas-based composition of publication-quality figures.
9
+
10
+ Terminology:
11
+ - Canvas: A paper figure workspace (e.g., "Figure 1" in publication)
12
+ - Panel: A single component on canvas (stx.plt output or image)
13
+ - Figure: Reserved for matplotlib's fig object (see scitex.plt)
14
+
15
+ Quick Start:
16
+ -----------
17
+ >>> import scitex as stx
18
+ >>>
19
+ >>> # Create canvas and add panels
20
+ >>> stx.vis.create_canvas("/output", "fig1")
21
+ >>> stx.vis.add_panel("/output", "fig1", "panel_a", source="plot.png",
22
+ ... position=(10, 10), size=(80, 60), label="A")
23
+ >>>
24
+ >>> # Save with stx.io (auto-exports PNG/PDF/SVG)
25
+ >>> canvas = stx.io.load("/output/fig1.canvas")
26
+ >>> stx.io.save(canvas, "/output/fig1_copy.canvas")
27
+
28
+ Directory Structure:
29
+ -------------------
30
+ {parent_dir}/{canvas_name}.canvas/
31
+ ├── canvas.json # Layout, panels, composition
32
+ ├── panels/ # Panel directories
33
+ └── exports/ # canvas.png, canvas.pdf, canvas.svg
34
+ """
35
+
36
+ # Submodules for advanced use
37
+ from . import io
38
+ from . import model
39
+ from . import backend
40
+ from . import utils
41
+ from . import editor
42
+
43
+ # Canvas class
44
+ from .canvas import Canvas
45
+
46
+ # =============================================================================
47
+ # Primary API (minimal, reusable, flexible)
48
+ # =============================================================================
49
+
50
+ # Canvas operations
51
+ from .io import (
52
+ ensure_canvas_directory as create_canvas,
53
+ get_canvas_directory_path as get_canvas_path,
54
+ canvas_directory_exists as canvas_exists,
55
+ list_canvas_directories as list_canvases,
56
+ delete_canvas_directory as delete_canvas,
57
+ )
58
+
59
+ # Panel operations
60
+ from .io import (
61
+ add_panel_from_scitex,
62
+ add_panel_from_image,
63
+ update_panel,
64
+ remove_panel,
65
+ list_panels,
66
+ )
67
+
68
+ # Export (usually handled by stx.io.save, but available for explicit use)
69
+ from .io import export_canvas_to_file as export_canvas
70
+
71
+ # Data integrity
72
+ from .io import verify_all_data_hashes as verify_data
73
+
74
+ # Editor
75
+ from .editor import edit
76
+
77
+
78
+ # =============================================================================
79
+ # Convenience wrapper for add_panel
80
+ # =============================================================================
81
+ def add_panel(
82
+ parent_dir,
83
+ canvas_name,
84
+ panel_name,
85
+ source,
86
+ position=(0, 0),
87
+ size=(50, 50),
88
+ label="",
89
+ bundle=False,
90
+ **kwargs,
91
+ ):
92
+ """
93
+ Add a panel to canvas (auto-detects scitex vs image type).
94
+
95
+ Parameters
96
+ ----------
97
+ parent_dir : str or Path
98
+ Parent directory containing canvas
99
+ canvas_name : str
100
+ Canvas name
101
+ panel_name : str
102
+ Name for the panel
103
+ source : str or Path
104
+ Source file (PNG, JPG, SVG)
105
+ position : tuple
106
+ (x_mm, y_mm) position on canvas
107
+ size : tuple
108
+ (width_mm, height_mm) panel size
109
+ label : str
110
+ Panel label (A, B, C...)
111
+ bundle : bool
112
+ If True, copy files. If False (default), use symlinks.
113
+ **kwargs
114
+ Additional panel properties (rotation_deg, opacity, flip_h, etc.)
115
+ """
116
+ from pathlib import Path
117
+
118
+ source = Path(source)
119
+ panel_properties = {
120
+ "position": {"x_mm": position[0], "y_mm": position[1]},
121
+ "size": {"width_mm": size[0], "height_mm": size[1]},
122
+ **kwargs,
123
+ }
124
+ if label:
125
+ panel_properties["label"] = {"text": label, "position": "top-left"}
126
+
127
+ # Check if scitex output (has .json/.csv siblings)
128
+ json_sibling = source.parent / f"{source.stem}.json"
129
+ if json_sibling.exists():
130
+ return add_panel_from_scitex(
131
+ project_dir=parent_dir,
132
+ canvas_name=canvas_name,
133
+ panel_name=panel_name,
134
+ source_png=source,
135
+ panel_properties=panel_properties,
136
+ bundle=bundle,
137
+ )
138
+ else:
139
+ return add_panel_from_image(
140
+ project_dir=parent_dir,
141
+ canvas_name=canvas_name,
142
+ panel_name=panel_name,
143
+ source_image=source,
144
+ panel_properties=panel_properties,
145
+ bundle=bundle,
146
+ )
147
+
148
+
149
+ # =============================================================================
150
+ # .figz Bundle Support
151
+ # =============================================================================
152
+
153
+ def save_figz(
154
+ panels,
155
+ path,
156
+ spec=None,
157
+ as_zip=None,
158
+ ):
159
+ """
160
+ Save panels as a .figz publication figure bundle.
161
+
162
+ Parameters
163
+ ----------
164
+ panels : dict
165
+ Dictionary mapping panel IDs to .pltz bundle paths or data.
166
+ Example: {"A": "timecourse.pltz.d", "B": "barplot.pltz.d"}
167
+ path : str or Path
168
+ Output path (e.g., "Figure1.figz" or "Figure1.figz.d").
169
+ - Path ending with ".figz" creates ZIP archive (default behavior)
170
+ - Path ending with ".figz.d" creates directory bundle
171
+ spec : dict, optional
172
+ Figure specification. Auto-generated if None.
173
+ as_zip : bool, optional
174
+ If True, save as ZIP archive. If False, save as directory.
175
+ Default: auto-detect from path (ZIP for .figz, directory for .figz.d).
176
+
177
+ Returns
178
+ -------
179
+ Path
180
+ Path to saved bundle.
181
+
182
+ Examples
183
+ --------
184
+ >>> import scitex.fig as sfig
185
+ >>> panels = {
186
+ ... "A": "timecourse.pltz.d",
187
+ ... "B": "barplot.pltz.d"
188
+ ... }
189
+ >>> sfig.save_figz(panels, "Figure1.figz") # Creates ZIP
190
+ >>> sfig.save_figz(panels, "Figure1.figz.d") # Creates directory
191
+ """
192
+ from pathlib import Path
193
+ import shutil
194
+ from scitex.io._bundle import save_bundle, BundleType
195
+
196
+ p = Path(path)
197
+ spath = str(path)
198
+
199
+ # Auto-detect as_zip from path suffix if not specified
200
+ if as_zip is None:
201
+ as_zip = not spath.endswith(".d")
202
+
203
+ # Auto-generate spec if not provided
204
+ if spec is None:
205
+ spec = _generate_figure_spec(panels)
206
+
207
+ # Build bundle data - pass source paths directly for file copying
208
+ bundle_data = {
209
+ 'spec': spec,
210
+ 'plots': {},
211
+ }
212
+
213
+ # Pass source paths directly (not loaded data) to preserve all files
214
+ for panel_id, pltz_source in panels.items():
215
+ pltz_path = Path(pltz_source)
216
+ if pltz_path.exists():
217
+ # Store source path for direct copying
218
+ bundle_data['plots'][panel_id] = str(pltz_path)
219
+
220
+ return save_bundle(bundle_data, p, bundle_type=BundleType.FIGZ, as_zip=as_zip)
221
+
222
+
223
+ def load_figz(path):
224
+ """
225
+ Load a .figz bundle.
226
+
227
+ Parameters
228
+ ----------
229
+ path : str or Path
230
+ Path to .figz bundle (directory or ZIP).
231
+
232
+ Returns
233
+ -------
234
+ dict
235
+ Figure data with:
236
+ - 'spec': Figure specification
237
+ - 'panels': Dict mapping panel IDs to {'spec': ..., 'data': ...}
238
+
239
+ Examples
240
+ --------
241
+ >>> figure = scitex.fig.load_figz("Figure1.figz.d")
242
+ >>> print(figure['spec']['figure']['title'])
243
+ >>> panel_a = figure['panels']['A']
244
+ >>> print(panel_a['spec'], panel_a['data'])
245
+ """
246
+ from scitex.io._bundle import load_bundle
247
+
248
+ bundle = load_bundle(path)
249
+
250
+ if bundle['type'] != 'figz':
251
+ raise ValueError(f"Not a .figz bundle: {path}")
252
+
253
+ result = {
254
+ 'spec': bundle.get('spec', {}),
255
+ 'panels': {},
256
+ }
257
+
258
+ # Return spec and data for each panel (reconstruction is optional)
259
+ for panel_id, plot_bundle in bundle.get('plots', {}).items():
260
+ result['panels'][panel_id] = {
261
+ 'spec': plot_bundle.get('spec', {}),
262
+ 'data': plot_bundle.get('data'),
263
+ }
264
+
265
+ return result
266
+
267
+
268
+ def _generate_figure_spec(panels):
269
+ """Generate figure.json spec from panels."""
270
+ from pathlib import Path
271
+
272
+ spec = {
273
+ 'schema': {'name': 'scitex.fig.figure', 'version': '1.0.0'},
274
+ 'figure': {
275
+ 'id': 'figure',
276
+ 'title': '',
277
+ 'caption': '',
278
+ 'styles': {
279
+ 'size': {'width_mm': 180, 'height_mm': 120},
280
+ 'background': '#ffffff',
281
+ },
282
+ },
283
+ 'panels': [],
284
+ }
285
+
286
+ # Auto-layout panels
287
+ panel_ids = sorted(panels.keys())
288
+ n_panels = len(panel_ids)
289
+
290
+ if n_panels == 0:
291
+ return spec
292
+
293
+ # Simple grid layout
294
+ cols = min(n_panels, 2)
295
+ rows = (n_panels + cols - 1) // cols
296
+
297
+ panel_w = 80
298
+ panel_h = 50
299
+ margin = 5
300
+
301
+ for i, panel_id in enumerate(panel_ids):
302
+ row = i // cols
303
+ col = i % cols
304
+
305
+ x = margin + col * (panel_w + margin)
306
+ y = margin + row * (panel_h + margin)
307
+
308
+ # Note: save_bundle uses panel_id for the directory name (e.g., A.pltz.d)
309
+ spec['panels'].append({
310
+ 'id': panel_id,
311
+ 'label': panel_id,
312
+ 'caption': '',
313
+ 'plot': f"{panel_id}.pltz.d",
314
+ 'position': {'x_mm': x, 'y_mm': y},
315
+ 'size': {'width_mm': panel_w, 'height_mm': panel_h},
316
+ })
317
+
318
+ return spec
319
+
320
+
321
+ __all__ = [
322
+ # Canvas class
323
+ "Canvas",
324
+ # Submodules (advanced)
325
+ "io",
326
+ "model",
327
+ "backend",
328
+ "utils",
329
+ "editor",
330
+ # Canvas operations
331
+ "create_canvas",
332
+ "get_canvas_path",
333
+ "canvas_exists",
334
+ "list_canvases",
335
+ "delete_canvas",
336
+ # Panel operations
337
+ "add_panel",
338
+ "update_panel",
339
+ "remove_panel",
340
+ "list_panels",
341
+ # Export
342
+ "export_canvas",
343
+ # Data integrity
344
+ "verify_data",
345
+ # Editor
346
+ "edit",
347
+ # .figz bundle
348
+ "save_figz",
349
+ "load_figz",
350
+ ]
351
+
352
+ # EOF
@@ -161,7 +161,7 @@ def validate_figure_json(fig_json: Dict[str, Any]) -> bool:
161
161
 
162
162
  Examples
163
163
  --------
164
- >>> from scitex.vis.backend import validate_figure_json
164
+ >>> from scitex.fig.backend import validate_figure_json
165
165
  >>> fig_json = {"width_mm": 180, "height_mm": 120, "axes": []}
166
166
  >>> validate_figure_json(fig_json)
167
167
  True
@@ -3,7 +3,7 @@
3
3
  # Timestamp: 2025-12-08
4
4
  # File: ./src/scitex/vis/canvas.py
5
5
  """
6
- Canvas class for scitex.vis.
6
+ Canvas class for scitex.fig.
7
7
 
8
8
  Provides object-oriented interface to canvas operations.
9
9
  """
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env python3
2
2
  # -*- coding: utf-8 -*-
3
- # File: ./src/scitex/vis/editor/__init__.py
3
+ # Timestamp: "2025-12-14 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/fig/editor/__init__.py
5
+
4
6
  """
5
7
  SciTeX Visual Editor Module
6
8
 
@@ -13,11 +15,12 @@ Supports multiple backends with graceful degradation:
13
15
  - mpl: Minimal matplotlib (always works)
14
16
  """
15
17
 
16
- from ._edit import edit, save_manual_overrides
18
+ from .edit import edit, save_manual_overrides
17
19
 
18
20
  __all__ = [
19
21
  "edit",
20
22
  "save_manual_overrides",
21
23
  ]
22
24
 
25
+
23
26
  # EOF
@@ -1901,7 +1901,7 @@ class DearPyGuiEditor:
1901
1901
  def _save_manual(self, sender=None, app_data=None, user_data=None):
1902
1902
  """Save current overrides to .manual.json."""
1903
1903
  import dearpygui.dearpygui as dpg
1904
- from ._edit import save_manual_overrides
1904
+ from .edit import save_manual_overrides
1905
1905
 
1906
1906
  try:
1907
1907
  self._collect_overrides(dpg)
@@ -3,6 +3,8 @@
3
3
  # File: ./src/scitex/vis/editor/_defaults.py
4
4
  """Default style settings for SciTeX visual editor."""
5
5
 
6
+ from scitex.plt.styles import get_default_dpi, get_preview_dpi
7
+
6
8
 
7
9
  def get_scitex_defaults():
8
10
  """
@@ -36,7 +38,7 @@ def get_scitex_defaults():
36
38
  "grid_linewidth": 0.6,
37
39
  "grid_alpha": 0.3,
38
40
  # Figure settings
39
- "dpi": 300, # Default DPI
41
+ "dpi": get_default_dpi(), # From SCITEX_STYLE.yaml
40
42
  "fig_size": [3.15, 2.68], # Default figure size in inches
41
43
  # Colors (SciTeX defaults)
42
44
  "facecolor": "#ffffff", # White background
@@ -126,13 +128,23 @@ def extract_defaults_from_metadata(metadata):
126
128
  if "n_ticks" in style_mm:
127
129
  defaults["n_ticks"] = style_mm["n_ticks"]
128
130
 
129
- # Dimensions from metadata
131
+ # Dimensions from metadata (support both old and new formats)
130
132
  dimensions = metadata.get("dimensions", {})
131
133
  if "dpi" in dimensions:
132
134
  defaults["dpi"] = dimensions["dpi"]
133
135
  if "figure_size_inch" in dimensions:
134
136
  defaults["fig_size"] = dimensions["figure_size_inch"]
135
137
 
138
+ # New format: size.width_mm, size.height_mm, size.dpi
139
+ size = metadata.get("size", {})
140
+ if "dpi" in size:
141
+ defaults["dpi"] = size["dpi"]
142
+ if "width_mm" in size and "height_mm" in size:
143
+ # Convert mm to inches
144
+ width_inch = size["width_mm"] / 25.4
145
+ height_inch = size["height_mm"] / 25.4
146
+ defaults["fig_size"] = [width_inch, height_inch]
147
+
136
148
  # Axis labels from metadata
137
149
  if "xlabel" in metadata:
138
150
  defaults["xlabel"] = metadata["xlabel"]
@@ -177,20 +189,73 @@ def extract_defaults_from_metadata(metadata):
177
189
  defaults["title"] = ax["title"]
178
190
  if "grid" in ax:
179
191
  defaults["grid"] = ax["grid"]
192
+ # Extract axis limits from list format
193
+ if "xlim" in ax:
194
+ defaults["xlim"] = ax["xlim"]
195
+ if "ylim" in ax:
196
+ defaults["ylim"] = ax["ylim"]
180
197
 
181
- # Extract traces information
198
+ # Extract traces information - check multiple possible locations
182
199
  traces = metadata.get("traces", [])
200
+
201
+ # Also check axes[].lines (pltz bundle format)
202
+ if not traces and isinstance(axes, list) and len(axes) > 0:
203
+ ax = axes[0]
204
+ lines = ax.get("lines", [])
205
+ if lines:
206
+ traces = lines
207
+
208
+ # Also check hit_regions.color_map for trace info
209
+ if not traces:
210
+ hit_regions = metadata.get("hit_regions", {})
211
+ color_map = hit_regions.get("color_map", {})
212
+ if color_map:
213
+ traces = []
214
+ for trace_id, trace_info in color_map.items():
215
+ traces.append({
216
+ "id": trace_id,
217
+ "label": trace_info.get("label", f"Trace {trace_id}"),
218
+ "type": trace_info.get("type", "line"),
219
+ })
220
+
183
221
  if traces:
184
222
  defaults["traces"] = traces
185
223
 
186
- # Extract legend information
224
+ # Extract legend information from multiple possible locations
187
225
  legend = metadata.get("legend", {})
226
+
227
+ # Also check selectable_regions.axes[0].legend (pltz bundle format)
228
+ if not legend:
229
+ selectable = metadata.get("selectable_regions", {})
230
+ sel_axes = selectable.get("axes", [])
231
+ if sel_axes and len(sel_axes) > 0:
232
+ legend = sel_axes[0].get("legend", {})
233
+
188
234
  if legend:
189
235
  defaults["legend_visible"] = legend.get("visible", True)
190
236
  defaults["legend_frameon"] = legend.get("frameon", False)
191
- loc = legend.get("loc", "best")
237
+ # Support both old format (loc) and new format (location)
238
+ loc = legend.get("location") or legend.get("loc", "best")
192
239
  # Convert numeric legend loc to string (matplotlib accepts both but GUI needs string)
193
240
  defaults["legend_loc"] = _normalize_legend_loc(loc)
241
+ # Extract fontsize if present
242
+ if "fontsize" in legend:
243
+ defaults["legend_fontsize"] = legend["fontsize"]
244
+ # Extract ncols if present
245
+ if "ncols" in legend:
246
+ defaults["legend_ncols"] = legend["ncols"]
247
+ # Extract title if present
248
+ if "title" in legend:
249
+ defaults["legend_title"] = legend["title"]
250
+
251
+ # Extract legend entries if present
252
+ entries = legend.get("entries", [])
253
+ if entries and not traces:
254
+ # Use legend entries as trace labels
255
+ defaults["traces"] = [
256
+ {"label": e.get("text", f"Trace {i}")}
257
+ for i, e in enumerate(entries)
258
+ ]
194
259
 
195
260
  return defaults
196
261
 
@@ -228,7 +228,7 @@ class MplEditor:
228
228
 
229
229
  def _save(self, event):
230
230
  """Save to .manual.json."""
231
- from ._edit import save_manual_overrides
231
+ from .edit import save_manual_overrides
232
232
 
233
233
  try:
234
234
  manual_path = save_manual_overrides(self.json_path, self.current_overrides)