diff --git a/src/nub.ts b/src/nub.ts index ae6c9352521dfd11e06d32af573324450aa0a2b0..409de6aa49f67cc2bd04874bc82a929499b55d5f 100644 --- a/src/nub.ts +++ b/src/nub.ts @@ -16,50 +16,6 @@ import { Result } from "./util/result"; */ export abstract class Nub extends ComputeNode implements IObservable { - private static progressPercentageAccordedToChainCalculation = 50; - - /** paramétrage de la dichotomie */ - public dichoStartIntervalMaxSteps: number = 100; - - /** pointer to parent Nub */ - public parent: Nub; - - /** parameter that is to be computed by default - to be overloaded by child classes */ - protected _defaultCalculatedParam: ParamDefinition; - - /** parameter that is to be computed */ - protected _calculatedParam: ParamDefinition; - - /** résultat de Calc()/CalcSerie() */ - protected _result: Result; - - /** - * List of children Nubs; browsed by parameters iterator. - * - for ParallelStructures: contains 0 or more Structures - * - for SectionNub : contains exactly 1 acSection - */ - protected _children: Nub[]; - - /** properties describing the Nub type */ - protected _props: Props = new Props(); - - /** implémentation par délégation de IObservable */ - private _observable: Observable; - - /** a rough indication of calculation progress, between 0 and 100 */ - private _progress: number = 0; - - /** allows notifying of progress every X milliseconds only */ - private previousNotificationTimestamp = 0; - - public constructor(prms: ParamsEquation, dbg: boolean = false) { - super(prms, dbg); - this._children = []; - this._observable = new Observable(); - this._defaultCalculatedParam = this.getFirstAnalyticalParameter(); - this.resetDefaultCalculatedParam(); - } - public get result(): Result { return this._result; } @@ -75,6 +31,24 @@ export abstract class Nub extends ComputeNode implements IObservable { this._props = props.clone(); } + /** + * return ParamsEquation of all children recursively + */ + public get childrenPrms(): ParamsEquation[] { + const prms: ParamsEquation[] = []; + if (this._children.length) { // if called within constructor, default class member value is not set yet + for (const child of this._children) { + prms.push(child.prms); + if (child.getChildren()) { + if (child.getChildren().length) { + Nub.concatPrms(prms, child.childrenPrms); + } + } + } + } + return prms; + } + /** * Returns an iterator over : * - own parameters (this._prms) @@ -83,10 +57,8 @@ export abstract class Nub extends ComputeNode implements IObservable { public get parameterIterator(): IParamDefinitionIterator { const prms: ParamsEquation[] = []; prms.push(this._prms); - if (this._children) { // if called within constructor, default class member value is not set yet - for (const child of this._children) { - prms.push(child.prms); - } + if (this._children) { + Nub.concatPrms(prms, this.childrenPrms); } return new ParamsEquationArrayIterator(prms); } @@ -145,6 +117,58 @@ export abstract class Nub extends ComputeNode implements IObservable { } } + private static progressPercentageAccordedToChainCalculation = 50; + + private static concatPrms(p1: ParamsEquation[], p2: ParamsEquation[]): ParamsEquation[] { + const p3: ParamsEquation[] = p1; + for (const p of p2) { + p3.push(p); + } + return p3; + } + + /** paramétrage de la dichotomie */ + public dichoStartIntervalMaxSteps: number = 100; + + /** pointer to parent Nub */ + public parent: Nub; + + /** parameter that is to be computed by default - to be overloaded by child classes */ + protected _defaultCalculatedParam: ParamDefinition; + + /** parameter that is to be computed */ + protected _calculatedParam: ParamDefinition; + + /** résultat de Calc()/CalcSerie() */ + protected _result: Result; + + /** + * List of children Nubs; browsed by parameters iterator. + * - for ParallelStructures: contains 0 or more Structures + * - for SectionNub : contains exactly 1 acSection + */ + protected _children: Nub[]; + + /** properties describing the Nub type */ + protected _props: Props = new Props(); + + /** implémentation par délégation de IObservable */ + private _observable: Observable; + + /** a rough indication of calculation progress, between 0 and 100 */ + private _progress: number = 0; + + /** allows notifying of progress every X milliseconds only */ + private previousNotificationTimestamp = 0; + + public constructor(prms: ParamsEquation, dbg: boolean = false) { + super(prms, dbg); + this._children = []; + this._observable = new Observable(); + this._defaultCalculatedParam = this.getFirstAnalyticalParameter(); + this.resetDefaultCalculatedParam(); + } + /** * Finds the previous calculated parameter and sets its mode to SINGLE */ @@ -1207,4 +1231,5 @@ export abstract class Nub extends ComputeNode implements IObservable { const rPrec = this._prms.Pr.v; return dicho.Dichotomie(target.v, rPrec, rInit); } + }