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
scitex/__init__.py
CHANGED
|
@@ -164,10 +164,7 @@ cloud = _LazyModule("cloud")
|
|
|
164
164
|
config = _LazyModule("config")
|
|
165
165
|
audio = _LazyModule("audio")
|
|
166
166
|
msword = _LazyModule("msword")
|
|
167
|
-
fts = _LazyModule(
|
|
168
|
-
"fts"
|
|
169
|
-
) # Figure-Table-Statistics - single source of truth for bundle schemas
|
|
170
|
-
fsb = fts # Legacy alias (FSB -> FTS)
|
|
167
|
+
fts = _LazyModule("fts") # Bundle schemas module
|
|
171
168
|
|
|
172
169
|
# Centralized path configuration - eager loaded for convenience
|
|
173
170
|
# Usage: scitex.PATHS.logs, scitex.PATHS.cache, etc.
|
scitex/__version__.py
CHANGED
scitex/_install_guide.py
CHANGED
|
@@ -16,33 +16,45 @@ from ._optional_deps import PACKAGE_TO_EXTRA, check_optional_deps
|
|
|
16
16
|
F = TypeVar("F", bound=Callable[..., Any])
|
|
17
17
|
|
|
18
18
|
# Module name -> (required_packages, extra_name, description)
|
|
19
|
+
# Synced with pyproject.toml [project.optional-dependencies]
|
|
19
20
|
MODULE_REQUIREMENTS: Dict[str, Tuple[List[str], str, str]] = {
|
|
20
21
|
"ai": (["openai", "anthropic"], "ai", "LLM APIs"),
|
|
21
22
|
"audio": (["pyttsx3", "gtts"], "audio", "Text-to-Speech"),
|
|
22
23
|
"benchmark": (["psutil"], "benchmark", "Performance Monitoring"),
|
|
24
|
+
"bridge": (["matplotlib", "scipy"], "bridge", "External System Integration"),
|
|
23
25
|
"browser": (["playwright"], "browser", "Web Automation"),
|
|
24
26
|
"capture": (["mss", "PIL"], "capture", "Screenshot Capture"),
|
|
25
27
|
"cli": (["click"], "cli", "Command Line Interface"),
|
|
28
|
+
"cloud": (["matplotlib"], "cloud", "Cloud Service Integration"),
|
|
29
|
+
"config": (["pyyaml"], "config", "Configuration Management"),
|
|
26
30
|
"db": (["sqlalchemy"], "db", "Database"),
|
|
27
31
|
"decorators": (["joblib"], "decorators", "Caching Utilities"),
|
|
32
|
+
"devtools": (["joblib", "ruamel.yaml"], "devtools", "Development Tools"),
|
|
33
|
+
"diagram": (["pyyaml"], "diagram", "Diagram Generation"),
|
|
28
34
|
"dsp": (["scipy", "sounddevice"], "dsp", "Signal Processing"),
|
|
29
|
-
"
|
|
35
|
+
"dt": (["matplotlib"], "dt", "Date/Time Utilities"),
|
|
30
36
|
"gen": (["IPython", "h5py"], "gen", "General Utilities"),
|
|
31
37
|
"git": (["git"], "git", "Git Operations"),
|
|
32
38
|
"io": (["h5py", "openpyxl"], "io", "File I/O"),
|
|
33
39
|
"linalg": (["scipy", "sympy"], "linalg", "Linear Algebra"),
|
|
40
|
+
"logging": (["matplotlib"], "logging", "Enhanced Logging"),
|
|
34
41
|
"msword": (["docx"], "msword", "MS Word"),
|
|
35
|
-
"neuro": (["mne"], "neuro", "Neuroscience"),
|
|
36
42
|
"nn": (["torch"], "nn", "Neural Networks"),
|
|
43
|
+
"parallel": (["tqdm"], "parallel", "Parallel Processing"),
|
|
37
44
|
"path": (["git"], "path", "Path Utilities"),
|
|
45
|
+
"pd": (["xarray"], "pd", "Pandas Utilities"),
|
|
38
46
|
"plt": (["matplotlib", "seaborn"], "plt", "Plotting"),
|
|
39
47
|
"repro": (["torch"], "repro", "Reproducibility"),
|
|
40
48
|
"resource": (["psutil"], "resource", "Resource Monitoring"),
|
|
41
49
|
"scholar": (["selenium", "bs4", "playwright"], "scholar", "Paper Management"),
|
|
50
|
+
"session": (["matplotlib", "pyyaml"], "session", "Session Management"),
|
|
51
|
+
"sh": (["matplotlib"], "sh", "Shell Utilities"),
|
|
42
52
|
"stats": (["scipy", "statsmodels"], "stats", "Statistical Analysis"),
|
|
43
53
|
"str": (["natsort"], "str", "String Utilities"),
|
|
54
|
+
"tex": (["matplotlib"], "tex", "LaTeX Utilities"),
|
|
44
55
|
"torch": (["torch"], "torch", "PyTorch Support"),
|
|
45
56
|
"types": (["xarray"], "types", "Type Utilities"),
|
|
57
|
+
"utils": (["h5py", "natsort"], "utils", "General Utilities"),
|
|
46
58
|
"web": (["aiohttp", "bs4"], "web", "Web Utilities"),
|
|
47
59
|
"writer": (["yq"], "writer", "Academic Writing"),
|
|
48
60
|
}
|
scitex/bridge/_figrecipe.py
CHANGED
|
@@ -63,7 +63,7 @@ def save_with_recipe(
|
|
|
63
63
|
dict
|
|
64
64
|
Paths to saved files: {'image': Path, 'csv': Path, 'recipe': Path}
|
|
65
65
|
"""
|
|
66
|
-
from scitex.
|
|
66
|
+
from scitex.io.bundle._bundle._storage import get_storage
|
|
67
67
|
|
|
68
68
|
path = Path(path)
|
|
69
69
|
result = {}
|
scitex/bridge/_helpers.py
CHANGED
|
@@ -118,7 +118,7 @@ def _detect_backend(target) -> Literal["plt", "vis"]:
|
|
|
118
118
|
"""
|
|
119
119
|
# Check for vis FigureModel
|
|
120
120
|
try:
|
|
121
|
-
from scitex.
|
|
121
|
+
from scitex.canvas.model import FigureModel
|
|
122
122
|
if isinstance(target, FigureModel):
|
|
123
123
|
return "vis"
|
|
124
124
|
except ImportError:
|
scitex/bridge/_plt_vis.py
CHANGED
scitex/bridge/_stats_plt.py
CHANGED
|
@@ -29,7 +29,7 @@ from typing import Optional, Dict, Any, Union, List
|
|
|
29
29
|
import warnings
|
|
30
30
|
|
|
31
31
|
# Import GUI classes from FTS (single source of truth)
|
|
32
|
-
from scitex.
|
|
32
|
+
from scitex.io.bundle._stats import Position
|
|
33
33
|
|
|
34
34
|
# StatResult is now a dict - the GUI-specific StatResult is deprecated
|
|
35
35
|
StatResult = dict
|
scitex/bridge/_stats_vis.py
CHANGED
|
@@ -27,11 +27,11 @@ When bridging between plt and vis, coordinate transformation may be needed.
|
|
|
27
27
|
from typing import Optional, Dict, Any, List, Tuple
|
|
28
28
|
|
|
29
29
|
# Import GUI classes from FTS (single source of truth)
|
|
30
|
-
from scitex.
|
|
30
|
+
from scitex.io.bundle._stats import Position, StatPositioning
|
|
31
31
|
|
|
32
32
|
# Legacy model imports - may not be available
|
|
33
33
|
try:
|
|
34
|
-
from scitex.
|
|
34
|
+
from scitex.canvas.model import AnnotationModel, FigureModel, AxesModel, TextStyle
|
|
35
35
|
VIS_MODEL_AVAILABLE = True
|
|
36
36
|
except ImportError:
|
|
37
37
|
AnnotationModel = None
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Timestamp: 2025-12-08
|
|
4
3
|
# File: ./src/scitex/vis/__init__.py
|
|
5
4
|
"""
|
|
6
|
-
SciTeX Visualization Module (scitex.
|
|
5
|
+
SciTeX Visualization Module (scitex.canvas)
|
|
7
6
|
|
|
8
7
|
Canvas-based composition of publication-quality figures.
|
|
9
8
|
|
|
@@ -19,7 +18,7 @@ Quick Start:
|
|
|
19
18
|
>>> # Create canvas and add panels
|
|
20
19
|
>>> stx.vis.create_canvas("/output", "fig1")
|
|
21
20
|
>>> stx.vis.add_panel("/output", "fig1", "panel_a", source="plot.png",
|
|
22
|
-
...
|
|
21
|
+
... xy_mm=(10, 10), size_mm=(80, 60), label="A")
|
|
23
22
|
>>>
|
|
24
23
|
>>> # Save with stx.io (auto-exports PNG/PDF/SVG)
|
|
25
24
|
>>> canvas = stx.io.load("/output/fig1.canvas")
|
|
@@ -34,46 +33,31 @@ Directory Structure:
|
|
|
34
33
|
"""
|
|
35
34
|
|
|
36
35
|
# Submodules for advanced use
|
|
37
|
-
from . import io
|
|
38
|
-
from . import model
|
|
39
|
-
from . import backend
|
|
40
|
-
from . import utils
|
|
41
|
-
from . import editor
|
|
36
|
+
from . import backend, editor, io, model, utils
|
|
42
37
|
|
|
43
38
|
# Canvas class
|
|
44
39
|
from .canvas import Canvas
|
|
45
40
|
|
|
41
|
+
# Editor
|
|
42
|
+
from .editor import edit
|
|
43
|
+
|
|
44
|
+
# Data integrity
|
|
45
|
+
# Export (usually handled by stx.io.save, but available for explicit use)
|
|
46
46
|
# =============================================================================
|
|
47
47
|
# Primary API (minimal, reusable, flexible)
|
|
48
48
|
# =============================================================================
|
|
49
|
-
|
|
50
49
|
# Canvas operations
|
|
51
|
-
from .io import (
|
|
52
|
-
ensure_canvas_directory as create_canvas,
|
|
53
|
-
get_canvas_directory_path as get_canvas_path,
|
|
54
|
-
canvas_directory_exists as canvas_exists,
|
|
55
|
-
list_canvas_directories as list_canvases,
|
|
56
|
-
delete_canvas_directory as delete_canvas,
|
|
57
|
-
)
|
|
58
|
-
|
|
59
50
|
# Panel operations
|
|
60
|
-
from .io import
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
remove_panel,
|
|
65
|
-
list_panels,
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
# Export (usually handled by stx.io.save, but available for explicit use)
|
|
51
|
+
from .io import add_panel_from_image, add_panel_from_scitex
|
|
52
|
+
from .io import canvas_directory_exists as canvas_exists
|
|
53
|
+
from .io import delete_canvas_directory as delete_canvas
|
|
54
|
+
from .io import ensure_canvas_directory as create_canvas
|
|
69
55
|
from .io import export_canvas_to_file as export_canvas
|
|
70
|
-
|
|
71
|
-
|
|
56
|
+
from .io import get_canvas_directory_path as get_canvas_path
|
|
57
|
+
from .io import list_canvas_directories as list_canvases
|
|
58
|
+
from .io import list_panels, remove_panel, update_panel
|
|
72
59
|
from .io import verify_all_data_hashes as verify_data
|
|
73
60
|
|
|
74
|
-
# Editor
|
|
75
|
-
from .editor import edit
|
|
76
|
-
|
|
77
61
|
|
|
78
62
|
# =============================================================================
|
|
79
63
|
# Convenience wrapper for add_panel
|
|
@@ -83,8 +67,8 @@ def add_panel(
|
|
|
83
67
|
canvas_name,
|
|
84
68
|
panel_name,
|
|
85
69
|
source,
|
|
86
|
-
|
|
87
|
-
|
|
70
|
+
xy_mm=(0, 0),
|
|
71
|
+
size_mm=(50, 50),
|
|
88
72
|
label="",
|
|
89
73
|
bundle=False,
|
|
90
74
|
**kwargs,
|
|
@@ -102,10 +86,10 @@ def add_panel(
|
|
|
102
86
|
Name for the panel
|
|
103
87
|
source : str or Path
|
|
104
88
|
Source file (PNG, JPG, SVG)
|
|
105
|
-
|
|
106
|
-
(x_mm, y_mm) position on canvas
|
|
107
|
-
|
|
108
|
-
(width_mm, height_mm) panel size
|
|
89
|
+
xy_mm : tuple
|
|
90
|
+
(x_mm, y_mm) position on canvas in millimeters
|
|
91
|
+
size_mm : tuple
|
|
92
|
+
(width_mm, height_mm) panel size in millimeters
|
|
109
93
|
label : str
|
|
110
94
|
Panel label (A, B, C...)
|
|
111
95
|
bundle : bool
|
|
@@ -117,8 +101,8 @@ def add_panel(
|
|
|
117
101
|
|
|
118
102
|
source = Path(source)
|
|
119
103
|
panel_properties = {
|
|
120
|
-
"position": {"x_mm":
|
|
121
|
-
"size": {"width_mm":
|
|
104
|
+
"position": {"x_mm": xy_mm[0], "y_mm": xy_mm[1]},
|
|
105
|
+
"size": {"width_mm": size_mm[0], "height_mm": size_mm[1]},
|
|
122
106
|
**kwargs,
|
|
123
107
|
}
|
|
124
108
|
if label:
|
|
@@ -147,32 +131,33 @@ def add_panel(
|
|
|
147
131
|
|
|
148
132
|
|
|
149
133
|
# =============================================================================
|
|
150
|
-
# .
|
|
134
|
+
# .figure Bundle Support
|
|
151
135
|
# =============================================================================
|
|
152
136
|
|
|
153
|
-
|
|
137
|
+
|
|
138
|
+
def save_figure(
|
|
154
139
|
panels,
|
|
155
140
|
path,
|
|
156
141
|
spec=None,
|
|
157
142
|
as_zip=None,
|
|
158
143
|
):
|
|
159
144
|
"""
|
|
160
|
-
Save panels as a .
|
|
145
|
+
Save panels as a .figure publication figure bundle.
|
|
161
146
|
|
|
162
147
|
Parameters
|
|
163
148
|
----------
|
|
164
149
|
panels : dict
|
|
165
|
-
Dictionary mapping panel IDs to .
|
|
166
|
-
Example: {"A": "timecourse.
|
|
150
|
+
Dictionary mapping panel IDs to .plot bundle paths or data.
|
|
151
|
+
Example: {"A": "timecourse.plot", "B": "barplot.plot"}
|
|
167
152
|
path : str or Path
|
|
168
|
-
Output path (e.g., "Figure1.
|
|
169
|
-
- Path ending with ".
|
|
170
|
-
- Path ending with ".
|
|
153
|
+
Output path (e.g., "Figure1.figure.zip" or "Figure1.figure").
|
|
154
|
+
- Path ending with ".zip" creates ZIP archive
|
|
155
|
+
- Path ending with ".figure" creates directory bundle
|
|
171
156
|
spec : dict, optional
|
|
172
157
|
Figure specification. Auto-generated if None.
|
|
173
158
|
as_zip : bool, optional
|
|
174
159
|
If True, save as ZIP archive. If False, save as directory.
|
|
175
|
-
Default: auto-detect from path
|
|
160
|
+
Default: auto-detect from path.
|
|
176
161
|
|
|
177
162
|
Returns
|
|
178
163
|
-------
|
|
@@ -181,24 +166,25 @@ def save_figz(
|
|
|
181
166
|
|
|
182
167
|
Examples
|
|
183
168
|
--------
|
|
184
|
-
>>> import scitex.
|
|
169
|
+
>>> import scitex.canvas as sfig
|
|
185
170
|
>>> panels = {
|
|
186
|
-
... "A": "timecourse.
|
|
187
|
-
... "B": "barplot.
|
|
171
|
+
... "A": "timecourse.plot",
|
|
172
|
+
... "B": "barplot.plot"
|
|
188
173
|
... }
|
|
189
|
-
>>> sfig.
|
|
190
|
-
>>> sfig.
|
|
174
|
+
>>> sfig.save_figure(panels, "Figure1.figure.zip") # Creates ZIP
|
|
175
|
+
>>> sfig.save_figure(panels, "Figure1.figure") # Creates directory
|
|
191
176
|
"""
|
|
192
|
-
from pathlib import Path
|
|
193
177
|
import shutil
|
|
194
|
-
from
|
|
178
|
+
from pathlib import Path
|
|
179
|
+
|
|
180
|
+
from scitex.io.bundle import BundleType, save
|
|
195
181
|
|
|
196
182
|
p = Path(path)
|
|
197
183
|
spath = str(path)
|
|
198
184
|
|
|
199
185
|
# Auto-detect as_zip from path suffix if not specified
|
|
200
186
|
if as_zip is None:
|
|
201
|
-
as_zip =
|
|
187
|
+
as_zip = spath.endswith(".zip")
|
|
202
188
|
|
|
203
189
|
# Auto-generate spec if not provided
|
|
204
190
|
if spec is None:
|
|
@@ -206,28 +192,28 @@ def save_figz(
|
|
|
206
192
|
|
|
207
193
|
# Build bundle data - pass source paths directly for file copying
|
|
208
194
|
bundle_data = {
|
|
209
|
-
|
|
210
|
-
|
|
195
|
+
"spec": spec,
|
|
196
|
+
"plots": {},
|
|
211
197
|
}
|
|
212
198
|
|
|
213
199
|
# Pass source paths directly (not loaded data) to preserve all files
|
|
214
|
-
for panel_id,
|
|
215
|
-
|
|
216
|
-
if
|
|
200
|
+
for panel_id, plot_source in panels.items():
|
|
201
|
+
plot_path = Path(plot_source)
|
|
202
|
+
if plot_path.exists():
|
|
217
203
|
# Store source path for direct copying
|
|
218
|
-
bundle_data[
|
|
204
|
+
bundle_data["plots"][panel_id] = str(plot_path)
|
|
219
205
|
|
|
220
|
-
return save(bundle_data, p, bundle_type=BundleType.
|
|
206
|
+
return save(bundle_data, p, bundle_type=BundleType.FIGURE, as_zip=as_zip)
|
|
221
207
|
|
|
222
208
|
|
|
223
|
-
def
|
|
209
|
+
def load_figure(path):
|
|
224
210
|
"""
|
|
225
|
-
Load a .
|
|
211
|
+
Load a .figure bundle.
|
|
226
212
|
|
|
227
213
|
Parameters
|
|
228
214
|
----------
|
|
229
215
|
path : str or Path
|
|
230
|
-
Path to .
|
|
216
|
+
Path to .figure bundle (directory or ZIP).
|
|
231
217
|
|
|
232
218
|
Returns
|
|
233
219
|
-------
|
|
@@ -238,7 +224,7 @@ def load_figz(path):
|
|
|
238
224
|
|
|
239
225
|
Examples
|
|
240
226
|
--------
|
|
241
|
-
>>> figure = scitex.
|
|
227
|
+
>>> figure = scitex.canvas.load_figure("Figure1.figure")
|
|
242
228
|
>>> print(figure['spec']['figure']['title'])
|
|
243
229
|
>>> panel_a = figure['panels']['A']
|
|
244
230
|
>>> print(panel_a['spec'], panel_a['data'])
|
|
@@ -247,19 +233,19 @@ def load_figz(path):
|
|
|
247
233
|
|
|
248
234
|
bundle = load(path)
|
|
249
235
|
|
|
250
|
-
if bundle[
|
|
251
|
-
raise ValueError(f"Not a .
|
|
236
|
+
if bundle["type"] != "figure":
|
|
237
|
+
raise ValueError(f"Not a .figure bundle: {path}")
|
|
252
238
|
|
|
253
239
|
result = {
|
|
254
|
-
|
|
255
|
-
|
|
240
|
+
"spec": bundle.get("spec", {}),
|
|
241
|
+
"panels": {},
|
|
256
242
|
}
|
|
257
243
|
|
|
258
244
|
# Return spec and data for each panel (reconstruction is optional)
|
|
259
|
-
for panel_id, plot_bundle in bundle.get(
|
|
260
|
-
result[
|
|
261
|
-
|
|
262
|
-
|
|
245
|
+
for panel_id, plot_bundle in bundle.get("plots", {}).items():
|
|
246
|
+
result["panels"][panel_id] = {
|
|
247
|
+
"spec": plot_bundle.get("spec", {}),
|
|
248
|
+
"data": plot_bundle.get("data"),
|
|
263
249
|
}
|
|
264
250
|
|
|
265
251
|
return result
|
|
@@ -270,17 +256,17 @@ def _generate_figure_spec(panels):
|
|
|
270
256
|
from pathlib import Path
|
|
271
257
|
|
|
272
258
|
spec = {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
259
|
+
"schema": {"name": "scitex.canvas.figure", "version": "1.0.0"},
|
|
260
|
+
"figure": {
|
|
261
|
+
"id": "figure",
|
|
262
|
+
"title": "",
|
|
263
|
+
"caption": "",
|
|
264
|
+
"styles": {
|
|
265
|
+
"size": {"width_mm": 180, "height_mm": 120},
|
|
266
|
+
"background": "#ffffff",
|
|
281
267
|
},
|
|
282
268
|
},
|
|
283
|
-
|
|
269
|
+
"panels": [],
|
|
284
270
|
}
|
|
285
271
|
|
|
286
272
|
# Auto-layout panels
|
|
@@ -305,15 +291,17 @@ def _generate_figure_spec(panels):
|
|
|
305
291
|
x = margin + col * (panel_w + margin)
|
|
306
292
|
y = margin + row * (panel_h + margin)
|
|
307
293
|
|
|
308
|
-
# Note: save_bundle uses panel_id for the directory name (e.g., A.
|
|
309
|
-
spec[
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
294
|
+
# Note: save_bundle uses panel_id for the directory name (e.g., A.plot)
|
|
295
|
+
spec["panels"].append(
|
|
296
|
+
{
|
|
297
|
+
"id": panel_id,
|
|
298
|
+
"label": panel_id,
|
|
299
|
+
"caption": "",
|
|
300
|
+
"plot": f"{panel_id}.plot",
|
|
301
|
+
"position": {"x_mm": x, "y_mm": y},
|
|
302
|
+
"size": {"width_mm": panel_w, "height_mm": panel_h},
|
|
303
|
+
}
|
|
304
|
+
)
|
|
317
305
|
|
|
318
306
|
return spec
|
|
319
307
|
|
|
@@ -344,9 +332,9 @@ __all__ = [
|
|
|
344
332
|
"verify_data",
|
|
345
333
|
# Editor
|
|
346
334
|
"edit",
|
|
347
|
-
# .
|
|
348
|
-
"
|
|
349
|
-
"
|
|
335
|
+
# .figure bundle
|
|
336
|
+
"save_figure",
|
|
337
|
+
"load_figure",
|
|
350
338
|
]
|
|
351
339
|
|
|
352
340
|
# EOF
|
|
@@ -161,7 +161,7 @@ def validate_figure_json(fig_json: Dict[str, Any]) -> bool:
|
|
|
161
161
|
|
|
162
162
|
Examples
|
|
163
163
|
--------
|
|
164
|
-
>>> from scitex.
|
|
164
|
+
>>> from scitex.canvas.backend import validate_figure_json
|
|
165
165
|
>>> fig_json = {"width_mm": 180, "height_mm": 120, "axes": []}
|
|
166
166
|
>>> validate_figure_json(fig_json)
|
|
167
167
|
True
|
scitex/{fig → canvas}/canvas.py
RENAMED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Timestamp: 2025-12-08
|
|
4
3
|
# File: ./src/scitex/vis/canvas.py
|
|
5
4
|
"""
|
|
6
|
-
Canvas class for scitex.
|
|
5
|
+
Canvas class for scitex.canvas.
|
|
7
6
|
|
|
8
7
|
Provides object-oriented interface to canvas operations.
|
|
9
8
|
"""
|
|
10
9
|
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
from typing import Dict, Any, Union, List, Optional
|
|
13
10
|
from datetime import datetime
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Any, Dict, List, Union
|
|
14
13
|
|
|
15
14
|
|
|
16
15
|
class Canvas:
|
|
@@ -35,8 +34,8 @@ class Canvas:
|
|
|
35
34
|
>>> # Create canvas
|
|
36
35
|
>>> canvas = stx.vis.Canvas("fig1", width_mm=180, height_mm=120)
|
|
37
36
|
>>> # Add panels
|
|
38
|
-
>>> canvas.add_panel("panel_a", "plot.png",
|
|
39
|
-
>>> canvas.add_panel("panel_b", "chart.png",
|
|
37
|
+
>>> canvas.add_panel("panel_a", "plot.png", xy_mm=(10, 10), size_mm=(80, 50), label="A")
|
|
38
|
+
>>> canvas.add_panel("panel_b", "chart.png", xy_mm=(100, 10), size_mm=(80, 50), label="B")
|
|
40
39
|
>>> # Save (auto-exports PNG/PDF/SVG)
|
|
41
40
|
>>> stx.io.save(canvas, "/output/fig1.canvas")
|
|
42
41
|
"""
|
|
@@ -82,8 +81,8 @@ class Canvas:
|
|
|
82
81
|
self,
|
|
83
82
|
panel_name: str,
|
|
84
83
|
source: Union[str, Path],
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
xy_mm: tuple = (0, 0),
|
|
85
|
+
size_mm: tuple = (50, 50),
|
|
87
86
|
label: str = "",
|
|
88
87
|
**kwargs,
|
|
89
88
|
) -> "Canvas":
|
|
@@ -96,10 +95,10 @@ class Canvas:
|
|
|
96
95
|
Name for the panel
|
|
97
96
|
source : str or Path
|
|
98
97
|
Path to source file (PNG, JPG, SVG)
|
|
99
|
-
|
|
100
|
-
(x_mm, y_mm) position on canvas
|
|
101
|
-
|
|
102
|
-
(width_mm, height_mm) panel size
|
|
98
|
+
xy_mm : tuple
|
|
99
|
+
(x_mm, y_mm) position on canvas in millimeters
|
|
100
|
+
size_mm : tuple
|
|
101
|
+
(width_mm, height_mm) panel size in millimeters
|
|
103
102
|
label : str
|
|
104
103
|
Panel label (A, B, C...)
|
|
105
104
|
**kwargs
|
|
@@ -120,8 +119,8 @@ class Canvas:
|
|
|
120
119
|
panel_entry = {
|
|
121
120
|
"name": panel_name,
|
|
122
121
|
"type": panel_type,
|
|
123
|
-
"position": {"x_mm":
|
|
124
|
-
"size": {"width_mm":
|
|
122
|
+
"position": {"x_mm": xy_mm[0], "y_mm": xy_mm[1]},
|
|
123
|
+
"size": {"width_mm": size_mm[0], "height_mm": size_mm[1]},
|
|
125
124
|
"z_index": len(self._panels),
|
|
126
125
|
"rotation_deg": kwargs.get("rotation_deg", 0),
|
|
127
126
|
"opacity": kwargs.get("opacity", 1.0),
|
|
@@ -197,7 +197,7 @@ def extract_defaults_from_metadata(metadata):
|
|
|
197
197
|
# Extract traces information - check multiple possible locations
|
|
198
198
|
traces = metadata.get("traces", [])
|
|
199
199
|
|
|
200
|
-
# Also check axes[].lines (
|
|
200
|
+
# Also check axes[].lines (plot bundle format)
|
|
201
201
|
if not traces and isinstance(axes, list) and len(axes) > 0:
|
|
202
202
|
ax = axes[0]
|
|
203
203
|
lines = ax.get("lines", [])
|
|
@@ -225,7 +225,7 @@ def extract_defaults_from_metadata(metadata):
|
|
|
225
225
|
# Extract legend information from multiple possible locations
|
|
226
226
|
legend = metadata.get("legend", {})
|
|
227
227
|
|
|
228
|
-
# Also check selectable_regions.axes[0].legend (
|
|
228
|
+
# Also check selectable_regions.axes[0].legend (plot bundle format)
|
|
229
229
|
if not legend:
|
|
230
230
|
selectable = metadata.get("selectable_regions", {})
|
|
231
231
|
sel_axes = selectable.get("axes", [])
|
|
@@ -8,24 +8,21 @@
|
|
|
8
8
|
This module provides the main edit() function and supporting utilities for:
|
|
9
9
|
- Backend detection and selection (flask, dearpygui, qt, tkinter, mpl)
|
|
10
10
|
- Path resolution for figure files (.json, .csv, .png)
|
|
11
|
-
- Bundle resolution for .
|
|
11
|
+
- Bundle resolution for .plot and .figure formats
|
|
12
12
|
- Panel data loading for multi-panel figures
|
|
13
13
|
- Manual override handling (.manual.json)
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
|
-
from .
|
|
17
|
-
from .backend_detector import (
|
|
18
|
-
detect_best_backend,
|
|
19
|
-
print_available_backends,
|
|
20
|
-
)
|
|
21
|
-
from .path_resolver import resolve_figure_paths
|
|
16
|
+
from .backend_detector import detect_best_backend, print_available_backends
|
|
22
17
|
from .bundle_resolver import (
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
resolve_figure_bundle,
|
|
19
|
+
resolve_layered_plot_bundle,
|
|
20
|
+
resolve_plot_bundle,
|
|
26
21
|
)
|
|
27
|
-
from .
|
|
22
|
+
from .editor_launcher import edit
|
|
28
23
|
from .manual_handler import compute_file_hash, save_manual_overrides
|
|
24
|
+
from .panel_loader import load_panel_data
|
|
25
|
+
from .path_resolver import resolve_figure_paths
|
|
29
26
|
|
|
30
27
|
__all__ = [
|
|
31
28
|
# Main entry point
|
|
@@ -36,9 +33,9 @@ __all__ = [
|
|
|
36
33
|
# Path resolution
|
|
37
34
|
"resolve_figure_paths",
|
|
38
35
|
# Bundle resolution
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
36
|
+
"resolve_plot_bundle",
|
|
37
|
+
"resolve_figure_bundle",
|
|
38
|
+
"resolve_layered_plot_bundle",
|
|
42
39
|
# Panel loading
|
|
43
40
|
"load_panel_data",
|
|
44
41
|
# Manual overrides
|