From 0ab322449ee6b0e46bbbc5ad8da45a2dcd05bacc Mon Sep 17 00:00:00 2001
From: "francois.grand" <francois.grand@irstea.fr>
Date: Fri, 8 Jun 2018 10:20:17 +0200
Subject: [PATCH] =?UTF-8?q?=20#45=20impl=C3=A9mentation=20de=20la=20r?=
 =?UTF-8?q?=C3=A9f=C3=A9rence=20=C3=A0=20des=20r=C3=A9sultats=20compl?=
 =?UTF-8?q?=C3=A9mentaires=20d'ouvrages=20parall=C3=A8les?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 spec/value_ref/value_ref_structure.spec.ts | 99 ++++++++++++++++++++++
 src/nub.ts                                 |  4 +-
 src/param/param-values.ts                  |  5 +-
 src/structure/parallel_structure.ts        | 35 ++++++++
 src/value_ref/object_ref.ts                |  6 +-
 5 files changed, 142 insertions(+), 7 deletions(-)
 create mode 100644 spec/value_ref/value_ref_structure.spec.ts

diff --git a/spec/value_ref/value_ref_structure.spec.ts b/spec/value_ref/value_ref_structure.spec.ts
new file mode 100644
index 00000000..f49eb0a6
--- /dev/null
+++ b/spec/value_ref/value_ref_structure.spec.ts
@@ -0,0 +1,99 @@
+import { SectionParametree } from "../../src/section/section_nub";
+import { cSnTrapez, ParamsSectionTrapez, ParallelStructure, ParallelStructureParams } from "../../src";
+import { StructureCem88d, RectangularStructureParams } from "../../src/structure/structure_cem88d";
+import { StructureCunge80 } from "../../src/structure/structure_cunge80";
+
+/**
+ * IMPORTANT !
+ * Décommenter temporairement la ligne suivante (import { } from "./mock_jasmine")
+ * Pour exécuter ce code dans le débugger.
+ * Faire de même avec le fichier test_func.ts
+ */
+// import { describe, expect, it, xdescribe, xit } from "../mock_jasmine";
+
+let nub1: ParallelStructure;
+let nub2: ParallelStructure;
+let nub3: StructureCem88d;
+let nub4: StructureCunge80;
+let prm3: RectangularStructureParams;
+let prm4: RectangularStructureParams;
+
+/**
+ * crée l'environnement de test.
+ * répété à chaque test car il manque un mock de beforeEach
+ */
+function createEnv() {
+    // Nub maître 1
+    nub1 = new ParallelStructure(new ParallelStructureParams(1, 2, 1));
+
+    // Nub maître 2
+    nub2 = new ParallelStructure(new ParallelStructureParams(1, 2, 1));
+
+    // Nub esclave 1
+    nub3 = new StructureCem88d(new RectangularStructureParams(0.5, 0, 1, 0.5, 1, 0.5));
+    prm3 = nub3.parameters as RectangularStructureParams;
+    nub1.addStructure(nub3);
+
+    // Nub esclave 2
+    nub4 = new StructureCunge80(new RectangularStructureParams(0.5, 0, 1, 0.5, 1, 0.5));
+    prm4 = nub4.parameters as RectangularStructureParams;
+    nub2.addStructure(nub4);
+}
+
+describe("référence d'un paramètre à un autre : ", () => {
+    describe("résultat complémentaire/ouvrages parallèles : ", () => {
+        it("test 1", () => {
+            // cas de figure :
+            // nub4.Q est lié au résultat complémentaire Q_Mode de nub1
+            // lecture de nub4.Q
+
+            createEnv();
+
+            prm4.Q.defineReference(nub1, "ouvrage[0].Q_Mode");
+
+            nub1.CalcSerie(0.001, 0.1, "Q");
+            nub2.CalcSerie(0.001, 0.1, "Q");
+            /*
+            nub1.result.resultElements[0].extraResults = {
+            "ouvrage[0].Q" : 6.264183905346331
+            "ouvrage[0].Q_Mode" : 0
+            "ouvrage[0].Q_Regime" : 0
+            }
+            nub2.result.resultElements[0].extraResults = {
+            "ouvrage[0].Q" : 2.4110855093366834
+            "ouvrage[0].Q_Mode" : 0
+            "ouvrage[0].Q_Regime" : 0
+            }
+            */
+
+            expect(prm4.Q.v).toEqual(0);
+        });
+
+        it("test 2", () => {
+            // cas de figure :
+            // nub4.Q est lié au résultat complémentaire Q de nub1
+            // lecture de nub4.Q
+
+            createEnv();
+
+            prm4.Q.defineReference(nub1, "ouvrage[0].Q");
+
+            nub1.CalcSerie(0.001, 0.1, "Q");
+            nub2.CalcSerie(0.001, 0.1, "Q");
+            /*
+            nub1.result.resultElements[0].extraResults = {
+            "ouvrage[0].Q" : 6.264183905346331
+            "ouvrage[0].Q_Mode" : 0
+            "ouvrage[0].Q_Regime" : 0
+            }
+            nub2.result.resultElements[0].extraResults = {
+            "ouvrage[0].Q" : 2.4110855093366834
+            "ouvrage[0].Q_Mode" : 0
+            "ouvrage[0].Q_Regime" : 0
+            }
+            */
+
+            expect(prm4.Q.v).toEqual(6.264183905346331);
+        });
+    });
+});
diff --git a/src/nub.ts b/src/nub.ts
index de4cdbaf..2f8db7a9 100644
--- a/src/nub.ts
+++ b/src/nub.ts
@@ -154,8 +154,8 @@ export abstract class Nub extends ComputeNode implements IReferencedObject {
         return this.getParameter(desc).paramValues;
     }
 
-    public getReferencedResult(desc: string): Result {
-        if (this._result !== undefined && this._result.name === desc)
+    public getReferencedResult(desc?: string): Result {
+        if (desc === undefined || (this._result !== undefined && this._result.name === desc))
             return this._result;
 
         return this.CalcSerie(0.001, 0.1, desc);
diff --git a/src/param/param-values.ts b/src/param/param-values.ts
index 1b13d34c..636da466 100644
--- a/src/param/param-values.ts
+++ b/src/param/param-values.ts
@@ -83,7 +83,10 @@ export class ParamValues implements IObjectReference {
     public get valueMode() {
         switch (this._valueMode) {
             case ParamValueMode.LINK:
-                return this.referencedParamValues.valueMode;
+                const pv = this.referencedParamValues;
+                if (pv == undefined)
+                    return undefined;
+                return pv.valueMode;
 
             default:
                 return this._valueMode;
diff --git a/src/structure/parallel_structure.ts b/src/structure/parallel_structure.ts
index 36d56b40..24cc5a8e 100644
--- a/src/structure/parallel_structure.ts
+++ b/src/structure/parallel_structure.ts
@@ -5,6 +5,7 @@ import { Result } from "../util/result";
 import { ParallelStructureParams } from "./parallel_structure_params";
 import { Structure } from "./structure";
 import { IParamDefinitionIterator, ParamsEquation, ParamsEquationArrayIterator } from "../param/params-equation";
+import { ParamValues } from "../param/param-values";
 
 /**
  * Interface pour mémoriser le n° d'ouvrage et le paramètre à calculer
@@ -245,6 +246,19 @@ export class ParallelStructure extends Nub {
         return { index: i, prm: sPrm };
     }
 
+    /**
+     * Renvoie le n° de structure et le paramètre à calculer
+     * @param sVarCalc Nom du paramètre à calculer : "ouvrage[n].X" avec "n" l'index de l'ouvrage et "X" son paramètre
+     */
+    private getStructureVarCalc2(sVarCalc: string): IStructureVarCalc {
+        const re = /([A-Z,a-z]+)\[(\d+)\]\.(.+)/;
+        const match = re.exec(sVarCalc);
+        if (match === null || match[1] != "ouvrage")
+            throw new Error(`getStructureVarCalc2() : erreur d'analyse de ${sVarCalc}, (pas de la forme ouvrage[n].X)`);
+
+        return { index: +match[2], prm: match[3] };
+    }
+
     /**
      * Calcul du paramètre d'un des ouvrages en parallèle
      * @param sVC Index de l'ouvrage et paramètre à calculer
@@ -258,4 +272,25 @@ export class ParallelStructure extends Nub {
         // Calcul du paramètre de la structure en calcul
         return this.structures[sVC.index].Calc(sVC.prm, rInit, rPrec);
     }
+
+    // interface IReferencedObject
+
+    public getReferencedParamValues(desc: string): ParamValues {
+        try {
+            // analyse ouvrage[n].X
+            const i: IStructureVarCalc = this.getStructureVarCalc2(desc);
+            return this.structures[i.index].getParameter(i.prm).paramValues;
+        }
+        catch (e) {
+            // pas de la forme ouvrage[n].X ou erreur sur n ou X
+            const param = this.getParameter(desc);
+            if (param === undefined)
+                return undefined;
+            return param.paramValues;
+        }
+    }
+
+    public getReferencedExtraResult(desc: string): any {
+        return this._result.getExtraResult(desc);
+    }
 }
diff --git a/src/value_ref/object_ref.ts b/src/value_ref/object_ref.ts
index 39d87bda..933ee698 100644
--- a/src/value_ref/object_ref.ts
+++ b/src/value_ref/object_ref.ts
@@ -16,7 +16,7 @@ export interface IReferencedObject {
      * getter du résultat
      * @param desc : description sous forme symbolique
      */
-    getReferencedResult(desc: string): Result;
+    getReferencedResult(desc?: string): Result;
 
     /**
      * getter du résultat complémentaire
@@ -111,8 +111,6 @@ export class ObjectReference implements IObjectReference {
      * instance de résultat complémentaire référencée
      */
     public get referencedExtraResult(): any {
-        const tmp: string[] = this._refDefinition.split(".");
-        const r: Result = this._referencedObject.getReferencedResult(tmp[0]);
-        return r.getExtraResult(tmp[1]);
+        return this._referencedObject.getReferencedExtraResult(this._refDefinition);
     }
 }
-- 
GitLab