scitex 2.10.3__py3-none-any.whl → 2.13.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 (504) hide show
  1. scitex/__init__.py +1 -4
  2. scitex/__main__.py +24 -5
  3. scitex/__version__.py +1 -1
  4. scitex/_install_guide.py +14 -2
  5. scitex/_optional_deps.py +33 -0
  6. scitex/ai/classification/reporters/_ClassificationReporter.py +1 -1
  7. scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +2 -2
  8. scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +2 -2
  9. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +2 -2
  10. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +2 -2
  11. scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +2 -2
  12. scitex/ai/classification/timeseries/_normalize_timestamp.py +1 -1
  13. scitex/ai/metrics/_calc_seizure_prediction_metrics.py +1 -1
  14. scitex/ai/plt/_plot_feature_importance.py +1 -1
  15. scitex/ai/plt/_plot_learning_curve.py +1 -1
  16. scitex/ai/plt/_plot_optuna_study.py +1 -1
  17. scitex/ai/plt/_plot_pre_rec_curve.py +1 -1
  18. scitex/ai/plt/_plot_roc_curve.py +1 -1
  19. scitex/ai/plt/_stx_conf_mat.py +1 -1
  20. scitex/ai/training/_LearningCurveLogger.py +1 -1
  21. scitex/audio/mcp_server.py +38 -8
  22. scitex/bridge/_figrecipe.py +1 -1
  23. scitex/bridge/_helpers.py +1 -1
  24. scitex/bridge/_plt_vis.py +1 -1
  25. scitex/bridge/_stats_plt.py +1 -1
  26. scitex/bridge/_stats_vis.py +2 -2
  27. scitex/browser/automation/CookieHandler.py +1 -1
  28. scitex/browser/core/BrowserMixin.py +1 -1
  29. scitex/browser/core/ChromeProfileManager.py +1 -1
  30. scitex/browser/debugging/_browser_logger.py +1 -1
  31. scitex/browser/debugging/_highlight_element.py +1 -1
  32. scitex/browser/debugging/_show_grid.py +1 -1
  33. scitex/browser/interaction/click_center.py +1 -1
  34. scitex/browser/interaction/click_with_fallbacks.py +1 -1
  35. scitex/browser/interaction/close_popups.py +1 -1
  36. scitex/browser/interaction/fill_with_fallbacks.py +1 -1
  37. scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +1 -1
  38. scitex/browser/pdf/detect_chrome_pdf_viewer.py +1 -1
  39. scitex/browser/stealth/HumanBehavior.py +1 -1
  40. scitex/browser/stealth/StealthManager.py +1 -1
  41. scitex/{fig → canvas}/__init__.py +84 -96
  42. scitex/canvas/_mcp_handlers.py +372 -0
  43. scitex/canvas/_mcp_tool_schemas.py +219 -0
  44. scitex/{fig → canvas}/backend/_parser.py +1 -1
  45. scitex/{fig → canvas}/canvas.py +13 -14
  46. scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
  47. scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
  48. scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
  49. scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
  50. scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
  51. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
  52. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
  53. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
  54. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
  55. scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
  56. scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
  57. scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
  58. scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
  59. scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
  60. scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
  61. scitex/{fig → canvas}/io/__init__.py +32 -38
  62. scitex/{fig → canvas}/io/_bundle.py +217 -154
  63. scitex/{fig → canvas}/io/_canvas.py +1 -1
  64. scitex/{fig → canvas}/io/_data.py +1 -1
  65. scitex/{fig → canvas}/io/_export.py +1 -1
  66. scitex/{fig → canvas}/io/_load.py +1 -1
  67. scitex/{fig → canvas}/io/_panel.py +1 -1
  68. scitex/{fig → canvas}/io/_save.py +1 -1
  69. scitex/canvas/mcp_server.py +151 -0
  70. scitex/{fig → canvas}/model/__init__.py +1 -1
  71. scitex/{fig → canvas}/model/_annotations.py +1 -1
  72. scitex/{fig → canvas}/model/_axes.py +1 -1
  73. scitex/{fig → canvas}/model/_figure.py +1 -1
  74. scitex/{fig → canvas}/model/_guides.py +1 -1
  75. scitex/{fig → canvas}/model/_plot.py +1 -1
  76. scitex/{fig → canvas}/model/_styles.py +1 -1
  77. scitex/{fig → canvas}/utils/__init__.py +1 -1
  78. scitex/capture/mcp_server.py +41 -12
  79. scitex/cli/audio.py +233 -0
  80. scitex/cli/capture.py +307 -0
  81. scitex/cli/convert.py +10 -6
  82. scitex/cli/main.py +27 -4
  83. scitex/cli/repro.py +233 -0
  84. scitex/cli/resource.py +240 -0
  85. scitex/cli/stats.py +325 -0
  86. scitex/cli/template.py +236 -0
  87. scitex/cli/tex.py +286 -0
  88. scitex/cli/web.py +11 -12
  89. scitex/dev/__init__.py +3 -0
  90. scitex/dev/_pyproject.py +405 -0
  91. scitex/dev/plt/__init__.py +2 -2
  92. scitex/dev/plt/mpl/get_dir_ax.py +1 -1
  93. scitex/dev/plt/mpl/get_signatures.py +1 -1
  94. scitex/dev/plt/mpl/get_signatures_details.py +1 -1
  95. scitex/diagram/README.md +7 -7
  96. scitex/diagram/_mcp_handlers.py +400 -0
  97. scitex/diagram/_mcp_tool_schemas.py +157 -0
  98. scitex/diagram/mcp_server.py +151 -0
  99. scitex/dsp/_demo_sig.py +51 -5
  100. scitex/dsp/_mne.py +13 -2
  101. scitex/dsp/_modulation_index.py +15 -3
  102. scitex/dsp/_pac.py +23 -5
  103. scitex/dsp/_psd.py +16 -4
  104. scitex/dsp/_resample.py +24 -4
  105. scitex/dsp/_transform.py +16 -3
  106. scitex/dsp/add_noise.py +15 -1
  107. scitex/dsp/norm.py +17 -2
  108. scitex/dsp/reference.py +17 -1
  109. scitex/dsp/utils/_differential_bandpass_filters.py +20 -2
  110. scitex/dsp/utils/_zero_pad.py +18 -4
  111. scitex/dt/_normalize_timestamp.py +1 -1
  112. scitex/git/_session.py +1 -1
  113. scitex/io/__init__.py +7 -19
  114. scitex/io/_load.py +15 -19
  115. scitex/io/_load_modules/_canvas.py +2 -2
  116. scitex/io/_load_modules/_con.py +17 -6
  117. scitex/io/_load_modules/_eeg.py +28 -13
  118. scitex/io/_load_modules/_optuna.py +21 -63
  119. scitex/io/_load_modules/_torch.py +11 -3
  120. scitex/io/_save.py +11 -16
  121. scitex/io/_save_modules/__init__.py +6 -10
  122. scitex/io/_save_modules/_canvas.py +3 -3
  123. scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +13 -2
  124. scitex/io/_save_modules/_plot_bundle.py +112 -0
  125. scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
  126. scitex/io/_save_modules/_stx_bundle.py +16 -16
  127. scitex/io/_save_modules/_torch.py +11 -3
  128. scitex/io/bundle/README.md +89 -80
  129. scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
  130. scitex/io/bundle/__init__.py +67 -35
  131. scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
  132. scitex/io/bundle/_core.py +184 -97
  133. scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
  134. scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
  135. scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
  136. scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
  137. scitex/io/bundle/_manifest.py +99 -0
  138. scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
  139. scitex/io/bundle/_nested.py +113 -100
  140. scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
  141. scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
  142. scitex/io/bundle/_types.py +41 -16
  143. scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
  144. scitex/io/bundle/_zip.py +21 -31
  145. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
  146. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
  147. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
  148. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
  149. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
  150. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
  151. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
  152. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
  153. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
  154. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
  155. scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
  156. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
  157. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
  158. scitex/io/bundle/schemas/__init__.py +30 -0
  159. scitex/mcp_server.py +159 -0
  160. scitex/parallel/_run.py +5 -4
  161. scitex/path/_find.py +60 -83
  162. scitex/path/_get_module_path.py +23 -21
  163. scitex/path/_get_spath.py +6 -27
  164. scitex/path/_getsize.py +23 -9
  165. scitex/path/_increment_version.py +31 -38
  166. scitex/path/_mk_spath.py +26 -29
  167. scitex/path/_path.py +5 -12
  168. scitex/path/_split.py +27 -15
  169. scitex/path/_this_path.py +23 -9
  170. scitex/plt/_mcp_handlers.py +361 -0
  171. scitex/plt/_mcp_tool_schemas.py +169 -0
  172. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
  173. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
  174. scitex/plt/gallery/_generate.py +76 -50
  175. scitex/plt/io/__init__.py +17 -19
  176. scitex/plt/io/_bundle.py +99 -52
  177. scitex/plt/io/_layered_bundle.py +303 -168
  178. scitex/plt/mcp_server.py +205 -0
  179. scitex/plt/utils/_csv_column_naming.py +250 -118
  180. scitex/repro/README_RandomStateManager.md +3 -3
  181. scitex/repro/_RandomStateManager.py +14 -14
  182. scitex/repro/_gen_ID.py +1 -1
  183. scitex/repro/_gen_timestamp.py +1 -1
  184. scitex/repro/_hash_array.py +4 -4
  185. scitex/schema/__init__.py +69 -73
  186. scitex/schema/_canvas.py +1 -1
  187. scitex/schema/_stats.py +2 -2
  188. scitex/scholar/__main__.py +24 -2
  189. scitex/scholar/_mcp_handlers.py +685 -0
  190. scitex/scholar/_mcp_tool_schemas.py +339 -0
  191. scitex/scholar/docs/template.py +1 -1
  192. scitex/scholar/examples/07_storage_integration.py +1 -1
  193. scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +1 -1
  194. scitex/scholar/impact_factor/jcr/build_database.py +1 -1
  195. scitex/scholar/mcp_server.py +315 -0
  196. scitex/scholar/pdf_download/ScholarPDFDownloader.py +1 -1
  197. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +1 -1
  198. scitex/scholar/pipelines/ScholarPipelineParallel.py +1 -1
  199. scitex/scholar/pipelines/ScholarPipelineSingle.py +1 -1
  200. scitex/scholar/storage/PaperIO.py +1 -1
  201. scitex/session/README.md +4 -4
  202. scitex/session/__init__.py +1 -1
  203. scitex/session/_decorator.py +9 -9
  204. scitex/session/_lifecycle.py +5 -5
  205. scitex/session/template.py +1 -1
  206. scitex/stats/__init__.py +30 -33
  207. scitex/stats/__main__.py +281 -0
  208. scitex/stats/_mcp_handlers.py +1191 -0
  209. scitex/stats/_mcp_tool_schemas.py +384 -0
  210. scitex/stats/_schema.py +1 -1
  211. scitex/stats/correct/_correct_bonferroni.py +1 -1
  212. scitex/stats/correct/_correct_fdr.py +1 -1
  213. scitex/stats/correct/_correct_fdr_.py +1 -1
  214. scitex/stats/correct/_correct_holm.py +1 -1
  215. scitex/stats/correct/_correct_sidak.py +1 -1
  216. scitex/stats/effect_sizes/_cliffs_delta.py +1 -1
  217. scitex/stats/effect_sizes/_cohens_d.py +1 -1
  218. scitex/stats/effect_sizes/_epsilon_squared.py +1 -1
  219. scitex/stats/effect_sizes/_eta_squared.py +1 -1
  220. scitex/stats/effect_sizes/_prob_superiority.py +1 -1
  221. scitex/stats/io/__init__.py +10 -11
  222. scitex/stats/io/_bundle.py +16 -16
  223. scitex/stats/mcp_server.py +405 -0
  224. scitex/stats/posthoc/_dunnett.py +1 -1
  225. scitex/stats/posthoc/_games_howell.py +1 -1
  226. scitex/stats/posthoc/_tukey_hsd.py +1 -1
  227. scitex/stats/power/_power.py +1 -1
  228. scitex/stats/utils/_effect_size.py +1 -1
  229. scitex/stats/utils/_formatters.py +1 -1
  230. scitex/stats/utils/_power.py +1 -1
  231. scitex/template/_mcp_handlers.py +259 -0
  232. scitex/template/_mcp_tool_schemas.py +112 -0
  233. scitex/template/mcp_server.py +186 -0
  234. scitex/utils/_verify_scitex_format.py +2 -2
  235. scitex/utils/template.py +1 -1
  236. scitex/web/__init__.py +12 -11
  237. scitex/web/_scraping.py +26 -265
  238. scitex/web/download_images.py +316 -0
  239. scitex/writer/Writer.py +1 -1
  240. scitex/writer/_clone_writer_project.py +1 -1
  241. scitex/writer/_validate_tree_structures.py +1 -1
  242. scitex/writer/dataclasses/config/_WriterConfig.py +1 -1
  243. scitex/writer/dataclasses/contents/_ManuscriptContents.py +1 -1
  244. scitex/writer/dataclasses/core/_Document.py +1 -1
  245. scitex/writer/dataclasses/core/_DocumentSection.py +1 -1
  246. scitex/writer/dataclasses/results/_CompilationResult.py +1 -1
  247. scitex/writer/dataclasses/results/_LaTeXIssue.py +1 -1
  248. scitex/writer/utils/.legacy_git_retry.py +7 -5
  249. scitex/writer/utils/_parse_latex_logs.py +1 -1
  250. scitex-2.13.0.dist-info/METADATA +1231 -0
  251. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/RECORD +376 -470
  252. scitex-2.13.0.dist-info/entry_points.txt +11 -0
  253. scitex/fig/editor/_defaults.py +0 -300
  254. scitex/fig/editor/edit/panel_loader.py +0 -232
  255. scitex/fig/editor/flask_editor/_bbox.py +0 -1299
  256. scitex/fig/editor/flask_editor/_core.py +0 -1429
  257. scitex/fig/editor/flask_editor/_renderer.py +0 -813
  258. scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
  259. scitex/fts/README.md +0 -262
  260. scitex/fts/TODO.md +0 -66
  261. scitex/fts/__init__.py +0 -90
  262. scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
  263. scitex/fts/_bundle/__init__.py +0 -38
  264. scitex/fts/_bundle/_utils/__init__.py +0 -55
  265. scitex/fts/_bundle/_utils/_const.py +0 -26
  266. scitex/fts/_bundle/_utils/_errors.py +0 -73
  267. scitex/fts/_bundle/_utils/_generate.py +0 -21
  268. scitex/fts/_bundle/_utils/_types.py +0 -76
  269. scitex/fts/_bundle/_zipbundle.py +0 -165
  270. scitex/fts/_fig/__init__.py +0 -22
  271. scitex/fts/_fig/_backend/_parser.py +0 -188
  272. scitex/fts/_fig/_editor/__init__.py +0 -14
  273. scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
  274. scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
  275. scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
  276. scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
  277. scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
  278. scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
  279. scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
  280. scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
  281. scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
  282. scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
  283. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
  284. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
  285. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
  286. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
  287. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
  288. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
  289. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
  290. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
  291. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
  292. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
  293. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
  294. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
  295. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
  296. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
  297. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
  298. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
  299. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
  300. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
  301. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
  302. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
  303. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
  304. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
  305. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
  306. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
  307. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
  308. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
  309. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
  310. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
  311. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
  312. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
  313. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
  314. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
  315. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
  316. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
  317. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
  318. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
  319. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
  320. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
  321. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
  322. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
  323. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
  324. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
  325. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
  326. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
  327. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
  328. scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
  329. scitex/fts/_fig/_models/_Annotations.py +0 -115
  330. scitex/fts/_fig/_models/_Axes.py +0 -152
  331. scitex/fts/_fig/_models/_Figure.py +0 -138
  332. scitex/fts/_fig/_models/_Plot.py +0 -123
  333. scitex/fts/_fig/_utils/_plot_layout.py +0 -397
  334. scitex/fts/_kinds/_figure/_composite.py +0 -345
  335. scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
  336. scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
  337. scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
  338. scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
  339. scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
  340. scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
  341. scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
  342. scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
  343. scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
  344. scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
  345. scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
  346. scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
  347. scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
  348. scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
  349. scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
  350. scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
  351. scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
  352. scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
  353. scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
  354. scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
  355. scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
  356. scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
  357. scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
  358. scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
  359. scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
  360. scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
  361. scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
  362. scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
  363. scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
  364. scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
  365. scitex/fts/_kinds/_table/_latex/_export.py +0 -279
  366. scitex/fts/_stats/__init__.py +0 -48
  367. scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
  368. scitex/fts/_stats/_dataclasses/__init__.py +0 -48
  369. scitex/fts/_tables/__init__.py +0 -65
  370. scitex/fts/_tables/_latex/__init__.py +0 -93
  371. scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
  372. scitex/fts/_tables/_latex/_editor/_app.py +0 -725
  373. scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
  374. scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
  375. scitex/fts/_tables/_latex/_table_exporter.py +0 -362
  376. scitex/fts/_tables/_latex/_utils.py +0 -369
  377. scitex/fts/_tables/_latex/_validator.py +0 -445
  378. scitex/io/_save_modules/_pltz_bundle.py +0 -356
  379. scitex-2.10.3.dist-info/METADATA +0 -952
  380. scitex-2.10.3.dist-info/entry_points.txt +0 -2
  381. /scitex/{fig → canvas}/README.md +0 -0
  382. /scitex/{fig → canvas}/backend/__init__.py +0 -0
  383. /scitex/{fig → canvas}/backend/_export.py +0 -0
  384. /scitex/{fig → canvas}/backend/_render.py +0 -0
  385. /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
  386. /scitex/{fig → canvas}/editor/__init__.py +0 -0
  387. /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
  388. /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
  389. /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
  390. /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
  391. /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
  392. /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
  393. /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
  394. /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
  395. /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
  396. /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
  397. /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
  398. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
  399. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
  400. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
  401. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
  402. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
  403. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
  404. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
  405. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
  406. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
  407. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
  408. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
  409. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
  410. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
  411. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
  412. /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
  413. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
  414. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
  415. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
  416. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
  417. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
  418. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
  419. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
  420. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
  421. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
  422. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
  423. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
  424. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
  425. /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
  426. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
  427. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
  428. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
  429. /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
  430. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
  431. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
  432. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
  433. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
  434. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
  435. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
  436. /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
  437. /scitex/{fig → canvas}/io/_directory.py +0 -0
  438. /scitex/{fig → canvas}/model/_plot_types.py +0 -0
  439. /scitex/{fig → canvas}/utils/_defaults.py +0 -0
  440. /scitex/{fig → canvas}/utils/_validate.py +0 -0
  441. /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
  442. /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
  443. /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
  444. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
  445. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
  446. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
  447. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
  448. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
  449. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
  450. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
  451. /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
  452. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
  453. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
  454. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
  455. /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
  456. /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
  457. /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
  458. /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
  459. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
  460. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
  461. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
  462. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
  463. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
  464. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
  465. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
  466. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
  467. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
  468. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
  469. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
  470. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
  471. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
  472. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
  473. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
  474. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
  475. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
  476. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
  477. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
  478. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
  479. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
  480. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
  481. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
  482. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
  483. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
  484. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
  485. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
  486. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
  487. /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
  488. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
  489. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
  490. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
  491. /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
  492. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
  493. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
  494. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
  495. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
  496. /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
  497. /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
  498. /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
  499. /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
  500. /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
  501. /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
  502. /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
  503. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/WHEEL +0 -0
  504. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,11 @@
1
+ [console_scripts]
2
+ scitex = scitex.__main__:main
3
+ scitex-audio = scitex.audio.mcp_server:main
4
+ scitex-canvas = scitex.canvas.mcp_server:main
5
+ scitex-capture = scitex.capture.mcp_server:main
6
+ scitex-diagram = scitex.diagram.mcp_server:main
7
+ scitex-mcp-server = scitex.mcp_server:main
8
+ scitex-plt = scitex.plt.mcp_server:main
9
+ scitex-scholar = scitex.scholar.mcp_server:main
10
+ scitex-stats = scitex.stats.mcp_server:main
11
+ scitex-template = scitex.template.mcp_server:main
@@ -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