Skip to content
Snippets Groups Projects
Commit a7c98a72 authored by mathias.chouet's avatar mathias.chouet
Browse files

Fix #230 : faire varier les conditions limites

parent abd94c01
No related branches found
No related tags found
1 merge request!49Resolve "Ajout du module de calcul d'une passe à bassins"
Showing
with 210 additions and 35 deletions
...@@ -80,6 +80,7 @@ import { LogEntryComponent } from "./components/log-entry/log-entry.component"; ...@@ -80,6 +80,7 @@ import { LogEntryComponent } from "./components/log-entry/log-entry.component";
import { ParamLinkComponent } from "./components/param-link/param-link.component"; import { ParamLinkComponent } from "./components/param-link/param-link.component";
import { SelectModelFieldLineComponent } from "./components/select-model-field-line/select-model-field-line.component"; import { SelectModelFieldLineComponent } from "./components/select-model-field-line/select-model-field-line.component";
import { PabTableComponent } from "./components/pab-table/pab-table.component"; import { PabTableComponent } from "./components/pab-table/pab-table.component";
import { PabVariableResultsSelectorComponent } from "./components/pab-results/pab-variable-results-selector.component";
import { DialogConfirmEmptySessionComponent } from "./components/dialog-confirm-empty-session/dialog-confirm-empty-session.component"; import { DialogConfirmEmptySessionComponent } from "./components/dialog-confirm-empty-session/dialog-confirm-empty-session.component";
import { DialogConfirmCloseCalcComponent } from "./components/dialog-confirm-close-calc/dialog-confirm-close-calc.component"; import { DialogConfirmCloseCalcComponent } from "./components/dialog-confirm-close-calc/dialog-confirm-close-calc.component";
...@@ -185,6 +186,7 @@ const appRoutes: Routes = [ ...@@ -185,6 +186,7 @@ const appRoutes: Routes = [
PabResultsComponent, PabResultsComponent,
PabResultsTableComponent, PabResultsTableComponent,
PabTableComponent, PabTableComponent,
PabVariableResultsSelectorComponent,
ParamComputedComponent, ParamComputedComponent,
ParamFieldLineComponent, ParamFieldLineComponent,
ParamLinkComponent, ParamLinkComponent,
......
...@@ -72,7 +72,7 @@ export class VarResultsComponent extends ResultsComponent { ...@@ -72,7 +72,7 @@ export class VarResultsComponent extends ResultsComponent {
} }
this._headers = this._headers.concat(this._varResults.extraResultHeaders); this._headers = this._headers.concat(this._varResults.extraResultHeaders);
// C. pre-extract variable parameters valueslet longest = 0; // C. pre-extract variable parameters values
const varValues = []; const varValues = [];
// find longest list // find longest list
this.size = 0; this.size = 0;
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
<!-- chapitres --> <!-- chapitres -->
<mat-card id="calc-card-field-sets" <mat-card id="calc-card-field-sets"
[class.pab-field-sets]="isPAB"
[fxFlex.gt-xs]="isPAB ? '1 0 auto' : '1 0 400px'" [fxFlex.gt-xs]="isPAB ? '1 0 auto' : '1 0 400px'"
[fxFlex.lt-sm]="isPAB ? '1 0 auto' : '1 0 300px'"> [fxFlex.lt-sm]="isPAB ? '1 0 auto' : '1 0 300px'">
...@@ -63,6 +64,7 @@ ...@@ -63,6 +64,7 @@
<!-- résultats --> <!-- résultats -->
<mat-card id="calc-card-results" <mat-card id="calc-card-results"
[class.pab-results]="isPAB"
[fxFlex.gt-xs]="isPAB ? '1 0 auto' : '1 0 400px'" [fxFlex.gt-xs]="isPAB ? '1 0 auto' : '1 0 400px'"
[fxFlex.lt-sm]="isPAB ? '1 0 auto' : '1 0 300px'"> [fxFlex.lt-sm]="isPAB ? '1 0 auto' : '1 0 300px'">
......
...@@ -38,6 +38,10 @@ mat-card { ...@@ -38,6 +38,10 @@ mat-card {
margin-left: 1em; margin-left: 1em;
margin-right: 1em; margin-right: 1em;
&.pab-field-sets {
margin-right: -1em;
}
mat-card-actions { mat-card-actions {
text-align: center; text-align: center;
...@@ -51,8 +55,12 @@ mat-card { ...@@ -51,8 +55,12 @@ mat-card {
margin-left: 1em; margin-left: 1em;
margin-right: 1em; margin-right: 1em;
&.pab-results {
margin-right: -1em;
}
mat-card-header { mat-card-header {
margin-bottom: 1em; // margin-bottom: 1em;
#generate-pab { #generate-pab {
height: min-content; height: min-content;
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
} }
.pab-results-table-container { .pab-results-table-container {
margin-top: 2em;
background-color: white; background-color: white;
} }
......
...@@ -46,15 +46,18 @@ export class PabResultsTableComponent extends ResultsComponent { ...@@ -46,15 +46,18 @@ export class PabResultsTableComponent extends ResultsComponent {
) { ) {
const pr = this._pabResults; const pr = this._pabResults;
const nDigits = this.appSetupService.displayDigits; const nDigits = this.appSetupService.displayDigits;
// when a parameter is variating, index of the variating parameter
// values to build the data from
const vi = pr.variableIndex;
// refresh headers here if language changed // refresh headers here if language changed
this._headers = pr.headers; this._headers = pr.headers;
// line 1 // line 1
if (pr.cloisonsResults[0].vCalc) { // parfois le calcul des cloisons échoue if (pr.cloisonsResults[0].resultElements[vi].vCalc) { // parfois le calcul des cloisons échoue
this._dataSet.push([ this._dataSet.push([
this.intlService.localizeText("INFO_LIB_AMONT"), this.intlService.localizeText("INFO_LIB_AMONT"),
pr.cloisonsResults[0] ? pr.cloisonsResults[0].vCalc.toFixed(nDigits) : "", pr.cloisonsResults[0].resultElements[vi] ? pr.cloisonsResults[0].resultElements[vi].vCalc.toFixed(nDigits) : "",
"", "", "", "", "", "", "" "", "", "", "", "", "", ""
]); ]);
} }
...@@ -62,14 +65,14 @@ export class PabResultsTableComponent extends ResultsComponent { ...@@ -62,14 +65,14 @@ export class PabResultsTableComponent extends ResultsComponent {
// lines 2 - n-1 // lines 2 - n-1
for (let i = 0; i < pr.cloisonsResults.length; i++) { for (let i = 0; i < pr.cloisonsResults.length; i++) {
if ( if (
pr.cloisonsResults[i].vCalc pr.cloisonsResults[i].resultElements[vi].vCalc
) { ) {
const r2n = pr.cloisonsResults[i].resultElement.extraResults; const r2n = pr.cloisonsResults[i].resultElements[vi].extraResults;
let Z1: number; let Z1: number;
if (i < pr.cloisonsResults.length - 1) { if (i < pr.cloisonsResults.length - 1) {
Z1 = pr.cloisonsResults[i + 1].vCalc; Z1 = pr.cloisonsResults[i + 1].resultElements[vi].vCalc;
} else { } else {
Z1 = pr.cloisonAvalResults.vCalc; Z1 = pr.cloisonAvalResults.resultElements[vi].vCalc;
} }
this._dataSet.push([ this._dataSet.push([
i + 1, // n° cloison i + 1, // n° cloison
...@@ -86,8 +89,8 @@ export class PabResultsTableComponent extends ResultsComponent { ...@@ -86,8 +89,8 @@ export class PabResultsTableComponent extends ResultsComponent {
} }
// downstream line // downstream line
if (pr.cloisonAvalResults.vCalc) { if (pr.cloisonAvalResults.resultElements[vi].vCalc) {
const rln = pr.cloisonAvalResults.resultElement.extraResults; const rln = pr.cloisonAvalResults.resultElements[vi].extraResults;
this._dataSet.push([ this._dataSet.push([
this.intlService.localizeText("INFO_LIB_AVAL"), this.intlService.localizeText("INFO_LIB_AVAL"),
pr.Z2.toFixed(nDigits), pr.Z2.toFixed(nDigits),
......
...@@ -2,6 +2,9 @@ ...@@ -2,6 +2,9 @@
<!-- journal --> <!-- journal -->
<log></log> <log></log>
<pab-variable-results-selector [results]="pabResults" (indexChange)="variableIndexChanged()">
</pab-variable-results-selector>
<div> <div>
<!-- tableau de résultats --> <!-- tableau de résultats -->
<pab-results-table [results]="pabResults"></pab-results-table> <pab-results-table [results]="pabResults"></pab-results-table>
......
...@@ -8,9 +8,10 @@ import { NgParameter } from "../../formulaire/ngparam"; ...@@ -8,9 +8,10 @@ import { NgParameter } from "../../formulaire/ngparam";
import { ApplicationSetupService } from "../../services/app-setup/app-setup.service"; import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
import { PabResultsTableComponent } from "./pab-results-table.component"; import { PabResultsTableComponent } from "./pab-results-table.component";
import { PabResults } from "../../results/pab-results"; import { PabResults } from "../../results/pab-results";
import { ResultsGraphComponent } from "../results-graph/results-graph.component"; import { PabVariableResultsSelectorComponent } from "./pab-variable-results-selector.component";
import { PlottableData } from "../../results/plottable-data"; import { PlottableData } from "../../results/plottable-data";
import { PlottablePabResults } from "../../results/plottable-pab-results"; import { PlottablePabResults } from "../../results/plottable-pab-results";
import { ResultsGraphComponent } from "../results-graph/results-graph.component";
@Component({ @Component({
selector: "pab-results", selector: "pab-results",
...@@ -33,11 +34,12 @@ export class PabResultsComponent implements DoCheck { ...@@ -33,11 +34,12 @@ export class PabResultsComponent implements DoCheck {
@ViewChild(PabResultsTableComponent) @ViewChild(PabResultsTableComponent)
private pabResultsTableComponent: PabResultsTableComponent; private pabResultsTableComponent: PabResultsTableComponent;
/** composant journal */ @ViewChild(PabVariableResultsSelectorComponent)
private pabVariableResultsSelectorComponent: PabVariableResultsSelectorComponent;
@ViewChild(LogComponent) @ViewChild(LogComponent)
private logComponent: LogComponent; private logComponent: LogComponent;
/** graphique dans le cas d'un paramètre à varier */
@ViewChild(ResultsGraphComponent) @ViewChild(ResultsGraphComponent)
private resultsGraphComponent: ResultsGraphComponent; private resultsGraphComponent: ResultsGraphComponent;
...@@ -55,11 +57,24 @@ export class PabResultsComponent implements DoCheck { ...@@ -55,11 +57,24 @@ export class PabResultsComponent implements DoCheck {
this.updateView(); this.updateView();
} }
/**
* update results table and chart when the variable index changed (event sent by
* PabVariableResultsSelectorComponent); variable index is already set in
* pabResults at this time
*/
public variableIndexChanged() {
console.log("oulala l'index variableu qui change !!");
this.updateView();
}
public updateView() { public updateView() {
this.logComponent.log = undefined; this.logComponent.log = undefined;
if (this.pabResultsTableComponent) { if (this.pabResultsTableComponent) {
this.pabResultsTableComponent.results = undefined; this.pabResultsTableComponent.results = undefined;
} }
if (this.pabVariableResultsSelectorComponent) {
this.pabVariableResultsSelectorComponent.results = undefined;
}
if (this.resultsGraphComponent) { if (this.resultsGraphComponent) {
this.resultsGraphComponent.results = undefined; this.resultsGraphComponent.results = undefined;
} }
...@@ -111,6 +126,7 @@ export class PabResultsComponent implements DoCheck { ...@@ -111,6 +126,7 @@ export class PabResultsComponent implements DoCheck {
pabUpdated = this.pabResultsTableComponent !== undefined; pabUpdated = this.pabResultsTableComponent !== undefined;
if (pabUpdated) { if (pabUpdated) {
this.pabResultsTableComponent.results = this._pabResults; this.pabResultsTableComponent.results = this._pabResults;
this.pabVariableResultsSelectorComponent.results = this._pabResults;
} }
graphUpdated = this.resultsGraphComponent !== undefined; graphUpdated = this.resultsGraphComponent !== undefined;
if (graphUpdated) { if (graphUpdated) {
......
<div class="pab-variable-results-selector" *ngIf="hasVariableResults" fxLayout="row wrap" fxLayoutAlign="center center">
<div fxFlex="1 1 100%">
<mat-form-field>
<mat-select id="pab-variating-element" [placeholder]="label" [(value)]="selectedValue">
<mat-option *ngFor="let e of entries" [value]="e">
{{ entryLabel(e) }}
</mat-option>
</mat-select>
</mat-form-field>
</div>
</div>
:host {
margin-top: 2em;
}
mat-form-field {
width: 100%;
max-width: 400px;
margin-top: 1em;
margin-bottom: -1em;
}
import { Component, Output, EventEmitter } from "@angular/core";
import { PabResults } from "../../results/pab-results";
import { I18nService } from "../../services/internationalisation/internationalisation.service";
import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
@Component({
selector: "pab-variable-results-selector",
templateUrl: "./pab-variable-results-selector.component.html",
styleUrls: [
"./pab-variable-results-selector.component.scss"
]
})
export class PabVariableResultsSelectorComponent {
/** résultats non mis en forme */
private _pabResults: PabResults;
private _selectedValue: number;
/** size of the longest variable value */
private size = 0;
/** inferred extended values list for each variating parameter */
private varValues = [];
@Output()
protected indexChange = new EventEmitter();
constructor(
protected intlService: I18nService,
protected appSetupService: ApplicationSetupService
) {
this._selectedValue = 0;
}
public set results(r: PabResults) {
this._pabResults = r;
if (this._pabResults) {
// pre-extract variable parameters values
this.varValues = [];
const nDigits = this.appSetupService.displayDigits;
// find longest list
this.size = 0;
for (let i = 0; i < this._pabResults.variatedParameters.length; i++) {
const vs = this._pabResults.variatedParameters[i].valuesIterator.count();
if (vs > this.size) {
this.size = vs;
}
}
// get extended values lists for each variable parameter
for (const v of this._pabResults.variatedParameters) {
const vv = [];
const iter = v.getExtendedValuesIterator(this.size);
while (iter.hasNext) {
const nv = iter.next();
vv.push(nv.value.toFixed(nDigits));
}
this.varValues.push(vv);
}
}
}
public get hasVariableResults(): boolean {
return (
this._pabResults
&& this._pabResults.hasResults
&& this._pabResults.variatedParameters.length > 0
);
}
public get entries(): number[] {
let i = 0;
const entries: number[] = this._pabResults.variatedParameters[0].inferredValuesList.map((v) => {
return i++;
});
return entries;
}
protected entryLabel(index: number): string {
let i = 0;
return this.varValues.map((vv) => {
const vp = this._pabResults.variatedParameters[i];
i++;
let value = "0";
value = vv[index];
return `${vp.symbol} = ${value}`;
}).join(", ");
}
public get selectedValue(): number {
return this._selectedValue;
}
public set selectedValue(v: number) {
this._pabResults.variableIndex = v;
this.indexChange.emit();
}
public get label() {
return this.intlService.localizeText("INFO_PARAMFIELD_BOUNDARY_CONDITIONS");
}
}
...@@ -57,7 +57,7 @@ export class ParamValuesComponent implements AfterViewInit, Observer { ...@@ -57,7 +57,7 @@ export class ParamValuesComponent implements AfterViewInit, Observer {
this.editValuesDialog.open( this.editValuesDialog.open(
DialogEditParamValuesComponent, DialogEditParamValuesComponent,
{ {
disableClose: true, disableClose: false,
data: { data: {
param: this.param param: this.param
}, },
......
...@@ -15,18 +15,15 @@ export class FormComputePab extends FormCompute { ...@@ -15,18 +15,15 @@ export class FormComputePab extends FormCompute {
return this._formResult as FormResultPab; return this._formResult as FormResultPab;
} }
private getVariatedParameter(): NgParameter { private getVariatedParameters(): NgParameter[] {
const res = this._formBase.getDisplayedParamFromState(ParamRadioConfig.VAR); const res = this._formBase.getDisplayedParamListFromState(ParamRadioConfig.VAR);
if (res !== undefined) {
return res;
}
const pms = this._formBase.getDisplayedParamListFromState(ParamRadioConfig.LINK); const pms = this._formBase.getDisplayedParamListFromState(ParamRadioConfig.LINK);
for (const p of pms) { for (const p of pms) {
if (p.paramDefinition.hasMultipleValues) { if (p.paramDefinition.hasMultipleValues) {
return p; res.push(p);
} }
} }
return res;
} }
protected compute() { protected compute() {
...@@ -37,7 +34,7 @@ export class FormComputePab extends FormCompute { ...@@ -37,7 +34,7 @@ export class FormComputePab extends FormCompute {
protected reaffectResultComponents() { protected reaffectResultComponents() {
const pab: Pab = (this._formBase.currentNub as Pab); const pab: Pab = (this._formBase.currentNub as Pab);
const computedParam: NgParameter = this.getComputedParameter(); const computedParam: NgParameter = this.getComputedParameter();
const varParam: NgParameter = this.getVariatedParameter(); const varParams: NgParameter[] = this.getVariatedParameters();
// résultat de calcul de la passe à bassins // résultat de calcul de la passe à bassins
const pabr = this.formResult.pabResults; const pabr = this.formResult.pabResults;
...@@ -55,8 +52,8 @@ export class FormComputePab extends FormCompute { ...@@ -55,8 +52,8 @@ export class FormComputePab extends FormCompute {
// cote aval de la passe // cote aval de la passe
pabr.Z2 = pab.prms.Z2.v; pabr.Z2 = pab.prms.Z2.v;
if (varParam) { if (varParams) {
pabr.variatedParameter = varParam; pabr.variatedParameters = varParams;
// pabr.update(false); // pabr.update(false);
} }
} }
......
...@@ -15,8 +15,11 @@ export class PabResults extends CalculatedParamResults { ...@@ -15,8 +15,11 @@ export class PabResults extends CalculatedParamResults {
/** cote aval de l'ensemble de la passe */ /** cote aval de l'ensemble de la passe */
public Z2: number; public Z2: number;
/** paramètre varié */ /** paramètres variés */
public variatedParameter: NgParameter; public variatedParameters: NgParameter[];
/** index de la valeur du paramètre varié à afficher dans les résultats */
public variableIndex = 0;
/** symboles des colonnes de résultat */ /** symboles des colonnes de résultat */
protected _columns: string[]; protected _columns: string[];
......
...@@ -64,6 +64,9 @@ export class PlottablePabResults implements PlottableData { ...@@ -64,6 +64,9 @@ export class PlottablePabResults implements PlottableData {
const pr = this.pabResults; const pr = this.pabResults;
const nDigits = ServiceFactory.instance.applicationSetupService.displayDigits; const nDigits = ServiceFactory.instance.applicationSetupService.displayDigits;
const l = this.pabResults.cloisonsResults.length; const l = this.pabResults.cloisonsResults.length;
// when a parameter is variating, index of the variating parameter
// values to build the data from
const vi = this.pabResults.variableIndex;
if (this.hasError()) { if (this.hasError()) {
return []; return [];
...@@ -82,18 +85,18 @@ export class PlottablePabResults implements PlottableData { ...@@ -82,18 +85,18 @@ export class PlottablePabResults implements PlottableData {
case "Q": case "Q":
data.push(""); data.push("");
for (let i = 0; i < l; i++) { for (let i = 0; i < l; i++) {
const er = pr.cloisonsResults[i].getExtraResult(symbol); const er = pr.cloisonsResults[i].resultElements[vi].getExtraResult(symbol);
data.push((er !== undefined) ? er.toFixed(nDigits) : ""); data.push((er !== undefined) ? er.toFixed(nDigits) : "");
} }
const zrAval = pr.cloisonAvalResults.getExtraResult(symbol); const zrAval = pr.cloisonAvalResults.resultElements[vi].getExtraResult(symbol);
data.push((zrAval !== undefined) ? zrAval.toFixed(nDigits) : ""); data.push((zrAval !== undefined) ? zrAval.toFixed(nDigits) : "");
break; break;
case "Z": case "Z":
for (let i = 0; i < l; i++) { for (let i = 0; i < l; i++) {
data.push(pr.cloisonsResults[i].vCalc.toFixed(nDigits)); data.push(pr.cloisonsResults[i].resultElements[vi].vCalc.toFixed(nDigits));
} }
data.push(pr.cloisonAvalResults.vCalc.toFixed(nDigits)); data.push(pr.cloisonAvalResults.resultElements[vi].vCalc.toFixed(nDigits));
data.push(pr.Z2.toFixed(nDigits)); data.push(pr.Z2.toFixed(nDigits));
break; break;
...@@ -103,7 +106,7 @@ export class PlottablePabResults implements PlottableData { ...@@ -103,7 +106,7 @@ export class PlottablePabResults implements PlottableData {
case "QA": case "QA":
data.push(""); data.push("");
for (let i = 0; i < l; i++) { for (let i = 0; i < l; i++) {
const er = pr.cloisonsResults[i].getExtraResult(symbol); const er = pr.cloisonsResults[i].resultElements[vi].getExtraResult(symbol);
data.push((er !== undefined) ? er.toFixed(nDigits) : ""); data.push((er !== undefined) ? er.toFixed(nDigits) : "");
} }
data.push(""); data.push("");
...@@ -112,10 +115,10 @@ export class PlottablePabResults implements PlottableData { ...@@ -112,10 +115,10 @@ export class PlottablePabResults implements PlottableData {
case "x": // wall abscissa case "x": // wall abscissa
data.push(""); data.push("");
for (let i = 0; i < l; i++) { for (let i = 0; i < l; i++) {
const er = pr.cloisonsResults[i].getExtraResult(symbol); const er = pr.cloisonsResults[i].resultElements[vi].getExtraResult(symbol);
data.push((er !== undefined) ? er.toFixed(nDigits) : ""); data.push((er !== undefined) ? er.toFixed(nDigits) : "");
} }
const erXdw = pr.cloisonAvalResults.getExtraResult(symbol); const erXdw = pr.cloisonAvalResults.resultElements[vi].getExtraResult(symbol);
data.push((erXdw !== undefined) ? erXdw.toFixed(nDigits) : ""); data.push((erXdw !== undefined) ? erXdw.toFixed(nDigits) : "");
break; break;
} }
......
...@@ -3,7 +3,19 @@ import { Injectable } from "@angular/core"; ...@@ -3,7 +3,19 @@ import { Injectable } from "@angular/core";
import { decode } from "he"; import { decode } from "he";
import { saveAs } from "file-saver"; import { saveAs } from "file-saver";
import { CalculatorType, LinkedValue, Observable, ParamDefinition, Session, Nub, ParallelStructure, Pab, Props, Cloisons } from "jalhyd"; import {
CalculatorType,
LinkedValue,
Observable,
ParamDefinition,
Session,
Nub,
ParallelStructure,
Pab,
Props,
Cloisons,
CloisonAval
} from "jalhyd";
import { HttpService } from "../../services/http/http.service"; import { HttpService } from "../../services/http/http.service";
import { I18nService } from "../../services/internationalisation/internationalisation.service"; import { I18nService } from "../../services/internationalisation/internationalisation.service";
......
...@@ -250,6 +250,7 @@ ...@@ -250,6 +250,7 @@
"INFO_PARALLELSTRUCTURE_TITRE_COURT": "// structures", "INFO_PARALLELSTRUCTURE_TITRE_COURT": "// structures",
"INFO_PARALLELSTRUCTURE_TITRE": "Parallel structures", "INFO_PARALLELSTRUCTURE_TITRE": "Parallel structures",
"INFO_PARAMFIELD_AWAITING_CALCULATION": "Awaiting calculation", "INFO_PARAMFIELD_AWAITING_CALCULATION": "Awaiting calculation",
"INFO_PARAMFIELD_BOUNDARY_CONDITIONS": "Boundary conditions",
"INFO_PARAMFIELD_CALCULATED": "Calculated", "INFO_PARAMFIELD_CALCULATED": "Calculated",
"INFO_PARAMFIELD_CALCULATION_FAILED": "Calculation failed", "INFO_PARAMFIELD_CALCULATION_FAILED": "Calculation failed",
"INFO_PARAMFIELD_GRAPH_SELECT_X_AXIS": "Variable for X axis", "INFO_PARAMFIELD_GRAPH_SELECT_X_AXIS": "Variable for X axis",
......
...@@ -250,6 +250,7 @@ ...@@ -250,6 +250,7 @@
"INFO_PARALLELSTRUCTURE_TITRE_COURT": "Ouvrages", "INFO_PARALLELSTRUCTURE_TITRE_COURT": "Ouvrages",
"INFO_PARALLELSTRUCTURE_TITRE": "Lois d'ouvrages", "INFO_PARALLELSTRUCTURE_TITRE": "Lois d'ouvrages",
"INFO_PARAMFIELD_AWAITING_CALCULATION": "En attente de calcul", "INFO_PARAMFIELD_AWAITING_CALCULATION": "En attente de calcul",
"INFO_PARAMFIELD_BOUNDARY_CONDITIONS": "Conditions aux limites",
"INFO_PARAMFIELD_CALCULATED": "Calculé", "INFO_PARAMFIELD_CALCULATED": "Calculé",
"INFO_PARAMFIELD_CALCULATION_FAILED": "Échec du calcul", "INFO_PARAMFIELD_CALCULATION_FAILED": "Échec du calcul",
"INFO_PARAMFIELD_GRAPH_SELECT_X_AXIS": "Variable en abscisse", "INFO_PARAMFIELD_GRAPH_SELECT_X_AXIS": "Variable en abscisse",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment