scitex 2.4.3__py3-none-any.whl → 2.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. scitex/__version__.py +1 -1
  2. scitex/io/_load.py +5 -0
  3. scitex/io/_load_modules/_canvas.py +171 -0
  4. scitex/io/_save.py +8 -0
  5. scitex/io/_save_modules/_canvas.py +356 -0
  6. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +77 -22
  7. scitex/plt/docs/FIGURE_ARCHITECTURE.md +257 -0
  8. scitex/plt/utils/__init__.py +10 -0
  9. scitex/plt/utils/_collect_figure_metadata.py +14 -12
  10. scitex/plt/utils/_csv_column_naming.py +237 -0
  11. scitex/session/_decorator.py +13 -1
  12. scitex/vis/README.md +246 -615
  13. scitex/vis/__init__.py +138 -78
  14. scitex/vis/canvas.py +423 -0
  15. scitex/vis/docs/CANVAS_ARCHITECTURE.md +307 -0
  16. scitex/vis/editor/__init__.py +1 -1
  17. scitex/vis/editor/_dearpygui_editor.py +1830 -0
  18. scitex/vis/editor/_defaults.py +40 -1
  19. scitex/vis/editor/_edit.py +54 -18
  20. scitex/vis/editor/_flask_editor.py +37 -0
  21. scitex/vis/editor/_qt_editor.py +865 -0
  22. scitex/vis/editor/flask_editor/__init__.py +21 -0
  23. scitex/vis/editor/flask_editor/bbox.py +216 -0
  24. scitex/vis/editor/flask_editor/core.py +152 -0
  25. scitex/vis/editor/flask_editor/plotter.py +130 -0
  26. scitex/vis/editor/flask_editor/renderer.py +184 -0
  27. scitex/vis/editor/flask_editor/templates/__init__.py +33 -0
  28. scitex/vis/editor/flask_editor/templates/html.py +295 -0
  29. scitex/vis/editor/flask_editor/templates/scripts.py +614 -0
  30. scitex/vis/editor/flask_editor/templates/styles.py +549 -0
  31. scitex/vis/editor/flask_editor/utils.py +81 -0
  32. scitex/vis/io/__init__.py +84 -21
  33. scitex/vis/io/canvas.py +226 -0
  34. scitex/vis/io/data.py +204 -0
  35. scitex/vis/io/directory.py +202 -0
  36. scitex/vis/io/export.py +460 -0
  37. scitex/vis/io/panel.py +424 -0
  38. {scitex-2.4.3.dist-info → scitex-2.5.0.dist-info}/METADATA +9 -2
  39. {scitex-2.4.3.dist-info → scitex-2.5.0.dist-info}/RECORD +42 -21
  40. scitex/vis/DJANGO_INTEGRATION.md +0 -677
  41. scitex/vis/editor/_web_editor.py +0 -1440
  42. scitex/vis/tmp.txt +0 -239
  43. {scitex-2.4.3.dist-info → scitex-2.5.0.dist-info}/WHEEL +0 -0
  44. {scitex-2.4.3.dist-info → scitex-2.5.0.dist-info}/entry_points.txt +0 -0
  45. {scitex-2.4.3.dist-info → scitex-2.5.0.dist-info}/licenses/LICENSE +0 -0
scitex/vis/io/panel.py ADDED
@@ -0,0 +1,424 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: 2025-12-08
4
+ # File: ./src/scitex/vis/io/panel.py
5
+ """
6
+ Panel operations for scitex.vis.
7
+
8
+ Handles adding, removing, updating, and listing panels within a canvas.
9
+ Panels can be either 'scitex' type (full stx.plt output) or 'image' type (static image).
10
+ """
11
+
12
+ from pathlib import Path
13
+ from typing import Dict, Any, Union, List, Optional
14
+ import shutil
15
+
16
+ from .directory import get_canvas_directory_path
17
+ from .canvas import load_canvas_json, save_canvas_json
18
+ from .data import compute_file_hash
19
+
20
+
21
+ def _symlink_or_copy(source: Path, dest: Path, bundle: bool = False) -> None:
22
+ """Create relative symlink or copy file based on bundle flag."""
23
+ import os
24
+
25
+ if dest.exists() or dest.is_symlink():
26
+ dest.unlink()
27
+
28
+ if bundle:
29
+ shutil.copy2(source, dest)
30
+ else:
31
+ try:
32
+ # Use relative symlink for portability
33
+ rel_path = os.path.relpath(source.resolve(), dest.parent.resolve())
34
+ dest.symlink_to(rel_path)
35
+ except (OSError, ValueError):
36
+ # Fallback to copy if symlink fails (e.g., Windows without admin)
37
+ shutil.copy2(source, dest)
38
+
39
+
40
+ def _get_default_panel_properties() -> Dict[str, Any]:
41
+ """Get default panel properties."""
42
+ return {
43
+ "position": {"x_mm": 0, "y_mm": 0},
44
+ "size": {"width_mm": 50, "height_mm": 50},
45
+ "z_index": 0,
46
+ "rotation_deg": 0,
47
+ "clip": {
48
+ "enabled": False,
49
+ "x_mm": 0,
50
+ "y_mm": 0,
51
+ "width_mm": None,
52
+ "height_mm": None,
53
+ },
54
+ "opacity": 1.0,
55
+ "flip_h": False,
56
+ "flip_v": False,
57
+ "visible": True,
58
+ "label": {
59
+ "text": "",
60
+ "position": "top-left",
61
+ "fontsize": 12,
62
+ "fontweight": "bold",
63
+ },
64
+ "border": {
65
+ "visible": False,
66
+ "color": "#000000",
67
+ "width_mm": 0.2,
68
+ },
69
+ }
70
+
71
+
72
+ def add_panel_from_scitex(
73
+ project_dir: Union[str, Path],
74
+ canvas_name: str,
75
+ panel_name: str,
76
+ source_png: Union[str, Path],
77
+ source_json: Optional[Union[str, Path]] = None,
78
+ source_csv: Optional[Union[str, Path]] = None,
79
+ panel_properties: Optional[Dict[str, Any]] = None,
80
+ bundle: bool = False,
81
+ ) -> Path:
82
+ """
83
+ Add a panel from stx.plt output (scitex type).
84
+
85
+ Parameters
86
+ ----------
87
+ project_dir : str or Path
88
+ Project root directory
89
+ canvas_name : str
90
+ Canvas name
91
+ panel_name : str
92
+ Name for the new panel
93
+ source_png : str or Path
94
+ Path to source PNG file
95
+ source_json : str or Path, optional
96
+ Path to source JSON file (auto-detected if not provided)
97
+ source_csv : str or Path, optional
98
+ Path to source CSV file (auto-detected if not provided)
99
+ panel_properties : Dict, optional
100
+ Panel properties (position, size, etc.)
101
+ bundle : bool, optional
102
+ If True, copy files. If False (default), use symlinks.
103
+
104
+ Returns
105
+ -------
106
+ Path
107
+ Path to panel directory
108
+ """
109
+ source_png = Path(source_png)
110
+ base_name = source_png.stem
111
+
112
+ # Auto-detect json and csv if not provided
113
+ if source_json is None:
114
+ source_json = source_png.parent / f"{base_name}.json"
115
+ if source_csv is None:
116
+ source_csv = source_png.parent / f"{base_name}.csv"
117
+
118
+ source_json = Path(source_json)
119
+ source_csv = Path(source_csv)
120
+
121
+ # Create panel directory
122
+ canvas_dir = get_canvas_directory_path(project_dir, canvas_name)
123
+ panel_dir = canvas_dir / "panels" / panel_name
124
+ panel_dir.mkdir(parents=True, exist_ok=True)
125
+
126
+ # Use symlinks (default) or copy files based on bundle flag
127
+ _symlink_or_copy(source_png.resolve(), panel_dir / "panel.png", bundle=bundle)
128
+ if source_json.exists():
129
+ _symlink_or_copy(source_json.resolve(), panel_dir / "panel.json", bundle=bundle)
130
+ if source_csv.exists():
131
+ _symlink_or_copy(source_csv.resolve(), panel_dir / "panel.csv", bundle=bundle)
132
+
133
+ # Build panel entry
134
+ panel_entry = _get_default_panel_properties()
135
+ panel_entry["name"] = panel_name
136
+ panel_entry["type"] = "scitex"
137
+
138
+ if panel_properties:
139
+ _deep_merge(panel_entry, panel_properties)
140
+
141
+ # Update canvas.json
142
+ canvas_json = load_canvas_json(project_dir, canvas_name, verify_data_hashes=False)
143
+
144
+ # Remove existing panel with same name
145
+ canvas_json["panels"] = [p for p in canvas_json["panels"] if p.get("name") != panel_name]
146
+
147
+ # Add new panel
148
+ canvas_json["panels"].append(panel_entry)
149
+
150
+ # Add data file reference with hash
151
+ if source_csv.exists():
152
+ csv_path = f"panels/{panel_name}/panel.csv"
153
+ csv_hash = compute_file_hash(panel_dir / "panel.csv")
154
+ # Remove existing reference
155
+ canvas_json["data_files"] = [
156
+ d for d in canvas_json.get("data_files", [])
157
+ if d.get("path") != csv_path
158
+ ]
159
+ canvas_json["data_files"].append({
160
+ "path": csv_path,
161
+ "hash": csv_hash,
162
+ })
163
+
164
+ save_canvas_json(project_dir, canvas_name, canvas_json)
165
+
166
+ return panel_dir
167
+
168
+
169
+ def add_panel_from_image(
170
+ project_dir: Union[str, Path],
171
+ canvas_name: str,
172
+ panel_name: str,
173
+ source_image: Union[str, Path],
174
+ panel_properties: Optional[Dict[str, Any]] = None,
175
+ bundle: bool = False,
176
+ ) -> Path:
177
+ """
178
+ Add a panel from an image file (image type).
179
+
180
+ Parameters
181
+ ----------
182
+ project_dir : str or Path
183
+ Project root directory
184
+ canvas_name : str
185
+ Canvas name
186
+ panel_name : str
187
+ Name for the new panel
188
+ source_image : str or Path
189
+ Path to source image file (PNG, JPG, SVG)
190
+ panel_properties : Dict, optional
191
+ Panel properties (position, size, etc.)
192
+ bundle : bool, optional
193
+ If True, copy files. If False (default), use symlinks.
194
+
195
+ Returns
196
+ -------
197
+ Path
198
+ Path to panel directory
199
+ """
200
+ source_image = Path(source_image)
201
+ suffix = source_image.suffix.lower()
202
+
203
+ # Create panel directory
204
+ canvas_dir = get_canvas_directory_path(project_dir, canvas_name)
205
+ panel_dir = canvas_dir / "panels" / panel_name
206
+ panel_dir.mkdir(parents=True, exist_ok=True)
207
+
208
+ # Use symlink (default) or copy based on bundle flag
209
+ dest_name = f"panel{suffix}"
210
+ _symlink_or_copy(source_image.resolve(), panel_dir / dest_name, bundle=bundle)
211
+
212
+ # Build panel entry
213
+ panel_entry = _get_default_panel_properties()
214
+ panel_entry["name"] = panel_name
215
+ panel_entry["type"] = "image"
216
+ panel_entry["source"] = dest_name
217
+
218
+ if panel_properties:
219
+ _deep_merge(panel_entry, panel_properties)
220
+
221
+ # Update canvas.json
222
+ canvas_json = load_canvas_json(project_dir, canvas_name, verify_data_hashes=False)
223
+
224
+ # Remove existing panel with same name
225
+ canvas_json["panels"] = [p for p in canvas_json["panels"] if p.get("name") != panel_name]
226
+
227
+ # Add new panel
228
+ canvas_json["panels"].append(panel_entry)
229
+
230
+ save_canvas_json(project_dir, canvas_name, canvas_json)
231
+
232
+ return panel_dir
233
+
234
+
235
+ def remove_panel(
236
+ project_dir: Union[str, Path],
237
+ canvas_name: str,
238
+ panel_name: str,
239
+ ) -> bool:
240
+ """
241
+ Remove a panel from canvas.
242
+
243
+ Parameters
244
+ ----------
245
+ project_dir : str or Path
246
+ Project root directory
247
+ canvas_name : str
248
+ Canvas name
249
+ panel_name : str
250
+ Name of panel to remove
251
+
252
+ Returns
253
+ -------
254
+ bool
255
+ True if removed, False if panel didn't exist
256
+ """
257
+ canvas_dir = get_canvas_directory_path(project_dir, canvas_name)
258
+ panel_dir = canvas_dir / "panels" / panel_name
259
+
260
+ # Remove from canvas.json
261
+ canvas_json = load_canvas_json(project_dir, canvas_name, verify_data_hashes=False)
262
+
263
+ original_count = len(canvas_json["panels"])
264
+ canvas_json["panels"] = [p for p in canvas_json["panels"] if p.get("name") != panel_name]
265
+
266
+ # Remove data file references for this panel
267
+ canvas_json["data_files"] = [
268
+ d for d in canvas_json.get("data_files", [])
269
+ if not d.get("path", "").startswith(f"panels/{panel_name}/")
270
+ ]
271
+
272
+ if len(canvas_json["panels"]) < original_count:
273
+ save_canvas_json(project_dir, canvas_name, canvas_json)
274
+
275
+ # Remove panel directory
276
+ if panel_dir.exists():
277
+ shutil.rmtree(panel_dir)
278
+
279
+ return True
280
+
281
+ return False
282
+
283
+
284
+ def update_panel(
285
+ project_dir: Union[str, Path],
286
+ canvas_name: str,
287
+ panel_name: str,
288
+ updates: Dict[str, Any],
289
+ ) -> Dict[str, Any]:
290
+ """
291
+ Update panel properties.
292
+
293
+ Parameters
294
+ ----------
295
+ project_dir : str or Path
296
+ Project root directory
297
+ canvas_name : str
298
+ Canvas name
299
+ panel_name : str
300
+ Name of panel to update
301
+ updates : Dict[str, Any]
302
+ Properties to update
303
+
304
+ Returns
305
+ -------
306
+ Dict[str, Any]
307
+ Updated panel entry
308
+
309
+ Raises
310
+ ------
311
+ ValueError
312
+ If panel not found
313
+ """
314
+ canvas_json = load_canvas_json(project_dir, canvas_name, verify_data_hashes=False)
315
+
316
+ # Find panel
317
+ panel_entry = None
318
+ for panel in canvas_json["panels"]:
319
+ if panel.get("name") == panel_name:
320
+ panel_entry = panel
321
+ break
322
+
323
+ if panel_entry is None:
324
+ raise ValueError(f"Panel not found: {panel_name}")
325
+
326
+ # Apply updates
327
+ _deep_merge(panel_entry, updates)
328
+
329
+ save_canvas_json(project_dir, canvas_name, canvas_json)
330
+
331
+ return panel_entry
332
+
333
+
334
+ def list_panels(
335
+ project_dir: Union[str, Path],
336
+ canvas_name: str,
337
+ ) -> List[Dict[str, Any]]:
338
+ """
339
+ List all panels in a canvas.
340
+
341
+ Parameters
342
+ ----------
343
+ project_dir : str or Path
344
+ Project root directory
345
+ canvas_name : str
346
+ Canvas name
347
+
348
+ Returns
349
+ -------
350
+ List[Dict[str, Any]]
351
+ List of panel entries
352
+ """
353
+ canvas_json = load_canvas_json(project_dir, canvas_name, verify_data_hashes=False)
354
+ return canvas_json.get("panels", [])
355
+
356
+
357
+ def get_panel(
358
+ project_dir: Union[str, Path],
359
+ canvas_name: str,
360
+ panel_name: str,
361
+ ) -> Optional[Dict[str, Any]]:
362
+ """
363
+ Get a specific panel by name.
364
+
365
+ Parameters
366
+ ----------
367
+ project_dir : str or Path
368
+ Project root directory
369
+ canvas_name : str
370
+ Canvas name
371
+ panel_name : str
372
+ Name of panel
373
+
374
+ Returns
375
+ -------
376
+ Optional[Dict[str, Any]]
377
+ Panel entry or None if not found
378
+ """
379
+ panels = list_panels(project_dir, canvas_name)
380
+ for panel in panels:
381
+ if panel.get("name") == panel_name:
382
+ return panel
383
+ return None
384
+
385
+
386
+ def reorder_panels(
387
+ project_dir: Union[str, Path],
388
+ canvas_name: str,
389
+ panel_order: List[str],
390
+ ) -> None:
391
+ """
392
+ Reorder panels by z_index based on provided order.
393
+
394
+ Parameters
395
+ ----------
396
+ project_dir : str or Path
397
+ Project root directory
398
+ canvas_name : str
399
+ Canvas name
400
+ panel_order : List[str]
401
+ List of panel names in desired z-order (first = bottom)
402
+ """
403
+ canvas_json = load_canvas_json(project_dir, canvas_name, verify_data_hashes=False)
404
+
405
+ # Update z_index based on order
406
+ for idx, panel_name in enumerate(panel_order):
407
+ for panel in canvas_json["panels"]:
408
+ if panel.get("name") == panel_name:
409
+ panel["z_index"] = idx
410
+ break
411
+
412
+ save_canvas_json(project_dir, canvas_name, canvas_json)
413
+
414
+
415
+ def _deep_merge(base: Dict, updates: Dict) -> None:
416
+ """Deep merge updates into base dictionary (in-place)."""
417
+ for key, value in updates.items():
418
+ if key in base and isinstance(base[key], dict) and isinstance(value, dict):
419
+ _deep_merge(base[key], value)
420
+ else:
421
+ base[key] = value
422
+
423
+
424
+ # EOF
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scitex
3
- Version: 2.4.3
3
+ Version: 2.5.0
4
4
  Summary: A comprehensive Python library for scientific computing and data analysis
5
5
  Project-URL: Homepage, https://github.com/ywatanabe1989/scitex-code
6
6
  Project-URL: Documentation, https://scitex.readthedocs.io
@@ -101,6 +101,7 @@ Requires-Dist: bitsandbytes; extra == 'all'
101
101
  Requires-Dist: bs4; extra == 'all'
102
102
  Requires-Dist: catboost; extra == 'all'
103
103
  Requires-Dist: crawl4ai; extra == 'all'
104
+ Requires-Dist: dearpygui; extra == 'all'
104
105
  Requires-Dist: einops; extra == 'all'
105
106
  Requires-Dist: fairscale; extra == 'all'
106
107
  Requires-Dist: fastapi; extra == 'all'
@@ -133,6 +134,7 @@ Requires-Dist: pyedflib; extra == 'all'
133
134
  Requires-Dist: pymed; extra == 'all'
134
135
  Requires-Dist: pymupdf; extra == 'all'
135
136
  Requires-Dist: pypdf2; extra == 'all'
137
+ Requires-Dist: pyqt6; extra == 'all'
136
138
  Requires-Dist: pytesseract; extra == 'all'
137
139
  Requires-Dist: python-docx; extra == 'all'
138
140
  Requires-Dist: pytorch-optimizer; extra == 'all'
@@ -206,6 +208,10 @@ Requires-Dist: torchaudio; extra == 'dl'
206
208
  Requires-Dist: torchsummary; extra == 'dl'
207
209
  Requires-Dist: torchvision; extra == 'dl'
208
210
  Requires-Dist: transformers; extra == 'dl'
211
+ Provides-Extra: gui
212
+ Requires-Dist: dearpygui; extra == 'gui'
213
+ Requires-Dist: flask; extra == 'gui'
214
+ Requires-Dist: pyqt6; extra == 'gui'
209
215
  Provides-Extra: jupyter
210
216
  Requires-Dist: ipdb; extra == 'jupyter'
211
217
  Requires-Dist: ipykernel; extra == 'jupyter'
@@ -296,7 +302,7 @@ Part of the fully open-source SciTeX project: https://scitex.ai
296
302
 
297
303
  ``` bash
298
304
  pip install scitex # ~600 MB, Core + utilities
299
- pip install scitex[dl,ml,jupyter,neuro,web,scholar,writer,dev] # ~2-5 GB, Complete toolkit
305
+ pip install scitex[dl,ml,jupyter,neuro,web,gui,scholar,writer,dev] # ~2-5 GB, Complete toolkit
300
306
  ```
301
307
 
302
308
  ### Alial
@@ -352,6 +358,7 @@ plt.close(fig)
352
358
  | **jupyter** | JupyterLab, papermill | ~100 MB |
353
359
  | **neuro** | MNE, obspy (EEG/MEG analysis) | ~200 MB |
354
360
  | **web** | FastAPI, Flask, Streamlit | ~50 MB |
361
+ | **gui** | Flask, DearPyGui, PyQt6 (multi-backend figure editors) | ~100 MB |
355
362
  | **scholar** | Selenium, PDF tools, paper management | ~150 MB |
356
363
  | **writer** | LaTeX compilation tools | ~10 MB |
357
364
  | **dev** | Testing, linting (dev only) | ~100 MB |
@@ -1,7 +1,7 @@
1
1
  scitex/.mcp.json,sha256=ge1NDrBZkRIxJgx_tCS9QvcEa_P_ay8AAAafraZVRP4,1259
2
2
  scitex/__init__.py,sha256=8MkZBGNQrJj9Iy0qKI5aVUYWXyFW8I2HCIdxG8O9WuY,5778
3
3
  scitex/__main__.py,sha256=m0B6tnYHtUnkY7tXQab7qlqfNsLTtHqtWOs1Sg-wnhw,488
4
- scitex/__version__.py,sha256=9jMqN4MJ8401QbqhffA5qUyQAvmSxbq3WRWDLytDssY,400
4
+ scitex/__version__.py,sha256=IXuw38szkcDXLVw6ko9SiWFDX-gbeJo6PuKI-s0uXVg,400
5
5
  scitex/_optional_deps.py,sha256=oHwPdE6uJ4MmWNgt7JXojNtbwkUjR4c0mCCNMOK4k-w,3696
6
6
  scitex/errors.py,sha256=sgl1csU2sfHCINxO9jwPCdNA6hr-CqaT8tQMiuH93sQ,15247
7
7
  scitex/units.py,sha256=2T6VCwcjHBT_zPr_DG3JhUIF7a7TU1pUxMQPDBKZNCw,10373
@@ -402,7 +402,7 @@ scitex/io/_cache.py,sha256=2T10CGtFaxwTGICtFvWWEAhpENlgCMJ1cEqIm2nyTSo,2931
402
402
  scitex/io/_flush.py,sha256=_lF16-UNLT-J8Vtv5L-BpdmZ_tk8M9ooXVgETWfUhyY,511
403
403
  scitex/io/_glob.py,sha256=ZdQEsnqPw9lXf6kAqUyDNjg_MTwXxGePc-AeFxiPTDY,3550
404
404
  scitex/io/_json2md.py,sha256=JIM3tpZZ7klk5ku7x93xL_-1SRISLJOa6DffsxLs0Pk,3265
405
- scitex/io/_load.py,sha256=RAXYGei6nQM2j_RDp6D93gF6RJ7Y4FMlXlJ9kA-v1UA,10686
405
+ scitex/io/_load.py,sha256=91xVgsTy7u_2C-GDX-vKXWteMTX2kra-yZ5x5PtgsqI,10900
406
406
  scitex/io/_load_cache.py,sha256=eWr9RB36hClqOWvCce0ykk7zjmgEV-MJZ8DP3ovSUmM,7636
407
407
  scitex/io/_load_configs.py,sha256=v3lMiKHSs1W48t1oGY2EEB7PeYlXHdiiAQ_qRAOuCTs,5721
408
408
  scitex/io/_metadata.py,sha256=M5c8GfTJvb8VgSL4EOrvj6B6dqtiYX7c4Fi_HjzQZ6g,9953
@@ -410,12 +410,13 @@ scitex/io/_mv_to_tmp.py,sha256=oNwVn4WliWX2dFsSnkrA6B7Yn-BNX6O5hHrCbjXWufg,421
410
410
  scitex/io/_path.py,sha256=mqbs2Y2kJP-IHwvdtnJs8vyime9i0QY8bh3IyVEP3qA,7803
411
411
  scitex/io/_qr_utils.py,sha256=toLF1OzI8DQhIjbGPiMyRTwd6ba-LAk0nHPZ-fKMmXU,1969
412
412
  scitex/io/_reload.py,sha256=k3FSMO-ts0sAqNVYroVAG5rxk7haIRtyDbPl1ZvLIfw,2780
413
- scitex/io/_save.py,sha256=dwivlwD-PEyFiyR3tCDe65mGmL3_cpD3N8zTeUv2-Po,42246
413
+ scitex/io/_save.py,sha256=HGGleElb9izOKWbwV_vYp71-gqnqne2MIjYNpZmeLDE,42529
414
414
  scitex/io/memo.md,sha256=L6hzBLnJrC3QcUmKZ_-6wUliRXnEInZiRP8pWvKlx7k,98235
415
415
  scitex/io/_load_modules/_H5Explorer.py,sha256=FCl8_Jc1kH6xkOaIoq2CIXQ-0xjzCzbxOzHwMAr3SK8,10351
416
416
  scitex/io/_load_modules/_ZarrExplorer.py,sha256=lm9ZE64uyK9uoiY1NoJjwEbQNdbSXddPwtK3KVxwC90,3356
417
417
  scitex/io/_load_modules/__init__.py,sha256=53Z8frCV8Z9xkr4W-x95fQJMZ3jrJtTvu3ujfcDBPJA,1057
418
418
  scitex/io/_load_modules/_bibtex.py,sha256=_9E39P-tEe7lLvq5sSIsKIMLwfOggW5Rr2Pn7Iw0YhE,5710
419
+ scitex/io/_load_modules/_canvas.py,sha256=tDrKiRqNJSYWL_e8kKhUR6jzlpLbQ59HXHFvXni0mAU,5034
419
420
  scitex/io/_load_modules/_catboost.py,sha256=YrNjB8Aw_a89ovHTt5q-pJ4PQQ6VtsU0gh2QHIXkeVg,1657
420
421
  scitex/io/_load_modules/_con.py,sha256=Q9kXysIVm-ziagItNv4rfivX-y9iGmbSrqAlG5z9EdM,483
421
422
  scitex/io/_load_modules/_docx.py,sha256=UKboIkZLQfzUk1xQqA5taJb15NjePL6oJAKTganFqk4,933
@@ -439,6 +440,7 @@ scitex/io/_load_modules/_yaml.py,sha256=-F-XyRqApbRZdUsuObit0XM1RsC7Xdo4fFe5_N_n
439
440
  scitex/io/_load_modules/_zarr.py,sha256=ahwbs5iWyisan4LwoUu1GA8qOpq7dgHKikGgxUnIzhM,3614
440
441
  scitex/io/_save_modules/__init__.py,sha256=hYN8b3itnZlWgUMQka4k5-HaARQy-NVx9GHDip7xEMM,2333
441
442
  scitex/io/_save_modules/_bibtex.py,sha256=oChSTWb1HhK6kEtjuWpK-8q8_Cu-k9DE0CEc-M68NII,5882
443
+ scitex/io/_save_modules/_canvas.py,sha256=s72x_9PxDA1gD77muidYSzucvitGSswbnGVV9Bj5F2g,11650
442
444
  scitex/io/_save_modules/_catboost.py,sha256=wYLeTlnMtTXGlGmeUoBr_gobpV8JRsiAH-7d7ze8t8M,513
443
445
  scitex/io/_save_modules/_csv.py,sha256=K9NFdwk_kJzD-4UhgFu3dY3zDTl44KO_lJ6YnnODjfs,3264
444
446
  scitex/io/_save_modules/_excel.py,sha256=LkTF_G3ff5WlyNZNC3SWQt7_UztYrdIEgFDmusliaL0,6357
@@ -568,7 +570,7 @@ scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py,sha256=96Zi2gJ1
568
570
  scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py,sha256=asQlzM-1UHwuG7Wcjybexkf6XY791jRkdMS86yuelVI,1088
569
571
  scitex/plt/_subplots/_export_as_csv_formatters/_format_matshow.py,sha256=rF6wQXoJAcnOKr3XPERe6FmnVLd4jh_koqWpPG3GVjA,1219
570
572
  scitex/plt/_subplots/_export_as_csv_formatters/_format_pie.py,sha256=dqFGKkltfa3Y-e47pVixCSpTIY7Z-msPQFuumhfGs-o,1134
571
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py,sha256=MmIpgHaHdTMWPU4uE17tEyNPjUu3SMcsnL4EbV4oBOI,4866
573
+ scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py,sha256=4NWr99Gjed_kKTfelFAuTsBIR4by-fTFbzzFfNakhD8,6921
572
574
  scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py,sha256=ToOsgYCgKDBqUeSVq1IWeXmvWR0gGag-pcIwmIlVav8,2691
573
575
  scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py,sha256=ETYxkEjVZBu9jVFam29GMUZNUDDb0V0OJHtQpIjSO4A,1133
574
576
  scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py,sha256=Lj85dnnNRs5wsWqzvsw6Ui7q6tqhTjP0ZLjaN-sHGoU,1499
@@ -662,20 +664,22 @@ scitex/plt/color/_colors.py,sha256=N8WYRPLYlWFn9TV-jhUAmfRjjpv45aNQAXUpGFgNa9A,4
662
664
  scitex/plt/color/_get_colors_from_conf_matap.py,sha256=5oHCtGa3a3xtWa3NPYjgC3kapYmOUs3fZ0Q5JGK2YOI,4057
663
665
  scitex/plt/color/_interpolate.py,sha256=jTprQ4hINxjYdFLlVutI2PMkjqAWjvev-jRyIA78rEQ,976
664
666
  scitex/plt/color/_vizualize_colors.py,sha256=EoCbgm3IrXwq6oCJHmmLsVjnWaOUXp-j3D6pt0vDH5c,1356
667
+ scitex/plt/docs/FIGURE_ARCHITECTURE.md,sha256=_z7hzBmvRutllrm0SZ1Gltq8vX6H8Mm6mhvRZKj-fEM,6097
665
668
  scitex/plt/styles/SCITEX_STYLE.yaml,sha256=x7-UGZBgzLumi1eVvgEFOuQmzvTxFQ75ZVZ0VBVz-To,4514
666
669
  scitex/plt/styles/__init__.py,sha256=2KrY7gkfbuAD8ZfDI5bnovMJdjTHLJV5pIMq3mz01_0,1500
667
670
  scitex/plt/styles/_plot_defaults.py,sha256=FxwRUMONhizf8UeUZ8wtSCJkpONHvYaZO3rkpaC4eX8,7962
668
671
  scitex/plt/styles/_plot_postprocess.py,sha256=5fL8gXqROnqDfyZqBIhUwZ8-LMiDm45C7sHSHAnnOvk,19628
669
672
  scitex/plt/styles/_style_loader.py,sha256=QtjFY2VQYKZzOtYMk_RadkWX9JqK3MDgsr2WRlV2M2s,7481
670
673
  scitex/plt/styles/presets.py,sha256=j5SrabLBPQizVNKPZbFD5IVSEcnu__EIdcZdZfHhh9k,8029
671
- scitex/plt/utils/__init__.py,sha256=gw__K6vLRrypA8AG01b9TEZkdOcoNu4j6IjEZsnv4ag,2107
674
+ scitex/plt/utils/__init__.py,sha256=Kyh9kupztX-FLk5WS1UPqwIFcoQS2JfqaBZU_phdAx8,2355
672
675
  scitex/plt/utils/_calc_bacc_from_conf_mat.py,sha256=6_e5bc6hi3kosYqi-7qVJCNAPAX5dA9iebBwTrc1lX4,1222
673
676
  scitex/plt/utils/_calc_nice_ticks.py,sha256=ORlbvqcumBxx8gNwTv384OPzJRXtIIXtMsRpNOvx9SQ,3080
674
677
  scitex/plt/utils/_close.py,sha256=joX9DiSJusUn3tLpApyd62Cri2FH3nDxk6He3Hxxars,1964
675
- scitex/plt/utils/_collect_figure_metadata.py,sha256=Nm_nmJ9mxRYqny9QvbTtM5ef5iukddcJ5_l6HKAhvmc,20705
678
+ scitex/plt/utils/_collect_figure_metadata.py,sha256=ZxQTNQcNE4TPeLPhEHzF_jZLTaayvwCOwhYNJpIRPhQ,20928
676
679
  scitex/plt/utils/_colorbar.py,sha256=K_YNnKuQv5FfrJKe8V8OA62ztLM2chy1VPHUs0Zowlk,4702
677
680
  scitex/plt/utils/_configure_mpl.py,sha256=PJQkygYniH1ik7o5D_GJuJDx2wO0zFAFN89KlKkzkWg,15845
678
681
  scitex/plt/utils/_crop.py,sha256=AvKM5pjTez-Eky8ADFw0RZB2hvr_bfSkDX_Zj46BuE8,8607
682
+ scitex/plt/utils/_csv_column_naming.py,sha256=HW6JpISsWbMRTAG5MPjUQ_Lsu54EhtjCFSe1AgBLC-I,6488
679
683
  scitex/plt/utils/_dimension_viewer.py,sha256=tw3if2HRlL8m0ah33ko1Y6q8hLIX8LjdWf5w34VL7ec,12569
680
684
  scitex/plt/utils/_figure_from_axes_mm.py,sha256=ZTKitbffW2E_j6cmcnEj1kW2LyXZ57DhPdlg7aAhyQA,11907
681
685
  scitex/plt/utils/_figure_mm.py,sha256=b9d8aRfZnZOO0kiP2EcMevbuxnsCSQMEZRStGZkgA6A,13030
@@ -2756,7 +2760,7 @@ scitex/security/cli.py,sha256=-QMRwGcbj_3F2ZSKwZoBhX392IteXq8T4_6Xn39SCUw,3636
2756
2760
  scitex/security/github.py,sha256=hIM3vVg3b5GdB2X5HRQL2M0FB9xoJgD3xGEpcDg6NyU,10824
2757
2761
  scitex/session/README.md,sha256=lcXy_JnOgwA2oRlMrAREAg6w4xxrEz0j3syvatwxoko,6052
2758
2762
  scitex/session/__init__.py,sha256=SQB8pyGklciq9_pkicbMYqZPMctjMiW5QWydL9wA5uM,1515
2759
- scitex/session/_decorator.py,sha256=oy26uARpngXLt0TzktP5sbQnpuT8t43AdX0mR-zpmjQ,19680
2763
+ scitex/session/_decorator.py,sha256=KlReag5dKRYX3N5urt-Vm_AlcGhNdSQsiYi46hlN1Yo,20110
2760
2764
  scitex/session/_lifecycle.py,sha256=U_hZu8C8UCmHncaDZhhzBKg5uskvXfcbOUAA9nd4Jw8,25932
2761
2765
  scitex/session/_manager.py,sha256=i5UuNzC8Mp0Dy_rw5FSIo7CwbTG7g57PeFMFTxn4EMQ,2826
2762
2766
  scitex/session/template.py,sha256=JqnYA-8dtq-zUyAbbCJ_8aCIoThgxsn7CXIRWyLO54U,532
@@ -2852,22 +2856,39 @@ scitex/utils/_search.py,sha256=IZ4I1sjiwCURw0yjAu9MO7pYRoQuh80urUyBFRQU8_k,3948
2852
2856
  scitex/utils/_verify_scitex_format.py,sha256=_WGwZu9Y2hQk75VEkIC1ulI5v4l2wmSgWquqd2ywpW4,17551
2853
2857
  scitex/utils/_verify_scitex_format_v01.py,sha256=EYWiwxS1Xgfb1ZawMJ10coYVizGQgagVGkyt9LgGjzA,10883
2854
2858
  scitex/utils/template.py,sha256=M38FsmsdJhPNO7eKQbsmcliHbS2aqA8B7_dxxjlzE1k,2506
2855
- scitex/vis/DJANGO_INTEGRATION.md,sha256=ojhSOSLFGLoTRjo_eTCZmhd8XB40lFga3rpxmcHN2_8,17537
2856
- scitex/vis/README.md,sha256=e6rbpnSJll3nVMmrcgugGCGaK0Ftsmgqcza4Qyvl90c,16881
2857
- scitex/vis/__init__.py,sha256=vLipTP0SbJr6bZ_dSLkaWpJeuJKFTIhomF-Rwk_AnmU,2780
2858
- scitex/vis/tmp.txt,sha256=mReC8L9MN7ZMCYsc6G6jNxg5fyIW-7N9hvCgtrxt5ac,7960
2859
+ scitex/vis/README.md,sha256=I2gHvX0bTAfqujnqGScA9jF7BHwhG29ttM326eqj11s,9140
2860
+ scitex/vis/__init__.py,sha256=w8EyvZ7FMX55XvdG0nKJZwhP539nFloLjUGqLt3jleA,4650
2861
+ scitex/vis/canvas.py,sha256=LRnGsDeZ8dJ6ItFoaG3thP4mfNwxTyYrt5v4ADEucRs,12831
2859
2862
  scitex/vis/backend/__init__.py,sha256=Samj3vse9vbMJDaEMbcW9t5S9vx9Z3ZYrqnCqi5a988,1110
2860
2863
  scitex/vis/backend/export.py,sha256=hK8jZfgVLtMPUo-PWqlGPC60QpRGG1KUIQnl96cI7-4,3911
2861
2864
  scitex/vis/backend/parser.py,sha256=xR-Hml_2rK6B2Kj3m4t5UPoP0BZcteewDC3DH17pRQY,4504
2862
2865
  scitex/vis/backend/render.py,sha256=jc4QU8HfUhhzrd0b7zW_KUwC6r2BXQ3C_EObqgNOzV4,11137
2863
- scitex/vis/editor/__init__.py,sha256=6nEF5MHk39-TN35APdsEChZCIkm3NqkJlHmgTszPu-o,584
2864
- scitex/vis/editor/_defaults.py,sha256=GkZVnJyH_Ss1JfbtPNPfZbH58V18JDLhH-SZyNfGULc,6344
2865
- scitex/vis/editor/_edit.py,sha256=3YqMldzLK9qEXUAAIXNbdVZDX-rC2pur1GMf-GUosxc,10080
2866
+ scitex/vis/docs/CANVAS_ARCHITECTURE.md,sha256=LF5GSiUA1ZWriZt1lAc0FNsGEjl__zgqDQLIp6HKkb8,10559
2867
+ scitex/vis/editor/__init__.py,sha256=WOTzc1pn-_GJb4WOATlI8T48_kbsPqUsLSnHgA3u4HM,578
2868
+ scitex/vis/editor/_dearpygui_editor.py,sha256=Xqj6aWpQRdfSjPvAxGHTdByG0JfIPvNWKfOyNnVNvdw,73723
2869
+ scitex/vis/editor/_defaults.py,sha256=9oD5X8EFvqqekd3nQPscEWJtwCr6xwB5tCLydW9QtnM,7370
2870
+ scitex/vis/editor/_edit.py,sha256=N0VVF1siCg8UjyYWT6Xao7hKPly_BycJxv6EO8YkJRM,11101
2871
+ scitex/vis/editor/_flask_editor.py,sha256=xt8_xzxOjiPen4LIIWCQnXbLp4Bd42UDQGfqPv8fpvI,848
2866
2872
  scitex/vis/editor/_mpl_editor.py,sha256=rrns4erlzx9LwVfkjwsTOPXwdWaDgEoVEmJagKk4Jo0,7703
2873
+ scitex/vis/editor/_qt_editor.py,sha256=hVNLfNqEghqMInSA_TdIJhXXBZlWPh3KTPqOyHXQBhg,32697
2867
2874
  scitex/vis/editor/_tkinter_editor.py,sha256=5XU70hjVdbU2VX0LpHz5wQDzxBNOXubCz8IJWt3b1mE,18683
2868
- scitex/vis/editor/_web_editor.py,sha256=Wryx2jFHt1RaJtE-nA6WT7fWNl3jT4reSfJZ4mhDwKo,56451
2869
- scitex/vis/io/__init__.py,sha256=hBeuVmbwoWfDf-b5hIzC-DPWhPPZIMnmkh2iCiCAJ34,749
2875
+ scitex/vis/editor/flask_editor/__init__.py,sha256=hJY-EO3oN0M7meHDgMWISE04l-5D9cxX6jmzTTGW_VQ,527
2876
+ scitex/vis/editor/flask_editor/bbox.py,sha256=RhgLGz4aaf4cols5n22e3zNQfEOxXWlNf7MDvsw6HGA,8513
2877
+ scitex/vis/editor/flask_editor/core.py,sha256=SjoH1EEgVpvEs78ZfMxj9A9ZwMhRwVjSAueN7h0JWKs,5512
2878
+ scitex/vis/editor/flask_editor/plotter.py,sha256=2-9fDDCIt7LC7JPwju8ude9dgittOHCI5imuZjRFHJY,4559
2879
+ scitex/vis/editor/flask_editor/renderer.py,sha256=mVQtjF_oDOBAJgllFHRM7JDugQYkUoAuPGEXswsJ8IE,5646
2880
+ scitex/vis/editor/flask_editor/utils.py,sha256=QhKgVMqamWsbHALkEcpC5sqZKQBLaIqKUmd0tI829H0,2540
2881
+ scitex/vis/editor/flask_editor/templates/__init__.py,sha256=bnu99-lmSWTauuVY-2cUKGIvlymgtnCWnDbY0oFwx2A,708
2882
+ scitex/vis/editor/flask_editor/templates/html.py,sha256=7QT5lfWI7qOa4-R5IiAOdKvPEpnTV2DWpPPRhhmQ8OQ,15059
2883
+ scitex/vis/editor/flask_editor/templates/scripts.py,sha256=LGgVGEMg6NyjasvH5QgFfCKN8O2sJvDITUxz8dOm37k,21795
2884
+ scitex/vis/editor/flask_editor/templates/styles.py,sha256=4LMHLQtB3bFa-RjZ2EtbWY3v3THJVg46WXa1jv2Np08,13033
2885
+ scitex/vis/io/__init__.py,sha256=Qmxyot62vE-QZDz9u2NCnGDQb_oKEXXguR6LL1bbBhQ,2337
2886
+ scitex/vis/io/canvas.py,sha256=L1h6hfKKNqGpXedDmFtmMVw7KLviLKTfi1l02XqN3Os,5694
2887
+ scitex/vis/io/data.py,sha256=soOB0wr9QFDhdvjVxxREAHdRCi1B5PnDoa1pd7SR1Sc,4786
2888
+ scitex/vis/io/directory.py,sha256=spLu_xdbsrcQRV79c6ooJ5XvLuSvR-QJMDyuPG-DVKg,5360
2889
+ scitex/vis/io/export.py,sha256=4iylKmJjCeqQuIjA8CJzYSdeV21bKdIGiJ4i23BwQ4g,12360
2870
2890
  scitex/vis/io/load.py,sha256=6hh7pVNc4e9BM8lz1grywORUrSFI9Syb0Nk2bQWvTLg,3708
2891
+ scitex/vis/io/panel.py,sha256=aYZ_cyZ5X6Xtm-bSq4sTuq8Jz9qQEsJnMGUS7W5hwZY,11631
2871
2892
  scitex/vis/io/save.py,sha256=85O_lznZYJMspHjnyhBIKiMxF0xTAIQQkl_W3mmMhL8,3051
2872
2893
  scitex/vis/model/__init__.py,sha256=v2dfoL1UGvDDkqrjrqR83L_r275P7rsxGWzHdvURVLw,2532
2873
2894
  scitex/vis/model/annotations.py,sha256=b1qLp80U_6f_aFwZ0PyJtZz5DJHiIpUl5rHq1qG4QoI,3733
@@ -2933,8 +2954,8 @@ scitex/writer/utils/__init__.py,sha256=wizvQZbOWHsNnkdDsB8J4-lPInRM3gDdwOCRg1fLI
2933
2954
  scitex/writer/utils/_parse_latex_logs.py,sha256=_KfTzSw2IYhUzdZBJsZreAvQZk_BJHUBe2qIUNJfd-s,3154
2934
2955
  scitex/writer/utils/_parse_script_args.py,sha256=vVMQE-AHCs2Q2uVQDuZVN8N3Eft0sxuPtNmnyPXVgnc,4625
2935
2956
  scitex/writer/utils/_watch.py,sha256=qSBbwbeCPmXEWXn-ozCrar43rp664Wo65JzwIMWx7wE,2575
2936
- scitex-2.4.3.dist-info/METADATA,sha256=2Cl9m8PVii8rfVZqZceefYFQeYZHW5XTpLiXtmgWA88,29660
2937
- scitex-2.4.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
2938
- scitex-2.4.3.dist-info/entry_points.txt,sha256=jmgM0XEEIfCoMvwDSUNwRHBHaX_cfcJWQgi-lFc-BNU,48
2939
- scitex-2.4.3.dist-info/licenses/LICENSE,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
2940
- scitex-2.4.3.dist-info/RECORD,,
2957
+ scitex-2.5.0.dist-info/METADATA,sha256=WozVBcO25KEnBXTriDRsMkbihu_O0Icpc2HiMyvBGaE,29965
2958
+ scitex-2.5.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
2959
+ scitex-2.5.0.dist-info/entry_points.txt,sha256=jmgM0XEEIfCoMvwDSUNwRHBHaX_cfcJWQgi-lFc-BNU,48
2960
+ scitex-2.5.0.dist-info/licenses/LICENSE,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
2961
+ scitex-2.5.0.dist-info/RECORD,,