scitex 2.10.2__py3-none-any.whl → 2.11.0__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 (363) hide show
  1. scitex/__init__.py +1 -4
  2. scitex/__version__.py +1 -1
  3. scitex/_install_guide.py +14 -2
  4. scitex/bridge/_figrecipe.py +1 -1
  5. scitex/bridge/_helpers.py +1 -1
  6. scitex/bridge/_plt_vis.py +1 -1
  7. scitex/bridge/_stats_plt.py +1 -1
  8. scitex/bridge/_stats_vis.py +2 -2
  9. scitex/{fig → canvas}/__init__.py +84 -96
  10. scitex/{fig → canvas}/backend/_parser.py +1 -1
  11. scitex/{fig → canvas}/canvas.py +13 -14
  12. scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
  13. scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
  14. scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
  15. scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
  16. scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
  17. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
  18. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
  19. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
  20. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
  21. scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
  22. scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
  23. scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
  24. scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
  25. scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
  26. scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
  27. scitex/{fig → canvas}/io/__init__.py +32 -38
  28. scitex/{fig → canvas}/io/_bundle.py +217 -154
  29. scitex/{fig → canvas}/io/_canvas.py +1 -1
  30. scitex/{fig → canvas}/io/_data.py +1 -1
  31. scitex/{fig → canvas}/io/_export.py +1 -1
  32. scitex/{fig → canvas}/io/_load.py +1 -1
  33. scitex/{fig → canvas}/io/_panel.py +1 -1
  34. scitex/{fig → canvas}/io/_save.py +1 -1
  35. scitex/{fig → canvas}/model/__init__.py +1 -1
  36. scitex/{fig → canvas}/model/_annotations.py +1 -1
  37. scitex/{fig → canvas}/model/_axes.py +1 -1
  38. scitex/{fig → canvas}/model/_figure.py +1 -1
  39. scitex/{fig → canvas}/model/_guides.py +1 -1
  40. scitex/{fig → canvas}/model/_plot.py +1 -1
  41. scitex/{fig → canvas}/model/_styles.py +1 -1
  42. scitex/{fig → canvas}/utils/__init__.py +1 -1
  43. scitex/cli/convert.py +10 -6
  44. scitex/diagram/README.md +7 -7
  45. scitex/io/__init__.py +7 -19
  46. scitex/io/_load.py +15 -19
  47. scitex/io/_load_modules/_canvas.py +2 -2
  48. scitex/io/_load_modules/_con.py +5 -5
  49. scitex/io/_load_modules/_eeg.py +16 -12
  50. scitex/io/_save.py +11 -16
  51. scitex/io/_save_modules/__init__.py +6 -10
  52. scitex/io/_save_modules/_canvas.py +3 -3
  53. scitex/io/_save_modules/_plot_bundle.py +112 -0
  54. scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
  55. scitex/io/_save_modules/_stx_bundle.py +16 -16
  56. scitex/io/bundle/README.md +89 -80
  57. scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
  58. scitex/io/bundle/__init__.py +67 -35
  59. scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
  60. scitex/io/bundle/_core.py +184 -97
  61. scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
  62. scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
  63. scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
  64. scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
  65. scitex/io/bundle/_manifest.py +99 -0
  66. scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
  67. scitex/io/bundle/_nested.py +113 -100
  68. scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
  69. scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
  70. scitex/io/bundle/_types.py +41 -16
  71. scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
  72. scitex/io/bundle/_zip.py +21 -31
  73. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
  74. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
  75. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
  76. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
  77. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
  78. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
  79. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
  80. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
  81. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
  82. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
  83. scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
  84. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
  85. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
  86. scitex/io/bundle/schemas/__init__.py +30 -0
  87. scitex/parallel/_run.py +5 -4
  88. scitex/path/_find.py +60 -83
  89. scitex/path/_get_module_path.py +23 -21
  90. scitex/path/_get_spath.py +6 -27
  91. scitex/path/_getsize.py +23 -9
  92. scitex/path/_increment_version.py +31 -38
  93. scitex/path/_mk_spath.py +26 -29
  94. scitex/path/_path.py +5 -12
  95. scitex/path/_split.py +27 -15
  96. scitex/path/_this_path.py +23 -9
  97. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
  98. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
  99. scitex/plt/gallery/_generate.py +76 -50
  100. scitex/plt/io/__init__.py +17 -19
  101. scitex/plt/io/_bundle.py +99 -52
  102. scitex/plt/io/_layered_bundle.py +303 -168
  103. scitex/plt/utils/_csv_column_naming.py +250 -118
  104. scitex/schema/__init__.py +69 -73
  105. scitex/schema/_canvas.py +1 -1
  106. scitex/schema/_stats.py +2 -2
  107. scitex/stats/__init__.py +30 -33
  108. scitex/stats/_schema.py +1 -1
  109. scitex/stats/io/__init__.py +10 -11
  110. scitex/stats/io/_bundle.py +16 -16
  111. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/METADATA +191 -72
  112. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/RECORD +237 -360
  113. scitex/fig/editor/_defaults.py +0 -300
  114. scitex/fig/editor/edit/panel_loader.py +0 -232
  115. scitex/fig/editor/flask_editor/_bbox.py +0 -1299
  116. scitex/fig/editor/flask_editor/_core.py +0 -1429
  117. scitex/fig/editor/flask_editor/_renderer.py +0 -813
  118. scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
  119. scitex/fts/README.md +0 -262
  120. scitex/fts/TODO.md +0 -66
  121. scitex/fts/__init__.py +0 -90
  122. scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
  123. scitex/fts/_bundle/__init__.py +0 -38
  124. scitex/fts/_bundle/_utils/__init__.py +0 -55
  125. scitex/fts/_bundle/_utils/_const.py +0 -26
  126. scitex/fts/_bundle/_utils/_errors.py +0 -73
  127. scitex/fts/_bundle/_utils/_generate.py +0 -21
  128. scitex/fts/_bundle/_utils/_types.py +0 -76
  129. scitex/fts/_bundle/_zipbundle.py +0 -165
  130. scitex/fts/_fig/__init__.py +0 -22
  131. scitex/fts/_fig/_backend/_parser.py +0 -188
  132. scitex/fts/_fig/_editor/__init__.py +0 -14
  133. scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
  134. scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
  135. scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
  136. scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
  137. scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
  138. scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
  139. scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
  140. scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
  141. scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
  142. scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
  143. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
  144. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
  145. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
  146. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
  147. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
  148. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
  149. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
  150. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
  151. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
  152. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
  153. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
  154. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
  155. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
  156. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
  157. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
  158. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
  159. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
  160. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
  161. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
  162. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
  163. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
  164. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
  165. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
  166. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
  167. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
  168. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
  169. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
  170. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
  171. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
  172. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
  173. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
  174. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
  175. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
  176. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
  177. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
  178. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
  179. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
  180. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
  181. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
  182. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
  183. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
  184. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
  185. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
  186. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
  187. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
  188. scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
  189. scitex/fts/_fig/_models/_Annotations.py +0 -115
  190. scitex/fts/_fig/_models/_Axes.py +0 -152
  191. scitex/fts/_fig/_models/_Figure.py +0 -138
  192. scitex/fts/_fig/_models/_Plot.py +0 -123
  193. scitex/fts/_fig/_utils/_plot_layout.py +0 -397
  194. scitex/fts/_kinds/_figure/_composite.py +0 -345
  195. scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
  196. scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
  197. scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
  198. scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
  199. scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
  200. scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
  201. scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
  202. scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
  203. scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
  204. scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
  205. scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
  206. scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
  207. scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
  208. scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
  209. scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
  210. scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
  211. scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
  212. scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
  213. scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
  214. scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
  215. scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
  216. scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
  217. scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
  218. scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
  219. scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
  220. scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
  221. scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
  222. scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
  223. scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
  224. scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
  225. scitex/fts/_kinds/_table/_latex/_export.py +0 -279
  226. scitex/fts/_stats/__init__.py +0 -48
  227. scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
  228. scitex/fts/_stats/_dataclasses/__init__.py +0 -48
  229. scitex/fts/_tables/__init__.py +0 -65
  230. scitex/fts/_tables/_latex/__init__.py +0 -93
  231. scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
  232. scitex/fts/_tables/_latex/_editor/_app.py +0 -725
  233. scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
  234. scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
  235. scitex/fts/_tables/_latex/_table_exporter.py +0 -362
  236. scitex/fts/_tables/_latex/_utils.py +0 -369
  237. scitex/fts/_tables/_latex/_validator.py +0 -445
  238. scitex/io/_save_modules/_pltz_bundle.py +0 -356
  239. /scitex/{fig → canvas}/README.md +0 -0
  240. /scitex/{fig → canvas}/backend/__init__.py +0 -0
  241. /scitex/{fig → canvas}/backend/_export.py +0 -0
  242. /scitex/{fig → canvas}/backend/_render.py +0 -0
  243. /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
  244. /scitex/{fig → canvas}/editor/__init__.py +0 -0
  245. /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
  246. /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
  247. /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
  248. /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
  249. /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
  250. /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
  251. /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
  252. /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
  253. /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
  254. /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
  255. /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
  256. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
  257. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
  258. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
  259. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
  260. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
  261. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
  262. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
  263. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
  264. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
  265. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
  266. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
  267. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
  268. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
  269. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
  270. /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
  271. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
  272. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
  273. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
  274. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
  275. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
  276. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
  277. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
  278. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
  279. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
  280. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
  281. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
  282. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
  283. /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
  284. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
  285. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
  286. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
  287. /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
  288. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
  289. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
  290. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
  291. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
  292. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
  293. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
  294. /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
  295. /scitex/{fig → canvas}/io/_directory.py +0 -0
  296. /scitex/{fig → canvas}/model/_plot_types.py +0 -0
  297. /scitex/{fig → canvas}/utils/_defaults.py +0 -0
  298. /scitex/{fig → canvas}/utils/_validate.py +0 -0
  299. /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
  300. /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
  301. /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
  302. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
  303. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
  304. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
  305. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
  306. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
  307. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
  308. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
  309. /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
  310. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
  311. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
  312. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
  313. /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
  314. /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
  315. /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
  316. /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
  317. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
  318. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
  319. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
  320. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
  321. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
  322. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
  323. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
  324. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
  325. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
  326. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
  327. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
  328. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
  329. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
  330. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
  331. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
  332. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
  333. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
  334. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
  335. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
  336. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
  337. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
  338. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
  339. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
  340. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
  341. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
  342. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
  343. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
  344. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
  345. /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
  346. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
  347. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
  348. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
  349. /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
  350. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
  351. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
  352. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
  353. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
  354. /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
  355. /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
  356. /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
  357. /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
  358. /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
  359. /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
  360. /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
  361. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/WHEEL +0 -0
  362. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/entry_points.txt +0 -0
  363. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,300 +0,0 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # File: ./src/scitex/vis/editor/_defaults.py
4
- """Default style settings for SciTeX visual editor."""
5
-
6
- from scitex.plt.styles import get_default_dpi, get_preview_dpi
7
-
8
-
9
- def get_scitex_defaults():
10
- """
11
- Get default style values based on SciTeX publication standards.
12
-
13
- Returns
14
- -------
15
- dict
16
- Dictionary of default style settings
17
- """
18
- return {
19
- # Font sizes (from _configure_mpl.py)
20
- "fontsize": 7, # Base font size for publication
21
- "title_fontsize": 8, # Title size
22
- "axis_fontsize": 7, # Axis label size
23
- "tick_fontsize": 7, # Tick label size
24
- "legend_fontsize": 6, # Legend font size
25
- # Line settings (in points, 1mm = 2.83465pt)
26
- "linewidth": 0.57, # Default line width (0.2mm)
27
- # Tick settings
28
- "n_ticks": 4, # Number of ticks
29
- "tick_length": 0.8, # Tick length in mm
30
- "tick_width": 0.2, # Tick width in mm
31
- "tick_direction": "out", # Tick direction
32
- # Axes settings
33
- "axis_width": 0.2, # Spine/axes line width in mm
34
- "hide_top_spine": True, # Hide top spine
35
- "hide_right_spine": True, # Hide right spine
36
- # Grid settings
37
- "grid": False, # Grid off by default
38
- "grid_linewidth": 0.6,
39
- "grid_alpha": 0.3,
40
- # Figure settings
41
- "dpi": get_default_dpi(), # From SCITEX_STYLE.yaml
42
- "fig_size": [3.15, 2.68], # Default figure size in inches
43
- # Colors (SciTeX defaults)
44
- "facecolor": "#ffffff", # White background
45
- "transparent": True, # Transparent background
46
- # Legend
47
- "legend_visible": True,
48
- "legend_frameon": False,
49
- "legend_loc": "best",
50
- # Font family
51
- "font_family": "Arial", # Sans-serif for publication
52
- # Annotations
53
- "annotations": [],
54
- }
55
-
56
-
57
- def get_scitex_colors():
58
- """
59
- Get SciTeX color palette.
60
-
61
- Returns
62
- -------
63
- dict
64
- Dictionary of named colors with hex values
65
- """
66
- # Based on scitex.plt.color.PARAMS
67
- return {
68
- "blue": "#1f77b4",
69
- "orange": "#ff7f0e",
70
- "green": "#2ca02c",
71
- "red": "#d62728",
72
- "purple": "#9467bd",
73
- "brown": "#8c564b",
74
- "pink": "#e377c2",
75
- "gray": "#7f7f7f",
76
- "olive": "#bcbd22",
77
- "cyan": "#17becf",
78
- # Additional publication colors
79
- "black": "#000000",
80
- "white": "#ffffff",
81
- "dark_gray": "#404040",
82
- "light_gray": "#d0d0d0",
83
- }
84
-
85
-
86
- def extract_defaults_from_metadata(metadata):
87
- """
88
- Extract style defaults from loaded figure metadata.
89
-
90
- Parameters
91
- ----------
92
- metadata : dict
93
- Figure metadata loaded from JSON
94
-
95
- Returns
96
- -------
97
- dict
98
- Dictionary of style values extracted from metadata
99
- """
100
- defaults = get_scitex_defaults()
101
-
102
- if not metadata:
103
- return defaults
104
-
105
- # Extract from scitex section (new format)
106
- scitex_meta = metadata.get("scitex", {})
107
- style_mm = scitex_meta.get("style_mm", {})
108
-
109
- # Font sizes from style_mm
110
- if "axis_font_size_pt" in style_mm:
111
- defaults["axis_fontsize"] = style_mm["axis_font_size_pt"]
112
- if "tick_font_size_pt" in style_mm:
113
- defaults["tick_fontsize"] = style_mm["tick_font_size_pt"]
114
- if "title_font_size_pt" in style_mm:
115
- defaults["title_fontsize"] = style_mm["title_font_size_pt"]
116
- if "legend_font_size_pt" in style_mm:
117
- defaults["legend_fontsize"] = style_mm["legend_font_size_pt"]
118
-
119
- # Line/axis thickness from metadata (in mm)
120
- if "trace_thickness_mm" in style_mm:
121
- defaults["linewidth"] = style_mm["trace_thickness_mm"] * 2.83465 # mm to pt
122
- if "axis_thickness_mm" in style_mm:
123
- defaults["axis_width"] = style_mm["axis_thickness_mm"]
124
- if "tick_length_mm" in style_mm:
125
- defaults["tick_length"] = style_mm["tick_length_mm"]
126
- if "tick_thickness_mm" in style_mm:
127
- defaults["tick_width"] = style_mm["tick_thickness_mm"]
128
- if "n_ticks" in style_mm:
129
- defaults["n_ticks"] = style_mm["n_ticks"]
130
-
131
- # Dimensions from metadata (support both old and new formats)
132
- dimensions = metadata.get("dimensions", {})
133
- if "dpi" in dimensions:
134
- defaults["dpi"] = dimensions["dpi"]
135
- if "figure_size_inch" in dimensions:
136
- defaults["fig_size"] = dimensions["figure_size_inch"]
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
-
148
- # Axis labels from metadata
149
- if "xlabel" in metadata:
150
- defaults["xlabel"] = metadata["xlabel"]
151
- if "ylabel" in metadata:
152
- defaults["ylabel"] = metadata["ylabel"]
153
- if "title" in metadata:
154
- defaults["title"] = metadata["title"]
155
-
156
- # Try to extract from axes if present
157
- axes = metadata.get("axes", {})
158
- if isinstance(axes, dict):
159
- # New format: {'x': {'label': ...}, 'y': {'label': ...}}
160
- x_axis = axes.get("x", {})
161
- y_axis = axes.get("y", {})
162
- if "label" in x_axis:
163
- unit = x_axis.get("unit", "")
164
- label = x_axis["label"]
165
- if unit:
166
- defaults["xlabel"] = f"{label} [{unit}]"
167
- else:
168
- defaults["xlabel"] = label
169
- if "label" in y_axis:
170
- unit = y_axis.get("unit", "")
171
- label = y_axis["label"]
172
- if unit:
173
- defaults["ylabel"] = f"{label} [{unit}]"
174
- else:
175
- defaults["ylabel"] = label
176
- # Extract axis limits
177
- if "lim" in x_axis:
178
- defaults["xlim"] = x_axis["lim"]
179
- if "lim" in y_axis:
180
- defaults["ylim"] = y_axis["lim"]
181
- elif isinstance(axes, list) and len(axes) > 0:
182
- # Legacy format: list of axes
183
- ax = axes[0]
184
- if "xlabel" in ax:
185
- defaults["xlabel"] = ax["xlabel"]
186
- if "ylabel" in ax:
187
- defaults["ylabel"] = ax["ylabel"]
188
- if "title" in ax:
189
- defaults["title"] = ax["title"]
190
- if "grid" in ax:
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"]
197
-
198
- # Extract traces information - check multiple possible locations
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
-
221
- if traces:
222
- defaults["traces"] = traces
223
-
224
- # Extract legend information from multiple possible locations
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
-
234
- if legend:
235
- defaults["legend_visible"] = legend.get("visible", True)
236
- defaults["legend_frameon"] = legend.get("frameon", False)
237
- # Support both old format (loc) and new format (location)
238
- loc = legend.get("location") or legend.get("loc", "best")
239
- # Convert numeric legend loc to string (matplotlib accepts both but GUI needs string)
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
- ]
259
-
260
- return defaults
261
-
262
-
263
- def _normalize_legend_loc(loc):
264
- """Convert legend location to string format for GUI compatibility.
265
-
266
- Matplotlib accepts both numeric codes and string locations for legends.
267
- This function ensures consistency by converting numeric codes to strings.
268
-
269
- Parameters
270
- ----------
271
- loc : int or str
272
- Legend location (numeric or string)
273
-
274
- Returns
275
- -------
276
- str
277
- String representation of legend location
278
- """
279
- if isinstance(loc, str):
280
- return loc
281
-
282
- # Numeric to string mapping (matplotlib legend location codes)
283
- loc_map = {
284
- 0: "best",
285
- 1: "upper right",
286
- 2: "upper left",
287
- 3: "lower left",
288
- 4: "lower right",
289
- 5: "right",
290
- 6: "center left",
291
- 7: "center right",
292
- 8: "lower center",
293
- 9: "upper center",
294
- 10: "center",
295
- }
296
-
297
- return loc_map.get(loc, "best")
298
-
299
-
300
- # EOF
@@ -1,232 +0,0 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Timestamp: "2025-12-14 (ywatanabe)"
4
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fig/editor/edit/panel_loader.py
5
-
6
- """Panel data loading for figure editor."""
7
-
8
- import io
9
- import json as json_module
10
- from pathlib import Path
11
- from typing import Optional, Union, Dict, Any
12
-
13
- __all__ = ["load_panel_data"]
14
-
15
-
16
- def load_panel_data(panel_path: Union[Path, str], is_zip: bool = None) -> Optional[Dict[str, Any]]:
17
- """
18
- Load panel data from either a .pltz.d directory or a .pltz zip file.
19
-
20
- Handles both formats transparently using in-memory reading for zips.
21
-
22
- Parameters
23
- ----------
24
- panel_path : Path or str
25
- Path to .pltz.d directory or .pltz zip file
26
- is_zip : bool, optional
27
- If True, treat as zip file. If False, treat as directory.
28
- If None, auto-detect based on path suffix and existence.
29
-
30
- Returns
31
- -------
32
- dict or None
33
- Dictionary with keys: metadata, csv_data, png_bytes, hitmap_bytes, img_size
34
- For directories, also includes: json_path, png_path, hitmap_path
35
- Returns None if panel cannot be loaded
36
- """
37
- from PIL import Image
38
-
39
- panel_path = Path(panel_path)
40
-
41
- # Auto-detect if not specified
42
- if is_zip is None:
43
- spath = str(panel_path)
44
- if spath.endswith('.pltz') and not spath.endswith('.pltz.d'):
45
- is_zip = panel_path.is_file()
46
- else:
47
- is_zip = False
48
-
49
- if is_zip:
50
- return _load_from_zip(panel_path)
51
- else:
52
- return _load_from_directory(panel_path)
53
-
54
-
55
- def _load_from_zip(panel_path: Path) -> Optional[Dict[str, Any]]:
56
- """Load panel data from a .pltz zip file."""
57
- from PIL import Image
58
- from scitex.io.bundle import ZipBundle
59
-
60
- if not panel_path.exists():
61
- return None
62
-
63
- try:
64
- with ZipBundle(panel_path, mode="r") as zb:
65
- # Load spec.json for metadata
66
- try:
67
- metadata = zb.read_json("spec.json")
68
- except FileNotFoundError:
69
- metadata = {}
70
-
71
- # Load style.json if exists
72
- try:
73
- style = zb.read_json("style.json")
74
- metadata["style"] = style
75
- except FileNotFoundError:
76
- pass
77
-
78
- # Find and read PNG
79
- png_bytes = None
80
- for name in zb.namelist():
81
- if name.endswith('.png') and '_hitmap' not in name and '_overview' not in name:
82
- if 'exports/' in name:
83
- png_bytes = zb.read_bytes(name)
84
- break
85
-
86
- # If no PNG in exports/, try root level
87
- if not png_bytes:
88
- for name in zb.namelist():
89
- if name.endswith('.png') and '_hitmap' not in name and '_overview' not in name:
90
- png_bytes = zb.read_bytes(name)
91
- break
92
-
93
- # Get image size
94
- img_size = None
95
- if png_bytes:
96
- img = Image.open(io.BytesIO(png_bytes))
97
- img_size = {"width": img.size[0], "height": img.size[1]}
98
- img.close()
99
-
100
- # Find and read hitmap
101
- hitmap_bytes = None
102
- for name in zb.namelist():
103
- if '_hitmap.png' in name:
104
- hitmap_bytes = zb.read_bytes(name)
105
- break
106
-
107
- # Load geometry_px.json if available
108
- geometry_data = None
109
- try:
110
- geometry_data = zb.read_json("cache/geometry_px.json")
111
- except FileNotFoundError:
112
- pass
113
-
114
- return {
115
- "metadata": metadata,
116
- "png_bytes": png_bytes,
117
- "hitmap_bytes": hitmap_bytes,
118
- "img_size": img_size,
119
- "geometry_data": geometry_data,
120
- "is_zip": True,
121
- }
122
- except Exception as e:
123
- print(f"Error loading panel zip {panel_path}: {e}")
124
- return None
125
-
126
-
127
- def _load_from_directory(panel_path: Path) -> Optional[Dict[str, Any]]:
128
- """Load panel data from a .pltz.d directory."""
129
- import scitex as stx
130
-
131
- panel_dir = panel_path
132
- if not panel_dir.exists():
133
- return None
134
-
135
- # Check for layered vs legacy format
136
- spec_path = panel_dir / "spec.json"
137
- if spec_path.exists():
138
- return _load_layered_directory(panel_dir)
139
- else:
140
- return _load_legacy_directory(panel_dir)
141
-
142
-
143
- def _load_layered_directory(panel_dir: Path) -> Dict[str, Any]:
144
- """Load panel data from layered format directory."""
145
- import scitex as stx
146
- from scitex.plt.io import load_layered_pltz_bundle
147
-
148
- bundle_data = load_layered_pltz_bundle(panel_dir)
149
- metadata = bundle_data.get("merged", {})
150
-
151
- # Find CSV
152
- csv_data = None
153
- for f in panel_dir.glob("*.csv"):
154
- csv_data = stx.io.load(f)
155
- break
156
-
157
- # Find exports - prefer PNG over SVG (PIL can't open SVG)
158
- png_path = None
159
- svg_path = None
160
- hitmap_path = None
161
- exports_dir = panel_dir / "exports"
162
- if exports_dir.exists():
163
- for f in exports_dir.iterdir():
164
- name = f.name
165
- if name.endswith('_hitmap.png'):
166
- hitmap_path = f
167
- elif name.endswith('.png') and '_hitmap' not in name and '_overview' not in name:
168
- png_path = f
169
- elif name.endswith('.svg') and '_hitmap' not in name and svg_path is None:
170
- svg_path = f
171
-
172
- if png_path is None:
173
- png_path = svg_path
174
-
175
- # Load geometry_px.json if available
176
- geometry_data = None
177
- geometry_path = panel_dir / "cache" / "geometry_px.json"
178
- if geometry_path.exists():
179
- with open(geometry_path) as f:
180
- geometry_data = json_module.load(f)
181
-
182
- return {
183
- "json_path": panel_dir / "spec.json",
184
- "metadata": metadata,
185
- "csv_data": csv_data,
186
- "png_path": png_path,
187
- "hitmap_path": hitmap_path,
188
- "geometry_data": geometry_data,
189
- "is_zip": False,
190
- }
191
-
192
-
193
- def _load_legacy_directory(panel_dir: Path) -> Optional[Dict[str, Any]]:
194
- """Load panel data from legacy format directory."""
195
- import scitex as stx
196
-
197
- json_path = None
198
- csv_data = None
199
- png_path = None
200
- hitmap_path = None
201
-
202
- for f in panel_dir.iterdir():
203
- name = f.name
204
- if name.endswith('.json') and not name.endswith('.manual.json'):
205
- json_path = f
206
- elif name.endswith('.csv'):
207
- csv_data = stx.io.load(f)
208
- elif name.endswith('_hitmap.png'):
209
- hitmap_path = f
210
- elif name.endswith('.svg') and '_hitmap' not in name:
211
- png_path = f
212
- elif name.endswith('.png') and '_hitmap' not in name and '_overview' not in name:
213
- if png_path is None:
214
- png_path = f
215
-
216
- if json_path is None:
217
- return None
218
-
219
- with open(json_path, 'r') as f:
220
- metadata = json_module.load(f)
221
-
222
- return {
223
- "json_path": json_path,
224
- "metadata": metadata,
225
- "csv_data": csv_data,
226
- "png_path": png_path,
227
- "hitmap_path": hitmap_path,
228
- "is_zip": False,
229
- }
230
-
231
-
232
- # EOF