simview 3.2__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 (163) hide show
  1. simview/__init__.py +69 -0
  2. simview/__main__.py +174 -0
  3. simview/launcher.py +109 -0
  4. simview/live.py +204 -0
  5. simview/merge.py +593 -0
  6. simview/model.py +690 -0
  7. simview/py.typed +0 -0
  8. simview/scene.py +603 -0
  9. simview/server.py +739 -0
  10. simview/state.py +190 -0
  11. simview/static/css/controls.css +36 -0
  12. simview/static/js/SimView.js +601 -0
  13. simview/static/js/components/AnimationController.js +654 -0
  14. simview/static/js/components/BatchManager.js +198 -0
  15. simview/static/js/components/InteractionController.js +446 -0
  16. simview/static/js/components/InteractionControls.js +116 -0
  17. simview/static/js/components/Scene.js +166 -0
  18. simview/static/js/components/StateStore.js +188 -0
  19. simview/static/js/config.js +233 -0
  20. simview/static/js/main.js +3 -0
  21. simview/static/js/objects/Body.js +616 -0
  22. simview/static/js/objects/StaticObject.js +181 -0
  23. simview/static/js/objects/Terrain.js +514 -0
  24. simview/static/js/objects/utils.js +378 -0
  25. simview/static/js/ui/AnalysisPanel.js +233 -0
  26. simview/static/js/ui/BatchLegend.js +207 -0
  27. simview/static/js/ui/BodyStateWindow.js +521 -0
  28. simview/static/js/ui/Controls.js +586 -0
  29. simview/static/js/ui/ErrorMetrics.js +664 -0
  30. simview/static/js/ui/Legend.js +87 -0
  31. simview/static/js/ui/PlaybackControls.js +314 -0
  32. simview/static/js/ui/ScalarPlotter.js +575 -0
  33. simview/static/js/utils/blobCodec.js +73 -0
  34. simview/static/js/utils/bodyTransforms.js +151 -0
  35. simview/static/js/utils/csv.js +46 -0
  36. simview/static/js/utils/errorMath.js +69 -0
  37. simview/static/js/utils/injectStyles.js +16 -0
  38. simview/static/js/utils/interpolate.js +65 -0
  39. simview/static/js/utils/liveFollow.js +17 -0
  40. simview/static/js/utils/loadRecordingLibs.js +34 -0
  41. simview/static/js/utils/viewState.js +226 -0
  42. simview/static/lib/chroma-js-3.1.2/index.min.js +8 -0
  43. simview/static/lib/chroma-js-3.1.2/src/Color.js +49 -0
  44. simview/static/lib/chroma-js-3.1.2/src/chroma.js +10 -0
  45. simview/static/lib/chroma-js-3.1.2/src/colors/colorbrewer.js +81 -0
  46. simview/static/lib/chroma-js-3.1.2/src/colors/w3cx11.js +164 -0
  47. simview/static/lib/chroma-js-3.1.2/src/generator/average.js +88 -0
  48. simview/static/lib/chroma-js-3.1.2/src/generator/bezier.js +86 -0
  49. simview/static/lib/chroma-js-3.1.2/src/generator/blend.js +57 -0
  50. simview/static/lib/chroma-js-3.1.2/src/generator/cubehelix.js +87 -0
  51. simview/static/lib/chroma-js-3.1.2/src/generator/mix.js +19 -0
  52. simview/static/lib/chroma-js-3.1.2/src/generator/random.js +12 -0
  53. simview/static/lib/chroma-js-3.1.2/src/generator/scale.js +394 -0
  54. simview/static/lib/chroma-js-3.1.2/src/interpolator/_hsx.js +59 -0
  55. simview/static/lib/chroma-js-3.1.2/src/interpolator/hcg.js +12 -0
  56. simview/static/lib/chroma-js-3.1.2/src/interpolator/hsi.js +12 -0
  57. simview/static/lib/chroma-js-3.1.2/src/interpolator/hsl.js +12 -0
  58. simview/static/lib/chroma-js-3.1.2/src/interpolator/hsv.js +12 -0
  59. simview/static/lib/chroma-js-3.1.2/src/interpolator/index.js +1 -0
  60. simview/static/lib/chroma-js-3.1.2/src/interpolator/lab.js +19 -0
  61. simview/static/lib/chroma-js-3.1.2/src/interpolator/lch.js +13 -0
  62. simview/static/lib/chroma-js-3.1.2/src/interpolator/lrgb.js +19 -0
  63. simview/static/lib/chroma-js-3.1.2/src/interpolator/num.js +15 -0
  64. simview/static/lib/chroma-js-3.1.2/src/interpolator/oklab.js +19 -0
  65. simview/static/lib/chroma-js-3.1.2/src/interpolator/oklch.js +12 -0
  66. simview/static/lib/chroma-js-3.1.2/src/interpolator/rgb.js +18 -0
  67. simview/static/lib/chroma-js-3.1.2/src/io/cmyk/cmyk2rgb.js +16 -0
  68. simview/static/lib/chroma-js-3.1.2/src/io/cmyk/index.js +27 -0
  69. simview/static/lib/chroma-js-3.1.2/src/io/cmyk/rgb2cmyk.js +17 -0
  70. simview/static/lib/chroma-js-3.1.2/src/io/css/css2rgb.js +238 -0
  71. simview/static/lib/chroma-js-3.1.2/src/io/css/hsl2css.js +26 -0
  72. simview/static/lib/chroma-js-3.1.2/src/io/css/index.js +27 -0
  73. simview/static/lib/chroma-js-3.1.2/src/io/css/lab2css.js +24 -0
  74. simview/static/lib/chroma-js-3.1.2/src/io/css/lch2css.js +24 -0
  75. simview/static/lib/chroma-js-3.1.2/src/io/css/oklab2css.js +16 -0
  76. simview/static/lib/chroma-js-3.1.2/src/io/css/oklch2css.js +16 -0
  77. simview/static/lib/chroma-js-3.1.2/src/io/css/rgb2css.js +61 -0
  78. simview/static/lib/chroma-js-3.1.2/src/io/gl/index.js +22 -0
  79. simview/static/lib/chroma-js-3.1.2/src/io/hcg/hcg2rgb.js +55 -0
  80. simview/static/lib/chroma-js-3.1.2/src/io/hcg/index.js +27 -0
  81. simview/static/lib/chroma-js-3.1.2/src/io/hcg/rgb2hcg.js +23 -0
  82. simview/static/lib/chroma-js-3.1.2/src/io/hex/hex2rgb.js +56 -0
  83. simview/static/lib/chroma-js-3.1.2/src/io/hex/index.js +29 -0
  84. simview/static/lib/chroma-js-3.1.2/src/io/hex/rgb2hex.js +29 -0
  85. simview/static/lib/chroma-js-3.1.2/src/io/hsi/hsi2rgb.js +45 -0
  86. simview/static/lib/chroma-js-3.1.2/src/io/hsi/index.js +27 -0
  87. simview/static/lib/chroma-js-3.1.2/src/io/hsi/rgb2hsi.js +31 -0
  88. simview/static/lib/chroma-js-3.1.2/src/io/hsl/hsl2rgb.js +35 -0
  89. simview/static/lib/chroma-js-3.1.2/src/io/hsl/index.js +27 -0
  90. simview/static/lib/chroma-js-3.1.2/src/io/hsl/rgb2hsl.js +45 -0
  91. simview/static/lib/chroma-js-3.1.2/src/io/hsv/hsv2rgb.js +47 -0
  92. simview/static/lib/chroma-js-3.1.2/src/io/hsv/index.js +27 -0
  93. simview/static/lib/chroma-js-3.1.2/src/io/hsv/rgb2hsv.js +32 -0
  94. simview/static/lib/chroma-js-3.1.2/src/io/input.js +4 -0
  95. simview/static/lib/chroma-js-3.1.2/src/io/lab/index.js +28 -0
  96. simview/static/lib/chroma-js-3.1.2/src/io/lab/lab-constants.js +120 -0
  97. simview/static/lib/chroma-js-3.1.2/src/io/lab/lab2rgb.js +101 -0
  98. simview/static/lib/chroma-js-3.1.2/src/io/lab/rgb2lab.js +67 -0
  99. simview/static/lib/chroma-js-3.1.2/src/io/lch/hcl2rgb.js +9 -0
  100. simview/static/lib/chroma-js-3.1.2/src/io/lch/index.js +35 -0
  101. simview/static/lib/chroma-js-3.1.2/src/io/lch/lab2lch.js +12 -0
  102. simview/static/lib/chroma-js-3.1.2/src/io/lch/lch2lab.js +18 -0
  103. simview/static/lib/chroma-js-3.1.2/src/io/lch/lch2rgb.js +13 -0
  104. simview/static/lib/chroma-js-3.1.2/src/io/lch/rgb2lch.js +12 -0
  105. simview/static/lib/chroma-js-3.1.2/src/io/named/index.js +30 -0
  106. simview/static/lib/chroma-js-3.1.2/src/io/num/index.js +32 -0
  107. simview/static/lib/chroma-js-3.1.2/src/io/num/num2rgb.js +13 -0
  108. simview/static/lib/chroma-js-3.1.2/src/io/num/rgb2num.js +8 -0
  109. simview/static/lib/chroma-js-3.1.2/src/io/oklab/index.js +27 -0
  110. simview/static/lib/chroma-js-3.1.2/src/io/oklab/oklab2rgb.js +34 -0
  111. simview/static/lib/chroma-js-3.1.2/src/io/oklab/rgb2oklab.js +37 -0
  112. simview/static/lib/chroma-js-3.1.2/src/io/oklch/index.js +27 -0
  113. simview/static/lib/chroma-js-3.1.2/src/io/oklch/oklch2rgb.js +13 -0
  114. simview/static/lib/chroma-js-3.1.2/src/io/oklch/rgb2oklch.js +12 -0
  115. simview/static/lib/chroma-js-3.1.2/src/io/rgb/index.js +44 -0
  116. simview/static/lib/chroma-js-3.1.2/src/io/temp/index.js +22 -0
  117. simview/static/lib/chroma-js-3.1.2/src/io/temp/rgb2temperature.js +30 -0
  118. simview/static/lib/chroma-js-3.1.2/src/io/temp/temperature2rgb.js +39 -0
  119. simview/static/lib/chroma-js-3.1.2/src/ops/alpha.js +13 -0
  120. simview/static/lib/chroma-js-3.1.2/src/ops/clipped.js +5 -0
  121. simview/static/lib/chroma-js-3.1.2/src/ops/darken.js +17 -0
  122. simview/static/lib/chroma-js-3.1.2/src/ops/get.js +13 -0
  123. simview/static/lib/chroma-js-3.1.2/src/ops/luminance.js +54 -0
  124. simview/static/lib/chroma-js-3.1.2/src/ops/mix.js +10 -0
  125. simview/static/lib/chroma-js-3.1.2/src/ops/premultiply.js +12 -0
  126. simview/static/lib/chroma-js-3.1.2/src/ops/saturate.js +15 -0
  127. simview/static/lib/chroma-js-3.1.2/src/ops/set.js +43 -0
  128. simview/static/lib/chroma-js-3.1.2/src/ops/shade.js +11 -0
  129. simview/static/lib/chroma-js-3.1.2/src/utils/analyze.js +191 -0
  130. simview/static/lib/chroma-js-3.1.2/src/utils/clip_rgb.js +15 -0
  131. simview/static/lib/chroma-js-3.1.2/src/utils/contrast.js +12 -0
  132. simview/static/lib/chroma-js-3.1.2/src/utils/contrastAPCA.js +68 -0
  133. simview/static/lib/chroma-js-3.1.2/src/utils/delta-e.js +62 -0
  134. simview/static/lib/chroma-js-3.1.2/src/utils/distance.js +17 -0
  135. simview/static/lib/chroma-js-3.1.2/src/utils/index.js +27 -0
  136. simview/static/lib/chroma-js-3.1.2/src/utils/last.js +8 -0
  137. simview/static/lib/chroma-js-3.1.2/src/utils/limit.js +5 -0
  138. simview/static/lib/chroma-js-3.1.2/src/utils/multiply-matrices.js +36 -0
  139. simview/static/lib/chroma-js-3.1.2/src/utils/scales.js +15 -0
  140. simview/static/lib/chroma-js-3.1.2/src/utils/type.js +18 -0
  141. simview/static/lib/chroma-js-3.1.2/src/utils/unpack.js +17 -0
  142. simview/static/lib/chroma-js-3.1.2/src/utils/valid.js +11 -0
  143. simview/static/lib/chroma-js-3.1.2/src/version.js +2 -0
  144. simview/static/lib/download.js +132 -0
  145. simview/static/lib/js-colormaps.js +19335 -0
  146. simview/static/lib/tar.js +334 -0
  147. simview/static/lib/three-0.174.0/addons/controls/OrbitControls.js +1556 -0
  148. simview/static/lib/three-0.174.0/addons/libs/lil-gui.module.min.js +8 -0
  149. simview/static/lib/three-0.174.0/three.core.js +48830 -0
  150. simview/static/lib/three-0.174.0/three.module.js +17313 -0
  151. simview/static/lib/uPlot.esm.js +6140 -0
  152. simview/static/lib/uPlot.min.css +2 -0
  153. simview/static/textures/contacts/red-cross0.png +0 -0
  154. simview/static/textures/points/ball0.png +0 -0
  155. simview/static/textures/points/ball1.png +0 -0
  156. simview/templates/index.html +81 -0
  157. simview/utils.py +41 -0
  158. simview-3.2.dist-info/METADATA +552 -0
  159. simview-3.2.dist-info/RECORD +163 -0
  160. simview-3.2.dist-info/WHEEL +5 -0
  161. simview-3.2.dist-info/entry_points.txt +2 -0
  162. simview-3.2.dist-info/licenses/LICENSE +28 -0
  163. simview-3.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,207 @@
1
+ import { injectStyles } from "../utils/injectStyles.js";
2
+
3
+ // Bottom-right, toggleable panel listing every batch's color swatch and name.
4
+ // Doubles as a batch picker (click a row to focus it) and a renaming UI (click
5
+ // the name to edit it in place); renames are persisted server-side via
6
+ // BatchManager.setBatchName so they survive a reload.
7
+ export class BatchLegend {
8
+ static styleId = "batch-legend-styles";
9
+
10
+ constructor(app) {
11
+ this.app = app;
12
+ this.isExpanded = true;
13
+ this.rowElements = new Map();
14
+
15
+ this._injectStyles();
16
+ this._setupHTML();
17
+ }
18
+
19
+ _injectStyles() {
20
+ const css = `
21
+ .batch-legend-container {
22
+ width: 220px;
23
+ position: fixed;
24
+ bottom: 1rem;
25
+ right: 1rem;
26
+ background-color: rgba(0, 0, 0, 0.75);
27
+ color: white;
28
+ border-radius: 8px;
29
+ font-family: Arial, sans-serif;
30
+ font-size: 12px;
31
+ z-index: 1000;
32
+ }
33
+ .batch-legend-header {
34
+ display: flex;
35
+ align-items: center;
36
+ padding: 8px 10px;
37
+ cursor: pointer;
38
+ font-weight: bold;
39
+ font-size: 1.1em;
40
+ }
41
+ .batch-legend-header:hover {
42
+ background-color: rgba(255, 255, 255, 0.1);
43
+ }
44
+ .batch-legend-header-icon {
45
+ padding-right: 0.4rem;
46
+ color: #ccc;
47
+ }
48
+ .batch-legend-content {
49
+ display: none;
50
+ padding: 0 8px 8px 8px;
51
+ border-top: 1px solid rgba(255, 255, 255, 0.5);
52
+ max-height: 30vh;
53
+ overflow-y: auto;
54
+ }
55
+ .batch-legend-content.visible {
56
+ display: block;
57
+ }
58
+ .batch-legend-row {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 8px;
62
+ padding: 5px 4px;
63
+ margin-top: 4px;
64
+ border-radius: 4px;
65
+ cursor: pointer;
66
+ }
67
+ .batch-legend-row:hover {
68
+ background-color: rgba(255, 255, 255, 0.1);
69
+ }
70
+ .batch-legend-row.active {
71
+ background-color: rgba(255, 255, 255, 0.18);
72
+ outline: 1px solid rgba(255, 255, 255, 0.6);
73
+ }
74
+ .batch-legend-swatch {
75
+ width: 12px;
76
+ height: 12px;
77
+ border-radius: 50%;
78
+ flex: none;
79
+ border: 1px solid rgba(255, 255, 255, 0.4);
80
+ }
81
+ .batch-legend-index {
82
+ color: #ccc;
83
+ flex: none;
84
+ }
85
+ .batch-legend-name {
86
+ flex: 1;
87
+ min-width: 0;
88
+ overflow: hidden;
89
+ text-overflow: ellipsis;
90
+ white-space: nowrap;
91
+ background: transparent;
92
+ border: 1px solid transparent;
93
+ color: white;
94
+ font-family: Arial, sans-serif;
95
+ font-size: 1em;
96
+ padding: 1px 3px;
97
+ border-radius: 3px;
98
+ }
99
+ .batch-legend-name:hover {
100
+ border-color: rgba(255, 255, 255, 0.3);
101
+ }
102
+ .batch-legend-name:focus {
103
+ outline: none;
104
+ border-color: white;
105
+ background-color: rgba(255, 255, 255, 0.1);
106
+ cursor: text;
107
+ }
108
+ `;
109
+ injectStyles(BatchLegend.styleId, css);
110
+ }
111
+
112
+ _setupHTML() {
113
+ this.container = document.createElement("div");
114
+ this.container.className = "batch-legend-container";
115
+
116
+ this.header = document.createElement("div");
117
+ this.header.className = "batch-legend-header";
118
+ this.icon = document.createElement("span");
119
+ this.icon.className = "batch-legend-header-icon";
120
+ const title = document.createElement("span");
121
+ title.textContent = "Batches";
122
+ this.header.appendChild(this.icon);
123
+ this.header.appendChild(title);
124
+ this.header.addEventListener("click", () => this._toggleDropdown());
125
+
126
+ this.content = document.createElement("div");
127
+ this.content.className = "batch-legend-content";
128
+
129
+ this._buildRows();
130
+ this._applyExpandedState();
131
+
132
+ this.container.appendChild(this.header);
133
+ this.container.appendChild(this.content);
134
+ document.body.appendChild(this.container);
135
+ }
136
+
137
+ _buildRows() {
138
+ this.content.innerHTML = "";
139
+ this.rowElements.clear();
140
+ const { batchManager } = this.app;
141
+ for (let i = 0; i < batchManager.simBatches; i++) {
142
+ const row = document.createElement("div");
143
+ row.className = "batch-legend-row";
144
+
145
+ const swatch = document.createElement("span");
146
+ swatch.className = "batch-legend-swatch";
147
+ const color = batchManager.getColorForBatch(i);
148
+ swatch.style.backgroundColor =
149
+ typeof color === "string" ? color : `#${color.getHexString()}`;
150
+
151
+ const index = document.createElement("span");
152
+ index.className = "batch-legend-index";
153
+ index.textContent = `${i}`;
154
+
155
+ const nameInput = document.createElement("input");
156
+ nameInput.type = "text";
157
+ nameInput.className = "batch-legend-name";
158
+ nameInput.value = batchManager.getBatchName(i);
159
+ nameInput.addEventListener("click", (e) => e.stopPropagation());
160
+ nameInput.addEventListener("keydown", (e) => {
161
+ if (e.key === "Enter") nameInput.blur();
162
+ e.stopPropagation();
163
+ });
164
+ nameInput.addEventListener("change", () => {
165
+ batchManager.setBatchName(i, nameInput.value);
166
+ });
167
+
168
+ row.appendChild(swatch);
169
+ row.appendChild(index);
170
+ row.appendChild(nameInput);
171
+ row.addEventListener("click", () => batchManager.setActiveBatch(i));
172
+
173
+ this.content.appendChild(row);
174
+ this.rowElements.set(i, row);
175
+ }
176
+ this.highlightActive();
177
+ }
178
+
179
+ highlightActive() {
180
+ const active = this.app.batchManager.currentlyActiveBatch;
181
+ this.rowElements.forEach((row, i) => {
182
+ row.classList.toggle("active", i === active);
183
+ });
184
+ }
185
+
186
+ // Re-reads names/colors from BatchManager, e.g. after a rename elsewhere.
187
+ refresh() {
188
+ this._buildRows();
189
+ }
190
+
191
+ _toggleDropdown() {
192
+ this.isExpanded = !this.isExpanded;
193
+ this._applyExpandedState();
194
+ }
195
+
196
+ _applyExpandedState() {
197
+ this.content.classList.toggle("visible", this.isExpanded);
198
+ this.icon.textContent = this.isExpanded ? "▾" : "▸";
199
+ }
200
+
201
+ dispose() {
202
+ if (this.container && this.container.parentElement) {
203
+ this.container.parentElement.removeChild(this.container);
204
+ }
205
+ this.rowElements.clear();
206
+ }
207
+ }