diff --git a/src/nub.ts b/src/nub.ts index 6c869ca68c506214d47c3f20f6c1d8ea0555518b..78f77f3c7ebbd89613f8206df2b7daad51457936 100644 --- a/src/nub.ts +++ b/src/nub.ts @@ -79,59 +79,34 @@ export abstract class Nub extends ComputeNode implements IReferencedNub { let computedParam: ParamDefinition; // instance de ParamValues utilisée pour le paramètre varié (qui peut être un paramètre référencé (importé)) let variatedPrmValues: ParamValues; + let refResult: Result; for (const p of this.parameterIterator) { - switch (p.valueMode) { + if (p.valueMode === ParamValueMode.CALCUL) { + if (sDonnee === undefined) { + if (computedParam === undefined) { + computedParam = p; + } else { + // tslint:disable-next-line:max-line-length + throw new Error(`CalcSerie() : il y plusieurs paramètres à calculer (au moins ${computedParam.symbol} et ${p.symbol})`); + } + } + } + + switch (p.paramValues.valueMode) { case ParamValueMode.SINGLE: break; case ParamValueMode.LISTE: case ParamValueMode.MINMAX: - if (variatedPrmValues === undefined) { - variatedPrmValues = p.paramValues; - } else { - // tslint:disable-next-line:max-line-length - throw new Error(`CalcSerie() : il y plusieurs paramètres à varier : ${p.symbol}`); - } + variatedPrmValues = this.setVariatedPrmValues(p, variatedPrmValues); break; case ParamValueMode.CALCUL: - if (sDonnee === undefined) { - if (computedParam === undefined) { - computedParam = p; - } else { - // tslint:disable-next-line:max-line-length - throw new Error(`CalcSerie() : il y plusieurs paramètres à calculer (au moins ${computedParam.symbol} et ${p.symbol})`); - } - } - break; - - case ParamValueMode.LINK: - if (p.referencedParamValues !== undefined) { - switch (p.referencedParamValues.valueMode) { - case ParamValueMode.SINGLE: - break; - - case ParamValueMode.LISTE: - case ParamValueMode.MINMAX: - variatedPrmValues = this.setVariatedPrmValues( - p.referencedParamValues, variatedPrmValues, p.symbol - ); - break; - - case ParamValueMode.CALCUL: - // Le paramètre lié est un résultat de calcul - if (p.referencedResult.nbResultElements > 1) { - variatedPrmValues = this.setVariatedPrmValues( - p.referencedParamValues, variatedPrmValues, p.symbol - ); - } - break; - - default: - // tslint:disable-next-line:max-line-length - throw new Error(`CalcSerie() : valeur référencée de ParamValueMode ${ParamValueMode[p.referencedParamValues.valueMode]} non prise en charge`); - } + // Le paramètre lié est un résultat de calcul + if (p.isReferenceDefined && p.referencedResult.nbResultElements > 1) { + variatedPrmValues = this.setVariatedPrmValues(p, variatedPrmValues); + refResult = p.referencedResult; } break; @@ -159,7 +134,7 @@ export abstract class Nub extends ComputeNode implements IReferencedNub { this._result = this.Calc(computedSymbol, rInit, rPrec); // résultat dans this._result } else { const res = new Result(); - variatedPrmValues.initIterator(); + variatedPrmValues.initIterator(false, refResult); while (variatedPrmValues.hasNext) { // tslint:disable-next-line:no-unused-expression variatedPrmValues.next; @@ -308,12 +283,12 @@ export abstract class Nub extends ComputeNode implements IReferencedNub { return prefix === undefined ? str : `${prefix}${str}`; } - private setVariatedPrmValues(prmValues: ParamValues, variatedPrmValues: ParamValues, symbol: string) { + private setVariatedPrmValues(p: ParamDefinition, variatedPrmValues: ParamValues) { if (variatedPrmValues === undefined) { - return prmValues; + return p.paramValues; } else { // tslint:disable-next-line:max-line-length - throw new Error(`CalcSerie() : il y plusieurs paramètres à varier : ${symbol}`); + throw new Error(`CalcSerie() : Paramètres à varier redondant : ${p.symbol}`); } } diff --git a/src/param/param-values.ts b/src/param/param-values.ts index 366e9901795d0745ee371e01790f13867e8cc07c..a8c2f384869db50faa0a06845ef3e7615804181c 100644 --- a/src/param/param-values.ts +++ b/src/param/param-values.ts @@ -247,7 +247,7 @@ export class ParamValues implements INubReference, IterableValues { * prépare un itérateur pour parcourir les valeurs * @param reverse */ - public initIterator(reverse: boolean = false) { + public initIterator(reverse: boolean = false, result?: Result) { switch (this._valueMode) { case ParamValueMode.LISTE: case ParamValueMode.MINMAX: @@ -255,9 +255,8 @@ export class ParamValues implements INubReference, IterableValues { break; case ParamValueMode.CALCUL: - this._iterator = this._nubRef.referencedResult.valuesIterator; + this._iterator = result.valuesIterator; break; - default: throw new Error(`ParamValues : mode de valeurs ${ParamValueMode[this._valueMode]} incorrect`); }