NDEVR
API Documentation
Unit.h
1#pragma once
2#include "DLLInfo.h"
3#include <NDEVR/TranslatedString.h>
4#include <NDEVR/StringStream.h>
5#include <NDEVR/StringView.h>
6#include <NDEVR/Angle.h>
7namespace NDEVR
8{
32
38 struct NDEVR_BASE_API Unit
39 {
40 const String name;
44
51
55 virtual ~Unit() = default;
56
63 [[nodiscard]] virtual fltp08 convertToUnit(const fltp08& program_space, const uint01 direction = X) const = 0;
64
71 [[nodiscard]] virtual fltp08 convertFromUnit(const fltp08& unit_space, const uint01 direction = X) const = 0;
72
78 [[nodiscard]] virtual Vertex<3, fltp08> convertToUnit(const Vertex<3, fltp08>& program_space) const = 0;
79
85 [[nodiscard]] virtual Vertex<3, fltp08> convertFromUnit(const Vertex<3, fltp08>& unit_space) const = 0;
86
92 [[nodiscard]] virtual Ray<3, fltp08> convertToUnit(const Ray<3, fltp08>& program_space) const = 0;
93
99 [[nodiscard]] virtual Ray<3, fltp08> convertFromUnit(const Ray<3, fltp08>& unit_space) const = 0;
100
106 [[nodiscard]] virtual const TranslatedString& abbreviation(uint01 direction = X) const = 0;
107
119 template<class t_angle_type>
120 [[nodiscard]] String convertToString(const Angle<t_angle_type>& program_space, bool add_comma, uint04 min_decimals, uint04 max_decimals, uint04 min_digits, bool include_abv = true, uint01 direction = X) const
121 {
122 return convertToString(program_space.template internal<false>(), add_comma, min_decimals, max_decimals, min_digits, include_abv, direction);
123 }
124
131 template<class t_angle_type>
132 [[nodiscard]] fltp08 convertToUnit(const Angle<t_angle_type>& program_space, uint01 direction = X) const
133 {
134 return convertToUnit(program_space.template internal<false>(), direction);
135 }
136
143 template<class t_angle_type>
144 [[nodiscard]] Angle<t_angle_type> convertAngleFromUnit(const fltp08& unit_space, uint01 direction = X) const
145 {
146 return Angle<t_angle_type>(INTERNAL_ANGLE, convertFromUnit(unit_space, direction));
147 }
148
160 [[nodiscard]] virtual String convertToString(const fltp08& program_space, bool add_comma, uint04 min_decimals, uint04 max_decimals, uint04 min_digits, bool include_abv = true, uint01 direction = X) const
161 {
162 return toString(convertToUnit(program_space, direction), add_comma, min_decimals, max_decimals, min_digits, include_abv, direction);
163 }
164
176 [[nodiscard]] String toString(const fltp08& unit_space, bool add_comma, uint04 min_decimals, uint04 max_decimals, uint04 min_digits, bool include_abv = true, uint01 direction = X) const
177 {
178 String s;
179 toString(s, unit_space, add_comma, min_decimals, max_decimals, min_digits, include_abv, direction);
180 return s;
181 }
182
194 virtual void toString(String& string, const fltp08& unit_space, bool add_comma, uint04 min_decimals, uint04 max_decimals, uint04 min_digits, bool include_abv = true, uint01 direction = X) const
195 {
196 string.append(unit_space);
197 if (add_comma || min_decimals > 0 || max_decimals <= string.size() || min_digits > 0)
198 string = string.formatNumberString(add_comma, min_decimals, max_decimals, min_digits);
199 if (include_abv)
200 string += abbreviation(direction).translation();
201 }
202
209 [[nodiscard]] virtual fltp08 convertFromString(const StringView& unit_string, uint01 direction = X) const
210 {
211 return convertFromUnit(fromString(unit_string, direction), direction);
212 }
213
220 [[nodiscard]] virtual fltp08 fromString(const StringView& unit_string, uint01 direction = X) const
221 {
222 UNUSED(direction);
223 return unit_string.getAs<fltp08>();
224 }
225
230 [[nodiscard]] TranslatedString translatedName() const;
231
237 [[nodiscard]] virtual TranslatedString translatedAxisName(uint04 index) const;
238
245 [[nodiscard]] virtual StringView getNextPreferredSeparator(const StringView& current_string, uint01 direction = X) const;
246
252 virtual void toFormula(StringAllocatingView& unit_string, uint01 direction = X) const;
253
260 [[nodiscard]] virtual fltp08 epsilon(fltp08 value, uint01 direction = X) const;
261
262
268 [[nodiscard]] virtual const Unit* subUnit(uint01 direction) const = 0;
269
274 [[nodiscard]] virtual Matrix<fltp08> matrix() const = 0;
275
281 bool operator==(const Unit& other) const
282 {
283 return other.matrix() == matrix() && other.name == name;
284 }
285
290 [[nodiscard]] virtual Unit* clone() const;
291
298 [[nodiscard]] virtual Unit* clone(const StringView& new_name, const TranslatedString& new_display_name) const = 0;
299 protected:
306 };
307 template class NDEVR_BASE_API StringStream<UnitCategory>;
308
309
310}
Stores an angle in an optimized internal format with support for efficient trigonometric operations.
Definition Angle.h:83
The equivelent of std::vector but with a bit more control.
Definition Buffer.hpp:58
Templated logic for doing matrix multiplication.
Definition Matrix.hpp:182
This class is like a string view, but may optionally store the data internally Useful if the return t...
Definition String.h:1278
Logic for reading or writing to a string or a user friendly, TranslatedString.
The core String View class for the NDEVR API.
Definition StringView.h:58
t_type getAs() const
Converts a string into an object.
Definition StringView.h:125
The core String class for the NDEVR API.
Definition String.h:95
Any text displayed to the user should be defined as a TranslatedString which allows the program to lo...
A point in N-dimensional space, used primarily for spatial location information.
Definition Vertex.hpp:44
The primary namespace for the NDEVR SDK.
UnitCategory
A category of unit describing what it relates to.
Definition Unit.h:15
@ e_rotational_speed
Rotational speed measurement (e.g., RPM, radians per second).
Definition Unit.h:26
@ e_time
Time measurement (e.g., seconds, hours).
Definition Unit.h:27
@ e_coordinate
Coordinate system values (e.g., Cartesian positions).
Definition Unit.h:20
@ e_orientation
Orientation measurement (e.g., azimuth, bearing).
Definition Unit.h:18
@ e_distance
Linear distance measurement (e.g., meters, feet).
Definition Unit.h:19
@ e_lat_lon
Latitude and longitude geographic coordinates.
Definition Unit.h:30
@ e_acceleration
Acceleration measurement (e.g., meters per second squared).
Definition Unit.h:25
@ e_weight
Weight or mass measurement (e.g., kilograms, pounds).
Definition Unit.h:23
@ e_angle
Angular measurement (e.g., degrees, radians).
Definition Unit.h:17
@ e_surface_area
Surface area measurement (e.g., square meters, acres).
Definition Unit.h:21
@ e_volume
Volume measurement (e.g., cubic meters, liters).
Definition Unit.h:22
@ e_speed
Speed measurement (e.g., meters per second, mph).
Definition Unit.h:24
@ e_force
Force measurement (e.g., newtons, pound-force).
Definition Unit.h:28
@ e_ratio
Dimensionless ratio (e.g., percentage, fraction).
Definition Unit.h:29
@ e_undefined_unit
No specific unit category assigned.
Definition Unit.h:16
uint32_t uint04
-Defines an alias representing a 4 byte, unsigned integer -Can represent exact integer values 0 throu...
double fltp08
Defines an alias representing an 8 byte floating-point number.
@ INTERNAL_ANGLE
The angle internally used by the angle class.
Definition Angle.h:59
uint8_t uint01
-Defines an alias representing a 1 byte, unsigned integer -Can represent exact integer values 0 throu...
virtual fltp08 convertFromString(const StringView &unit_string, uint01 direction=X) const
Parses a string in this unit's format and converts the result to internal program space.
Definition Unit.h:209
virtual Vertex< 3, fltp08 > convertToUnit(const Vertex< 3, fltp08 > &program_space) const =0
Converts a 3D vertex from internal program space to this unit's representation.
virtual fltp08 fromString(const StringView &unit_string, uint01 direction=X) const
Parses a string into a scalar value in this unit's space without converting to program space.
Definition Unit.h:220
virtual Matrix< fltp08 > matrix() const =0
Returns the transformation matrix representing this unit's conversion.
virtual Unit * clone() const
Creates a deep copy of this unit.
Angle< t_angle_type > convertAngleFromUnit(const fltp08 &unit_space, uint01 direction=X) const
Converts a scalar value in this unit's space back to an Angle in program space.
Definition Unit.h:144
virtual StringView getNextPreferredSeparator(const StringView &current_string, uint01 direction=X) const
Returns the next preferred separator character sequence based on the current input string.
String convertToString(const Angle< t_angle_type > &program_space, bool add_comma, uint04 min_decimals, uint04 max_decimals, uint04 min_digits, bool include_abv=true, uint01 direction=X) const
Converts an angle value from program space to a formatted string in this unit.
Definition Unit.h:120
virtual fltp08 epsilon(fltp08 value, uint01 direction=X) const
Returns a small epsilon value appropriate for comparisons in this unit at the given magnitude.
virtual fltp08 convertFromUnit(const fltp08 &unit_space, const uint01 direction=X) const =0
Converts a value from this unit's representation back to internal program space.
virtual String convertToString(const fltp08 &program_space, bool add_comma, uint04 min_decimals, uint04 max_decimals, uint04 min_digits, bool include_abv=true, uint01 direction=X) const
Converts a scalar value from program space to a formatted string in this unit.
Definition Unit.h:160
TranslatedString translatedName() const
Returns the translated display name of this unit.
virtual void toString(String &string, const fltp08 &unit_space, bool add_comma, uint04 min_decimals, uint04 max_decimals, uint04 min_digits, bool include_abv=true, uint01 direction=X) const
Appends a formatted unit value to an existing string.
Definition Unit.h:194
virtual Ray< 3, fltp08 > convertFromUnit(const Ray< 3, fltp08 > &unit_space) const =0
Converts a 3D ray from this unit's representation back to internal program space.
fltp08 convertToUnit(const Angle< t_angle_type > &program_space, uint01 direction=X) const
Converts an angle value from program space to this unit's scalar representation.
Definition Unit.h:132
virtual Unit * clone(const StringView &new_name, const TranslatedString &new_display_name) const =0
Creates a deep copy of this unit with a new name and display name.
virtual ~Unit()=default
Virtual destructor.
Unit(StringView name, TranslatedString translated_id)
Constructs a Unit with the given internal name and translated display name.
virtual const TranslatedString & abbreviation(uint01 direction=X) const =0
Returns the abbreviated name for this unit along the given axis direction.
String toString(const fltp08 &unit_space, bool add_comma, uint04 min_decimals, uint04 max_decimals, uint04 min_digits, bool include_abv=true, uint01 direction=X) const
Formats a value already in this unit's space into a display string.
Definition Unit.h:176
virtual Ray< 3, fltp08 > convertToUnit(const Ray< 3, fltp08 > &program_space) const =0
Converts a 3D ray from internal program space to this unit's representation.
virtual const Unit * subUnit(uint01 direction) const =0
Returns the sub-unit for a specific axis direction, if this unit is compound.
static Buffer< StringView > OperatorSplit(const StringView &string)
Splits a string by operator characters for formula parsing.
virtual void toFormula(StringAllocatingView &unit_string, uint01 direction=X) const
Writes the unit conversion as a formula into the given string.
virtual fltp08 convertToUnit(const fltp08 &program_space, const uint01 direction=X) const =0
Converts a value from internal program space to this unit's representation.
TranslatedString axis_name_ids[4]
Translated axis names for up to four axes.
Definition Unit.h:42
const String name
Internal identifier name for this unit.
Definition Unit.h:40
TranslatedString axis_abbreviations[4]
Translated axis abbreviations for up to four axes.
Definition Unit.h:43
virtual TranslatedString translatedAxisName(uint04 index) const
Returns the translated axis name for a given axis index.
virtual Vertex< 3, fltp08 > convertFromUnit(const Vertex< 3, fltp08 > &unit_space) const =0
Converts a 3D vertex from this unit's representation back to internal program space.
bool operator==(const Unit &other) const
Checks equality between two units by comparing their matrices and names.
Definition Unit.h:281
const TranslatedString translated_id
Translated display name for this unit.
Definition Unit.h:41