Commit 01ddbea5 authored by Mathias Chouet's avatar Mathias Chouet 🍝
Browse files

Fix #376 - generate SectionPram in Bief: manage variating / calculated parameters

parent 83e56764
......@@ -8,7 +8,7 @@ import { I18nService } from "../../services/internationalisation.service";
import { ResultsComponentDirective } from "./results.component";
import { DialogLogEntriesDetailsComponent } from "../dialog-log-entries-details/dialog-log-entries-details.component";
import { AppComponent } from "../../app.component";
import { longestVarParam } from "../../../app/util";
import { longestVarNgParam } from "../../../app/util";
@Component({
selector: "var-results",
......@@ -68,7 +68,7 @@ export class VarResultsComponent extends ResultsComponentDirective {
// C. pre-extract variable parameters values
const varValues = [];
// find longest list
const lvp = longestVarParam(this._varResults.variatedParameters);
const lvp = longestVarNgParam(this._varResults.variatedParameters);
this.size = lvp.size;
// get extended values lists for each variable parameter
for (const v of this._varResults.variatedParameters) {
......
......@@ -2,7 +2,22 @@ import { Component, OnInit, DoCheck, OnDestroy, ViewChild, ViewChildren,
QueryList, AfterViewChecked, ElementRef, Inject, forwardRef } from "@angular/core";
import { ActivatedRoute, Router } from "@angular/router";
import { Observer, Session, Cloisons, Pab, ParamValueMode, CalculatorType, Bief, SectionParametree, acSection, round } from "jalhyd";
import {
Observer,
Session,
Cloisons,
Pab,
ParamValueMode,
CalculatorType,
Bief,
SectionParametree,
acSection,
ParamDefinition,
round,
VariatedDetails
} from "jalhyd";
import { longestVarParam } from "../../util";
import { AppComponent } from "../../app.component";
import { FormulaireService } from "../../services/formulaire.service";
......@@ -645,7 +660,7 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
public get generateSPAmontEnabled(): boolean {
const bief = (this._formulaire.currentNub as Bief);
if (bief.prms.Z1 === bief.calculatedParam) {
return this.hasResults && bief.result.ok;
return this.hasResults && ! bief.result.hasErrorMessages();
} else {
return true;
}
......@@ -654,7 +669,7 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
public get generateSPAvalEnabled(): boolean {
const bief = (this._formulaire.currentNub as Bief);
if (bief.prms.Z2 === bief.calculatedParam) {
return this.hasResults && bief.result.ok;
return this.hasResults && ! bief.result.hasErrorMessages();
} else {
return true;
}
......@@ -681,7 +696,10 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
*/
public generateSPAmont() {
const bief = (this._formulaire.currentNub as Bief);
this.generateSP(round(bief.prms.Z1.singleValue - bief.prms.ZF1.singleValue, 3));
this.generateSP(
this.generateYValuesForSP(bief.prms.Z1, bief.prms.ZF1),
this.generateIfValuesForSP()
);
}
/**
......@@ -689,19 +707,150 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
*/
public generateSPAval() {
const bief = (this._formulaire.currentNub as Bief);
this.generateSP(round(bief.prms.Z2.singleValue - bief.prms.ZF2.singleValue, 3));
this.generateSP(
this.generateYValuesForSP(bief.prms.Z2, bief.prms.ZF2),
this.generateIfValuesForSP()
);
}
/**
* Génère une liste de valeurs de tirant d'eau pour un couple Z1/ZF1 ou Z2/ZF2 donné, que ces
* paramètres soient fixés, variés et/ou calculés
* @TODO factoriser avec generateIfValuesForSP() la partie "générer des combinaisons de valeurs depuis N paramètres"
* @param Z cote de leau (Z1 ou Z2)
* @param ZF cote de fond (ZF1 ou ZF2)
*/
private generateYValuesForSP(Z: ParamDefinition, ZF: ParamDefinition): number | number[] {
const bief = (this._formulaire.currentNub as Bief);
if (
(Z.isCalculated && bief.resultHasMultipleValues())
|| Z.hasMultipleValues
|| ZF.hasMultipleValues
) {
// find longest values list with standard Nub method
const { param, index, size } = longestVarParam(bief.findVariatedParams());
console.log(`Z: ${Z.symbol}, isCalculated=${Z.isCalculated}, hasMultipleValues=${Z.hasMultipleValues}, count=${Z.count()}`);
// tslint:disable-next-line:max-line-length
console.log(`ZF: ${ZF.symbol}, isCalculated=${ZF.isCalculated}, hasMultipleValues=${ZF.hasMultipleValues}, count=${ZF.count()}`);
console.log(`longest = ${param.symbol}, size = ${size}`);
// extend values list for Z / Z1 if they vary
let ZVals: number[];
if (Z.isCalculated) {
ZVals = bief.result.getCalculatedValues();
} else {
if (Z.hasMultipleValues) {
ZVals = Z.getInferredValuesList(size);
} else {
ZVals = [ Z.singleValue ];
}
}
let ZFVals: number[];
if (ZF.hasMultipleValues) {
ZFVals = ZF.getInferredValuesList(size);
} else {
ZFVals = [ ZF.singleValue ];
}
console.log("ZVals", ZVals);
console.log("ZFVals", ZFVals);
// calculate Y values
const Ys: number[] = [];
for (let i = 0; i < size; i++) {
// using "%" because one of the two lists might have only 1 value
Ys.push(round(ZVals[i % ZVals.length] - ZFVals[i % ZFVals.length], 3));
}
console.log("Ys", Ys);
return Ys;
} else {
// .V returns calculated value or latest .v; no problem since no parameter is varying
// @TODO check that .v is not polluted by any DICHO calc ?
const Y = round(Z.V - ZF.V, 3);
console.log("Y", Y);
return Y;
}
}
/**
* Génère une liste de valeurs de pente en fonction de ZF1, ZF2 et Long,
* que ces paramètres soient fixés, variés et/ou calculés
*/
private generateIfValuesForSP(): number | number[] {
const bief = (this._formulaire.currentNub as Bief);
const ZF1 = bief.prms.ZF1;
const ZF2 = bief.prms.ZF2;
const Long = bief.prms.Long;
if (ZF1.hasMultipleValues || ZF2.hasMultipleValues || Long.hasMultipleValues) {
// find longest values list
const variated: VariatedDetails[] = [
{
param: ZF1,
values: ZF1.paramValues
},
{
param: ZF2,
values: ZF2.paramValues
},
{
param: Long,
values: Long.paramValues
}
];
const { param, index, size } = longestVarParam(variated);
console.log(`ZF1: hasMultipleValues=${ZF1.hasMultipleValues}, count=${ZF1.count()}`);
console.log(`ZF2: hasMultipleValues=${ZF2.hasMultipleValues}, count=${ZF2.count()}`);
console.log(`Long: hasMultipleValues=${Long.hasMultipleValues}, count=${Long.count()}`);
console.log(`longest = ${param.symbol}, size = ${size}`);
// extend values list for ZF1 / ZF2 / Long if they vary
let ZF1Vals: number[];
if (ZF1.hasMultipleValues) {
ZF1Vals = ZF1.getInferredValuesList(size);
} else {
ZF1Vals = [ ZF1.singleValue ];
}
let ZF2Vals: number[];
if (ZF2.hasMultipleValues) {
ZF2Vals = ZF2.getInferredValuesList(size);
} else {
ZF2Vals = [ ZF2.singleValue ];
}
let LongVals: number[];
if (Long.hasMultipleValues) {
LongVals = Long.getInferredValuesList(size);
} else {
LongVals = [ Long.singleValue ];
}
console.log("ZF1Vals", ZF1Vals);
console.log("ZF2Vals", ZF2Vals);
console.log("LongVals", LongVals);
// calculate If values
const Ifs: number[] = [];
for (let i = 0; i < size; i++) {
// using "%" because one of the three lists might have only 1 value
Ifs.push(round((ZF1Vals[i % ZF1Vals.length] - ZF2Vals[i % ZF2Vals.length]) / LongVals[i % LongVals.length], 5));
}
console.log("Ifs", Ifs);
return Ifs;
} else {
const If = round((ZF1.singleValue - ZF2.singleValue) / Long.singleValue, 5);
console.log("If", If);
return If;
}
}
/**
* Génère une SectionParametree à partir du module Bief en cours
* @param Y tirant d'eau
* @param Ys tirant(s) d'eau
* @param Ifs pente(s)
*/
private generateSP(Y: number) {
private generateSP(Ys: number | number[], Ifs: number | number[]) {
const bief = (this._formulaire.currentNub as Bief);
const pente = round(
(bief.prms.ZF1.singleValue - bief.prms.ZF2.singleValue) / bief.prms.Long.singleValue,
5 // ça ou autre chose…
);
const serialisedSection = bief.section.serialise();
const sectionCopy = Session.getInstance().unserialiseSingleNub(serialisedSection, false).nub;
const secParam = new SectionParametree(sectionCopy as acSection);
......@@ -710,8 +859,8 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
this.formulaireService.createFormulaire(CalculatorType.SectionParametree, secParam)
.then((f: FormulaireDefinition) => {
const sp = (f.currentNub as SectionParametree);
sp.section.prms.Y.singleValue = Y;
sp.section.prms.If.singleValue = pente;
sp.section.prms.Y.setValues(Ys);
sp.section.prms.If.setValues(Ifs);
// calculate
f.doCompute();
// go to new SP
......
......@@ -6,7 +6,7 @@ import { I18nService } from "../../services/internationalisation.service";
import { ResultsComponentDirective } from "../fixedvar-results/results.component";
import { PabResults } from "../../results/pab-results";
import { IYSeries } from "../../results/y-series";
import { fv, longestVarParam } from "../../util";
import { fv, longestVarNgParam } from "../../util";
import { AppComponent } from "../../app.component";
import { CloisonAval, Cloisons, LoiDebit } from "jalhyd";
......@@ -132,7 +132,7 @@ export class PabProfileChartComponent extends ResultsComponentDirective {
if (this._results) {
this.varValues = [];
// find longest list
const lvp = longestVarParam(this._results.variatedParameters);
const lvp = longestVarNgParam(this._results.variatedParameters);
this.size = lvp.size;
// get extended values lists for each variable parameter
for (const v of this._results.variatedParameters) {
......
import { Component, Output, EventEmitter } from "@angular/core";
import { I18nService } from "../../services/internationalisation.service";
import { fv, longestVarParam } from "../../util";
import { fv, longestVarNgParam } from "../../util";
import { MultiDimensionResults } from "../../results/multidimension-results";
@Component({
......@@ -40,7 +40,7 @@ export class VariableResultsSelectorComponent {
// pre-extract variable parameters values
this.varValues = [];
// find longest list
const lvp = longestVarParam(this._results.variatedParameters);
const lvp = longestVarNgParam(this._results.variatedParameters);
this.size = lvp.size;
// get extended values lists for each variable parameter
for (const v of this._results.variatedParameters) {
......
......@@ -3,7 +3,7 @@ import { Pab, Result } from "jalhyd";
import { FormulaireDefinition } from "./form-definition";
import { PabResults } from "../../results/pab-results";
import { NgParameter } from "../elements/ngparam";
import { longestVarParam } from "../../util";
import { longestVarNgParam } from "../../util";
import { CalculatorResults } from "../../results/calculator-results";
/**
......@@ -55,7 +55,7 @@ export class FormulairePab extends FormulaireDefinition {
pabr.Z2 = [];
if (varParams.length > 0) {
// find longest list
const lvp = longestVarParam(varParams);
const lvp = longestVarNgParam(varParams);
const longest = lvp.size;
// get extended values lists for Z2
if (pab.prms.Z2.hasMultipleValues) {
......
......@@ -8,7 +8,7 @@ import { ChartType } from "./chart-type";
import { sprintf } from "sprintf-js";
import { longestVarParam } from "../util";
import { longestVarNgParam } from "../util";
export class VarResults extends CalculatedParamResults implements PlottableData {
/**
......@@ -335,7 +335,7 @@ export class VarResults extends CalculatedParamResults implements PlottableData
});
// liste la plus longue
const lvp = longestVarParam(this._variatedParams);
const lvp = longestVarNgParam(this._variatedParams);
this.size = lvp.size;
this.longest = lvp.index;
......
import { NgParameter } from "./formulaire/elements/ngparam";
import { ServiceFactory } from "./services/service-factory";
import { formattedValue, Nub, ParamDefinition, ParamValues } from "jalhyd";
import { formattedValue, Nub, VariatedDetails, ParamDefinition } from "jalhyd";
export function logObject(obj: {}, m?: string) {
// évite le message "Value below was evaluated just now" dans le debugger de Chrome
......@@ -47,14 +47,28 @@ export function decodeHtml(html: string): string {
* values, its index in the list, and the number of values it contains
* @param varParams
*/
export function longestVarParam(varParams: NgParameter[]): { param: NgParameter, index: number, size: number } {
const variated: { param: ParamDefinition, values: ParamValues }[] = [];
export function longestVarNgParam(varParams: NgParameter[]): { param: NgParameter, index: number, size: number } {
const variated: VariatedDetails[] = [];
for (const vp of varParams) {
variated.push({
param: vp.paramDefinition,
values: vp.paramDefinition.paramValues
});
}
const { param, index, size } = longestVarParam(variated);
return {
param: varParams[index],
index,
size
};
}
/**
* Given a list of variated ParamDefinition, returns the parameter having the most
* values, its index in the list, and the number of values it contains
* @param variated
*/
export function longestVarParam(variated: VariatedDetails[]): { param: ParamDefinition, index: number, size: number } {
const { size, longest, minLinkedResultParam } = Nub.findVariatedSize(variated);
let realSize = size;
// if at least one linked variated result was found
......@@ -66,7 +80,7 @@ export function longestVarParam(varParams: NgParameter[]): { param: NgParameter,
}
}
return {
param: varParams[longest],
param: longest !== undefined ? variated[longest].param : undefined,
index: longest,
size: realSize
};
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment