From c09245d7b18b58b0cb5c1f3af03584988a449d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Tue, 4 Feb 2025 11:17:01 +0100 Subject: [PATCH] limiting siPrefix group + moved voltageStr,currentStr into Circuit --- .../angular/src/app/editor/circuit/Circuit.ts | 11 +++++++++ .../src/app/editor/parts/battery/Battery.ts | 5 ++-- .../src/app/editor/parts/light/Light.ts | 11 ++++----- .../src/app/editor/parts/relay/Relay.ts | 11 ++++----- src/main/angular/src/app/editor/siPrefix.ts | 24 ++++++++++++------- 5 files changed, 39 insertions(+), 23 deletions(-) diff --git a/src/main/angular/src/app/editor/circuit/Circuit.ts b/src/main/angular/src/app/editor/circuit/Circuit.ts index 909d6d8..24a79c6 100644 --- a/src/main/angular/src/app/editor/circuit/Circuit.ts +++ b/src/main/angular/src/app/editor/circuit/Circuit.ts @@ -6,9 +6,12 @@ import {Light} from '../parts/light/Light'; import {Relay} from '../parts/relay/Relay'; import {Junction} from '../junction/Junction'; import {Switch} from '../parts/switch/Switch'; +import {siPrefix} from '../siPrefix'; export class Circuit { + private siPrefixRange: number = 2; + constructor( readonly uuid: string, public name: string, @@ -97,4 +100,12 @@ export class Circuit { this.calculate(); } + voltageStr(voltage: number) { + return siPrefix(Math.abs(voltage), 'V', 2, -this.siPrefixRange, +this.siPrefixRange); + } + + currentStr(current: number) { + return siPrefix(Math.abs(current) || 0, 'A', 2, -this.siPrefixRange, +this.siPrefixRange); + } + } diff --git a/src/main/angular/src/app/editor/parts/battery/Battery.ts b/src/main/angular/src/app/editor/parts/battery/Battery.ts index 4ba135a..5339c75 100644 --- a/src/main/angular/src/app/editor/parts/battery/Battery.ts +++ b/src/main/angular/src/app/editor/parts/battery/Battery.ts @@ -1,7 +1,6 @@ import {Part} from "../Part"; import {Junction} from '../../junction/Junction'; import {PartType} from '../PartType'; -import {siPrefix} from '../../siPrefix'; import {Wire} from '../../wire/Wire'; import {Circuit} from '../../circuit/Circuit'; @@ -37,11 +36,11 @@ export class Battery extends Part { } get voltageStr(): string { - return siPrefix(Math.abs(this.voltage), 'V', 2); + return this.circuit.voltageStr(this.voltage); } get currentStr(): string { - return siPrefix(Math.abs(this.current) || 0, 'A', 2); + return this.circuit.currentStr(this.current); } } diff --git a/src/main/angular/src/app/editor/parts/light/Light.ts b/src/main/angular/src/app/editor/parts/light/Light.ts index 277e3c7..6233e07 100644 --- a/src/main/angular/src/app/editor/parts/light/Light.ts +++ b/src/main/angular/src/app/editor/parts/light/Light.ts @@ -1,7 +1,6 @@ import {Part} from "../Part"; import {Junction} from '../../junction/Junction'; import {PartType} from '../PartType'; -import {siPrefix} from '../../siPrefix'; import {fadeColor} from '../../colorHelpers'; import {Wire} from '../../wire/Wire'; @@ -40,10 +39,6 @@ export class Light extends Part { return this.voltage > this.voltageMax; } - get voltageStr(): string { - return siPrefix(Math.abs(this.voltage), 'V', 2); - } - get current(): number { if (this.a.voltage === null || this.b.voltage === null) { return 0; @@ -51,8 +46,12 @@ export class Light extends Part { return (this.b.voltage - this.a.voltage) / this.resistance; } + get voltageStr(): string { + return this.circuit.voltageStr(this.voltage); + } + get currentStr(): string { - return siPrefix(Math.abs(this.current) || 0, 'A', 2); + return this.circuit.currentStr(this.current); } fill(): string { diff --git a/src/main/angular/src/app/editor/parts/relay/Relay.ts b/src/main/angular/src/app/editor/parts/relay/Relay.ts index 8134d34..3805661 100644 --- a/src/main/angular/src/app/editor/parts/relay/Relay.ts +++ b/src/main/angular/src/app/editor/parts/relay/Relay.ts @@ -1,7 +1,6 @@ import {Part} from "../Part"; import {Junction} from '../../junction/Junction'; import {PartType} from '../PartType'; -import {siPrefix} from '../../siPrefix'; import {Wire} from '../../wire/Wire'; import {RESISTANCE_MIN} from '../../circuit/Calculation'; import {Circuit} from '../../circuit/Circuit'; @@ -54,10 +53,6 @@ export class Relay extends Part { return this.voltage > this.voltageMax; } - get voltageStr(): string { - return siPrefix(Math.abs(this.voltage), 'V', 2); - } - get current(): number { if (this.coilA.voltage === null || this.coilB.voltage === null) { return 0; @@ -65,8 +60,12 @@ export class Relay extends Part { return (this.coilB.voltage - this.coilA.voltage) / this.resistance; } + get voltageStr(): string { + return this.circuit.voltageStr(this.voltage); + } + get currentStr(): string { - return siPrefix(Math.abs(this.current) || 0, 'A', 2); + return this.circuit.currentStr(this.current); } override postCalculate(): boolean { diff --git a/src/main/angular/src/app/editor/siPrefix.ts b/src/main/angular/src/app/editor/siPrefix.ts index 2f06f16..9825ed7 100644 --- a/src/main/angular/src/app/editor/siPrefix.ts +++ b/src/main/angular/src/app/editor/siPrefix.ts @@ -1,18 +1,26 @@ export const SI_PREFIXES: string[] = ['q', 'r', 'y', 'z', 'a', 'f', 'p', 'n', 'ยต', 'm', '', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', 'R', 'Q']; -export function siPrefix(value: number, unit: string, minDigits: number): string { +export function siPrefix(value: number, unit: string, minDigits: number, minGroup: number = -10, maxGroup: number = +10): string { if (value === 0) { return `0${unit}`; } + + minGroup = Math.max(-10, minGroup); + maxGroup = Math.min(+10, maxGroup); + const negative = value < 0; value = negative ? -value : value; - const exp0 = Math.log10(value); - const group = Math.max(-10, Math.min(+10, Math.floor(exp0 / 3))); - const index = group + 10; - const prefix = SI_PREFIXES[index]; - const exp1 = group * 3; - const factor = Math.pow(10, -exp1); - const newValue = factor * value; + + const measureExponent = Math.log10(value); + const prefixGroup = Math.max(minGroup, Math.min(maxGroup, Math.floor(measureExponent / 3))); + const prefixIndex = prefixGroup + 10; + const prefix = SI_PREFIXES[prefixIndex]; + const scalerExponent = prefixGroup * 3; + if (value < Math.pow(10, scalerExponent)) { + return `0${unit}`; + } + const factor = Math.pow(10, -scalerExponent); + const newValue = value * factor; const hasDigits = Math.floor(Math.log10(newValue)) + 1; const decimals = Math.max(0, minDigits - hasDigits); const newValueStr2 = newValue.toFixed(decimals);