@jjlmoya/utils-chrono 1.18.0 → 1.19.0
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.
- package/package.json +1 -1
- package/src/category/index.ts +2 -0
- package/src/entries.ts +4 -1
- package/src/index.ts +1 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/mainspring-finder/bibliography.astro +16 -0
- package/src/tool/mainspring-finder/bibliography.ts +16 -0
- package/src/tool/mainspring-finder/client.ts +89 -0
- package/src/tool/mainspring-finder/component.astro +72 -0
- package/src/tool/mainspring-finder/entry.ts +50 -0
- package/src/tool/mainspring-finder/helpers.ts +52 -0
- package/src/tool/mainspring-finder/i18n/de.ts +212 -0
- package/src/tool/mainspring-finder/i18n/en.ts +212 -0
- package/src/tool/mainspring-finder/i18n/es.ts +212 -0
- package/src/tool/mainspring-finder/i18n/fr.ts +212 -0
- package/src/tool/mainspring-finder/i18n/id.ts +212 -0
- package/src/tool/mainspring-finder/i18n/it.ts +212 -0
- package/src/tool/mainspring-finder/i18n/ja.ts +212 -0
- package/src/tool/mainspring-finder/i18n/ko.ts +212 -0
- package/src/tool/mainspring-finder/i18n/nl.ts +212 -0
- package/src/tool/mainspring-finder/i18n/pl.ts +212 -0
- package/src/tool/mainspring-finder/i18n/pt.ts +212 -0
- package/src/tool/mainspring-finder/i18n/ru.ts +212 -0
- package/src/tool/mainspring-finder/i18n/sv.ts +212 -0
- package/src/tool/mainspring-finder/i18n/tr.ts +212 -0
- package/src/tool/mainspring-finder/i18n/zh.ts +212 -0
- package/src/tool/mainspring-finder/index.ts +11 -0
- package/src/tool/mainspring-finder/mainspring-finder.css +242 -0
- package/src/tool/mainspring-finder/seo.astro +16 -0
- package/src/tools.ts +2 -0
package/package.json
CHANGED
package/src/category/index.ts
CHANGED
|
@@ -20,6 +20,7 @@ import { perpetualCalendar } from '../tool/perpetual-calendar/entry';
|
|
|
20
20
|
import { tourbillonVisualizer } from '../tool/tourbillon-visualizer/entry';
|
|
21
21
|
import { gmtWorldTimer } from '../tool/gmt-world-timer/entry';
|
|
22
22
|
import { quartzBatteryHealth } from '../tool/quartz-battery-health/entry';
|
|
23
|
+
import { mainspringFinder } from '../tool/mainspring-finder/entry';
|
|
23
24
|
|
|
24
25
|
export const chronoCategory: ChronoCategoryEntry = {
|
|
25
26
|
icon: 'mdi:clock-outline',
|
|
@@ -45,6 +46,7 @@ export const chronoCategory: ChronoCategoryEntry = {
|
|
|
45
46
|
tourbillonVisualizer,
|
|
46
47
|
gmtWorldTimer,
|
|
47
48
|
quartzBatteryHealth,
|
|
49
|
+
mainspringFinder,
|
|
48
50
|
],
|
|
49
51
|
i18n: {
|
|
50
52
|
de: () => import('./i18n/de').then((m) => m.content),
|
package/src/entries.ts
CHANGED
|
@@ -42,6 +42,8 @@ export { gmtWorldTimer } from './tool/gmt-world-timer/entry';
|
|
|
42
42
|
export type { GMTWorldTimerUI, GMTWorldTimerLocaleContent } from './tool/gmt-world-timer/entry';
|
|
43
43
|
export { quartzBatteryHealth } from './tool/quartz-battery-health/entry';
|
|
44
44
|
export type { QuartzBatteryHealthUI, QuartzBatteryHealthLocaleContent } from './tool/quartz-battery-health/entry';
|
|
45
|
+
export { mainspringFinder } from './tool/mainspring-finder/entry';
|
|
46
|
+
export type { MainspringFinderUI, MainspringFinderLocaleContent } from './tool/mainspring-finder/entry';
|
|
45
47
|
export { chronoCategory } from './category';
|
|
46
48
|
|
|
47
49
|
import { watchAccuracyTracker } from './tool/watch-accuracy-tracker/entry';
|
|
@@ -66,6 +68,7 @@ import { perpetualCalendar } from './tool/perpetual-calendar/entry';
|
|
|
66
68
|
import { tourbillonVisualizer } from './tool/tourbillon-visualizer/entry';
|
|
67
69
|
import { gmtWorldTimer } from './tool/gmt-world-timer/entry';
|
|
68
70
|
import { quartzBatteryHealth } from './tool/quartz-battery-health/entry';
|
|
71
|
+
import { mainspringFinder } from './tool/mainspring-finder/entry';
|
|
69
72
|
|
|
70
|
-
export const ALL_ENTRIES = [watchAccuracyTracker, wristPresenceCalculator, demagnetizingTimer, watchSavingsPlanner, crownReferenceGuide, powerReserveEstimator, beatRateConverter, waterResistanceConverter, strapTaperCalculator, watchSizeComparator, lumeColorSimulator, moonPhaseVisualizer, tachymeterCalculator, serviceIntervalTracker, strapLengthCalculator, telemeterCalculator, siderealTimeTracker, gearTrainExplorer, perpetualCalendar, tourbillonVisualizer, gmtWorldTimer, quartzBatteryHealth];
|
|
73
|
+
export const ALL_ENTRIES = [watchAccuracyTracker, wristPresenceCalculator, demagnetizingTimer, watchSavingsPlanner, crownReferenceGuide, powerReserveEstimator, beatRateConverter, waterResistanceConverter, strapTaperCalculator, watchSizeComparator, lumeColorSimulator, moonPhaseVisualizer, tachymeterCalculator, serviceIntervalTracker, strapLengthCalculator, telemeterCalculator, siderealTimeTracker, gearTrainExplorer, perpetualCalendar, tourbillonVisualizer, gmtWorldTimer, quartzBatteryHealth, mainspringFinder];
|
|
71
74
|
|
package/src/index.ts
CHANGED
|
@@ -16,6 +16,7 @@ export { tachymeterCalculator, TACHYMETER_CALCULATOR_TOOL } from './tool/tachyme
|
|
|
16
16
|
export { serviceIntervalTracker, SERVICE_INTERVAL_TRACKER_TOOL } from './tool/service-interval-tracker';
|
|
17
17
|
export { strapLengthCalculator, STRAP_LENGTH_CALCULATOR_TOOL } from './tool/strap-length-calculator';
|
|
18
18
|
export { quartzBatteryHealth, QUARTZ_BATTERY_HEALTH_TOOL } from './tool/quartz-battery-health';
|
|
19
|
+
export { mainspringFinder, MAINSPRING_FINDER_TOOL } from './tool/mainspring-finder';
|
|
19
20
|
|
|
20
21
|
export type {
|
|
21
22
|
KnownLocale,
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { mainspringFinder } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'en' } = Astro.props as Props;
|
|
11
|
+
const loader = mainspringFinder.i18n[locale] || mainspringFinder.i18n.en;
|
|
12
|
+
const content = await loader?.();
|
|
13
|
+
if (!content) return null;
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
{content && <SharedBibliography links={content.bibliography} />}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { BibliographyEntry } from '../../types';
|
|
2
|
+
|
|
3
|
+
export const bibliography: BibliographyEntry[] = [
|
|
4
|
+
{
|
|
5
|
+
name: 'Mainspring Dimensions & Specifications - Ranfft',
|
|
6
|
+
url: 'https://ranfft.org/caliber/5755-FHF-76-2',
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
name: 'Watch Mainspring Guide',
|
|
10
|
+
url: 'https://www.vintagewatchstraps.com/mainsprings.php',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'Mainspring Sizing Chart - Cousins UK',
|
|
14
|
+
url: 'https://www.cousinsuk.com/category/filter/mainsprings-by-size-search-watch-pocket',
|
|
15
|
+
},
|
|
16
|
+
];
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { calculateMainspring, fmt } from './helpers';
|
|
2
|
+
|
|
3
|
+
const el = document.querySelector('.msf') as HTMLElement;
|
|
4
|
+
const UI = JSON.parse(el.dataset.ui || '{}');
|
|
5
|
+
|
|
6
|
+
const barrelIn = document.getElementById('msf-barrel') as HTMLInputElement;
|
|
7
|
+
const arborIn = document.getElementById('msf-arbor') as HTMLInputElement;
|
|
8
|
+
const heightIn = document.getElementById('msf-height') as HTMLInputElement;
|
|
9
|
+
const turnsIn = document.getElementById('msf-turns') as HTMLInputElement;
|
|
10
|
+
const unitBtns = document.querySelectorAll('.msf-u-btn') as NodeListOf<HTMLElement>;
|
|
11
|
+
const result = document.getElementById('msf-result') as HTMLElement;
|
|
12
|
+
const thickV = document.getElementById('msf-thick') as HTMLElement;
|
|
13
|
+
const heightV = document.getElementById('msf-h') as HTMLElement;
|
|
14
|
+
const lenV = document.getElementById('msf-len') as HTMLElement;
|
|
15
|
+
const strengthB = document.getElementById('msf-strength') as HTMLElement;
|
|
16
|
+
const commV = document.getElementById('msf-comm') as HTMLElement;
|
|
17
|
+
|
|
18
|
+
const sLabels = [UI.strengthWeak || 'Light', UI.strengthMedium || 'Medium', UI.strengthStrong || 'Strong'];
|
|
19
|
+
const sColors = ['#10b981', '#f59e0b', '#ef4444'];
|
|
20
|
+
const KEY = 'jjlmoya_chrono_msf';
|
|
21
|
+
let cur: 'mm' | 'in' = 'mm';
|
|
22
|
+
|
|
23
|
+
interface S { b: string; a: string; h: string; t: string; u: string }
|
|
24
|
+
|
|
25
|
+
function parseNum(v: string): number {
|
|
26
|
+
return parseFloat(v.replace(',', '.')) || 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function save() {
|
|
30
|
+
try { localStorage.setItem(KEY, JSON.stringify({ b: barrelIn.value, a: arborIn.value, h: heightIn.value, t: turnsIn.value, u: cur } as S)); } catch {}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function load() {
|
|
34
|
+
try {
|
|
35
|
+
const r = localStorage.getItem(KEY);
|
|
36
|
+
if (!r) return;
|
|
37
|
+
const s: S = JSON.parse(r);
|
|
38
|
+
const pairs: [string | undefined, HTMLInputElement][] = [[s.b, barrelIn], [s.a, arborIn], [s.h, heightIn], [s.t, turnsIn]];
|
|
39
|
+
for (const [v, el] of pairs) { if (v) el.value = v; }
|
|
40
|
+
if (s.u === 'in' || s.u === 'mm') cur = s.u;
|
|
41
|
+
} catch {}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function convertVal(v: number, from: 'mm' | 'in', to: 'mm' | 'in'): number {
|
|
45
|
+
if (from === to) return v;
|
|
46
|
+
return to === 'in' ? v / 25.4 : v * 25.4;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function setUnit(u: 'mm' | 'in') {
|
|
50
|
+
if (u === cur) return;
|
|
51
|
+
const b = parseNum(barrelIn.value);
|
|
52
|
+
const a = parseNum(arborIn.value);
|
|
53
|
+
const h = parseNum(heightIn.value);
|
|
54
|
+
barrelIn.value = convertVal(b, cur, u).toFixed(u === 'in' ? 2 : 1);
|
|
55
|
+
arborIn.value = convertVal(a, cur, u).toFixed(u === 'in' ? 3 : 1);
|
|
56
|
+
heightIn.value = convertVal(h, cur, u).toFixed(u === 'in' ? 3 : 2);
|
|
57
|
+
barrelIn.step = ''; arborIn.step = ''; heightIn.step = '';
|
|
58
|
+
cur = u;
|
|
59
|
+
unitBtns.forEach(b => b.classList.toggle('msf-u-on', b.dataset.unit === u));
|
|
60
|
+
calc();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function calc() {
|
|
64
|
+
const barrelId = parseNum(barrelIn.value);
|
|
65
|
+
const arborD = parseNum(arborIn.value);
|
|
66
|
+
const height = parseNum(heightIn.value);
|
|
67
|
+
const turns = parseInt(turnsIn.value, 10) || 6;
|
|
68
|
+
const r = calculateMainspring({ barrelId, barrelH: height, arborD, turns, unit: cur });
|
|
69
|
+
if (!r) { result.style.display = 'none'; return; }
|
|
70
|
+
|
|
71
|
+
const ul = cur;
|
|
72
|
+
thickV.textContent = `${fmt(r.thickness, cur, cur === 'in' ? 4 : 3)} ${ul}`;
|
|
73
|
+
heightV.textContent = `${fmt(r.height, cur, 2)} ${ul}`;
|
|
74
|
+
lenV.textContent = `${fmt(r.length, cur, 1)} ${ul}`;
|
|
75
|
+
strengthB.textContent = sLabels[r.strengthIndex];
|
|
76
|
+
strengthB.style.background = sColors[r.strengthIndex];
|
|
77
|
+
commV.textContent = `${fmt(r.height, cur, 2)} x ${fmt(r.thickness, cur, cur === 'in' ? 4 : 3)} x ${fmt(r.length, cur, 1)} ${ul}`;
|
|
78
|
+
result.style.display = 'flex';
|
|
79
|
+
save();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
unitBtns.forEach(b => b.addEventListener('click', () => setUnit(b.dataset.unit as 'mm' | 'in')));
|
|
83
|
+
barrelIn.addEventListener('input', calc);
|
|
84
|
+
arborIn.addEventListener('input', calc);
|
|
85
|
+
heightIn.addEventListener('input', calc);
|
|
86
|
+
turnsIn.addEventListener('input', calc);
|
|
87
|
+
load();
|
|
88
|
+
setUnit(cur);
|
|
89
|
+
calc();
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
interface Props { ui: Record<string, string> }
|
|
3
|
+
const { ui } = Astro.props;
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<div class="msf" data-ui={JSON.stringify(ui)}>
|
|
7
|
+
<div class="msf-top">
|
|
8
|
+
<div class="msf-u">
|
|
9
|
+
<button class="msf-u-btn msf-u-on" data-unit="mm" type="button">{ui.mm || "mm"}</button>
|
|
10
|
+
<button class="msf-u-btn" data-unit="in" type="button">{ui.inch || "in"}</button>
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<div class="msf-grid">
|
|
15
|
+
<label class="msf-f">
|
|
16
|
+
<span class="msf-f-l">{ui.barrelLabel || "Barrel ID"}</span>
|
|
17
|
+
<input class="msf-f-i" id="msf-barrel" type="text" inputmode="decimal" value="14.0" />
|
|
18
|
+
</label>
|
|
19
|
+
<label class="msf-f">
|
|
20
|
+
<span class="msf-f-l">{ui.arborLabel || "Arbor OD"}</span>
|
|
21
|
+
<input class="msf-f-i" id="msf-arbor" type="text" inputmode="decimal" value="3.5" />
|
|
22
|
+
</label>
|
|
23
|
+
<label class="msf-f">
|
|
24
|
+
<span class="msf-f-l">{ui.heightLabel || "Height"}</span>
|
|
25
|
+
<input class="msf-f-i" id="msf-height" type="text" inputmode="decimal" value="1.50" />
|
|
26
|
+
</label>
|
|
27
|
+
<label class="msf-f">
|
|
28
|
+
<span class="msf-f-l">{ui.turnsLabel || "Turns"}</span>
|
|
29
|
+
<input class="msf-f-i" id="msf-turns" type="text" inputmode="numeric" value="6" />
|
|
30
|
+
</label>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<div class="msf-r" id="msf-result">
|
|
34
|
+
<div class="msf-r-grid">
|
|
35
|
+
<div class="msf-r-c">
|
|
36
|
+
<span class="msf-r-c-l">{ui.resultThickness || "Thickness"}</span>
|
|
37
|
+
<span class="msf-r-c-v" id="msf-thick">--</span>
|
|
38
|
+
</div>
|
|
39
|
+
<div class="msf-r-c">
|
|
40
|
+
<span class="msf-r-c-l">{ui.resultHeight || "Height"}</span>
|
|
41
|
+
<span class="msf-r-c-v" id="msf-h">--</span>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="msf-r-c">
|
|
44
|
+
<span class="msf-r-c-l">{ui.resultLength || "Length"}</span>
|
|
45
|
+
<span class="msf-r-c-v" id="msf-len">--</span>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="msf-r-bot">
|
|
49
|
+
<div class="msf-r-bot-i">
|
|
50
|
+
<span class="msf-r-bot-l">{ui.resultStrength || "Strength"}</span>
|
|
51
|
+
<span class="msf-badge" id="msf-strength">--</span>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="msf-r-bot-i">
|
|
54
|
+
<span class="msf-r-bot-l">{ui.commercial || "Size"}</span>
|
|
55
|
+
<span class="msf-r-bot-v" id="msf-comm">--</span>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<div class="msf-steps">
|
|
61
|
+
<div class="msf-step"><span class="msf-step-n">1</span><span>{ui.step1 || "Measure barrel ID, arbor OD, and height."}</span></div>
|
|
62
|
+
<div class="msf-step"><span class="msf-step-n">2</span><span>{ui.step2 || "Set winding turns (5-8 manual, 6-10 auto)."}</span></div>
|
|
63
|
+
<div class="msf-step"><span class="msf-step-n">3</span><span>{ui.step3 || "Toggle mm/in for your unit."}</span></div>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<div class="msf-tip">
|
|
67
|
+
<svg viewBox="0 0 24 24" width="14" height="14" style="flex-shrink:0;margin-top:0.05rem"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z" fill="currentColor"/></svg>
|
|
68
|
+
<span>{ui.tipContent || "Always verify against manufacturer specs before ordering."}</span>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<script src="./client.ts"></script>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ChronoToolEntry, ToolLocaleContent } from '../../types';
|
|
2
|
+
|
|
3
|
+
export type MainspringFinderUI = {
|
|
4
|
+
title: string;
|
|
5
|
+
barrelLabel: string;
|
|
6
|
+
arborLabel: string;
|
|
7
|
+
heightLabel: string;
|
|
8
|
+
turnsLabel: string;
|
|
9
|
+
calculate: string;
|
|
10
|
+
resultThickness: string;
|
|
11
|
+
resultHeight: string;
|
|
12
|
+
resultLength: string;
|
|
13
|
+
resultStrength: string;
|
|
14
|
+
strengthWeak: string;
|
|
15
|
+
strengthMedium: string;
|
|
16
|
+
strengthStrong: string;
|
|
17
|
+
commercial: string;
|
|
18
|
+
unitLabel: string;
|
|
19
|
+
mm: string;
|
|
20
|
+
inch: string;
|
|
21
|
+
step1: string;
|
|
22
|
+
step2: string;
|
|
23
|
+
step3: string;
|
|
24
|
+
tipTitle: string;
|
|
25
|
+
tipContent: string;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type MainspringFinderLocaleContent = ToolLocaleContent<MainspringFinderUI>;
|
|
29
|
+
|
|
30
|
+
export const mainspringFinder: ChronoToolEntry<MainspringFinderUI> = {
|
|
31
|
+
id: 'mainspring-finder',
|
|
32
|
+
icons: { bg: 'mdi:ruler', fg: 'mdi:cog-clockwise' },
|
|
33
|
+
i18n: {
|
|
34
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
35
|
+
de: () => import('./i18n/de').then((m) => m.content),
|
|
36
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
37
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
38
|
+
id: () => import('./i18n/id').then((m) => m.content),
|
|
39
|
+
it: () => import('./i18n/it').then((m) => m.content),
|
|
40
|
+
ja: () => import('./i18n/ja').then((m) => m.content),
|
|
41
|
+
ko: () => import('./i18n/ko').then((m) => m.content),
|
|
42
|
+
nl: () => import('./i18n/nl').then((m) => m.content),
|
|
43
|
+
pl: () => import('./i18n/pl').then((m) => m.content),
|
|
44
|
+
pt: () => import('./i18n/pt').then((m) => m.content),
|
|
45
|
+
ru: () => import('./i18n/ru').then((m) => m.content),
|
|
46
|
+
sv: () => import('./i18n/sv').then((m) => m.content),
|
|
47
|
+
tr: () => import('./i18n/tr').then((m) => m.content),
|
|
48
|
+
zh: () => import('./i18n/zh').then((m) => m.content),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface MainspringInput {
|
|
2
|
+
barrelId: number;
|
|
3
|
+
barrelH: number;
|
|
4
|
+
arborD: number;
|
|
5
|
+
turns: number;
|
|
6
|
+
unit: 'mm' | 'in';
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface MainspringResult {
|
|
10
|
+
thickness: number;
|
|
11
|
+
height: number;
|
|
12
|
+
length: number;
|
|
13
|
+
strengthIndex: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function toMm(val: number, unit: 'mm' | 'in'): number {
|
|
17
|
+
return unit === 'in' ? val * 25.4 : val;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function fmt(val: number, unit: 'mm' | 'in', dec: number): string {
|
|
21
|
+
const v = unit === 'in' ? val / 25.4 : val;
|
|
22
|
+
return v.toFixed(dec);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function getStrengthIndex(thickness: number): number {
|
|
26
|
+
if (thickness <= 0.10) return 0;
|
|
27
|
+
if (thickness <= 0.18) return 1;
|
|
28
|
+
return 2;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function calculateMainspring(input: MainspringInput): MainspringResult | null {
|
|
32
|
+
let { barrelId, barrelH, arborD } = input;
|
|
33
|
+
const { turns, unit } = input;
|
|
34
|
+
barrelId = toMm(barrelId, unit);
|
|
35
|
+
barrelH = toMm(barrelH, unit);
|
|
36
|
+
arborD = toMm(arborD, unit);
|
|
37
|
+
|
|
38
|
+
if (barrelId <= 0 || arborD <= 0 || barrelH <= 0 || arborD >= barrelId) return null;
|
|
39
|
+
|
|
40
|
+
const clearance = 0.1;
|
|
41
|
+
const height = barrelH - clearance;
|
|
42
|
+
|
|
43
|
+
const thickness = (barrelId - arborD) / (4 * Math.PI * turns);
|
|
44
|
+
const length = (Math.PI * turns * (barrelId + arborD)) / 2;
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
thickness: Math.round(thickness * 1000) / 1000,
|
|
48
|
+
height: Math.round(height * 100) / 100,
|
|
49
|
+
length: Math.round(length * 10) / 10,
|
|
50
|
+
strengthIndex: getStrengthIndex(thickness),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { MainspringFinderUI } from '../entry';
|
|
3
|
+
import { bibliography } from '../bibliography';
|
|
4
|
+
|
|
5
|
+
export const content: ToolLocaleContent<MainspringFinderUI> = {
|
|
6
|
+
slug: 'zugfeder-rechner',
|
|
7
|
+
title: 'Zugfeder Rechner',
|
|
8
|
+
description: 'Berechnen Sie Zugfederabmessungen aus Federhausmessungen für Vintage-Uhrwerke.',
|
|
9
|
+
ui: {
|
|
10
|
+
title: 'Zugfeder Rechner',
|
|
11
|
+
barrelLabel: 'Federhaus-ID',
|
|
12
|
+
arborLabel: 'Wellen-AD',
|
|
13
|
+
heightLabel: 'Federhaushöhe',
|
|
14
|
+
turnsLabel: 'Umdrehungen',
|
|
15
|
+
calculate: 'Berechnen',
|
|
16
|
+
resultThickness: 'Stärke',
|
|
17
|
+
resultHeight: 'Höhe',
|
|
18
|
+
resultLength: 'Länge',
|
|
19
|
+
resultStrength: 'Federkraft',
|
|
20
|
+
strengthWeak: 'Leicht',
|
|
21
|
+
strengthMedium: 'Mittel',
|
|
22
|
+
strengthStrong: 'Stark',
|
|
23
|
+
commercial: 'Handelsgröße',
|
|
24
|
+
unitLabel: 'Einheit',
|
|
25
|
+
mm: 'mm',
|
|
26
|
+
inch: 'Zoll',
|
|
27
|
+
step1: 'Messen Sie Federhaus-ID, Wellen-AD und innere Höhe mit einem Messschieber.',
|
|
28
|
+
step2: 'Stellen Sie die erwartete Anzahl Aufzugsumdrehungen ein (5-8 Handaufzug, 6-10 Automatik).',
|
|
29
|
+
step3: 'Wechseln Sie zwischen mm/Zoll für Ihr bevorzugtes Einheitensystem.',
|
|
30
|
+
tipTitle: 'Tipp',
|
|
31
|
+
tipContent: 'Überprüfen Sie die berechneten Maße immer mit den Herstellerangaben. Gleichen Sie sie vor der Bestellung mit Lieferantenkatalogen ab.',
|
|
32
|
+
},
|
|
33
|
+
seo: [
|
|
34
|
+
{ type: 'title', text: 'Zugfeder-Rechner: Federabmessungen für Uhrwerke berechnen', level: 2 },
|
|
35
|
+
{
|
|
36
|
+
type: 'stats',
|
|
37
|
+
items: [
|
|
38
|
+
{ value: '0.08-0.18 mm', label: 'Typische Federstärke' },
|
|
39
|
+
{ value: '5-10 Umdrehungen', label: 'Üblicher Aufzugsbereich' },
|
|
40
|
+
{ value: '150-450 mm', label: 'Übliche Federlänge' },
|
|
41
|
+
],
|
|
42
|
+
columns: 3,
|
|
43
|
+
},
|
|
44
|
+
{ type: 'paragraph', html: 'Bei der Restaurierung eines Vintage-Uhrwerks beginnt die Arbeit oft mit der Identifizierung der richtigen Zugfeder. Der <strong>Zugfeder-Rechner</strong> hilft Ihnen, die theoretischen Abmessungen der Zugfeder anhand der Federhausgeometrie zu berechnen. Durch Eingabe des Federhausinnendurchmessers, des Wellendurchmessers, der Federhaushöhe und der erwarteten Anzahl Umdrehungen ermittelt das Werkzeug Federstärke, Höhe und Länge. Die Ergebnisse werden auch als ungefähre Handelsgrößen in metrischen und imperialen Einheiten angezeigt, was den Abgleich mit Lieferantenkatalogen erleichtert.' },
|
|
45
|
+
{ type: 'title', text: 'Wie Zugfederabmessungen berechnet werden', level: 3 },
|
|
46
|
+
{ type: 'paragraph', html: 'Die Zugfeder nimmt den Ringraum zwischen Federhauswand und Welle ein. Die <strong>Federstärke</strong> wird geschätzt als <strong>(Federhaus-ID - Wellen-AD) / (2x Umdrehungen + 1,5)</strong>, wobei die zusätzlichen 1,5 den Federendanschluss und den Platz berücksichtigen, den die Feder gegen sich selbst einnimmt. Die <strong>Federlänge</strong> folgt <strong>L = pi x Umdrehungen x (Federhaus-ID + Wellen-AD) / 2</strong>, was die Gesamtlänge des Bandes in ausgelegtem Zustand ergibt. Die <strong>Federhöhe</strong> entspricht der inneren Federhaushöhe abzüglich eines kleinen Spiels (typischerweise 0,1 mm), um Reibung am Federhausdeckel zu vermeiden.' },
|
|
47
|
+
{ type: 'title', text: 'So messen Sie ein Federhaus für die Zugfederauswahl', level: 3 },
|
|
48
|
+
{
|
|
49
|
+
type: 'glossary',
|
|
50
|
+
items: [
|
|
51
|
+
{ term: 'Federhausinnendurchmesser', definition: 'Der Innendurchmesser der Federhaustrommel, gemessen mit einem Messschieber. Dies ist der größte Kreis, den die Zugfeder einnehmen kann. Typischer Bereich: 8-30 mm.' },
|
|
52
|
+
{ term: 'Wellendurchmesser', definition: 'Der Durchmesser der Federhauswelle an ihrer breitesten Stelle, wo die innere Windung der Zugfeder einhakt. Kleinere Wellen ermöglichen längere Federn bei gleichem Federhaus.' },
|
|
53
|
+
{ term: 'Federhaushöhe', definition: 'Die innere Höhe der Federhaustrommel. Die Zugfederhöhe muss geringfügig kleiner sein (0,05-0,15 mm), um freie Drehung ohne Reibung am Deckel zu ermöglichen.' },
|
|
54
|
+
{ term: 'Anzahl Umdrehungen', definition: 'Die Anzahl vollständiger Aufzugsumdrehungen des Werks. Handaufzugskaliber bieten typischerweise 5-8 Umdrehungen, Automatikwerke 6-10 Umdrehungen.' },
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
{ type: 'title', text: 'Federkraft und was sie für Ihr Uhrwerk bedeutet', level: 3 },
|
|
58
|
+
{ type: 'paragraph', html: 'Die <strong>Federstärke</strong> ist der wichtigste Faktor für das auf das Räderwerk übertragene Drehmoment. Eine dickere Feder (über 0,14 mm) liefert ein hohes Drehmoment, geeignet für Werke mit Komplikationen wie Chronographen oder Schlagwerken. Mittlere Federn (0,10-0,14 mm) sind Standard für die meisten Werke mit reiner Zeit- und Datumsanzeige. Dünne Federn (unter 0,10 mm) finden sich in kleinen Damenuhren oder ultraflachen Kalibern. Verwenden Sie immer die ursprüngliche Herstellerspezifikation, sofern verfügbar; eine zu starke Feder kann die Federhauswelle oder die Räderwerkszapfen beschädigen.' },
|
|
59
|
+
{
|
|
60
|
+
type: 'diagnostic',
|
|
61
|
+
variant: 'warning',
|
|
62
|
+
title: 'Die falsche Zugfeder kann Ihr Uhrwerk beschädigen',
|
|
63
|
+
html: 'Der Einbau einer <strong>zu dicken</strong> Feder erhöht Reibung und Drehmoment über die Auslegungsgrenzen, was möglicherweise das Federhauswellenloch ausweitet, den Zentrumsradzapfen verbiegt oder sogar das Federhaus bricht. Eine <strong>zu dünne</strong> Feder liefert nicht genug Amplitude, was dazu führt, dass die Uhr zu langsam läuft oder vor Erreichen der vollen Gangreserve stehen bleibt. Gleichen Sie die berechneten Maße vor der Bestellung immer mit bekannten Lieferantenkatalogen ab.',
|
|
64
|
+
},
|
|
65
|
+
{ type: 'title', text: 'Kommerzielle Zugfedergrößensysteme', level: 3 },
|
|
66
|
+
{ type: 'paragraph', html: 'Zugfederlieferanten katalogisieren Federn nach <strong>Länge x Höhe x Stärke</strong> in Millimetern. Übliche metrische Größen folgen dem General Resources oder GR-System. Zollbasierte Systeme werden noch von einigen amerikanischen und britischen Lieferanten verwendet. Das Werkzeug zeigt beide Systeme an, damit Sie unabhängig vom Lieferanten in Katalogen suchen können. Wenn die exakte berechnete Größe nicht verfügbar ist, wählen Sie die nächstgelegene Handelsgröße, die in der Höhe exakt und in der Stärke auf 0,005 mm genau übereinstimmt, und passen Sie dann die Länge durch Auswahl einer Feder aus derselben Höhen- und Stärkefamilie an.' },
|
|
67
|
+
{ type: 'title', text: 'Besonderheiten bei Vintage-Kalibern', level: 3 },
|
|
68
|
+
{
|
|
69
|
+
type: 'list',
|
|
70
|
+
items: [
|
|
71
|
+
'<strong>Schweizer Kaliber (ETA, FHF, AS, Unitas)</strong> - im GR-System gut dokumentiert. Die meisten haben bekannte Zugfederreferenzen.',
|
|
72
|
+
'<strong>Französische Kaliber (LIP, France Ebauches)</strong> - verwenden oft nicht standardmäßige Federhausproportionen. Sorgfältig messen.',
|
|
73
|
+
'<strong>Amerikanische Kaliber (Waltham, Elgin, Illinois)</strong> - zollbasierte Systeme. Verwenden Sie die imperialen Angaben zum Abgleich.',
|
|
74
|
+
'<strong>Japanische Kaliber (Seiko, Citizen, Miyota)</strong> - metrisches System mit guter Katalogabdeckung für Werke ab 1960.',
|
|
75
|
+
'<strong>Chinesische Kaliber (Sea-Gull, DG, Tongji)</strong> - oft Klone von Schweizer Konstruktionen. Die Schweizer GR-Referenz gilt meist.',
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: 'summary',
|
|
80
|
+
title: 'Wichtige Erkenntnisse zur Zugfederauswahl',
|
|
81
|
+
items: [
|
|
82
|
+
'Federhaus-ID, Wellen-AD und Federhaushöhe genau mit einem Präzisionsmessschieber messen',
|
|
83
|
+
'Die berechneten Maße als Ausgangspunkt verwenden, nicht als absolute Vorgabe',
|
|
84
|
+
'Mit technischen Datenblättern des Herstellers oder bekannten Lieferantenkatalogen abgleichen',
|
|
85
|
+
'Die Federhöhe genau der Federhaushöhe minus 0,05-0,15 mm Spiel anpassen',
|
|
86
|
+
'Die Stärke auf 0,005 mm des berechneten Werts genau wählen für optimale Leistung',
|
|
87
|
+
'Sicherstellen, dass die Federlänge für die erwartete Anzahl Aufzugsumdrehungen ausreicht',
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
faq: [
|
|
92
|
+
{
|
|
93
|
+
question: 'Wie genau sind die berechneten Zugfederabmessungen?',
|
|
94
|
+
answer: 'Die Berechnungen basieren auf standardmäßigen uhrmacherischen Formeln, die eine ideale Federhausgeometrie annehmen. Tatsächliche Maße können aufgrund von Fertigungstoleranzen, Federendkonfigurationen (Anker, Öse oder T-Ende) und der verwendeten Legierung um bis zu 5-10 % abweichen. Verwenden Sie die berechneten Werte als starken Referenzpunkt, gleichen Sie sie aber vor der Bestellung mit Datenblättern der Hersteller oder kommerziellen Lieferantenkatalogen ab.',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
question: 'Was tun, wenn ich die exakte Handelsgröße nicht finde?',
|
|
98
|
+
answer: 'Wenn die exakte Größe nicht verfügbar ist, priorisieren Sie zuerst die genaue Federhöhe, dann die Stärke auf 0,005 mm genau. Die Länge kann durch Auswahl einer anderen Feder aus derselben Höhen- und Stärkefamilie angepasst werden. Eine etwas längere Feder funktioniert, wenn das Federhaus genügend Platz hat, aber eine kürzere Feder reduziert die Gangreserve.',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
question: 'Wie messe ich die Federhausmaße, ohne die Zugfeder zu entfernen?',
|
|
102
|
+
answer: 'Wenn das Federhaus noch die alte Feder enthält, können Sie den Außendurchmesser des Federhauses von außen messen (dann die Wandstärke abziehen, typischerweise 0,2-0,4 mm) und die Gesamthöhe (dann die Deckelstärke abziehen). Für die genauesten Ergebnisse entfernen Sie die alte Feder und reinigen Sie das Federhaus vor dem Messen.',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
question: 'Was ist der Unterschied zwischen einem Anker- und einem Ösen-Federende?',
|
|
106
|
+
answer: 'Ein Ankerende (auch T-Ende genannt) hat eine kleine T-förmige Lasche, die in die Federhauswand einhakt. Die meisten modernen Schweizer und japanischen Kaliber verwenden diesen Typ. Ein Ösenende hat ein kleines Loch, das über einen Stift auf der Welle passt. Dieses Werkzeug berechnet nur die Bandabmessungen; Sie müssen vor der Bestellung überprüfen, ob der Endtyp zu Ihrem Federhaus passt.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
question: 'Kann ich dieses Werkzeug für Chronographen- oder Automatikwerke verwenden?',
|
|
110
|
+
answer: 'Ja, aber beachten Sie, dass Automatikwerke oft eine höhere Anzahl Umdrehungen haben (8-10) und eine etwas dünnere Feder benötigen, um das zusätzliche Aufzugsmodul unterzubringen. Chronographenwerke benötigen typischerweise dickere Federn, um das Chronographenwerk anzutreiben. Passen Sie den Umdrehungswert entsprechend an und überprüfen Sie ihn mit den Herstellerspezifikationen.',
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
bibliography,
|
|
114
|
+
howTo: [
|
|
115
|
+
{
|
|
116
|
+
name: 'Federhausinnendurchmesser messen',
|
|
117
|
+
text: 'Messen Sie mit einem Präzisionsmessschieber den Innendurchmesser der Federhaustrommel. Messen Sie an zwei um 90 Grad versetzten Stellen und mitteln Sie die Werte. Notieren Sie das Ergebnis in Millimetern.',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'Wellendurchmesser messen',
|
|
121
|
+
text: 'Messen Sie den Durchmesser der Federhauswelle an der breitesten Stelle, an der die innere Windung der Zugfeder ansetzt. Dies ist typischerweise nahe der Wellenmitte, nicht am Vierkantende.',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: 'Innere Federhaushöhe messen',
|
|
125
|
+
text: 'Messen Sie die Tiefe des Federhauses vom Boden bis zur Oberkante. Wenn der Deckel abnehmbar ist, beziehen Sie die Deckelstärke in Ihre Messung ein. Die Federhöhe wird etwa 0,1 mm geringer sein.',
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: 'Anzahl Umdrehungen einstellen',
|
|
129
|
+
text: 'Ermitteln Sie, wie viele volle Umdrehungen die Zugfeder bei vollständigem Aufzug macht. Bei Handaufzugskalibern sind dies typischerweise 5-8 Umdrehungen. Automatikwerke können 6-10 Umdrehungen haben. Prüfen Sie die Werksspezifikationen, falls verfügbar.',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'Berechnete Maße ablesen',
|
|
133
|
+
text: 'Das Werkzeug zeigt die empfohlene Federstärke, Höhe und Länge an. Es schätzt auch die Federkraftkategorie und gibt Handelsäquivalente in metrischen und imperialen Einheiten an.',
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: 'Mit Katalogen abgleichen',
|
|
137
|
+
text: 'Verwenden Sie die angezeigten Handelsgrößen, um in Lieferantenkatalogen zu suchen. Geben Sie die metrischen oder imperialen Maße bei Cousins UK, Jules Borel oder Ihrem bevorzugten Lieferanten ein. Passen Sie die Suche an, falls die exakte Größe nicht verfügbar ist.',
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
schemas: [
|
|
141
|
+
{
|
|
142
|
+
'@context': 'https://schema.org',
|
|
143
|
+
'@type': 'FAQPage',
|
|
144
|
+
'mainEntity': [
|
|
145
|
+
{
|
|
146
|
+
'@type': 'Question',
|
|
147
|
+
'name': 'Wie genau sind die berechneten Zugfederabmessungen?',
|
|
148
|
+
'acceptedAnswer': { '@type': 'Answer', 'text': 'Die Berechnungen basieren auf standardmäßigen uhrmacherischen Formeln, die eine ideale Federhausgeometrie annehmen. Tatsächliche Maße können aufgrund von Fertigungstoleranzen, Federendkonfigurationen und der verwendeten Legierung um bis zu 5-10 % abweichen. Gleichen Sie die Werte vor der Bestellung mit Datenblättern der Hersteller oder kommerziellen Katalogen ab.' },
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
'@type': 'Question',
|
|
152
|
+
'name': 'Was tun, wenn ich die exakte Handelsgröße nicht finde?',
|
|
153
|
+
'acceptedAnswer': { '@type': 'Answer', 'text': 'Zuerst die Federhöhe exakt anpassen, dann die Stärke auf 0,005 mm genau. Die Länge aus derselben Höhen-/Stärkefamilie anpassen.' },
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
'@type': 'Question',
|
|
157
|
+
'name': 'Wie messe ich das Federhaus, ohne die Zugfeder zu entfernen?',
|
|
158
|
+
'acceptedAnswer': { '@type': 'Answer', 'text': 'Den äußeren Federhausdurchmesser messen und die Wandstärke abziehen (0,2-0,4 mm). Für beste Ergebnisse zuerst die alte Feder entfernen.' },
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
'@type': 'Question',
|
|
162
|
+
'name': 'Was ist der Unterschied zwischen Anker- und Ösenenden?',
|
|
163
|
+
'acceptedAnswer': { '@type': 'Answer', 'text': 'Anker (T-Ende) hakt in die Federhauswand ein. Ösenende hat ein Loch über einem Wellenstift. Moderne Schweizer/japanische Kaliber verwenden Ankerenden.' },
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
'@type': 'Question',
|
|
167
|
+
'name': 'Kann ich dies für Chronographen- oder Automatikwerke verwenden?',
|
|
168
|
+
'acceptedAnswer': { '@type': 'Answer', 'text': 'Ja. Automatikwerke benötigen oft mehr Umdrehungen (8-10) und dünnere Federn. Chronographen benötigen dickere Federn. Umdrehungen anpassen und überprüfen.' },
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
'@context': 'https://schema.org',
|
|
174
|
+
'@type': 'SoftwareApplication',
|
|
175
|
+
'name': 'Zugfeder-Rechner',
|
|
176
|
+
'operatingSystem': 'Alle',
|
|
177
|
+
'applicationCategory': 'UtilitiesApplication',
|
|
178
|
+
'applicationSubCategory': 'Uhrmacher-Zugfederrechner',
|
|
179
|
+
'description': 'Berechnen Sie theoretische Zugfederabmessungen aus Federhausmessungen für Vintage-Uhrwerke.',
|
|
180
|
+
'softwareVersion': '1.0',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
'@context': 'https://schema.org',
|
|
184
|
+
'@type': 'TechArticle',
|
|
185
|
+
'name': 'Berechnung von Zugfederabmessungen',
|
|
186
|
+
'proficiencyLevel': 'Intermediate',
|
|
187
|
+
'abstract': 'Erfahren Sie, wie Zugfederabmessungen aus Federhausinnendurchmesser, Wellengröße und Aufzugsumdrehungen berechnet werden.',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
'@context': 'https://schema.org',
|
|
191
|
+
'@type': 'HowTo',
|
|
192
|
+
'name': 'Die richtige Zugfeder finden',
|
|
193
|
+
'description': 'Schritt-für-Schritt-Anleitung zum Messen eines Federhauses und Berechnen der korrekten Zugfederabmessungen.',
|
|
194
|
+
'step': [
|
|
195
|
+
{ '@type': 'HowToStep', 'name': 'Federhaus-ID messen', 'text': 'Messen Sie mit einem Präzisionsmessschieber den Innendurchmesser der Federhaustrommel.' },
|
|
196
|
+
{ '@type': 'HowToStep', 'name': 'Wellen-AD messen', 'text': 'Messen Sie den Federhauswellendurchmesser an seiner breitesten Stelle.' },
|
|
197
|
+
{ '@type': 'HowToStep', 'name': 'Federhaushöhe messen', 'text': 'Messen Sie die innere Tiefe. Die Federhöhe ist etwa 0,1 mm geringer.' },
|
|
198
|
+
{ '@type': 'HowToStep', 'name': 'Umdrehungen einstellen', 'text': '5-8 für Handaufzug, 6-10 für Automatikwerke einstellen.' },
|
|
199
|
+
{ '@type': 'HowToStep', 'name': 'Ergebnisse ablesen', 'text': 'Federstärke, Höhe, Länge und Handelsäquivalente anzeigen.' },
|
|
200
|
+
],
|
|
201
|
+
'totalTime': 'PT5M',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
'@context': 'https://schema.org',
|
|
205
|
+
'@type': 'Product',
|
|
206
|
+
'name': 'Zugfeder-Rechner',
|
|
207
|
+
'description': 'Ein Werkzeug für Uhrmacher zur Berechnung von Zugfederabmessungen aus Federhausmessungen.',
|
|
208
|
+
'category': 'Uhrmacherwerkzeug',
|
|
209
|
+
'audience': { '@type': 'Audience', 'audienceType': 'Uhrmacher und Uhrenliebhaber' },
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
};
|