• Grand Francois's avatar
    #45 import de résultat · a4b5c3a4
    Grand Francois authored
    - classe ParamValues : ajout de la notion de valeur courante (_currentValue) indépendante du mode de valeur pour distinguer la valeur en mode SINGLE et la valeur actuelle quand on itère sur les valeurs possibles
    a4b5c3a4
param-values.ts 8.84 KiB
import { Pair } from "../util/pair"
import { DefinedNumber } from "../util/definedvalue";
import { IReferencedObject, IObjectReference, ObjectReference } from "../value_ref/object_ref";
import { Result } from "..";
import { ParamValueMode } from "./param-value-mode";
import { ParamValueIterator } from "./param-value-iterator";
export class ParamValues implements IObjectReference {
    /**
     * mode de génération des valeurs : min/max, liste, ...
    private _valueMode: ParamValueMode;
    /**
     * valeur numérique (éventuellement non définie) dans le mode "valeur unique" (ParamValueMode.SINGLE)
    private _singleValue: DefinedNumber;
    /**
     * valeur min dans le cas ParamValueMode.MINMAX
    private _minValue: number = undefined;
    /**
     * valeur max dans le cas ParamValueMode.MINMAX
    private _maxValue: number = undefined;
    /**
     * pas de progression dans le cas ParamValueMode.MINMAX
    private _stepValue: number = undefined;
    /**
     * liste de valeurs dans le cas ParamValueMode.LISTE
    private _valueList: number[];
    /**
     * valeur courante (éventuellement non définie) indépendemment du mode
    private _currentValue: DefinedNumber;
    /**
     * itérateur courant
    private _iterator: ParamValueIterator;
    /**
     * implémentation par délégation de IObjectReference
    private _valueRef: ObjectReference;
    constructor() {
        this._singleValue = new DefinedNumber();
        this._currentValue = new DefinedNumber();
        this._valueRef = new ObjectReference();
    public setValues(o: number | any, max?: number, step?: number) {
        if (typeof (o) === "number") {
            if (max == undefined) {
                this._valueMode = ParamValueMode.SINGLE;
                this._singleValue.value = o as number;
                this._currentValue.value = o as number;
            } else {
                this._valueMode = ParamValueMode.MINMAX;
                this._minValue = o as number;
                this._maxValue = max;
                this._stepValue = step;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
this._currentValue.undefine(); } } else if (Array.isArray(o)) { this._valueMode = ParamValueMode.LISTE; this._valueList = o; this._currentValue.undefine(); } else throw new Error(`ParamValues.setValues() : appel invalide`); } public get valueMode() { switch (this._valueMode) { case ParamValueMode.LINK: return this.referencedParamValues.valueMode; default: return this._valueMode; } } public set valueMode(m: ParamValueMode) { this._valueMode = m; } private checkValueMode(expected: ParamValueMode) { if (this._valueMode != expected) throw new Error(`ParamValues : mode de valeurs ${ParamValueMode[expected]} incorrect`); } public check() { switch (this._valueMode) { case ParamValueMode.SINGLE: if (!this._singleValue.isDefined) throw new Error(`ParamValues : valeur fixe non définie`); break; case ParamValueMode.MINMAX: if (this._minValue == undefined) throw new Error(`ParamValues : valeur min non définie`); if (this._maxValue == undefined) throw new Error(`ParamValues : valeur max non définie`); if (this._stepValue == undefined) throw new Error(`ParamValues : valeur du pas non définie`); if (this._minValue > this._maxValue) throw new Error(`ParamValues : min > max`); break; case ParamValueMode.LISTE: if (this._valueList == undefined) throw new Error(`ParamValues : liste de valeurs non définie`); break; case ParamValueMode.LINK: case ParamValueMode.CALCUL: break; default: throw new Error(`ParamValues : mode de valeurs ${ParamValueMode[this._valueMode]} incorrect`); } } /** * valeur courante */ public get currentValue(): number { if (this.isReferenceDefined) return this._valueRef.referencedParamValues.currentValue; return this._currentValue.value;
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
} /** * valeur dans le mode SINGLE */ public get singleValue(): number { if (this.isReferenceDefined) return this._valueRef.referencedParamValues.singleValue; return this._singleValue.value; } public get uncheckedValue() { return this._singleValue.uncheckedValue; } public setSingleValue(v: number) { this._valueMode = ParamValueMode.SINGLE; this._singleValue.value = v; this._currentValue.value = v; } public get isDefined() { return this._singleValue.isDefined; } public get min() { switch (this._valueMode) { case ParamValueMode.MINMAX: return this._minValue; case ParamValueMode.LINK: return this._valueRef.referencedParamValues.min; default: this.checkValueMode(ParamValueMode.MINMAX); // pour générer une erreur return undefined; // pour le compilo } } public set min(v: number) { this._minValue = v; this._valueMode = ParamValueMode.MINMAX; } public get max() { switch (this._valueMode) { case ParamValueMode.MINMAX: return this._maxValue; case ParamValueMode.LINK: return this._valueRef.referencedParamValues.max; default: this.checkValueMode(ParamValueMode.MINMAX); return undefined; // pour le compilo } } public set max(v: number) { this._maxValue = v; this._valueMode = ParamValueMode.MINMAX; } public get stepRefValue(): Pair { this.checkValueMode(ParamValueMode.MINMAX); return new Pair(1e-9, this._maxValue - this._minValue); } public get step() { switch (this._valueMode) {
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
case ParamValueMode.MINMAX: return this._stepValue; case ParamValueMode.LINK: return this._valueRef.referencedParamValues.step; default: this.checkValueMode(ParamValueMode.MINMAX); // pour générer une erreur return undefined; // pour le compilo } } public set step(v: number) { this._stepValue = v; this._valueMode = ParamValueMode.MINMAX; } public get valueList() { this.checkValueMode(ParamValueMode.LISTE); return this._valueList; } public set valueList(l: number[]) { this._valueList = l; this._valueMode = ParamValueMode.LISTE; } /** * crée un iterateur * @param reverse true si on veut itérer max->min ou depuis la fin de la liste */ public getValuesIterator(reverse: boolean = false): ParamValueIterator { return new ParamValueIterator(this, reverse); } /** * * @param reverse prépare un itérateur pour parcourir les valeurs */ public initIterator(reverse: boolean = false) { switch (this._valueMode) { case ParamValueMode.LISTE: case ParamValueMode.MINMAX: this._iterator = this.getValuesIterator(reverse); break; case ParamValueMode.LINK: this._iterator = this._valueRef.referencedParamValues.getValuesIterator(reverse); break; default: throw new Error(`ParamValues : mode de valeurs ${ParamValueMode[this._valueMode]} incorrect`); } } /** * @return true si il reste des valeurs à parcourir par l'itérateur courant */ public get hasNext(): boolean { return this._iterator.hasNext; } /** * fixe la valeur courante à la prochaine valeur à parcourir par l'itérateur courant * @return prochaine valeur à parcourir par l'itérateur courant */ public get next(): number { this._currentValue.value = this._iterator.next().value; return this._currentValue.value; }
281282283284285286287288289290291292293294295296297298299300301
// interface IObjectReference public defineReference(target: IReferencedObject, desc: string) { this.valueMode = ParamValueMode.LINK; this._valueRef.defineReference(target, desc); } public get isReferenceDefined(): boolean { return this._valueRef.isReferenceDefined; } public get referencedParamValues(): ParamValues { return this._valueRef.referencedParamValues; } public get referencedResult(): Result { return this._valueRef.referencedResult; } }