scitex 2.10.3__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.
- scitex/__init__.py +1 -4
- scitex/__version__.py +1 -1
- scitex/_install_guide.py +14 -2
- scitex/bridge/_figrecipe.py +1 -1
- scitex/bridge/_helpers.py +1 -1
- scitex/bridge/_plt_vis.py +1 -1
- scitex/bridge/_stats_plt.py +1 -1
- scitex/bridge/_stats_vis.py +2 -2
- scitex/{fig → canvas}/__init__.py +84 -96
- scitex/{fig → canvas}/backend/_parser.py +1 -1
- scitex/{fig → canvas}/canvas.py +13 -14
- scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
- scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
- scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
- scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
- scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
- scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
- scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
- scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
- scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
- scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
- scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
- scitex/{fig → canvas}/io/__init__.py +32 -38
- scitex/{fig → canvas}/io/_bundle.py +217 -154
- scitex/{fig → canvas}/io/_canvas.py +1 -1
- scitex/{fig → canvas}/io/_data.py +1 -1
- scitex/{fig → canvas}/io/_export.py +1 -1
- scitex/{fig → canvas}/io/_load.py +1 -1
- scitex/{fig → canvas}/io/_panel.py +1 -1
- scitex/{fig → canvas}/io/_save.py +1 -1
- scitex/{fig → canvas}/model/__init__.py +1 -1
- scitex/{fig → canvas}/model/_annotations.py +1 -1
- scitex/{fig → canvas}/model/_axes.py +1 -1
- scitex/{fig → canvas}/model/_figure.py +1 -1
- scitex/{fig → canvas}/model/_guides.py +1 -1
- scitex/{fig → canvas}/model/_plot.py +1 -1
- scitex/{fig → canvas}/model/_styles.py +1 -1
- scitex/{fig → canvas}/utils/__init__.py +1 -1
- scitex/cli/convert.py +10 -6
- scitex/diagram/README.md +7 -7
- scitex/io/__init__.py +7 -19
- scitex/io/_load.py +15 -19
- scitex/io/_load_modules/_canvas.py +2 -2
- scitex/io/_load_modules/_con.py +5 -5
- scitex/io/_load_modules/_eeg.py +16 -12
- scitex/io/_save.py +11 -16
- scitex/io/_save_modules/__init__.py +6 -10
- scitex/io/_save_modules/_canvas.py +3 -3
- scitex/io/_save_modules/_plot_bundle.py +112 -0
- scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
- scitex/io/_save_modules/_stx_bundle.py +16 -16
- scitex/io/bundle/README.md +89 -80
- scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
- scitex/io/bundle/__init__.py +67 -35
- scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
- scitex/io/bundle/_core.py +184 -97
- scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
- scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
- scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
- scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
- scitex/io/bundle/_manifest.py +99 -0
- scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
- scitex/io/bundle/_nested.py +113 -100
- scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
- scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
- scitex/io/bundle/_types.py +41 -16
- scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
- scitex/io/bundle/_zip.py +21 -31
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
- scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
- scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
- scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
- scitex/io/bundle/schemas/__init__.py +30 -0
- scitex/parallel/_run.py +5 -4
- scitex/path/_find.py +60 -83
- scitex/path/_get_module_path.py +23 -21
- scitex/path/_get_spath.py +6 -27
- scitex/path/_getsize.py +23 -9
- scitex/path/_increment_version.py +31 -38
- scitex/path/_mk_spath.py +26 -29
- scitex/path/_path.py +5 -12
- scitex/path/_split.py +27 -15
- scitex/path/_this_path.py +23 -9
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
- scitex/plt/gallery/_generate.py +76 -50
- scitex/plt/io/__init__.py +17 -19
- scitex/plt/io/_bundle.py +99 -52
- scitex/plt/io/_layered_bundle.py +303 -168
- scitex/plt/utils/_csv_column_naming.py +250 -118
- scitex/schema/__init__.py +69 -73
- scitex/schema/_canvas.py +1 -1
- scitex/schema/_stats.py +2 -2
- scitex/stats/__init__.py +30 -33
- scitex/stats/_schema.py +1 -1
- scitex/stats/io/__init__.py +10 -11
- scitex/stats/io/_bundle.py +16 -16
- {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/METADATA +190 -73
- {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/RECORD +237 -360
- scitex/fig/editor/_defaults.py +0 -300
- scitex/fig/editor/edit/panel_loader.py +0 -232
- scitex/fig/editor/flask_editor/_bbox.py +0 -1299
- scitex/fig/editor/flask_editor/_core.py +0 -1429
- scitex/fig/editor/flask_editor/_renderer.py +0 -813
- scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
- scitex/fts/README.md +0 -262
- scitex/fts/TODO.md +0 -66
- scitex/fts/__init__.py +0 -90
- scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
- scitex/fts/_bundle/__init__.py +0 -38
- scitex/fts/_bundle/_utils/__init__.py +0 -55
- scitex/fts/_bundle/_utils/_const.py +0 -26
- scitex/fts/_bundle/_utils/_errors.py +0 -73
- scitex/fts/_bundle/_utils/_generate.py +0 -21
- scitex/fts/_bundle/_utils/_types.py +0 -76
- scitex/fts/_bundle/_zipbundle.py +0 -165
- scitex/fts/_fig/__init__.py +0 -22
- scitex/fts/_fig/_backend/_parser.py +0 -188
- scitex/fts/_fig/_editor/__init__.py +0 -14
- scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
- scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
- scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
- scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
- scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
- scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
- scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
- scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
- scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
- scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
- scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
- scitex/fts/_fig/_models/_Annotations.py +0 -115
- scitex/fts/_fig/_models/_Axes.py +0 -152
- scitex/fts/_fig/_models/_Figure.py +0 -138
- scitex/fts/_fig/_models/_Plot.py +0 -123
- scitex/fts/_fig/_utils/_plot_layout.py +0 -397
- scitex/fts/_kinds/_figure/_composite.py +0 -345
- scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
- scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
- scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
- scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
- scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
- scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
- scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
- scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
- scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
- scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
- scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
- scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
- scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
- scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
- scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
- scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
- scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
- scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
- scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
- scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
- scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
- scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
- scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
- scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
- scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
- scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
- scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
- scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
- scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
- scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
- scitex/fts/_kinds/_table/_latex/_export.py +0 -279
- scitex/fts/_stats/__init__.py +0 -48
- scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
- scitex/fts/_stats/_dataclasses/__init__.py +0 -48
- scitex/fts/_tables/__init__.py +0 -65
- scitex/fts/_tables/_latex/__init__.py +0 -93
- scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
- scitex/fts/_tables/_latex/_editor/_app.py +0 -725
- scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
- scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
- scitex/fts/_tables/_latex/_table_exporter.py +0 -362
- scitex/fts/_tables/_latex/_utils.py +0 -369
- scitex/fts/_tables/_latex/_validator.py +0 -445
- scitex/io/_save_modules/_pltz_bundle.py +0 -356
- /scitex/{fig → canvas}/README.md +0 -0
- /scitex/{fig → canvas}/backend/__init__.py +0 -0
- /scitex/{fig → canvas}/backend/_export.py +0 -0
- /scitex/{fig → canvas}/backend/_render.py +0 -0
- /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
- /scitex/{fig → canvas}/editor/__init__.py +0 -0
- /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
- /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
- /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
- /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
- /scitex/{fig → canvas}/io/_directory.py +0 -0
- /scitex/{fig → canvas}/model/_plot_types.py +0 -0
- /scitex/{fig → canvas}/utils/_defaults.py +0 -0
- /scitex/{fig → canvas}/utils/_validate.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
- {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/WHEEL +0 -0
- {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/entry_points.txt +0 -0
- {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -3,27 +3,31 @@
|
|
|
3
3
|
# Timestamp: "2025-12-14 (ywatanabe)"
|
|
4
4
|
# File: /home/ywatanabe/proj/scitex-code/src/scitex/fig/editor/edit/bundle_resolver.py
|
|
5
5
|
|
|
6
|
-
"""Bundle path resolution for .
|
|
6
|
+
"""Bundle path resolution for .plot and .figure formats."""
|
|
7
7
|
|
|
8
8
|
import json as json_module
|
|
9
9
|
import tempfile
|
|
10
10
|
import zipfile
|
|
11
11
|
from pathlib import Path
|
|
12
|
-
from typing import
|
|
12
|
+
from typing import Any, Dict, Optional, Tuple
|
|
13
13
|
|
|
14
|
-
__all__ = [
|
|
14
|
+
__all__ = [
|
|
15
|
+
"resolve_plot_bundle",
|
|
16
|
+
"resolve_figure_bundle",
|
|
17
|
+
"resolve_layered_plot_bundle",
|
|
18
|
+
]
|
|
15
19
|
|
|
16
20
|
|
|
17
|
-
def
|
|
21
|
+
def resolve_figure_bundle(path: Path, panel_index: int = 0) -> Tuple:
|
|
18
22
|
"""
|
|
19
|
-
Resolve paths from a .
|
|
23
|
+
Resolve paths from a .figure bundle (multi-panel figure).
|
|
20
24
|
|
|
21
|
-
Uses in-memory zip reading for .
|
|
25
|
+
Uses in-memory zip reading for .plot panels - no disk extraction.
|
|
22
26
|
|
|
23
27
|
Parameters
|
|
24
28
|
----------
|
|
25
29
|
path : Path
|
|
26
|
-
Path to .
|
|
30
|
+
Path to .figure bundle (.figure or .figure)
|
|
27
31
|
panel_index : int, optional
|
|
28
32
|
Index of panel to open (default: 0 for first panel)
|
|
29
33
|
|
|
@@ -33,41 +37,41 @@ def resolve_figz_bundle(path: Path, panel_index: int = 0) -> Tuple:
|
|
|
33
37
|
(json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info)
|
|
34
38
|
"""
|
|
35
39
|
spath = str(path)
|
|
36
|
-
|
|
40
|
+
figure_is_zip = False
|
|
37
41
|
|
|
38
42
|
# Handle ZIP vs directory for figz
|
|
39
|
-
if spath.endswith(
|
|
40
|
-
|
|
43
|
+
if spath.endswith(".figure") and not spath.endswith(".figure"):
|
|
44
|
+
figure_is_zip = True
|
|
41
45
|
if not path.exists():
|
|
42
|
-
raise FileNotFoundError(f"
|
|
43
|
-
# For
|
|
44
|
-
temp_dir = tempfile.mkdtemp(prefix=
|
|
45
|
-
with zipfile.ZipFile(path,
|
|
46
|
+
raise FileNotFoundError(f"Figure bundle not found: {path}")
|
|
47
|
+
# For figure zip, extract to access nested pltz
|
|
48
|
+
temp_dir = tempfile.mkdtemp(prefix="scitex_edit_figure_")
|
|
49
|
+
with zipfile.ZipFile(path, "r") as zf:
|
|
46
50
|
zf.extractall(temp_dir)
|
|
47
51
|
bundle_dir = Path(temp_dir)
|
|
48
52
|
for item in bundle_dir.iterdir():
|
|
49
|
-
if item.is_dir() and str(item).endswith(
|
|
53
|
+
if item.is_dir() and str(item).endswith(".figure"):
|
|
50
54
|
bundle_dir = item
|
|
51
55
|
break
|
|
52
56
|
else:
|
|
53
57
|
bundle_dir = Path(path)
|
|
54
58
|
if not bundle_dir.exists():
|
|
55
|
-
raise FileNotFoundError(f"
|
|
59
|
+
raise FileNotFoundError(f"Figure bundle directory not found: {bundle_dir}")
|
|
56
60
|
|
|
57
|
-
# Find nested
|
|
61
|
+
# Find nested plot bundles
|
|
58
62
|
panel_paths = []
|
|
59
63
|
panel_is_zip = []
|
|
60
64
|
|
|
61
65
|
for item in sorted(bundle_dir.iterdir(), key=lambda x: x.name):
|
|
62
|
-
if item.is_dir() and str(item).endswith(
|
|
66
|
+
if item.is_dir() and str(item).endswith(".plot"):
|
|
63
67
|
panel_paths.append(str(item))
|
|
64
68
|
panel_is_zip.append(False)
|
|
65
|
-
elif item.is_file() and str(item).endswith(
|
|
69
|
+
elif item.is_file() and str(item).endswith(".plot"):
|
|
66
70
|
panel_paths.append(str(item))
|
|
67
71
|
panel_is_zip.append(True)
|
|
68
72
|
|
|
69
73
|
if not panel_paths:
|
|
70
|
-
raise FileNotFoundError(f"No .
|
|
74
|
+
raise FileNotFoundError(f"No .plot panels found in figure bundle: {bundle_dir}")
|
|
71
75
|
|
|
72
76
|
# Validate panel index
|
|
73
77
|
if panel_index < 0 or panel_index >= len(panel_paths):
|
|
@@ -77,7 +81,7 @@ def resolve_figz_bundle(path: Path, panel_index: int = 0) -> Tuple:
|
|
|
77
81
|
panel_name = Path(selected_panel_path).name
|
|
78
82
|
print(f"Opening panel: {panel_name}")
|
|
79
83
|
if len(panel_paths) > 1:
|
|
80
|
-
print(f" (
|
|
84
|
+
print(f" (Figure contains {len(panel_paths)} panels)")
|
|
81
85
|
|
|
82
86
|
# Build panel info
|
|
83
87
|
panel_names = [Path(p).name for p in panel_paths]
|
|
@@ -86,19 +90,21 @@ def resolve_figz_bundle(path: Path, panel_index: int = 0) -> Tuple:
|
|
|
86
90
|
"panel_paths": panel_paths,
|
|
87
91
|
"panel_is_zip": panel_is_zip,
|
|
88
92
|
"current_index": panel_index,
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"bundle_path":
|
|
93
|
+
"figure_dir": str(bundle_dir),
|
|
94
|
+
"figure_is_zip": figure_is_zip,
|
|
95
|
+
"bundle_path": (
|
|
96
|
+
str(path) if figure_is_zip else None
|
|
97
|
+
), # Original figure zip path for export/download
|
|
92
98
|
}
|
|
93
99
|
|
|
94
100
|
# Resolve the selected panel
|
|
95
|
-
result =
|
|
101
|
+
result = resolve_plot_bundle(Path(selected_panel_path))
|
|
96
102
|
return result + (panel_info,)
|
|
97
103
|
|
|
98
104
|
|
|
99
|
-
def
|
|
105
|
+
def resolve_plot_bundle(path: Path) -> Tuple:
|
|
100
106
|
"""
|
|
101
|
-
Resolve paths from a .
|
|
107
|
+
Resolve paths from a .plot bundle (directory or ZIP).
|
|
102
108
|
|
|
103
109
|
Supports both:
|
|
104
110
|
- Legacy format (single {basename}.json)
|
|
@@ -107,7 +113,7 @@ def resolve_pltz_bundle(path: Path) -> Tuple:
|
|
|
107
113
|
Parameters
|
|
108
114
|
----------
|
|
109
115
|
path : Path
|
|
110
|
-
Path to .
|
|
116
|
+
Path to .plot bundle (.plot or .plot)
|
|
111
117
|
|
|
112
118
|
Returns
|
|
113
119
|
-------
|
|
@@ -117,15 +123,15 @@ def resolve_pltz_bundle(path: Path) -> Tuple:
|
|
|
117
123
|
spath = str(path)
|
|
118
124
|
|
|
119
125
|
# Handle ZIP vs directory
|
|
120
|
-
if spath.endswith(
|
|
126
|
+
if spath.endswith(".plot") and not spath.endswith(".plot"):
|
|
121
127
|
if not path.exists():
|
|
122
128
|
raise FileNotFoundError(f"Bundle not found: {path}")
|
|
123
|
-
temp_dir = tempfile.mkdtemp(prefix=
|
|
124
|
-
with zipfile.ZipFile(path,
|
|
129
|
+
temp_dir = tempfile.mkdtemp(prefix="scitex_edit_")
|
|
130
|
+
with zipfile.ZipFile(path, "r") as zf:
|
|
125
131
|
zf.extractall(temp_dir)
|
|
126
132
|
bundle_dir = Path(temp_dir)
|
|
127
133
|
for item in bundle_dir.iterdir():
|
|
128
|
-
if item.is_dir() and str(item).endswith(
|
|
134
|
+
if item.is_dir() and str(item).endswith(".plot"):
|
|
129
135
|
bundle_dir = item
|
|
130
136
|
break
|
|
131
137
|
else:
|
|
@@ -136,7 +142,7 @@ def resolve_pltz_bundle(path: Path) -> Tuple:
|
|
|
136
142
|
# Check if this is a layered bundle (v2.0)
|
|
137
143
|
spec_path = bundle_dir / "spec.json"
|
|
138
144
|
if spec_path.exists():
|
|
139
|
-
return
|
|
145
|
+
return resolve_layered_plot_bundle(bundle_dir)
|
|
140
146
|
|
|
141
147
|
# === Legacy format ===
|
|
142
148
|
json_path = None
|
|
@@ -148,15 +154,17 @@ def resolve_pltz_bundle(path: Path) -> Tuple:
|
|
|
148
154
|
|
|
149
155
|
for f in bundle_dir.iterdir():
|
|
150
156
|
name = f.name
|
|
151
|
-
if name.endswith(
|
|
157
|
+
if name.endswith(".json") and not name.endswith(".manual.json"):
|
|
152
158
|
json_path = f
|
|
153
|
-
elif name.endswith(
|
|
159
|
+
elif name.endswith(".csv"):
|
|
154
160
|
csv_path = f
|
|
155
|
-
elif name.endswith(
|
|
161
|
+
elif name.endswith("_hitmap.png"):
|
|
156
162
|
hitmap_path = f
|
|
157
|
-
elif name.endswith(
|
|
163
|
+
elif name.endswith(".svg") and "_hitmap" not in name:
|
|
158
164
|
svg_path = f
|
|
159
|
-
elif
|
|
165
|
+
elif (
|
|
166
|
+
name.endswith(".png") and "_hitmap" not in name and "_overview" not in name
|
|
167
|
+
):
|
|
160
168
|
png_path = f
|
|
161
169
|
|
|
162
170
|
# Prefer SVG for display
|
|
@@ -164,7 +172,7 @@ def resolve_pltz_bundle(path: Path) -> Tuple:
|
|
|
164
172
|
png_path = svg_path
|
|
165
173
|
|
|
166
174
|
if json_path and json_path.exists():
|
|
167
|
-
with open(json_path,
|
|
175
|
+
with open(json_path, "r") as f:
|
|
168
176
|
bundle_spec = json_module.load(f)
|
|
169
177
|
|
|
170
178
|
return (
|
|
@@ -176,12 +184,12 @@ def resolve_pltz_bundle(path: Path) -> Tuple:
|
|
|
176
184
|
)
|
|
177
185
|
|
|
178
186
|
|
|
179
|
-
def
|
|
187
|
+
def resolve_layered_plot_bundle(bundle_dir: Path) -> Tuple:
|
|
180
188
|
"""
|
|
181
|
-
Resolve paths from a layered .
|
|
189
|
+
Resolve paths from a layered .plot bundle (v2.0 format).
|
|
182
190
|
|
|
183
191
|
Layered format structure:
|
|
184
|
-
plot.
|
|
192
|
+
plot.plot/
|
|
185
193
|
spec.json # Semantic
|
|
186
194
|
style.json # Appearance
|
|
187
195
|
{basename}.csv # Data
|
|
@@ -191,16 +199,16 @@ def resolve_layered_pltz_bundle(bundle_dir: Path) -> Tuple:
|
|
|
191
199
|
Parameters
|
|
192
200
|
----------
|
|
193
201
|
bundle_dir : Path
|
|
194
|
-
Path to .
|
|
202
|
+
Path to .plot bundle directory.
|
|
195
203
|
|
|
196
204
|
Returns
|
|
197
205
|
-------
|
|
198
206
|
tuple
|
|
199
207
|
(json_path, csv_path, png_path, hitmap_path, bundle_spec)
|
|
200
208
|
"""
|
|
201
|
-
from scitex.plt.io import
|
|
209
|
+
from scitex.plt.io import load_layered_plot_bundle
|
|
202
210
|
|
|
203
|
-
bundle_data =
|
|
211
|
+
bundle_data = load_layered_plot_bundle(bundle_dir)
|
|
204
212
|
spec_path = bundle_dir / "spec.json"
|
|
205
213
|
csv_path = None
|
|
206
214
|
png_path = None
|
|
@@ -216,11 +224,11 @@ def resolve_layered_pltz_bundle(bundle_dir: Path) -> Tuple:
|
|
|
216
224
|
if exports_dir.exists():
|
|
217
225
|
for f in exports_dir.iterdir():
|
|
218
226
|
name = f.name
|
|
219
|
-
if name.endswith(
|
|
227
|
+
if name.endswith("_hitmap.png"):
|
|
220
228
|
hitmap_path = f
|
|
221
|
-
elif name.endswith(
|
|
229
|
+
elif name.endswith(".svg") and "_hitmap" not in name:
|
|
222
230
|
png_path = f
|
|
223
|
-
elif name.endswith(
|
|
231
|
+
elif name.endswith(".png") and "_hitmap" not in name and png_path is None:
|
|
224
232
|
png_path = f
|
|
225
233
|
|
|
226
234
|
bundle_spec = bundle_data.get("merged", {})
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
"""Main edit function for launching visual editor."""
|
|
7
7
|
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import
|
|
9
|
+
from typing import Literal, Union
|
|
10
10
|
|
|
11
|
-
from .backend_detector import
|
|
11
|
+
from .backend_detector import detect_best_backend, print_available_backends
|
|
12
|
+
from .bundle_resolver import resolve_figure_bundle, resolve_plot_bundle
|
|
12
13
|
from .path_resolver import resolve_figure_paths
|
|
13
|
-
from .bundle_resolver import resolve_pltz_bundle, resolve_figz_bundle
|
|
14
14
|
|
|
15
15
|
__all__ = ["edit"]
|
|
16
16
|
|
|
@@ -28,9 +28,9 @@ def edit(
|
|
|
28
28
|
----------
|
|
29
29
|
path : str or Path
|
|
30
30
|
Path to figure file. Can be:
|
|
31
|
-
- .
|
|
32
|
-
- .
|
|
33
|
-
- .
|
|
31
|
+
- .plot directory bundle (recommended for hitmap selection)
|
|
32
|
+
- .plot ZIP bundle
|
|
33
|
+
- .figure multi-panel bundle
|
|
34
34
|
- JSON file (figure.json or figure.manual.json)
|
|
35
35
|
- CSV file (figure.csv) - for data-only start
|
|
36
36
|
- PNG file (figure.png)
|
|
@@ -60,8 +60,8 @@ def edit(
|
|
|
60
60
|
panel_info = None
|
|
61
61
|
|
|
62
62
|
# Resolve paths based on input type
|
|
63
|
-
json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info =
|
|
64
|
-
path, spath, parent_str
|
|
63
|
+
json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info = (
|
|
64
|
+
_resolve_paths(path, spath, parent_str)
|
|
65
65
|
)
|
|
66
66
|
|
|
67
67
|
if not json_path.exists():
|
|
@@ -111,17 +111,31 @@ def _resolve_paths(path: Path, spath: str, parent_str: str) -> tuple:
|
|
|
111
111
|
hitmap_path = None
|
|
112
112
|
bundle_spec = None
|
|
113
113
|
|
|
114
|
-
# Check if this is a .
|
|
115
|
-
if spath.endswith(
|
|
116
|
-
json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info =
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
114
|
+
# Check if this is a .figure bundle (multi-panel figure)
|
|
115
|
+
if spath.endswith(".figure") or spath.endswith(".figure"):
|
|
116
|
+
json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info = (
|
|
117
|
+
resolve_figure_bundle(path)
|
|
118
|
+
)
|
|
119
|
+
# Check if this is a .plot bundle
|
|
120
|
+
elif (
|
|
121
|
+
spath.endswith(".plot")
|
|
122
|
+
or spath.endswith(".plot")
|
|
123
|
+
or parent_str.endswith(".plot")
|
|
124
|
+
):
|
|
125
|
+
bundle_path = path.parent if parent_str.endswith(".plot") else path
|
|
126
|
+
json_path, csv_path, png_path, hitmap_path, bundle_spec = resolve_plot_bundle(
|
|
127
|
+
bundle_path
|
|
128
|
+
)
|
|
129
|
+
# Check if file is inside a .figure
|
|
130
|
+
elif parent_str.endswith(".figure") or (
|
|
131
|
+
path.parent.parent and str(path.parent.parent).endswith(".figure")
|
|
132
|
+
):
|
|
133
|
+
figure_path = (
|
|
134
|
+
path.parent if parent_str.endswith(".figure") else path.parent.parent
|
|
135
|
+
)
|
|
136
|
+
json_path, csv_path, png_path, hitmap_path, bundle_spec, panel_info = (
|
|
137
|
+
resolve_figure_bundle(figure_path)
|
|
138
|
+
)
|
|
125
139
|
else:
|
|
126
140
|
# Standard file paths
|
|
127
141
|
json_path, csv_path, png_path = resolve_figure_paths(path)
|
|
@@ -143,11 +157,28 @@ def _launch_backend(
|
|
|
143
157
|
) -> None:
|
|
144
158
|
"""Launch the specified editor backend."""
|
|
145
159
|
if backend == "flask":
|
|
146
|
-
_launch_flask(
|
|
160
|
+
_launch_flask(
|
|
161
|
+
json_path,
|
|
162
|
+
metadata,
|
|
163
|
+
csv_data,
|
|
164
|
+
png_path,
|
|
165
|
+
hitmap_path,
|
|
166
|
+
manual_overrides,
|
|
167
|
+
port,
|
|
168
|
+
panel_info,
|
|
169
|
+
)
|
|
147
170
|
elif backend == "dearpygui":
|
|
148
171
|
_launch_dearpygui(json_path, metadata, csv_data, png_path, manual_overrides)
|
|
149
172
|
elif backend == "qt":
|
|
150
|
-
_launch_qt(
|
|
173
|
+
_launch_qt(
|
|
174
|
+
json_path,
|
|
175
|
+
metadata,
|
|
176
|
+
csv_data,
|
|
177
|
+
png_path,
|
|
178
|
+
manual_overrides,
|
|
179
|
+
hitmap_path,
|
|
180
|
+
bundle_spec,
|
|
181
|
+
)
|
|
151
182
|
elif backend == "tkinter":
|
|
152
183
|
_launch_tkinter(json_path, metadata, csv_data, manual_overrides)
|
|
153
184
|
elif backend == "mpl":
|
|
@@ -159,10 +190,20 @@ def _launch_backend(
|
|
|
159
190
|
)
|
|
160
191
|
|
|
161
192
|
|
|
162
|
-
def _launch_flask(
|
|
193
|
+
def _launch_flask(
|
|
194
|
+
json_path,
|
|
195
|
+
metadata,
|
|
196
|
+
csv_data,
|
|
197
|
+
png_path,
|
|
198
|
+
hitmap_path,
|
|
199
|
+
manual_overrides,
|
|
200
|
+
port,
|
|
201
|
+
panel_info,
|
|
202
|
+
):
|
|
163
203
|
"""Launch Flask web editor."""
|
|
164
204
|
try:
|
|
165
205
|
from .._flask_editor import WebEditor
|
|
206
|
+
|
|
166
207
|
editor = WebEditor(
|
|
167
208
|
json_path=json_path,
|
|
168
209
|
metadata=metadata,
|
|
@@ -175,13 +216,16 @@ def _launch_flask(json_path, metadata, csv_data, png_path, hitmap_path, manual_o
|
|
|
175
216
|
)
|
|
176
217
|
editor.run()
|
|
177
218
|
except ImportError as e:
|
|
178
|
-
raise ImportError(
|
|
219
|
+
raise ImportError(
|
|
220
|
+
"Flask backend requires Flask. Install with: pip install flask"
|
|
221
|
+
) from e
|
|
179
222
|
|
|
180
223
|
|
|
181
224
|
def _launch_dearpygui(json_path, metadata, csv_data, png_path, manual_overrides):
|
|
182
225
|
"""Launch DearPyGui editor."""
|
|
183
226
|
try:
|
|
184
227
|
from .._dearpygui_editor import DearPyGuiEditor
|
|
228
|
+
|
|
185
229
|
editor = DearPyGuiEditor(
|
|
186
230
|
json_path=json_path,
|
|
187
231
|
metadata=metadata,
|
|
@@ -191,13 +235,18 @@ def _launch_dearpygui(json_path, metadata, csv_data, png_path, manual_overrides)
|
|
|
191
235
|
)
|
|
192
236
|
editor.run()
|
|
193
237
|
except ImportError as e:
|
|
194
|
-
raise ImportError(
|
|
238
|
+
raise ImportError(
|
|
239
|
+
"DearPyGui backend requires dearpygui. Install with: pip install dearpygui"
|
|
240
|
+
) from e
|
|
195
241
|
|
|
196
242
|
|
|
197
|
-
def _launch_qt(
|
|
243
|
+
def _launch_qt(
|
|
244
|
+
json_path, metadata, csv_data, png_path, manual_overrides, hitmap_path, bundle_spec
|
|
245
|
+
):
|
|
198
246
|
"""Launch Qt editor."""
|
|
199
247
|
try:
|
|
200
248
|
from .._qt_editor import QtEditor
|
|
249
|
+
|
|
201
250
|
editor = QtEditor(
|
|
202
251
|
json_path=json_path,
|
|
203
252
|
metadata=metadata,
|
|
@@ -209,12 +258,15 @@ def _launch_qt(json_path, metadata, csv_data, png_path, manual_overrides, hitmap
|
|
|
209
258
|
)
|
|
210
259
|
editor.run()
|
|
211
260
|
except ImportError as e:
|
|
212
|
-
raise ImportError(
|
|
261
|
+
raise ImportError(
|
|
262
|
+
"Qt backend requires PyQt5/PyQt6 or PySide2/PySide6. Install with: pip install PyQt6"
|
|
263
|
+
) from e
|
|
213
264
|
|
|
214
265
|
|
|
215
266
|
def _launch_tkinter(json_path, metadata, csv_data, manual_overrides):
|
|
216
267
|
"""Launch Tkinter editor."""
|
|
217
268
|
from .._tkinter_editor import TkinterEditor
|
|
269
|
+
|
|
218
270
|
editor = TkinterEditor(
|
|
219
271
|
json_path=json_path,
|
|
220
272
|
metadata=metadata,
|
|
@@ -227,6 +279,7 @@ def _launch_tkinter(json_path, metadata, csv_data, manual_overrides):
|
|
|
227
279
|
def _launch_mpl(json_path, metadata, csv_data, manual_overrides):
|
|
228
280
|
"""Launch matplotlib editor."""
|
|
229
281
|
from .._mpl_editor import MplEditor
|
|
282
|
+
|
|
230
283
|
editor = MplEditor(
|
|
231
284
|
json_path=json_path,
|
|
232
285
|
metadata=metadata,
|
|
@@ -16,14 +16,14 @@ def load_panel_data(
|
|
|
16
16
|
panel_path: Union[Path, str], is_zip: bool = None
|
|
17
17
|
) -> Optional[Dict[str, Any]]:
|
|
18
18
|
"""
|
|
19
|
-
Load panel data from either a .
|
|
19
|
+
Load panel data from either a .plot directory or a .plot.zip file.
|
|
20
20
|
|
|
21
21
|
Handles both formats transparently using in-memory reading for zips.
|
|
22
22
|
|
|
23
23
|
Parameters
|
|
24
24
|
----------
|
|
25
25
|
panel_path : Path or str
|
|
26
|
-
Path to .
|
|
26
|
+
Path to .plot directory or .plot.zip file
|
|
27
27
|
is_zip : bool, optional
|
|
28
28
|
If True, treat as zip file. If False, treat as directory.
|
|
29
29
|
If None, auto-detect based on path suffix and existence.
|
|
@@ -41,7 +41,7 @@ def load_panel_data(
|
|
|
41
41
|
# Auto-detect if not specified
|
|
42
42
|
if is_zip is None:
|
|
43
43
|
spath = str(panel_path)
|
|
44
|
-
if spath.endswith(".
|
|
44
|
+
if spath.endswith(".plot.zip"):
|
|
45
45
|
is_zip = panel_path.is_file()
|
|
46
46
|
else:
|
|
47
47
|
is_zip = False
|
|
@@ -53,10 +53,10 @@ def load_panel_data(
|
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
def _load_from_zip(panel_path: Path) -> Optional[Dict[str, Any]]:
|
|
56
|
-
"""Load panel data from a .
|
|
56
|
+
"""Load panel data from a .plot.zip file."""
|
|
57
57
|
from PIL import Image
|
|
58
58
|
|
|
59
|
-
from scitex.
|
|
59
|
+
from scitex.io.bundle import ZipBundle
|
|
60
60
|
|
|
61
61
|
if not panel_path.exists():
|
|
62
62
|
return None
|
|
@@ -134,7 +134,7 @@ def _load_from_zip(panel_path: Path) -> Optional[Dict[str, Any]]:
|
|
|
134
134
|
|
|
135
135
|
|
|
136
136
|
def _load_from_directory(panel_path: Path) -> Optional[Dict[str, Any]]:
|
|
137
|
-
"""Load panel data from a .
|
|
137
|
+
"""Load panel data from a .plot directory."""
|
|
138
138
|
|
|
139
139
|
panel_dir = panel_path
|
|
140
140
|
if not panel_dir.exists():
|
|
@@ -151,9 +151,9 @@ def _load_from_directory(panel_path: Path) -> Optional[Dict[str, Any]]:
|
|
|
151
151
|
def _load_layered_directory(panel_dir: Path) -> Dict[str, Any]:
|
|
152
152
|
"""Load panel data from layered format directory."""
|
|
153
153
|
import scitex as stx
|
|
154
|
-
from scitex.plt.io import
|
|
154
|
+
from scitex.plt.io import load_layered_plot_bundle
|
|
155
155
|
|
|
156
|
-
bundle_data =
|
|
156
|
+
bundle_data = load_layered_plot_bundle(panel_dir)
|
|
157
157
|
metadata = bundle_data.get("merged", {})
|
|
158
158
|
|
|
159
159
|
# Find CSV
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
2
3
|
# File: ./src/scitex/vis/editor/flask_editor/bbox.py
|
|
3
4
|
"""Bounding box extraction for figure elements.
|
|
4
5
|
|
|
@@ -1002,7 +1003,7 @@ def extract_bboxes_from_metadata(
|
|
|
1002
1003
|
"ax_id": ax_id,
|
|
1003
1004
|
}
|
|
1004
1005
|
|
|
1005
|
-
# Extract from traces array (
|
|
1006
|
+
# Extract from traces array (plot spec format)
|
|
1006
1007
|
traces = metadata.get("traces", [])
|
|
1007
1008
|
if isinstance(traces, list):
|
|
1008
1009
|
for i, trace in enumerate(traces):
|