Skip to content

Commit

Permalink
address comments
Browse files Browse the repository at this point in the history
  • Loading branch information
hl662 committed Dec 16, 2024
1 parent dd35db9 commit 63cd035
Showing 1 changed file with 12 additions and 18 deletions.
30 changes: 12 additions & 18 deletions core/quantity/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,46 +14,40 @@
- [Contributing](#contributing)
- [Licensing](#licensing)

The __@itwin/core-quantity__ package contains classes for quantity formatting and parsing. For detailed API documentation, see our [iTwin.js references documentation](https://www.itwinjs.org/reference/core-quantity/quantity/).
The __@itwin/core-quantity__ package contains classes for quantity formatting and parsing. For detailed API documentation, see our [iTwin.js reference documentation](https://www.itwinjs.org/reference/core-quantity/quantity/).

Also check the [iTwin.js learnings documentation](https://www.itwinjs.org/learning/frontend/quantityformatting/#quantity-package) explaining quantity formatting and it's basic concepts.
Also check the [iTwin.js learning documentation](https://www.itwinjs.org/learning/frontend/quantityformatting/#quantity-package) explaining quantity formatting and its basic concepts.

## Terms and Concepts

### Common Terms

- `Unit`/`UnitProps` - A named unit of measure which can be located by its name or label. The definition of any unit is represented through it's `UnitProps`.
- `UnitsProvider` - An interface that locates the UnitProps for a unit given name or label. This interface also provides methods for `UnitConversion` to allow converting from one unit to another.
- `Unit`/`UnitProps` - A named unit of measure which can be located by its name or label. The definition of any unit is represented through its `UnitProps`.
- `UnitsProvider` - An interface that locates the `UnitProps` for a unit given name or label. This interface also provides methods for `UnitConversion` to allow converting from one unit to another.
- Unit Family/`Phenomenon` - A physical quantity that can be measured (e.g., length, temperature, pressure). Only units in the same phenomenon can be converted between.
- Persistence Unit - The unit used to store the quantity value in memory or to persist the value in an editable IModel.
- Format/FormatProp - The display format for the quantity value. For example, an angle may be persisted in radians but formatted and shown to user in degrees.
- CompositeValue - An addition to the format specification that allows the explicit specification of a unit label, it also allows the persisted value to be displayed as up to 4 sub-units. Typical multi-unit composites are used to display `feet'-inches"` and `degree°minutes'seconds"`.
- `FormatterSpec` - Holds the format specification as well as the `UnitConversion` between the persistence unit and all units defined in the format. This is done to avoid any async calls by the UnitsProvider during the formatting process.
- `ParserSpec` - Holds the format specification as well as the `UnitConversion` between the persistence unit and all other units in the same phenomenon. This is done to avoid async calls by the UnitsProvider and also done to allow a user to enter `43in` even when in "metric" unit system and have the string properly converted to meters.
- `Formatter` - A class that holds methods to format a quantity value into a text string. Given a FormatterSpec object - containing one or many Unit definitions each with their own Unit Conversion info and a Format passed in - and a single `magnitude` number, the Formatter can convert that number into a text string, adhering to the properties passed to the formatTraits of a Format.
- `Parser` - A class that holds methods to parse a text string into a single number. Given a ParserSpec object containing a Format's Units and their Unit Conversions, as well as an input string, the Parser can either return an object `QuantityParseResult` that contains the magnitude of type `number`, or an object `ParseQuantityError`.


- `FormatterSpec` - Holds the format specification as well as the `UnitConversion` between the persistence unit and all units defined in the format. This is done to avoid any async calls by the `UnitsProvider` during the formatting process.
- `ParserSpec` - Holds the format specification as well as the `UnitConversion` between the persistence unit and all other units in the same phenomenon. This is done to avoid async calls by the `UnitsProvider` and to allow users to input quantities in different unit systems than specified. For instance, if a metric unit system is set, a user could enter `43in` and have the result properly converted to meters.
- `Formatter` - A class that holds methods to format a quantity value into a text string. Given a `FormatterSpec` object— which includes one or more unit definitions, each with their own conversion information and a specified format — and a single magnitude number, the `Formatter` can convert this number into a text string, adhering to the properties specified in the `formatTraits`.
- `Parser` - A class that holds methods to parse a text string into a single number. Given a `ParserSpec` object containing a Format's Units and their Unit Conversions, as well as an input string, the Parser can either return an object `QuantityParseResult` that contains the magnitude of type `number`, or an object `ParseQuantityError`.

### Concepts

#### Units Provider

To appropriately parse and output formatted values, A units provider is used to define all available units and provides conversion factors between units. There are a couple implementations of the UnitsProvider across iTwin.js:
To appropriately parse and output formatted values, a units provider is used to define all available units and provides conversion factors between units. There are several implementations of the UnitsProvider across iTwin.js:

The `BasicUnitsProvider` holds many common units and their conversions between each other.

The `SchemaUnitProvider` is another example, used to load unit definitions of schemas from an iModel. This holds more extensive units through the Units schema, while also allowing users to define their own units.
The `SchemaUnitProvider` is used to load unit definitions of schemas from an iModel. This holds more extensive units through the Units schema, while also allowing users to define their own units.

The `AlternateUnitLabelsProvider` interface allows users to specify a set of alternate labels which may be encountered during parsing of strings. By default only the input unit label and the labels of other units in the same Unit Family/Phenomenon, as well as the label of units in a Composite format are used.

#### Unit Conversion

Unit conversion is performed through `UnitConversionSpec`. These objects are generated by a UnitsProvider, with the implementation determined by each specific provider. During initialization, a ParserSpec/FormatterSpec can ask for UnitConversionSpec objects provided via the UnitsProvider. During parsing and formatting, the specification will retrieve the UnitConversionSpec between the source and destination units to apply the unit conversion.

<!-- #### How a value is formatted
#### How a string is parsed into a value -->
Unit conversion is performed through a `UnitConversionSpec`. These objects are generated by a `UnitsProvider`, with the implementation determined by each specific provider. During initialization, a `ParserSpec` or `FormatterSpec` can ask for `UnitConversionSpec` objects provided via the `UnitsProvider`. During parsing and formatting, the specification will retrieve the `UnitConversionSpec` between the source and destination units to apply the unit conversion.

### Examples of Usage

Expand Down Expand Up @@ -190,7 +184,7 @@ For the composite format below, we provide a unit in meters and produce a format

#### Mathematical Operation Parsing

The quantity formatter supports parsing mathematical operations. The operation is solved, formatting every values present, according to the specified format. This makes it possible to process several different units at once.
The quantity formatter supports parsing mathematical operations. The operation is solved, formatting each value present, according to the specified format. This makes it possible to process several different units at once.

<details>
<summary>Example Code</summary>
Expand Down

0 comments on commit 63cd035

Please sign in to comment.