PyMieSimX 0.1.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.
- PyMieSimX/__init__.py +5 -0
- PyMieSimX/__main__.py +35 -0
- PyMieSimX/gui/__init__.py +5 -0
- PyMieSimX/gui/assets/card-state.js +41 -0
- PyMieSimX/gui/assets/dashboard.css +3352 -0
- PyMieSimX/gui/assets/default-settings.json +32 -0
- PyMieSimX/gui/assets/logo.png +0 -0
- PyMieSimX/gui/assets/pymiesim-favicon.svg +6 -0
- PyMieSimX/gui/assets/pymiesim-logo-dark.svg +15 -0
- PyMieSimX/gui/assets/pymiesim-logo.svg +39 -0
- PyMieSimX/gui/components/__init__.py +5 -0
- PyMieSimX/gui/components/cards.py +64 -0
- PyMieSimX/gui/defaults.py +18 -0
- PyMieSimX/gui/interface.py +688 -0
- PyMieSimX/gui/layout.py +329 -0
- PyMieSimX/gui/pages/__init__.py +9 -0
- PyMieSimX/gui/pages/citation.py +66 -0
- PyMieSimX/gui/pages/documentation.py +132 -0
- PyMieSimX/gui/pages/experiment/__init__.py +5 -0
- PyMieSimX/gui/pages/experiment/page.py +49 -0
- PyMieSimX/gui/pages/experiment/sections/__init__.py +5 -0
- PyMieSimX/gui/pages/experiment/sections/configuration.py +42 -0
- PyMieSimX/gui/pages/home.py +152 -0
- PyMieSimX/gui/pages/install_local.py +110 -0
- PyMieSimX/gui/pages/settings.py +87 -0
- PyMieSimX/gui/pages/single/__init__.py +5 -0
- PyMieSimX/gui/pages/single/page.py +28 -0
- PyMieSimX/gui/pages/single/sections/__init__.py +6 -0
- PyMieSimX/gui/pages/single/sections/representations.py +38 -0
- PyMieSimX/gui/pages/single/sections/setup.py +27 -0
- PyMieSimX/gui/parsing.py +149 -0
- PyMieSimX/gui/schemas.py +118 -0
- PyMieSimX/gui/services.py +735 -0
- pymiesimx-0.1.0.dist-info/METADATA +90 -0
- pymiesimx-0.1.0.dist-info/RECORD +39 -0
- pymiesimx-0.1.0.dist-info/WHEEL +5 -0
- pymiesimx-0.1.0.dist-info/entry_points.txt +2 -0
- pymiesimx-0.1.0.dist-info/licenses/LICENSE +21 -0
- pymiesimx-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"application": {
|
|
3
|
+
"theme": "light",
|
|
4
|
+
"default_tab": "experiment-tab"
|
|
5
|
+
},
|
|
6
|
+
"workspaces": {
|
|
7
|
+
"parameter_sweep": {
|
|
8
|
+
"source_type": "PlaneWaveSet",
|
|
9
|
+
"scatterer_type": "SphereSet",
|
|
10
|
+
"detector_type": "None"
|
|
11
|
+
},
|
|
12
|
+
"particle_explorer": {
|
|
13
|
+
"source_type": "PlaneWave",
|
|
14
|
+
"scatterer_type": "Sphere",
|
|
15
|
+
"representation": "s1s2",
|
|
16
|
+
"projection": "2d",
|
|
17
|
+
"sampling": 120
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"plot": {
|
|
21
|
+
"font_size": 18,
|
|
22
|
+
"line_width": 2,
|
|
23
|
+
"graph_height": 700,
|
|
24
|
+
"template": "match-theme",
|
|
25
|
+
"show_legend": true,
|
|
26
|
+
"show_grid": true,
|
|
27
|
+
"coordinate_system": "cartesian",
|
|
28
|
+
"x_scale": "linear",
|
|
29
|
+
"show_title": true,
|
|
30
|
+
"log_y": false
|
|
31
|
+
}
|
|
32
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="PMS favicon">
|
|
3
|
+
<title>PMS</title>
|
|
4
|
+
<rect width="64" height="64" rx="12" fill="#000000"/>
|
|
5
|
+
<text x="32" y="41" text-anchor="middle" fill="#2f80ff" font-family="Arial, Helvetica, sans-serif" font-size="24" font-weight="800" letter-spacing="1">PMS</text>
|
|
6
|
+
</svg>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1100" height="400" viewBox="200 50 700 400" role="img" aria-label="PyMieSim Light Scattering Simulation logo">
|
|
3
|
+
<title>PyMieSim Light Scattering Simulation</title>
|
|
4
|
+
<style>
|
|
5
|
+
.logo-main { font-family: "Avenir Next", "Century Gothic", Futura, Montserrat, Arial, sans-serif; font-size: 186px; font-weight: 560; letter-spacing: -3px; fill: #f4f7fb; }
|
|
6
|
+
.logo-subtitle { font-family: "Avenir Next", "Century Gothic", Futura, Montserrat, Arial, sans-serif; font-size: 55px; font-weight: 350; letter-spacing: -1.2px; fill: #d8e2ee; text-anchor: end; }
|
|
7
|
+
</style>
|
|
8
|
+
<text class="logo-main" x="35" y="290"><tspan>P</tspan><tspan dx="9">yMieSim</tspan></text>
|
|
9
|
+
<g transform="translate(-108,0)">
|
|
10
|
+
<path d="m 975.8673,149.6464 h 26 l 64,88 -64,88 h -26 l 64,-88 z" fill="#65a0ff"/>
|
|
11
|
+
<path d="m 1135.8673,149.6464 h 28 l -64,88 64,88 h -28 l -62,-88 z" fill="#48e0eb"/>
|
|
12
|
+
</g>
|
|
13
|
+
<text class="logo-subtitle" x="1078" y="397">Light Scattering Simulation</text>
|
|
14
|
+
<line x1="460" y1="416" x2="1078" y2="416" stroke="#d8e2ee" stroke-width="5" stroke-linecap="butt" />
|
|
15
|
+
</svg>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg"
|
|
3
|
+
width="1100" height="400"
|
|
4
|
+
viewBox="200 50 700 400"
|
|
5
|
+
role="img"
|
|
6
|
+
aria-label="PyMieSim Flow-cytometry Calibration logo">
|
|
7
|
+
<title>PyMieSim Flow-cytometry Calibration</title>
|
|
8
|
+
<style>
|
|
9
|
+
.logo-main {
|
|
10
|
+
font-family: "Avenir Next", "Century Gothic", Futura, Montserrat, Arial, serif;
|
|
11
|
+
font-size: 186px;
|
|
12
|
+
font-weight: 560;
|
|
13
|
+
letter-spacing: -3px;
|
|
14
|
+
fill: #26272a;
|
|
15
|
+
}
|
|
16
|
+
.logo-subtitle {
|
|
17
|
+
font-family: "Avenir Next", "Century Gothic", Futura, Montserrat, Arial, sans-serif;
|
|
18
|
+
font-size: 55px;
|
|
19
|
+
font-weight: 350;
|
|
20
|
+
letter-spacing: -1.2px;
|
|
21
|
+
fill: #26272a;
|
|
22
|
+
text-anchor: end;
|
|
23
|
+
}
|
|
24
|
+
</style>
|
|
25
|
+
|
|
26
|
+
<text class="logo-main" x="35" y="290"><tspan>P</tspan><tspan dx="9">yMieSim</tspan></text>
|
|
27
|
+
|
|
28
|
+
<!-- Original blue/cyan chevron X preserved as vector paths, shifted slightly right for better spacing -->
|
|
29
|
+
<g transform="translate(-108,0)">
|
|
30
|
+
<path d="m 975.8673,149.6464 h 26 l 64,88 -64,88 h -26 l 64,-88 z"
|
|
31
|
+
fill="#2d6df6"/>
|
|
32
|
+
<path d="m 1135.8673,149.6464 h 28 l -64,88 64,88 h -28 l -62,-88 z"
|
|
33
|
+
fill="#16c9dc"/>
|
|
34
|
+
</g>
|
|
35
|
+
|
|
36
|
+
<text class="logo-subtitle" x="1078" y="397">Light Scattering Simulation</text>
|
|
37
|
+
<line x1="460" y1="416" x2="1078" y2="416"
|
|
38
|
+
stroke="#26272a" stroke-width="5" stroke-linecap="butt" />
|
|
39
|
+
</svg>
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""Reusable card primitives shared by all dashboard pages."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Sequence
|
|
6
|
+
|
|
7
|
+
from dash import html
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Card:
|
|
11
|
+
"""Build a RosettaX-style card with an optional colored left accent."""
|
|
12
|
+
|
|
13
|
+
@classmethod
|
|
14
|
+
def classes(cls, *, color: str = "blue", extra: str = "") -> str:
|
|
15
|
+
"""Return the shared card class names for any page component."""
|
|
16
|
+
return " ".join(filter(None, ["card", "ui-card", f"ui-card--{color}", extra]))
|
|
17
|
+
|
|
18
|
+
def __init__(self, children, *, class_name: str = "", color: str = "blue"):
|
|
19
|
+
self.children = children
|
|
20
|
+
self.class_name = class_name
|
|
21
|
+
self.color = color
|
|
22
|
+
|
|
23
|
+
def render(self):
|
|
24
|
+
return html.Section(className=self.classes(color=self.color, extra=self.class_name), children=self.children)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class HeaderCard(Card):
|
|
28
|
+
"""Build a workflow header with an intro and embedded step cards."""
|
|
29
|
+
|
|
30
|
+
def __init__(self, title: str, description: str, steps: Sequence[tuple[str, str, str, str]], *, color: str = "green"):
|
|
31
|
+
super().__init__(children=[], class_name="workflow-header-card", color=color)
|
|
32
|
+
self.title = title
|
|
33
|
+
self.description = description
|
|
34
|
+
self.steps = steps
|
|
35
|
+
|
|
36
|
+
def render(self):
|
|
37
|
+
return html.Section(
|
|
38
|
+
className=self.classes(color=self.color, extra=self.class_name),
|
|
39
|
+
children=[
|
|
40
|
+
html.Div(
|
|
41
|
+
className="card-body workflow-header-body",
|
|
42
|
+
children=[
|
|
43
|
+
html.Div(
|
|
44
|
+
className="header-card-intro",
|
|
45
|
+
children=[html.H2(self.title), html.P(self.description)],
|
|
46
|
+
),
|
|
47
|
+
html.Div(
|
|
48
|
+
className="header-card-steps",
|
|
49
|
+
children=[
|
|
50
|
+
html.Div(
|
|
51
|
+
className=f"rosettax-workflow-step-card rosettax-workflow-step-card--{color}",
|
|
52
|
+
children=[
|
|
53
|
+
html.Div(number, className="header-step-number"),
|
|
54
|
+
html.H6(step_title),
|
|
55
|
+
html.P(step_description),
|
|
56
|
+
],
|
|
57
|
+
)
|
|
58
|
+
for number, step_title, step_description, color in self.steps
|
|
59
|
+
],
|
|
60
|
+
),
|
|
61
|
+
],
|
|
62
|
+
),
|
|
63
|
+
]
|
|
64
|
+
)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Shared dashboard defaults loaded from the bundled asset configuration."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
_DEFAULTS_PATH = Path(__file__).with_name("assets") / "default-settings.json"
|
|
10
|
+
|
|
11
|
+
with _DEFAULTS_PATH.open(encoding="utf-8") as _defaults_file:
|
|
12
|
+
_defaults = json.load(_defaults_file)
|
|
13
|
+
|
|
14
|
+
DEFAULT_APPLICATION_SETTINGS = _defaults["application"]
|
|
15
|
+
DEFAULT_WORKSPACE_SETTINGS = _defaults["workspaces"]
|
|
16
|
+
DEFAULT_PLOT_SETTINGS = _defaults["plot"]
|
|
17
|
+
DEFAULT_PARTICLE_PLOT_SETTINGS = {**DEFAULT_PLOT_SETTINGS}
|
|
18
|
+
DEFAULT_SWEEP_PLOT_SETTINGS = {**DEFAULT_PLOT_SETTINGS}
|