From e0f90f0304fc40daaee4ccf6c440789d64b2d328 Mon Sep 17 00:00:00 2001
From: "francois.grand" <francois.grand@irstea.fr>
Date: Thu, 11 Jan 2018 09:00:10 +0100
Subject: [PATCH] =?UTF-8?q?Ajout=20de=20la=20calculette=20"passe=20=C3=A0?=
 =?UTF-8?q?=20bassin=20:=20puissance=20dissip=C3=A9e"=20-=20correction=20d?=
 =?UTF-8?q?'un=20bug=20lors=20du=20calcul=20d'un=20param=C3=A8tre=20:=20la?=
 =?UTF-8?q?=20valeur=20initiale=20ne=20tenait=20pas=20compte=20du=20domain?=
 =?UTF-8?q?e=20de=20d=C3=A9finition=20du=20param=C3=A8tre=20-=20correction?=
 =?UTF-8?q?=20d'un=20bug=20lors=20de=20la=20modification=20"fix=C3=A9/?=
 =?UTF-8?q?=C3=A0=20varier/=C3=A0=20calculer"=20-=20modification=20de=20la?=
 =?UTF-8?q?=20proc=C3=A9dure=20d'ajout=20d'une=20calculette?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md                                     | 18 +++----
 .../generic/calculator.component.ts           |  3 ++
 .../pab-puissance/pab-puissance.config.json   | 47 ++++++++++++++++
 .../pab-puissance/pab-puissance.en.json       |  9 ++++
 .../pab-puissance/pab-puissance.fr.json       |  9 ++++
 .../calculator-list.component.ts              |  1 +
 src/app/formulaire/formulaire-definition.ts   | 53 ++++++++++++++++---
 src/app/formulaire/ngparam.ts                 |  6 ++-
 .../services/formulaire/formulaire.service.ts |  3 ++
 src/app/services/param/param.service.ts       |  5 ++
 src/locale/error_messages.en.json             |  3 +-
 src/locale/error_messages.fr.json             |  3 +-
 12 files changed, 140 insertions(+), 20 deletions(-)
 create mode 100644 src/app/calculators/pab-puissance/pab-puissance.config.json
 create mode 100644 src/app/calculators/pab-puissance/pab-puissance.en.json
 create mode 100644 src/app/calculators/pab-puissance/pab-puissance.fr.json

diff --git a/README.md b/README.md
index b990318df..03fd8828b 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@ and then :
 `npm run lint`
 
 
-# Procédure d'ajout d'une calculette #
+#Procédure d'ajout d'une calculette
 
 ##JaLHyd
 
@@ -139,7 +139,6 @@ and then :
 
 ##ngHyd
 
-
 * Créer les fichier de configuration de la calculette
 	- dans _src/app/calculators_ : créer un répertoire (par ex _ma-calculette_)
 
@@ -160,7 +159,13 @@ and then :
 
 	On ne reprend pas directement l'enum _ComputeNodeType_ car celui ci sert à distinguer les variantes au sein d'une même calculette (par exemple les différentes sections paramétrées).
 
-* Composant CalculatorListComponent : ajouter une ligne au constructeur pour créer une nouvelle entrée dans la liste des calculettes disponibles.
+* Composant CalculatorListComponent : ajouter une ligne à la methode _updateLocale()_ pour créer une nouvelle entrée dans la liste des calculettes disponibles.
+
+* _src/locale/error_messages.&lt;langue&gt;.json_ :
+	Ajouter un champ pour le titre de la calculette. Par exemple :
+		 _"INFO_MACALC_TITRE": "Ma calculette"_
+
+* Compléter la méthode _GenericCalculatorComponent .uitextTitre()_ avec cette valeur et la valeur de l'enum _CalculatorType_ correspondante.
 
 * Classe _FormulaireService_, méthode _getConfigPathPrefix()_ : compléter le _switch_ pour fournir le préfixe des fichiers de configuration/internationalisation.
 
@@ -170,10 +175,5 @@ and then :
 	- _FormulaireDefinition.getComputeNodeTypeFromSection()_.
 	- _ParamService.hasParameter()_
 
-* _src/locale/error_messages.&lt;langue&gt;.json_ :
-	Ajouter un champ pour le titre de la calculette. Par exemple :
-		 _"INFO_MACALC_TITRE": "Ma calculette"_
-	Compléter la méthode _GenericCalculatorComponent .uitextTitre()_ avec cette valeur et la valeur de l'enum _CalculatorType_ correspondante.
-
 * Classe FormulaireDefinition : compléter la méthode _doCompute()_.
-	En particulier, adapter les méthodes _getNubAndParameters()_ ou _getSectionNubAndParameters()_ (récupération des valeurs saisies dans l'interface).
\ No newline at end of file
+	En particulier, adapter les méthodes _getNubAndParameters()_ ou _getSectionNubAndParameters()_ (récupération des valeurs saisies dans l'interface).
diff --git a/src/app/calculators/generic/calculator.component.ts b/src/app/calculators/generic/calculator.component.ts
index 312fc0f57..91771cd8e 100644
--- a/src/app/calculators/generic/calculator.component.ts
+++ b/src/app/calculators/generic/calculator.component.ts
@@ -71,6 +71,9 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, OnDestroy, O
             case CalculatorType.PabDimensions:
                 return this.intlService.localizeText("INFO_PABDIM_TITRE")
 
+            case CalculatorType.PabPuissance:
+                return this.intlService.localizeText("INFO_PABPUISS_TITRE")
+
             default:
                 return "Invalid calculator type " + this._formulaire.calculatorType;
         }
diff --git a/src/app/calculators/pab-puissance/pab-puissance.config.json b/src/app/calculators/pab-puissance/pab-puissance.config.json
new file mode 100644
index 000000000..378584f65
--- /dev/null
+++ b/src/app/calculators/pab-puissance/pab-puissance.config.json
@@ -0,0 +1,47 @@
+[
+    {
+        "id": "fs_puissance",
+        "option": "cal",
+        "fields": [
+            {
+                "type": "input",
+                "id": "DH",
+                "unit": "m",
+                "value": 0.3
+            },
+            {
+                "type": "input",
+                "id": "Q",
+                "unit": "m³/s",
+                "value": 0.1
+            },
+            {
+                "type": "input",
+                "id": "V",
+                "unit": "m³",
+                "value": 0.5
+            },
+            {
+                "type": "input",
+                "id": "Pv",
+                "unit": "W",
+                "value": 588.6
+            }
+        ]
+    },
+    {
+        "id": "fs_param_calc",
+        "option": "fix",
+        "fields": [
+            {
+                "type": "input",
+                "id": "Pr"
+            }
+        ]
+    },
+    {
+        "id": "options",
+        "idCal": "Pv",
+        "nodeType": "PabPuissance"
+    }
+]
\ No newline at end of file
diff --git a/src/app/calculators/pab-puissance/pab-puissance.en.json b/src/app/calculators/pab-puissance/pab-puissance.en.json
new file mode 100644
index 000000000..b771da546
--- /dev/null
+++ b/src/app/calculators/pab-puissance/pab-puissance.en.json
@@ -0,0 +1,9 @@
+{
+    "fs_puissance": "Basin dimensions",
+    "DH": "Drop",
+    "Q": "Discharge",
+    "V": "Volume",
+    "Pv": "Dissipated power",
+    "fs_param_calc": "Calculation parameters",
+    "Pr": "Display accuracy"
+}
\ No newline at end of file
diff --git a/src/app/calculators/pab-puissance/pab-puissance.fr.json b/src/app/calculators/pab-puissance/pab-puissance.fr.json
new file mode 100644
index 000000000..fb5d64a4a
--- /dev/null
+++ b/src/app/calculators/pab-puissance/pab-puissance.fr.json
@@ -0,0 +1,9 @@
+{
+    "fs_puissance": "Paramètres",
+    "DH": "Chute entre bassins",
+    "Q": "Débit",
+    "V": "Volume",
+    "Pv": "Puissance dissipée",
+    "fs_param_calc": "Paramètres de calcul",
+    "Pr": "Précision de calcul"
+}
\ No newline at end of file
diff --git a/src/app/components/calculator-list/calculator-list.component.ts b/src/app/components/calculator-list/calculator-list.component.ts
index 912d49bec..509b10a1c 100644
--- a/src/app/components/calculator-list/calculator-list.component.ts
+++ b/src/app/components/calculator-list/calculator-list.component.ts
@@ -37,6 +37,7 @@ export class CalculatorListComponent implements OnInit {
         this._items.push(new ListElement(this.intlService.localizeText("INFO_SECTPARAM_TITRE"), CalculatorType.SectionParametree));
         this._items.push(new ListElement(this.intlService.localizeText("INFO_REMOUS_TITRE"), CalculatorType.CourbeRemous));
         this._items.push(new ListElement(this.intlService.localizeText("INFO_PABDIM_TITRE"), CalculatorType.PabDimensions));
+        this._items.push(new ListElement(this.intlService.localizeText("INFO_PABPUISS_TITRE"), CalculatorType.PabPuissance));
     }
 
     private create(t: CalculatorType) {
diff --git a/src/app/formulaire/formulaire-definition.ts b/src/app/formulaire/formulaire-definition.ts
index 280abe716..d9ba762ed 100644
--- a/src/app/formulaire/formulaire-definition.ts
+++ b/src/app/formulaire/formulaire-definition.ts
@@ -1,7 +1,7 @@
-import { ComputeNodeType, ParamsEquation, Nub, acSection, RegimeUniforme, MethodeResolution, CourbeRemousParams, CourbeRemous } from "jalhyd";
+import { ComputeNodeType, ParamsEquation, Nub, acSection, RegimeUniforme, MethodeResolution, CourbeRemousParams, CourbeRemous, ParamDomainValue } from "jalhyd";
 import { ParamsSectionRectang, cSnRectang, ParamsSectionCirc, cSnCirc, ParamsSectionPuiss, cSnPuiss, Result } from "jalhyd";
 import { ConduiteDistrib, ConduiteDistribParams, LechaptCalmon, LechaptCalmonParams, ParamsSectionTrapez, cSnTrapez } from "jalhyd";
-import { PabDimension, PabDimensionParams } from "jalhyd";
+import { PabDimension, PabDimensionParams, PabPuissance, PabPuissanceParams } from "jalhyd";
 
 import { ParamService } from "../services/param/param.service";
 import { InternationalisationService } from "../services/internationalisation/internationalisation.service";
@@ -28,6 +28,7 @@ import { StringMap } from "../stringmap";
 export enum CalculatorType {
     ConduiteDistributrice, LechaptCalmon, SectionParametree, RegimeUniforme, CourbeRemous,
     PabDimensions, // passe à bassin rectangulaire
+    PabPuissance, // passe à bassin : puissance dissipée
 }
 
 
@@ -332,11 +333,13 @@ export class FormulaireDefinition {
             for (let fs of this._fieldSets) {
                 for (let p of fs.fields) {
                     if (p instanceof NgParameter)
-                        if (p.radioState == ParamRadioConfig.FIX && p != sourceParam) {
+                        if (p.radioConfig == ParamRadioConfig.CAL && p.radioState == ParamRadioConfig.FIX && p != sourceParam) {
                             newCal = p;
                             break;
                         }
                 }
+                if (newCal != undefined)
+                    break;
             }
 
             newCal.radioState = ParamRadioConfig.CAL;
@@ -961,6 +964,17 @@ export class FormulaireDefinition {
                     return [nub, prms];
                 }
 
+            case CalculatorType.PabPuissance:
+                {
+                    let DH: number = this.getParameterValue("DH");  // Chute entre bassins
+                    let Q: number = this.getParameterValue("Q"); // Débit 
+                    let V: number = this.getParameterValue("V"); // volume V
+                    let Pv: number = this.getParameterValue("Pv"); // puissance dissipée
+                    let prms = new PabPuissanceParams(DH, Q, V, Pv);
+                    let nub = new PabPuissance(prms); // pour initialiser la calculabilité des paramètres
+                    return [nub, prms];
+                }
+
             default:
                 throw "FormulaireService.getNubAndParameters() : valeur de CalculatorType " + this.calculatorType + " non implémentée"
         }
@@ -1034,6 +1048,32 @@ export class FormulaireDefinition {
         }
     }
 
+    /**
+     * lance le calcul d'un paramètre en déterminant une valeur initiale
+     */
+    private runNubCalc(nub: Nub, p: NgParameter, prec: number): Result {
+        let init: number;
+        switch (p.domain.domain) {
+            case ParamDomainValue.ANY:
+            case ParamDomainValue.POS_NULL:
+                init = 0;
+                break;
+
+            case ParamDomainValue.INTERVAL:
+                init = p.domain.minValue;
+                break;
+
+            case ParamDomainValue.NOT_NULL:
+            case ParamDomainValue.POS:
+                init = 1e-8;
+                break;
+        }
+        if (prec == undefined)
+            return nub.Calc(p.symbol, init);
+
+        return nub.Calc(p.symbol, init, prec);
+    }
+
     private doComputeFixedVar() {
         let np: [Nub, ParamsEquation];
         let nub: Nub;
@@ -1059,10 +1099,7 @@ export class FormulaireDefinition {
         if (varParam == undefined) {
             // pas de paramètre à varier
 
-            if (computePrec == undefined)
-                var res: Result = nub.Calc(computedParam.symbol, 0);
-            else
-                res = nub.Calc(computedParam.symbol, 0, computePrec);
+            let res: Result = this.runNubCalc(nub, computedParam, computePrec);
             if (res.ok) {
                 this.addFixedResults(!rg);
                 this._fixVarResults.addFixedResult(computedParam, res.vCalc, !rg);
@@ -1085,7 +1122,7 @@ export class FormulaireDefinition {
             for (let val = min; val <= max; val += step) {
                 prms[varParam.symbol].v = val;
 
-                let res = nub.Calc(computedParam.symbol, 0, computePrec);
+                let res: Result = this.runNubCalc(nub, computedParam, computePrec);
                 if (res.ok) {
                     this._fixVarResults.addVarResult(val, res.vCalc);
                 }
diff --git a/src/app/formulaire/ngparam.ts b/src/app/formulaire/ngparam.ts
index 998b75a71..2db893c26 100644
--- a/src/app/formulaire/ngparam.ts
+++ b/src/app/formulaire/ngparam.ts
@@ -1,4 +1,4 @@
-import { ParamDefinition, ParamDomainValue, Interval } from "jalhyd";
+import { ParamDefinition, ParamDomainValue, Interval, ParamDomain } from "jalhyd";
 
 import { InputField } from "./input-field";
 import { Dependency } from "./dependency";
@@ -70,6 +70,10 @@ export class NgParameter extends InputField {
         return this._paramDef.symbol;
     }
 
+    get domain(): ParamDomain {
+        return this._paramDef.getDomain();
+    }
+
     // get alias(): string {
     //     return this._paramDef.symbolAlias;
     // }
diff --git a/src/app/services/formulaire/formulaire.service.ts b/src/app/services/formulaire/formulaire.service.ts
index 0195eb204..6bc3746c9 100644
--- a/src/app/services/formulaire/formulaire.service.ts
+++ b/src/app/services/formulaire/formulaire.service.ts
@@ -177,6 +177,9 @@ export class FormulaireService extends Observable {
             case CalculatorType.PabDimensions:
                 return "app/calculators/pab-dimensions/pab-dimensions.";
 
+            case CalculatorType.PabPuissance:
+                return "app/calculators/pab-puissance/pab-puissance.";
+
             default:
                 throw "FormulaireService.getConfigPathPrefix() : valeur de CalculatorType " + ct + " non implémentée"
         }
diff --git a/src/app/services/param/param.service.ts b/src/app/services/param/param.service.ts
index a2e3aa375..a56076a61 100644
--- a/src/app/services/param/param.service.ts
+++ b/src/app/services/param/param.service.ts
@@ -24,6 +24,7 @@ export class ParamService {
         this.addParameters(ComputeNodeType.CourbeRemousRectangle);
         this.addParameters(ComputeNodeType.CourbeRemousTrapeze);
         this.addParameters(ComputeNodeType.PabDimensions);
+        this.addParameters(ComputeNodeType.PabPuissance);
 
         // précision de calcul
 
@@ -48,6 +49,10 @@ export class ParamService {
         p.calculability = ParamCalculability.FREE;
         this.addParameter(p);
 
+        p = new ParamDefinition(ComputeNodeType.PabPuissance, 'Pr', d);
+        p.calculability = ParamCalculability.FREE;
+        this.addParameter(p);
+
         // logObject(this._params);
     }
 
diff --git a/src/locale/error_messages.en.json b/src/locale/error_messages.en.json
index c3cb91560..b6c4c68f6 100644
--- a/src/locale/error_messages.en.json
+++ b/src/locale/error_messages.en.json
@@ -76,5 +76,6 @@
     "INFO_CLOSE_DIALOGUE_TEXT": "Warning ! Parameters and results will be lost. Really close ?",
     "INFO_OPTION_YES": "Yes",
     "INFO_OPTION_NO": "No",
-    "INFO_PABDIM_TITRE": "Passe à bassin : dimensions"
+    "INFO_PABDIM_TITRE": "Passe à bassin : dimensions",
+    "INFO_PABPUISS_TITRE": "Passe à bassin : dissipated power"
 }
\ No newline at end of file
diff --git a/src/locale/error_messages.fr.json b/src/locale/error_messages.fr.json
index d3e14d846..cc78a2a51 100644
--- a/src/locale/error_messages.fr.json
+++ b/src/locale/error_messages.fr.json
@@ -82,5 +82,6 @@
     "INFO_CLOSE_DIALOGUE_TEXT": "Attention ! Les paramètres et résultats de la calculette seront perdus. Vraiment fermer ?",
     "INFO_OPTION_YES": "Oui",
     "INFO_OPTION_NO": "Non",
-    "INFO_PABDIM_TITRE": "Passe à bassin : dimensions"
+    "INFO_PABDIM_TITRE": "Passe à bassin : dimensions",
+    "INFO_PABPUISS_TITRE": "Passe à bassin : puissance dissipée"
 }
\ No newline at end of file
-- 
GitLab