geomui 0.5.4

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 (44) hide show
  1. package/README.md +58 -0
  2. package/dist/Drawing.svelte +303 -0
  3. package/dist/Drawing.svelte.d.ts +21 -0
  4. package/dist/DrawingList.svelte +66 -0
  5. package/dist/DrawingList.svelte.d.ts +17 -0
  6. package/dist/InputParams.svelte +453 -0
  7. package/dist/InputParams.svelte.d.ts +22 -0
  8. package/dist/LabelCheckbox.svelte +27 -0
  9. package/dist/LabelCheckbox.svelte.d.ts +14 -0
  10. package/dist/LocStorRead.svelte +56 -0
  11. package/dist/LocStorRead.svelte.d.ts +17 -0
  12. package/dist/LocStorTable.svelte +167 -0
  13. package/dist/LocStorTable.svelte.d.ts +18 -0
  14. package/dist/LocStorWrite.svelte +66 -0
  15. package/dist/LocStorWrite.svelte.d.ts +17 -0
  16. package/dist/ModalDiag.svelte +100 -0
  17. package/dist/ModalDiag.svelte.d.ts +22 -0
  18. package/dist/ModalImg.svelte +59 -0
  19. package/dist/ModalImg.svelte.d.ts +17 -0
  20. package/dist/OneDesign.svelte +32 -0
  21. package/dist/OneDesign.svelte.d.ts +18 -0
  22. package/dist/ParamDrawExport.svelte +195 -0
  23. package/dist/ParamDrawExport.svelte.d.ts +19 -0
  24. package/dist/SimpleDrawing.svelte +58 -0
  25. package/dist/SimpleDrawing.svelte.d.ts +20 -0
  26. package/dist/SubDesign.svelte +202 -0
  27. package/dist/SubDesign.svelte.d.ts +19 -0
  28. package/dist/TimeControl.svelte +107 -0
  29. package/dist/TimeControl.svelte.d.ts +19 -0
  30. package/dist/ZoomControl.svelte +106 -0
  31. package/dist/ZoomControl.svelte.d.ts +16 -0
  32. package/dist/downloadParams.d.ts +4 -0
  33. package/dist/downloadParams.js +42 -0
  34. package/dist/drawingLayers.d.ts +3 -0
  35. package/dist/drawingLayers.js +6 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +5 -0
  38. package/dist/initStore.d.ts +5 -0
  39. package/dist/initStore.js +46 -0
  40. package/dist/storePVal.d.ts +6 -0
  41. package/dist/storePVal.js +4 -0
  42. package/dist/style/colors.scss +51 -0
  43. package/dist/style/styling.scss +23 -0
  44. package/package.json +66 -0
@@ -0,0 +1,453 @@
1
+ <script>import ModalDiag from "./ModalDiag.svelte";
2
+ import ModalImg from "./ModalImg.svelte";
3
+ import LocStorWrite from "./LocStorWrite.svelte";
4
+ import LocStorRead from "./LocStorRead.svelte";
5
+ import SimpleDrawing from "./SimpleDrawing.svelte";
6
+ import { PType, parseParamFile, createParamFile } from "geometrix";
7
+ import { storePV } from "./storePVal";
8
+ import { downloadParams, generateUrl } from "./downloadParams";
9
+ import { onMount, createEventDispatcher } from "svelte";
10
+ import { browser } from "$app/environment";
11
+ import { page } from "$app/stores";
12
+ import { base } from "$app/paths";
13
+ const dispatch = createEventDispatcher();
14
+ export let pDef;
15
+ export let fgeom;
16
+ export let selFace;
17
+ export let simTime = 0;
18
+ let inputComment = "";
19
+ function paramChange() {
20
+ dispatch("paramChg", { foo: "bla" });
21
+ }
22
+ function tolerantApply(ipVal) {
23
+ let rMsg = "";
24
+ let cover = 0;
25
+ let uncover = 0;
26
+ let equal = 0;
27
+ const pNameList = [];
28
+ for (const p of pDef.params) {
29
+ pNameList.push(p.name);
30
+ if (Object.hasOwn(ipVal, p.name)) {
31
+ cover += 1;
32
+ if ($storePV[pDef.partName][p.name] === ipVal[p.name]) {
33
+ equal += 1;
34
+ } else {
35
+ $storePV[pDef.partName][p.name] = ipVal[p.name];
36
+ }
37
+ } else {
38
+ uncover += 1;
39
+ }
40
+ }
41
+ let notInScope = 0;
42
+ for (const pa of Object.keys(ipVal)) {
43
+ if (!pNameList.includes(pa)) {
44
+ notInScope += 1;
45
+ rMsg += `warn363: parameter ${pa} not in the scope of the design (${notInScope})
46
+ `;
47
+ }
48
+ }
49
+ const rApplyWarn = notInScope > 0 ? true : false;
50
+ const loadDate = (/* @__PURE__ */ new Date()).toLocaleTimeString();
51
+ rMsg += `Params loaded at ${loadDate} :`;
52
+ rMsg += ` def-nb: ${Object.keys(pDef.params).length}`;
53
+ rMsg += `, cover-nb: ${cover}, uncover-nb: ${uncover}
54
+ `;
55
+ rMsg += ` load-nb: ${Object.keys(ipVal).length}`;
56
+ rMsg += `, equal-nb: ${equal}, changed-nb: ${cover - equal}`;
57
+ rMsg += `, out-of-scope: ${notInScope}`;
58
+ return [rMsg, rApplyWarn];
59
+ }
60
+ let loadMsg = "";
61
+ let applyWarn = false;
62
+ function initParams2() {
63
+ if (browser) {
64
+ const searchParams = new URLSearchParams($page.url.search);
65
+ const pVal2 = {};
66
+ for (const [kk, vv] of searchParams) {
67
+ const vvn = Number(vv);
68
+ if (!isNaN(vvn)) {
69
+ pVal2[kk] = vvn;
70
+ }
71
+ }
72
+ if (Object.keys(pVal2).length > 0) {
73
+ [loadMsg, applyWarn] = tolerantApply(pVal2);
74
+ }
75
+ }
76
+ }
77
+ function forceInit() {
78
+ initParams2();
79
+ paramChange();
80
+ }
81
+ onMount(() => {
82
+ forceInit();
83
+ });
84
+ function loadParams(iStr) {
85
+ try {
86
+ const [paramJson] = parseParamFile(iStr);
87
+ [loadMsg, applyWarn] = tolerantApply(paramJson.pVal);
88
+ inputComment = paramJson.comment;
89
+ paramChange();
90
+ } catch (emsg) {
91
+ let errMsg = "err723: error by parsing parameter file\n";
92
+ errMsg += emsg;
93
+ loadMsg = errMsg;
94
+ applyWarn = true;
95
+ }
96
+ }
97
+ function loadFile(fileP) {
98
+ const reader = new FileReader();
99
+ reader.addEventListener("loadend", () => {
100
+ loadParams(reader.result);
101
+ });
102
+ reader.readAsText(fileP);
103
+ }
104
+ function loadParamFromFile(eve) {
105
+ if (eve.target) {
106
+ const paramFiles = eve.target.files;
107
+ if (paramFiles) {
108
+ loadFile(paramFiles[0]);
109
+ }
110
+ }
111
+ }
112
+ function downloadParams2() {
113
+ downloadParams(pDef.partName, $storePV[pDef.partName], inputComment);
114
+ }
115
+ let modalLoadDefault = false;
116
+ let modalLoadLocal = false;
117
+ let modalSaveUrl = false;
118
+ let modalSaveLocal = false;
119
+ function loadDefaults() {
120
+ const pInit = {};
121
+ for (const p of pDef.params) {
122
+ pInit[p.name] = p.init;
123
+ }
124
+ [loadMsg, applyWarn] = tolerantApply(pInit);
125
+ }
126
+ let locStorRname;
127
+ function loadLocStor() {
128
+ if (locStorRname !== void 0 && locStorRname !== "") {
129
+ const storeKey = `${pDef.partName}_${locStorRname}`;
130
+ if (browser) {
131
+ const storeStr = window.localStorage.getItem(storeKey);
132
+ if (storeStr === null) {
133
+ loadMsg = `Warn157: localStorage key ${storeKey} is null`;
134
+ applyWarn = true;
135
+ } else {
136
+ loadParams(storeStr);
137
+ }
138
+ }
139
+ } else {
140
+ loadMsg = "Warn239: No valid name for loading from localStorage!";
141
+ applyWarn = true;
142
+ }
143
+ }
144
+ let locStorWname;
145
+ function saveInLocStor() {
146
+ if (locStorWname !== void 0 && locStorWname !== "") {
147
+ const storeKey = `${pDef.partName}_${locStorWname}`;
148
+ const re2 = /\..*$/;
149
+ const lastModif = (/* @__PURE__ */ new Date()).toISOString().replace(re2, "");
150
+ const storeAllStr = createParamFile(lastModif, $storePV[pDef.partName], inputComment);
151
+ if (browser) {
152
+ window.localStorage.setItem(storeKey, storeAllStr);
153
+ }
154
+ } else {
155
+ console.log("Warn639: No valid name for writing to localStorage!");
156
+ }
157
+ }
158
+ let pUrl = "";
159
+ function generateUrl2() {
160
+ const url1 = generateUrl($page.url.href, $storePV[pDef.partName], false);
161
+ return url1.toString();
162
+ }
163
+ function openModalUrl() {
164
+ pUrl = generateUrl2();
165
+ modalSaveUrl = true;
166
+ }
167
+ function saveAsUrl() {
168
+ }
169
+ let paramSvg = `${base}/default_param_blank.svg`;
170
+ function paramPict(keyName) {
171
+ paramSvg = `${base}/default_param_blank.svg`;
172
+ if (Object.keys(pDef.paramSvg).includes(keyName)) {
173
+ paramSvg = `${base}/${pDef.paramSvg[keyName]}`;
174
+ }
175
+ }
176
+ function paramPict2(idx, pDef_page) {
177
+ const paramNb = Object.keys($storePV[pDef_page]).length;
178
+ if (idx < paramNb) {
179
+ paramPict(Object.keys($storePV[pDef_page])[idx]);
180
+ }
181
+ }
182
+ $:
183
+ paramPict2(0, pDef.partName);
184
+ let modalImg = false;
185
+ function showSvg() {
186
+ modalImg = true;
187
+ }
188
+ </script>
189
+
190
+ <section>
191
+ <h2>Parameters</h2>
192
+ <main>
193
+ <label for="loadFParams" class="fileUpload">Load Params from File</label>
194
+ <input
195
+ id="loadFParams"
196
+ type="file"
197
+ accept="text/plain, application/json"
198
+ on:change={loadParamFromFile}
199
+ />
200
+ <button
201
+ on:click={() => {
202
+ modalLoadDefault = true;
203
+ }}>Set Params Default</button
204
+ >
205
+ <button
206
+ on:click={() => {
207
+ modalLoadLocal = true;
208
+ }}>Load Params from localStorage</button
209
+ >
210
+ <ModalDiag
211
+ bind:modalOpen={modalLoadDefault}
212
+ okName="Overwrite Parameters"
213
+ okFunc={loadDefaults}>Load the default parameters ?</ModalDiag
214
+ >
215
+ <ModalDiag bind:modalOpen={modalLoadLocal} okName="Load Parameters" okFunc={loadLocStor}
216
+ ><LocStorRead pageName={pDef.partName} bind:storeName={locStorRname} /></ModalDiag
217
+ >
218
+ <textarea
219
+ rows="3"
220
+ cols="80"
221
+ readonly
222
+ wrap="off"
223
+ value={loadMsg}
224
+ class:colorWarn={applyWarn}
225
+ />
226
+ <table>
227
+ <thead>
228
+ <tr>
229
+ <td>Parameter name</td>
230
+ <td>Value</td>
231
+ <td>Unit</td>
232
+ <td>Default</td>
233
+ <td>Min</td>
234
+ <td>Max</td>
235
+ <td>Step</td>
236
+ </tr>
237
+ </thead>
238
+ <tbody>
239
+ {#each pDef.params as param}
240
+ <tr class:changed={$storePV[pDef.partName][param.name] !== param.init}>
241
+ <td><button on:click={() => paramPict(param.name)}>{param.name}</button></td
242
+ >
243
+ <td>
244
+ {#if param.pType === PType.eNumber}
245
+ <input
246
+ type="number"
247
+ bind:value={$storePV[pDef.partName][param.name]}
248
+ min={param.min}
249
+ max={param.max}
250
+ step={param.step}
251
+ on:change={paramChange}
252
+ class="input-number"
253
+ />
254
+ <input
255
+ type="range"
256
+ bind:value={$storePV[pDef.partName][param.name]}
257
+ min={param.min}
258
+ max={param.max}
259
+ step={param.step}
260
+ on:change={paramChange}
261
+ />
262
+ {:else if param.pType === PType.eCheckbox}
263
+ <select bind:value={$storePV[pDef.partName][param.name]}>
264
+ {#each ['Off', 'On'] as one, idx}
265
+ <option value={idx}>{one}</option>
266
+ {/each}
267
+ </select>
268
+ {:else}
269
+ <select bind:value={$storePV[pDef.partName][param.name]}>
270
+ {#each param.dropdown as one, idx}
271
+ <option value={idx}>{one}</option>
272
+ {/each}
273
+ </select>
274
+ {/if}
275
+ </td>
276
+ <td>{param.unit}</td>
277
+ <td>{param.init}</td>
278
+ <td>{param.min}</td>
279
+ <td>{param.max}</td>
280
+ <td>{param.step}</td>
281
+ </tr>
282
+ {/each}
283
+ </tbody>
284
+ </table>
285
+ <div class="comment">
286
+ <label for="inComment">Comment:</label>
287
+ <input type="text" id="inComment" bind:value={inputComment} maxlength="150" size="70" />
288
+ </div>
289
+ <button on:click={downloadParams2}>Save Parameters to File</button>
290
+ <button on:click={openModalUrl}>Save Parameters as URL</button>
291
+ <button
292
+ on:click={() => {
293
+ modalSaveLocal = true;
294
+ }}>Save Parameters to localStorage</button
295
+ >
296
+ <ModalDiag bind:modalOpen={modalSaveUrl} okName="Done" okFunc={saveAsUrl} sizeLarge={true}
297
+ ><p>Copy this URL and send it to your friends!</p>
298
+ <p class="cUrl">{pUrl}</p></ModalDiag
299
+ >
300
+ <ModalDiag
301
+ bind:modalOpen={modalSaveLocal}
302
+ okName="Save into localStorage"
303
+ okFunc={saveInLocStor}
304
+ ><LocStorWrite pageName={pDef.partName} bind:storeName={locStorWname} /></ModalDiag
305
+ >
306
+ </main>
307
+ <ModalImg bind:modalOpen={modalImg} svgPath={paramSvg} />
308
+ <button on:click={showSvg} class="side-img">
309
+ <img src={paramSvg} alt={paramSvg} />
310
+ </button>
311
+ <div class="mini-canvas">
312
+ <SimpleDrawing pageName={pDef.partName} {fgeom} {selFace} {simTime} />
313
+ </div>
314
+ </section>
315
+
316
+ <style>/*
317
+ $canvas-point: grey;
318
+
319
+ // export to js
320
+ :export {
321
+ colorCanvasPoint: $canvas-point;
322
+ }
323
+ */
324
+ section > h2 {
325
+ color: grey;
326
+ margin: 1rem 0.5rem 0;
327
+ }
328
+
329
+ section > main {
330
+ display: inline-block;
331
+ }
332
+
333
+ section > main > label.fileUpload {
334
+ display: inline-block;
335
+ height: 1.2rem;
336
+ /*width: 1.6rem;*/
337
+ color: darkBlue;
338
+ font-size: 0.8rem;
339
+ font-weight: 400;
340
+ padding: 0.1rem 0.4rem 0.1rem;
341
+ border-style: solid;
342
+ border-width: 0.1rem;
343
+ border-radius: 0.2rem;
344
+ border-color: darkBlue;
345
+ margin: 0.5rem;
346
+ background-color: lightBlue;
347
+ }
348
+
349
+ section > main > input[type=file] {
350
+ display: none;
351
+ }
352
+
353
+ section > main > textarea {
354
+ display: block;
355
+ /*resize: horizontal;*/
356
+ font-size: 0.8rem;
357
+ font-weight: 400;
358
+ margin: 0.2rem;
359
+ margin-left: 0.5rem;
360
+ }
361
+
362
+ section > main > textarea.colorWarn {
363
+ background-color: orange;
364
+ }
365
+
366
+ section > main > table {
367
+ font-size: 0.8rem;
368
+ font-weight: 400;
369
+ margin: 0.2rem 0.5rem 0.2rem;
370
+ }
371
+
372
+ section > main > table > thead {
373
+ background-color: #ddd;
374
+ }
375
+
376
+ section > main > table > tbody {
377
+ background-color: #eee;
378
+ }
379
+
380
+ section > main > table > tbody > tr.changed {
381
+ background-color: #ded;
382
+ }
383
+
384
+ section > main > table > thead > tr > td,
385
+ section > main > table > tbody > tr > td {
386
+ padding-left: 0.4rem;
387
+ padding-right: 0.4rem;
388
+ }
389
+
390
+ section > main > table > tbody > tr > td > button {
391
+ color: darkBlue;
392
+ background-color: transparent;
393
+ border: 0;
394
+ }
395
+
396
+ section > main > table > tbody > tr > td > input {
397
+ height: 0.8rem;
398
+ }
399
+
400
+ section > main > table > tbody > tr > td > input.input-number {
401
+ width: 5rem;
402
+ }
403
+
404
+ section > main > div.comment {
405
+ font-size: 0.8rem;
406
+ margin-left: 0.5rem;
407
+ }
408
+
409
+ section > main > button {
410
+ /*display: inline-block;*/
411
+ height: 1.6rem;
412
+ /*width: 1.6rem;*/
413
+ color: darkBlue;
414
+ font-size: 0.8rem;
415
+ font-weight: 400;
416
+ padding: 0.2rem 0.4rem 0.2rem;
417
+ border-style: solid;
418
+ border-width: 0.1rem;
419
+ border-radius: 0.2rem;
420
+ border-color: darkBlue;
421
+ margin: 0.5rem;
422
+ background-color: lightBlue;
423
+ }
424
+
425
+ p.cUrl {
426
+ margin: 0 1rem 0;
427
+ }
428
+
429
+ section > button.side-img {
430
+ margin: 0.2rem;
431
+ border: none;
432
+ padding: 0;
433
+ font-size: 0.6rem;
434
+ background-color: white;
435
+ vertical-align: top;
436
+ position: sticky;
437
+ z-index: 1;
438
+ top: 0.5rem;
439
+ }
440
+
441
+ section > button.side-img > img {
442
+ max-width: 200px;
443
+ max-height: 200px;
444
+ }
445
+
446
+ section > div.mini-canvas {
447
+ display: inline-block;
448
+ margin: 0.2rem;
449
+ vertical-align: top;
450
+ position: sticky;
451
+ z-index: 1;
452
+ top: 0.5rem;
453
+ }</style>
@@ -0,0 +1,22 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { tParamDef, tGeomFunc } from 'geometrix';
3
+ declare const __propDef: {
4
+ props: {
5
+ pDef: tParamDef;
6
+ fgeom: tGeomFunc;
7
+ selFace: string;
8
+ simTime?: number | undefined;
9
+ };
10
+ events: {
11
+ paramChg: CustomEvent<any>;
12
+ } & {
13
+ [evt: string]: CustomEvent<any>;
14
+ };
15
+ slots: {};
16
+ };
17
+ export type InputParamsProps = typeof __propDef.props;
18
+ export type InputParamsEvents = typeof __propDef.events;
19
+ export type InputParamsSlots = typeof __propDef.slots;
20
+ export default class InputParams extends SvelteComponent<InputParamsProps, InputParamsEvents, InputParamsSlots> {
21
+ }
22
+ export {};
@@ -0,0 +1,27 @@
1
+ <script>import { dLayers } from "./drawingLayers";
2
+ </script>
3
+
4
+ <div>
5
+ <label><input type="checkbox" bind:checked={$dLayers.main} />main part</label>
6
+ <label><input type="checkbox" bind:checked={$dLayers.mainB} />main skeleton</label>
7
+ <label><input type="checkbox" bind:checked={$dLayers.second} />second parts</label>
8
+ <label><input type="checkbox" bind:checked={$dLayers.secondB} />second skeletons</label>
9
+ <label><input type="checkbox" bind:checked={$dLayers.dynamics} />dynamics</label>
10
+ <label><input type="checkbox" bind:checked={$dLayers.ruler} />ruler</label>
11
+ <label><input type="checkbox" bind:checked={$dLayers.refframe} />frame of reference</label>
12
+ <label><input type="checkbox" bind:checked={$dLayers.points} />points</label>
13
+ <label><input type="checkbox" bind:checked={$dLayers.lines} />lines</label>
14
+ <label><input type="checkbox" bind:checked={$dLayers.vectors} />vectors</label>
15
+ </div>
16
+
17
+ <style>/*
18
+ $canvas-point: grey;
19
+
20
+ // export to js
21
+ :export {
22
+ colorCanvasPoint: $canvas-point;
23
+ }
24
+ */
25
+ div > label > input {
26
+ margin-left: 1rem;
27
+ }</style>
@@ -0,0 +1,14 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: Record<string, never>;
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {};
8
+ };
9
+ export type LabelCheckboxProps = typeof __propDef.props;
10
+ export type LabelCheckboxEvents = typeof __propDef.events;
11
+ export type LabelCheckboxSlots = typeof __propDef.slots;
12
+ export default class LabelCheckbox extends SvelteComponent<LabelCheckboxProps, LabelCheckboxEvents, LabelCheckboxSlots> {
13
+ }
14
+ export {};
@@ -0,0 +1,56 @@
1
+ <script>import LocStorTable from "./LocStorTable.svelte";
2
+ export let pageName;
3
+ export let storeName;
4
+ let localKeys = [];
5
+ function defaultName(ilocalKeys) {
6
+ let rname = storeName;
7
+ const nameUpdate = !ilocalKeys.includes(rname);
8
+ if (nameUpdate) {
9
+ if (ilocalKeys.length > 0) {
10
+ rname = ilocalKeys[0];
11
+ } else {
12
+ rname = "";
13
+ }
14
+ }
15
+ return rname;
16
+ }
17
+ $:
18
+ storeName = defaultName(localKeys);
19
+ </script>
20
+
21
+ <LocStorTable {pageName} bind:storeName bind:localKeys />
22
+ <div>
23
+ <label for="storName">Select a parameter-set:</label>
24
+ <input
25
+ type="text"
26
+ id="storName"
27
+ value={storeName}
28
+ readonly
29
+ minlength="4"
30
+ maxlength="30"
31
+ size="32"
32
+ />
33
+ </div>
34
+
35
+ <style>/*
36
+ $canvas-point: grey;
37
+
38
+ // export to js
39
+ :export {
40
+ colorCanvasPoint: $canvas-point;
41
+ }
42
+ */
43
+ div {
44
+ min-height: 6rem;
45
+ display: flex;
46
+ flex-direction: column;
47
+ justify-content: flex-start;
48
+ align-items: center;
49
+ }
50
+
51
+ div > label,
52
+ div > input {
53
+ font-size: 1rem;
54
+ font-weight: 400;
55
+ margin: 0.2rem;
56
+ }</style>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ pageName: string;
5
+ storeName: string;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export type LocStorReadProps = typeof __propDef.props;
13
+ export type LocStorReadEvents = typeof __propDef.events;
14
+ export type LocStorReadSlots = typeof __propDef.slots;
15
+ export default class LocStorRead extends SvelteComponent<LocStorReadProps, LocStorReadEvents, LocStorReadSlots> {
16
+ }
17
+ export {};