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.
- scitex/__init__.py +1 -4
- scitex/__main__.py +24 -5
- scitex/__version__.py +1 -1
- scitex/_install_guide.py +14 -2
- scitex/_optional_deps.py +33 -0
- scitex/ai/classification/reporters/_ClassificationReporter.py +1 -1
- scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +2 -2
- scitex/ai/classification/timeseries/_normalize_timestamp.py +1 -1
- scitex/ai/metrics/_calc_seizure_prediction_metrics.py +1 -1
- scitex/ai/plt/_plot_feature_importance.py +1 -1
- scitex/ai/plt/_plot_learning_curve.py +1 -1
- scitex/ai/plt/_plot_optuna_study.py +1 -1
- scitex/ai/plt/_plot_pre_rec_curve.py +1 -1
- scitex/ai/plt/_plot_roc_curve.py +1 -1
- scitex/ai/plt/_stx_conf_mat.py +1 -1
- scitex/ai/training/_LearningCurveLogger.py +1 -1
- scitex/audio/mcp_server.py +38 -8
- 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/browser/automation/CookieHandler.py +1 -1
- scitex/browser/core/BrowserMixin.py +1 -1
- scitex/browser/core/ChromeProfileManager.py +1 -1
- scitex/browser/debugging/_browser_logger.py +1 -1
- scitex/browser/debugging/_highlight_element.py +1 -1
- scitex/browser/debugging/_show_grid.py +1 -1
- scitex/browser/interaction/click_center.py +1 -1
- scitex/browser/interaction/click_with_fallbacks.py +1 -1
- scitex/browser/interaction/close_popups.py +1 -1
- scitex/browser/interaction/fill_with_fallbacks.py +1 -1
- scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +1 -1
- scitex/browser/pdf/detect_chrome_pdf_viewer.py +1 -1
- scitex/browser/stealth/HumanBehavior.py +1 -1
- scitex/browser/stealth/StealthManager.py +1 -1
- scitex/{fig → canvas}/__init__.py +84 -96
- scitex/canvas/_mcp_handlers.py +372 -0
- scitex/canvas/_mcp_tool_schemas.py +219 -0
- 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/canvas/mcp_server.py +151 -0
- 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/capture/mcp_server.py +41 -12
- scitex/cli/audio.py +233 -0
- scitex/cli/capture.py +307 -0
- scitex/cli/convert.py +10 -6
- scitex/cli/main.py +27 -4
- scitex/cli/repro.py +233 -0
- scitex/cli/resource.py +240 -0
- scitex/cli/stats.py +325 -0
- scitex/cli/template.py +236 -0
- scitex/cli/tex.py +286 -0
- scitex/cli/web.py +11 -12
- scitex/dev/__init__.py +3 -0
- scitex/dev/_pyproject.py +405 -0
- scitex/dev/plt/__init__.py +2 -2
- scitex/dev/plt/mpl/get_dir_ax.py +1 -1
- scitex/dev/plt/mpl/get_signatures.py +1 -1
- scitex/dev/plt/mpl/get_signatures_details.py +1 -1
- scitex/diagram/README.md +7 -7
- scitex/diagram/_mcp_handlers.py +400 -0
- scitex/diagram/_mcp_tool_schemas.py +157 -0
- scitex/diagram/mcp_server.py +151 -0
- scitex/dsp/_demo_sig.py +51 -5
- scitex/dsp/_mne.py +13 -2
- scitex/dsp/_modulation_index.py +15 -3
- scitex/dsp/_pac.py +23 -5
- scitex/dsp/_psd.py +16 -4
- scitex/dsp/_resample.py +24 -4
- scitex/dsp/_transform.py +16 -3
- scitex/dsp/add_noise.py +15 -1
- scitex/dsp/norm.py +17 -2
- scitex/dsp/reference.py +17 -1
- scitex/dsp/utils/_differential_bandpass_filters.py +20 -2
- scitex/dsp/utils/_zero_pad.py +18 -4
- scitex/dt/_normalize_timestamp.py +1 -1
- scitex/git/_session.py +1 -1
- 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 +17 -6
- scitex/io/_load_modules/_eeg.py +28 -13
- scitex/io/_load_modules/_optuna.py +21 -63
- scitex/io/_load_modules/_torch.py +11 -3
- 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/_optuna_study_as_csv_and_pngs.py +13 -2
- 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/_save_modules/_torch.py +11 -3
- 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/mcp_server.py +159 -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/_mcp_handlers.py +361 -0
- scitex/plt/_mcp_tool_schemas.py +169 -0
- 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/mcp_server.py +205 -0
- scitex/plt/utils/_csv_column_naming.py +250 -118
- scitex/repro/README_RandomStateManager.md +3 -3
- scitex/repro/_RandomStateManager.py +14 -14
- scitex/repro/_gen_ID.py +1 -1
- scitex/repro/_gen_timestamp.py +1 -1
- scitex/repro/_hash_array.py +4 -4
- scitex/schema/__init__.py +69 -73
- scitex/schema/_canvas.py +1 -1
- scitex/schema/_stats.py +2 -2
- scitex/scholar/__main__.py +24 -2
- scitex/scholar/_mcp_handlers.py +685 -0
- scitex/scholar/_mcp_tool_schemas.py +339 -0
- scitex/scholar/docs/template.py +1 -1
- scitex/scholar/examples/07_storage_integration.py +1 -1
- scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +1 -1
- scitex/scholar/impact_factor/jcr/build_database.py +1 -1
- scitex/scholar/mcp_server.py +315 -0
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +1 -1
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +1 -1
- scitex/scholar/pipelines/ScholarPipelineParallel.py +1 -1
- scitex/scholar/pipelines/ScholarPipelineSingle.py +1 -1
- scitex/scholar/storage/PaperIO.py +1 -1
- scitex/session/README.md +4 -4
- scitex/session/__init__.py +1 -1
- scitex/session/_decorator.py +9 -9
- scitex/session/_lifecycle.py +5 -5
- scitex/session/template.py +1 -1
- scitex/stats/__init__.py +30 -33
- scitex/stats/__main__.py +281 -0
- scitex/stats/_mcp_handlers.py +1191 -0
- scitex/stats/_mcp_tool_schemas.py +384 -0
- scitex/stats/_schema.py +1 -1
- scitex/stats/correct/_correct_bonferroni.py +1 -1
- scitex/stats/correct/_correct_fdr.py +1 -1
- scitex/stats/correct/_correct_fdr_.py +1 -1
- scitex/stats/correct/_correct_holm.py +1 -1
- scitex/stats/correct/_correct_sidak.py +1 -1
- scitex/stats/effect_sizes/_cliffs_delta.py +1 -1
- scitex/stats/effect_sizes/_cohens_d.py +1 -1
- scitex/stats/effect_sizes/_epsilon_squared.py +1 -1
- scitex/stats/effect_sizes/_eta_squared.py +1 -1
- scitex/stats/effect_sizes/_prob_superiority.py +1 -1
- scitex/stats/io/__init__.py +10 -11
- scitex/stats/io/_bundle.py +16 -16
- scitex/stats/mcp_server.py +405 -0
- scitex/stats/posthoc/_dunnett.py +1 -1
- scitex/stats/posthoc/_games_howell.py +1 -1
- scitex/stats/posthoc/_tukey_hsd.py +1 -1
- scitex/stats/power/_power.py +1 -1
- scitex/stats/utils/_effect_size.py +1 -1
- scitex/stats/utils/_formatters.py +1 -1
- scitex/stats/utils/_power.py +1 -1
- scitex/template/_mcp_handlers.py +259 -0
- scitex/template/_mcp_tool_schemas.py +112 -0
- scitex/template/mcp_server.py +186 -0
- scitex/utils/_verify_scitex_format.py +2 -2
- scitex/utils/template.py +1 -1
- scitex/web/__init__.py +12 -11
- scitex/web/_scraping.py +26 -265
- scitex/web/download_images.py +316 -0
- scitex/writer/Writer.py +1 -1
- scitex/writer/_clone_writer_project.py +1 -1
- scitex/writer/_validate_tree_structures.py +1 -1
- scitex/writer/dataclasses/config/_WriterConfig.py +1 -1
- scitex/writer/dataclasses/contents/_ManuscriptContents.py +1 -1
- scitex/writer/dataclasses/core/_Document.py +1 -1
- scitex/writer/dataclasses/core/_DocumentSection.py +1 -1
- scitex/writer/dataclasses/results/_CompilationResult.py +1 -1
- scitex/writer/dataclasses/results/_LaTeXIssue.py +1 -1
- scitex/writer/utils/.legacy_git_retry.py +7 -5
- scitex/writer/utils/_parse_latex_logs.py +1 -1
- scitex-2.13.0.dist-info/METADATA +1231 -0
- {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/RECORD +376 -470
- scitex-2.13.0.dist-info/entry_points.txt +11 -0
- 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-2.10.3.dist-info/METADATA +0 -952
- scitex-2.10.3.dist-info/entry_points.txt +0 -2
- /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.13.0.dist-info}/WHEEL +0 -0
- {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/licenses/LICENSE +0 -0
scitex/plt/gallery/_generate.py
CHANGED
|
@@ -24,10 +24,10 @@ def generate(
|
|
|
24
24
|
save_csv=True,
|
|
25
25
|
save_png=True,
|
|
26
26
|
save_svg=True,
|
|
27
|
-
|
|
27
|
+
save_plot=True,
|
|
28
28
|
verbose=True,
|
|
29
29
|
):
|
|
30
|
-
"""Generate gallery plots with CSVs and optional .
|
|
30
|
+
"""Generate gallery plots with CSVs and optional .plot bundles.
|
|
31
31
|
|
|
32
32
|
Parameters
|
|
33
33
|
----------
|
|
@@ -49,8 +49,8 @@ def generate(
|
|
|
49
49
|
Whether to save PNG image files.
|
|
50
50
|
save_svg : bool
|
|
51
51
|
Whether to save SVG image files for element selection.
|
|
52
|
-
|
|
53
|
-
Whether to save .
|
|
52
|
+
save_plot : bool
|
|
53
|
+
Whether to save .plot bundles (reproducible plot packages).
|
|
54
54
|
verbose : bool
|
|
55
55
|
Print progress messages.
|
|
56
56
|
|
|
@@ -78,7 +78,7 @@ def generate(
|
|
|
78
78
|
if verbose:
|
|
79
79
|
print(f"Generating {len(plots_to_generate)} plots to {output_dir}")
|
|
80
80
|
|
|
81
|
-
results = {"png": [], "svg": [], "csv": [], "
|
|
81
|
+
results = {"png": [], "svg": [], "csv": [], "plot": [], "errors": []}
|
|
82
82
|
|
|
83
83
|
for plot_name in plots_to_generate:
|
|
84
84
|
if plot_name not in PLOT_FUNCTIONS:
|
|
@@ -102,31 +102,34 @@ def generate(
|
|
|
102
102
|
# Generate plot
|
|
103
103
|
fig, ax = plot_func(fig, ax, stx)
|
|
104
104
|
|
|
105
|
-
# Save as .
|
|
105
|
+
# Save as .plot bundle - this is the single source of truth
|
|
106
106
|
# All other formats (PNG, SVG, CSV, hitmap) are extracted from the bundle
|
|
107
|
-
|
|
108
|
-
stx.io.save(fig,
|
|
107
|
+
plot_path = cat_dir / f"{plot_name}.plot"
|
|
108
|
+
stx.io.save(fig, plot_path, dpi=dpi)
|
|
109
109
|
|
|
110
110
|
if verbose:
|
|
111
|
-
print(f" [PLTZ] {
|
|
111
|
+
print(f" [PLTZ] {plot_path}")
|
|
112
112
|
|
|
113
113
|
# Extract files from bundle to gallery directory
|
|
114
|
-
# The
|
|
114
|
+
# The plot bundle contains: plot.png, plot.svg, plot.pdf, plot.csv, plot.json, plot_hitmap.png
|
|
115
115
|
import shutil
|
|
116
116
|
|
|
117
117
|
if save_png:
|
|
118
|
-
bundle_png =
|
|
118
|
+
bundle_png = plot_path / "plot.png"
|
|
119
119
|
gallery_png = cat_dir / f"{plot_name}.png"
|
|
120
120
|
if bundle_png.exists():
|
|
121
121
|
shutil.copy(bundle_png, gallery_png)
|
|
122
122
|
results["png"].append(str(gallery_png))
|
|
123
123
|
if verbose:
|
|
124
124
|
from PIL import Image
|
|
125
|
+
|
|
125
126
|
with Image.open(gallery_png) as img:
|
|
126
|
-
print(
|
|
127
|
+
print(
|
|
128
|
+
f" [PNG] {gallery_png} ({img.size[0]}x{img.size[1]})"
|
|
129
|
+
)
|
|
127
130
|
|
|
128
131
|
if save_csv:
|
|
129
|
-
bundle_csv =
|
|
132
|
+
bundle_csv = plot_path / "plot.csv"
|
|
130
133
|
gallery_csv = cat_dir / f"{plot_name}.csv"
|
|
131
134
|
if bundle_csv.exists():
|
|
132
135
|
shutil.copy(bundle_csv, gallery_csv)
|
|
@@ -135,7 +138,7 @@ def generate(
|
|
|
135
138
|
print(f" [CSV] {gallery_csv}")
|
|
136
139
|
|
|
137
140
|
if save_svg:
|
|
138
|
-
bundle_svg =
|
|
141
|
+
bundle_svg = plot_path / "plot.svg"
|
|
139
142
|
gallery_svg = cat_dir / f"{plot_name}.svg"
|
|
140
143
|
if bundle_svg.exists():
|
|
141
144
|
shutil.copy(bundle_svg, gallery_svg)
|
|
@@ -144,28 +147,31 @@ def generate(
|
|
|
144
147
|
print(f" [SVG] {gallery_svg}")
|
|
145
148
|
|
|
146
149
|
# Copy hitmap from bundle
|
|
147
|
-
bundle_hitmap =
|
|
150
|
+
bundle_hitmap = plot_path / "plot_hitmap.png"
|
|
148
151
|
gallery_hitmap = cat_dir / f"{plot_name}_hitmap.png"
|
|
149
152
|
if bundle_hitmap.exists():
|
|
150
153
|
shutil.copy(bundle_hitmap, gallery_hitmap)
|
|
151
154
|
if verbose:
|
|
152
155
|
from PIL import Image
|
|
156
|
+
|
|
153
157
|
with Image.open(gallery_hitmap) as img:
|
|
154
|
-
print(
|
|
158
|
+
print(
|
|
159
|
+
f" [HITMAP] {gallery_hitmap} ({img.size[0]}x{img.size[1]})"
|
|
160
|
+
)
|
|
155
161
|
|
|
156
162
|
# Copy and update JSON from bundle
|
|
157
|
-
bundle_json =
|
|
163
|
+
bundle_json = plot_path / "plot.json"
|
|
158
164
|
gallery_json = cat_dir / f"{plot_name}.json"
|
|
159
165
|
if bundle_json.exists():
|
|
160
166
|
shutil.copy(bundle_json, gallery_json)
|
|
161
167
|
# Add element_bboxes to the copied JSON
|
|
162
168
|
_add_element_bboxes_to_json(fig, ax, dpi, gallery_json, verbose)
|
|
163
169
|
|
|
164
|
-
if
|
|
165
|
-
results["
|
|
170
|
+
if save_plot:
|
|
171
|
+
results["plot"].append(str(plot_path))
|
|
166
172
|
else:
|
|
167
173
|
# Remove bundle if not requested
|
|
168
|
-
shutil.rmtree(
|
|
174
|
+
shutil.rmtree(plot_path)
|
|
169
175
|
|
|
170
176
|
stx.plt.close(fig._fig_mpl if hasattr(fig, "_fig_mpl") else fig)
|
|
171
177
|
|
|
@@ -175,7 +181,9 @@ def generate(
|
|
|
175
181
|
print(f" [ERROR] {plot_name}: {e}")
|
|
176
182
|
|
|
177
183
|
if verbose:
|
|
178
|
-
print(
|
|
184
|
+
print(
|
|
185
|
+
f"\nGenerated: {len(results['png'])} PNG, {len(results['svg'])} SVG, {len(results['csv'])} CSV, {len(results['plot'])} PLTZ"
|
|
186
|
+
)
|
|
179
187
|
if results["errors"]:
|
|
180
188
|
print(f"Errors: {len(results['errors'])}")
|
|
181
189
|
|
|
@@ -229,11 +237,12 @@ def _add_element_bboxes_to_json(fig, ax, dpi, json_path, verbose=True):
|
|
|
229
237
|
Print progress messages
|
|
230
238
|
"""
|
|
231
239
|
from PIL import Image
|
|
240
|
+
|
|
232
241
|
from scitex.plt.utils.metadata._geometry_extraction import (
|
|
233
242
|
extract_axes_bbox_px,
|
|
234
243
|
extract_line_geometry,
|
|
235
|
-
extract_scatter_geometry,
|
|
236
244
|
extract_polygon_geometry,
|
|
245
|
+
extract_scatter_geometry,
|
|
237
246
|
)
|
|
238
247
|
|
|
239
248
|
try:
|
|
@@ -249,7 +258,7 @@ def _add_element_bboxes_to_json(fig, ax, dpi, json_path, verbose=True):
|
|
|
249
258
|
renderer = mpl_fig.canvas.get_renderer()
|
|
250
259
|
|
|
251
260
|
# Get saved image dimensions (needed for coordinate transformation)
|
|
252
|
-
png_path = json_path.with_suffix(
|
|
261
|
+
png_path = json_path.with_suffix(".png")
|
|
253
262
|
if png_path.exists():
|
|
254
263
|
with Image.open(png_path) as img:
|
|
255
264
|
img_width, img_height = img.size
|
|
@@ -267,26 +276,28 @@ def _add_element_bboxes_to_json(fig, ax, dpi, json_path, verbose=True):
|
|
|
267
276
|
return
|
|
268
277
|
|
|
269
278
|
# Load existing JSON
|
|
270
|
-
with open(json_path,
|
|
279
|
+
with open(json_path, "r") as f:
|
|
271
280
|
metadata = json.load(f)
|
|
272
281
|
|
|
273
282
|
# Add element_bboxes
|
|
274
|
-
metadata[
|
|
283
|
+
metadata["element_bboxes"] = element_bboxes
|
|
275
284
|
|
|
276
285
|
# Also ensure figure_size_px is present
|
|
277
|
-
if
|
|
278
|
-
metadata[
|
|
279
|
-
metadata[
|
|
280
|
-
|
|
281
|
-
|
|
286
|
+
if "dimensions" not in metadata:
|
|
287
|
+
metadata["dimensions"] = {}
|
|
288
|
+
metadata["dimensions"]["figure_size_px"] = {
|
|
289
|
+
"width": img_width,
|
|
290
|
+
"height": img_height,
|
|
282
291
|
}
|
|
283
292
|
|
|
284
293
|
# Save updated JSON
|
|
285
|
-
with open(json_path,
|
|
294
|
+
with open(json_path, "w") as f:
|
|
286
295
|
json.dump(metadata, f, indent=4)
|
|
287
296
|
|
|
288
297
|
if verbose:
|
|
289
|
-
print(
|
|
298
|
+
print(
|
|
299
|
+
f" [BBOXES] Added {len(element_bboxes)} element bboxes to {json_path.name}"
|
|
300
|
+
)
|
|
290
301
|
|
|
291
302
|
except Exception as e:
|
|
292
303
|
if verbose:
|
|
@@ -323,8 +334,12 @@ def _extract_element_bboxes_for_gallery(fig, ax, renderer, img_width, img_height
|
|
|
323
334
|
"""Get element bbox in image pixel coordinates."""
|
|
324
335
|
try:
|
|
325
336
|
bbox = element.get_window_extent(renderer)
|
|
326
|
-
if not (
|
|
327
|
-
|
|
337
|
+
if not (
|
|
338
|
+
np.isfinite(bbox.x0)
|
|
339
|
+
and np.isfinite(bbox.x1)
|
|
340
|
+
and np.isfinite(bbox.y0)
|
|
341
|
+
and np.isfinite(bbox.y1)
|
|
342
|
+
):
|
|
328
343
|
return
|
|
329
344
|
|
|
330
345
|
elem_x0_inches = bbox.x0 / fig.dpi
|
|
@@ -447,7 +462,9 @@ def _extract_element_bboxes_for_gallery(fig, ax, renderer, img_width, img_height
|
|
|
447
462
|
return bboxes
|
|
448
463
|
|
|
449
464
|
|
|
450
|
-
def _generate_and_save_hitmap(
|
|
465
|
+
def _generate_and_save_hitmap(
|
|
466
|
+
fig, dpi, hitmap_path, json_path, verbose=True, crop_box=None
|
|
467
|
+
):
|
|
451
468
|
"""Generate hitmap PNG and add color_map to JSON.
|
|
452
469
|
|
|
453
470
|
The hitmap is generated at the same size as the PNG by:
|
|
@@ -471,6 +488,7 @@ def _generate_and_save_hitmap(fig, dpi, hitmap_path, json_path, verbose=True, cr
|
|
|
471
488
|
If provided, applies the same crop to hitmap for exact size matching.
|
|
472
489
|
"""
|
|
473
490
|
from PIL import Image
|
|
491
|
+
|
|
474
492
|
from scitex.plt.utils._hitmap import generate_hitmap_id_colors
|
|
475
493
|
|
|
476
494
|
try:
|
|
@@ -492,10 +510,10 @@ def _generate_and_save_hitmap(fig, dpi, hitmap_path, json_path, verbose=True, cr
|
|
|
492
510
|
rgb[:, :, 0] = (hitmap_array >> 16) & 0xFF
|
|
493
511
|
rgb[:, :, 1] = (hitmap_array >> 8) & 0xFF
|
|
494
512
|
rgb[:, :, 2] = hitmap_array & 0xFF
|
|
495
|
-
hitmap_full = Image.fromarray(rgb, mode=
|
|
513
|
+
hitmap_full = Image.fromarray(rgb, mode="RGB")
|
|
496
514
|
|
|
497
515
|
# Save full hitmap first (before cropping)
|
|
498
|
-
hitmap_full.save(hitmap_path, format=
|
|
516
|
+
hitmap_full.save(hitmap_path, format="PNG")
|
|
499
517
|
|
|
500
518
|
if verbose:
|
|
501
519
|
print(f" [HITMAP] Full size: {w}x{h}")
|
|
@@ -503,6 +521,7 @@ def _generate_and_save_hitmap(fig, dpi, hitmap_path, json_path, verbose=True, cr
|
|
|
503
521
|
# Apply same crop as PNG if crop_box provided
|
|
504
522
|
if crop_box is not None:
|
|
505
523
|
from scitex.plt.utils._crop import crop
|
|
524
|
+
|
|
506
525
|
crop(
|
|
507
526
|
str(hitmap_path),
|
|
508
527
|
output_path=str(hitmap_path),
|
|
@@ -515,45 +534,52 @@ def _generate_and_save_hitmap(fig, dpi, hitmap_path, json_path, verbose=True, cr
|
|
|
515
534
|
print(f" [HITMAP] Cropped to: {cropped.size[0]}x{cropped.size[1]}")
|
|
516
535
|
|
|
517
536
|
# Validate sizes match
|
|
518
|
-
png_path = hitmap_path.parent / hitmap_path.name.replace(
|
|
537
|
+
png_path = hitmap_path.parent / hitmap_path.name.replace("_hitmap.png", ".png")
|
|
519
538
|
if png_path.exists():
|
|
520
539
|
with Image.open(png_path) as png_img, Image.open(hitmap_path) as hitmap_img:
|
|
521
540
|
png_size = png_img.size
|
|
522
541
|
hitmap_size = hitmap_img.size
|
|
523
542
|
if png_size != hitmap_size:
|
|
524
|
-
print(
|
|
525
|
-
|
|
543
|
+
print(
|
|
544
|
+
f" [ERROR] Size mismatch! PNG={png_size}, Hitmap={hitmap_size}"
|
|
545
|
+
)
|
|
546
|
+
raise ValueError(
|
|
547
|
+
f"Hitmap size {hitmap_size} doesn't match PNG size {png_size}"
|
|
548
|
+
)
|
|
526
549
|
elif verbose:
|
|
527
|
-
print(
|
|
550
|
+
print(
|
|
551
|
+
f" [HITMAP] Size validated: {hitmap_size[0]}x{hitmap_size[1]} (matches PNG)"
|
|
552
|
+
)
|
|
528
553
|
|
|
529
554
|
if verbose:
|
|
530
555
|
print(f" [HITMAP] {hitmap_path.name} ({len(color_map)} elements)")
|
|
531
556
|
|
|
532
557
|
# Add hitmap_color_map to JSON
|
|
533
558
|
if json_path.exists():
|
|
534
|
-
with open(json_path,
|
|
559
|
+
with open(json_path, "r") as f:
|
|
535
560
|
metadata = json.load(f)
|
|
536
561
|
|
|
537
562
|
# Store color_map with string keys for JSON compatibility
|
|
538
|
-
metadata[
|
|
539
|
-
metadata[
|
|
563
|
+
metadata["hitmap_color_map"] = {str(k): v for k, v in color_map.items()}
|
|
564
|
+
metadata["hitmap_file"] = hitmap_path.name
|
|
540
565
|
|
|
541
566
|
# Store crop_box in metadata for reference
|
|
542
567
|
if crop_box is not None:
|
|
543
|
-
metadata[
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
568
|
+
metadata["hitmap_crop_box"] = {
|
|
569
|
+
"left": int(crop_box[0]),
|
|
570
|
+
"upper": int(crop_box[1]),
|
|
571
|
+
"right": int(crop_box[2]),
|
|
572
|
+
"lower": int(crop_box[3]),
|
|
548
573
|
}
|
|
549
574
|
|
|
550
|
-
with open(json_path,
|
|
575
|
+
with open(json_path, "w") as f:
|
|
551
576
|
json.dump(metadata, f, indent=4)
|
|
552
577
|
|
|
553
578
|
except Exception as e:
|
|
554
579
|
if verbose:
|
|
555
580
|
print(f" [WARN] Could not generate hitmap: {e}")
|
|
556
581
|
import traceback
|
|
582
|
+
|
|
557
583
|
traceback.print_exc()
|
|
558
584
|
|
|
559
585
|
|
scitex/plt/io/__init__.py
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Timestamp: "2025-12-13 (ywatanabe)"
|
|
4
3
|
# File: /home/ywatanabe/proj/scitex-code/src/scitex/plt/io/__init__.py
|
|
5
4
|
|
|
6
5
|
"""
|
|
7
|
-
I/O operations for scitex.plt - Plot bundles (.
|
|
6
|
+
I/O operations for scitex.plt - Plot bundles (.plot).
|
|
8
7
|
|
|
9
8
|
This module handles:
|
|
10
|
-
- .
|
|
9
|
+
- .plot bundle load/save operations (legacy and layered formats)
|
|
11
10
|
- CSV data export/import
|
|
12
11
|
- Hitmap generation and storage
|
|
13
12
|
- Bundle overview generation
|
|
14
13
|
|
|
15
14
|
Layered Format (v2.0):
|
|
16
|
-
plot.
|
|
15
|
+
plot.plot/
|
|
17
16
|
spec.json # Semantic: WHAT to plot
|
|
18
17
|
style.json # Appearance: HOW it looks
|
|
19
18
|
data.csv # Raw data
|
|
@@ -22,30 +21,29 @@ Layered Format (v2.0):
|
|
|
22
21
|
"""
|
|
23
22
|
|
|
24
23
|
from ._bundle import (
|
|
25
|
-
|
|
26
|
-
load_pltz_bundle,
|
|
27
|
-
save_pltz_bundle,
|
|
24
|
+
PLOT_SCHEMA_SPEC,
|
|
28
25
|
generate_bundle_overview,
|
|
29
|
-
|
|
26
|
+
load_plot_bundle,
|
|
27
|
+
save_plot_bundle,
|
|
28
|
+
validate_plot_spec,
|
|
30
29
|
)
|
|
31
|
-
|
|
32
30
|
from ._layered_bundle import (
|
|
33
|
-
save_layered_pltz_bundle,
|
|
34
|
-
load_layered_pltz_bundle,
|
|
35
|
-
merge_layered_bundle,
|
|
36
31
|
is_layered_bundle,
|
|
32
|
+
load_layered_plot_bundle,
|
|
33
|
+
merge_layered_bundle,
|
|
34
|
+
save_layered_plot_bundle,
|
|
37
35
|
)
|
|
38
36
|
|
|
39
37
|
__all__ = [
|
|
40
|
-
#
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
38
|
+
# Bundle operations
|
|
39
|
+
"validate_plot_spec",
|
|
40
|
+
"load_plot_bundle",
|
|
41
|
+
"save_plot_bundle",
|
|
44
42
|
"generate_bundle_overview",
|
|
45
|
-
"
|
|
43
|
+
"PLOT_SCHEMA_SPEC",
|
|
46
44
|
# Layered bundle operations (v2.0)
|
|
47
|
-
"
|
|
48
|
-
"
|
|
45
|
+
"save_layered_plot_bundle",
|
|
46
|
+
"load_layered_plot_bundle",
|
|
49
47
|
"merge_layered_bundle",
|
|
50
48
|
"is_layered_bundle",
|
|
51
49
|
]
|