@@ -19,7 +19,7 @@ JaLHyd offers **calculation modules** also called **Nub**s, that are each respon
...
@@ -19,7 +19,7 @@ JaLHyd offers **calculation modules** also called **Nub**s, that are each respon
#### calculator type
#### calculator type
Each Nub must have a **calculator type**, that is an item of the `CalculatorType` enum. It is stored in `this._calcType` and must be defined in the Nub's constructor.
Each Nub must have a **calculator type**, that is an item of the `CalculatorType` enum. It is stored in the `calcType`property and must be defined in the properties passed to the Nub `setProperties` method.
#### calculated parameter
#### calculated parameter
...
@@ -51,7 +51,7 @@ To be calculated, a Nub might require the results of one or more other Nubs. See
...
@@ -51,7 +51,7 @@ To be calculated, a Nub might require the results of one or more other Nubs. See
Parameters are objects that represent the input/outputs of a Nub's equation. All the parameters of a given Nub must be grouped in an object derived from `ParamsEquation`, (ex: `CloisonsParams` for Nub `Cloisons`). Only one parameter at a time may be the **calculated parameter** of its Nub; its value is computed based on the fixed values of other parameters.
Parameters are objects that represent the input/outputs of a Nub's equation. All the parameters of a given Nub must be grouped in an object derived from `ParamsEquation`, (ex: `CloisonsParams` for Nub `Cloisons`). Only one parameter at a time may be the **calculated parameter** of its Nub; its value is computed based on the fixed values of other parameters.
A parameter is characterized by a **symbol** (ex: "Q"), a **definition domain** (from the `ParamDomainValue` enum, or a free interval), a **unit** (for display purposes only, ex: "m³/s"), an **initial value**, a **family** (see "Links" below), and a **visibility** (for display purposes only).
A parameter is characterized by a **symbol** (ex: "Q"), a **definition domain** (from the `ParamDomainValue` enum, or a free interval), a **unit** (for display purposes only, ex: "m³/s"), an **initial value**, a **family** (see "Links" below), its **calculability**, a **mode**and a **visibility** (for display purposes only).
#### calculability
#### calculability
...
@@ -103,7 +103,7 @@ Parameters are grouped into **families**, indicating that they may be linked to
...
@@ -103,7 +103,7 @@ Parameters are grouped into **families**, indicating that they may be linked to
A **property** is an attribute of a Nub that is not numerical and/or accepts only values from a limited set. It is thus distinct from a **parameter**. Usually they are bound to enums, through `Session.enumFromProperty`. Example: "trigoOperation" in `Trigo` that only accepts items from `TrigoOperation` enum.
A **property** is an attribute of a Nub that is not numerical and/or accepts only values from a limited set. It is thus distinct from a **parameter**. Usually they are bound to enums, through `Session.enumFromProperty`. Example: "trigoOperation" in `Trigo` that only accepts items from `TrigoOperation` enum.
Properties are stored in `this.properties`. Not all Nubs have properties. Those who do should set a default value for each property in their constructor, through a call to `this.properties.setPropValue()`.
Properties are stored in `this._props_` and accessed by client code through `getPropValue`/`setPropValue` methods. Not all Nubs have properties. Those who do should set a default value for each property in their constructor, through a call to `this.setPropValue()`.
Properties are **observable** objects: subscribing to a Nub's properties through `addObserver()` method guarantees to be informed of a property value change through the `update()` method of the `Observer` interface.
Properties are **observable** objects: subscribing to a Nub's properties through `addObserver()` method guarantees to be informed of a property value change through the `update()` method of the `Observer` interface.
...
@@ -119,9 +119,9 @@ Otherwise, when no parameter is varying there is exactly one result element, and
...
@@ -119,9 +119,9 @@ Otherwise, when no parameter is varying there is exactly one result element, and
#### result elements
#### result elements
A `ResultElement` is an object that contains a main calculated value `.vCalc`, optional additional calculated values stored as key-value pairs in `.values` (often referred to as "extra results"), and a calculation log concerning this calculation step only.
A `ResultElement` is an object that contains a main calculated value `vCalc`, optional additional calculated values stored as key-value pairs in `values` (often referred to as "extra results"), and a calculation log concerning this calculation step only.
A result element is `.ok` if it has a value and no error-level message.
The result element state (returned by`ok`getter) is true if it has a value and no error-level message.
#### families
#### families
...
@@ -129,13 +129,13 @@ Results families allow results to be linked to parameters of the same **family**
...
@@ -129,13 +129,13 @@ Results families allow results to be linked to parameters of the same **family**
### Log
### Log
A **log** is a collection of `Messages` objects used to inform about events during the calculation process.
A **log** is a collection of `Message` objects used to inform about events during the calculation process.
Every result element has a log, and the `Result` object has an additional `.globalLog`.
Every result element has a log, and the `Result` object has an additional `globalLog`.
#### messages
#### messages
A **message** is an object containing a `MessageCode` that describes the issue, along with optional key-value pairs stored in `.extraVars`. The message severity `INFO`, `WARNING` or `ERROR` is inferred from the message code string prefix.
A **message** is an object containing a `MessageCode` that describes the issue, along with optional key-value pairs stored in `extraVars`. The message severity `INFO`, `WARNING` or `ERROR` is inferred from the message code string prefix.
### Links
### Links
...
@@ -215,7 +215,7 @@ Note the **mandatory** call to `this.addParamDefinition()` and getter method for
...
@@ -215,7 +215,7 @@ Note the **mandatory** call to `this.addParamDefinition()` and getter method for
#### Nub class
#### Nub class
In `addition.ts`, create and export a new class named `Addition`:
In `addition.ts`, create and export a new class named `Addition` that extends Nub class:
```typescript
```typescript
import{CalculatorType}from"../compute-node";
import{CalculatorType}from"../compute-node";
import{Nub}from"../nub";
import{Nub}from"../nub";
...
@@ -361,6 +361,8 @@ export * from "./addition";
...
@@ -361,6 +361,8 @@ export * from "./addition";
export*from"./addition_params";
export*from"./addition_params";
```
```
Also add exports in `internal_modules.ts` for the new classes, as index.ts should not be used in JalHyd to avoid the "TypeError: Class extends value undefined is not a constructor or null" error (internal module pattern).
## Further considerations for adding more complex modules
## Further considerations for adding more complex modules
### properties
### properties
...
@@ -371,7 +373,7 @@ If the module uses **properties**, one should add a default value in the Nub's c
...
@@ -371,7 +373,7 @@ If the module uses **properties**, one should add a default value in the Nub's c
@@ -387,12 +389,12 @@ public update(sender: any, data: any) {
...
@@ -387,12 +389,12 @@ public update(sender: any, data: any) {
}
}
```
```
Update property-enum associations list in `src/app/formulaire/elements/select-field.ts` (example for operation property in Trigo module)
Update property-enum associations list in `src/props.ts` (example for operation property in Trigo module)
```typescript
```typescript
publicstaticenumFromProperty={
publicstaticenumFromProperty={
…
…
"trigoOperation":TrigoOperation
trigoOperation:TrigoOperation
};
};
```
```
...
@@ -415,12 +417,12 @@ function setRandomTrigoOperation(sn: Trigo) {
...
@@ -415,12 +417,12 @@ function setRandomTrigoOperation(sn: Trigo) {
### Nubs with children
### Nubs with children
If a module has children, the `childrenType` attribute should be set in the Nub's constructor. This attribute is used for translation in GUIs, notably ngHyd. Example from `MacroRugoCompound`:
If a module has children, the `intlType` attribute should be set in the Nub's constructor. This attribute is used for translation in GUIs, notably ngHyd. Example from `MacroRugoCompound`:
When implementing parent's `Equation()` method, children should be calculated using `Calc()` and not `Equation()` or `Solve()`, so that their logs and results are properly attached to them.
When implementing parent's `Equation()` method, children should be calculated using `Calc()` and not `Equation()` or `Solve()`, so that their logs and results are properly attached to them.