MeshLib C++ Docs
Loading...
Searching...
No Matches
MRUnits.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRViewer/exports.h"
5#include "MRMesh/MRUnitInfo.h"
6
7#include <string>
8#include <variant>
9
11
12namespace MR
13{
16
17
18namespace detail::Units
19{
20 struct Empty {};
21}
22
23template <UnitEnum E>
25
28template <UnitEnum E>
30
31#define MR_X(E) extern template MRVIEWER_API const UnitToStringParams<E>& getDefaultUnitParams();
33#undef MR_X
34
36template <UnitEnum E>
38
39#define MR_X(E) extern template MRVIEWER_API void setDefaultUnitParams( const UnitToStringParams<E>& newParams );
41#undef MR_X
42
50
52enum class DegreesMode
53{
54 degrees,
57 _count [[maybe_unused]],
58};
59[[nodiscard]] MRVIEWER_API std::string_view toString( DegreesMode mode );
60
61enum class ZeroMode
62{
63 asIs,
66};
67
69template <UnitEnum E>
71{
74 std::string_view decorationFormatString = "{}";
75
77
81 std::optional<E> targetUnit = getDefaultUnitParams<E>().targetUnit;
82
85
87
90
93
95
98
101
103 bool unicodeMinusSign = getDefaultUnitParams<E>().unicodeMinusSign;
104
106 char thousandsSeparator = getDefaultUnitParams<E>().thousandsSeparator;
108 char thousandsSeparatorFrac = getDefaultUnitParams<E>().thousandsSeparatorFrac;
109
112
114 bool stripTrailingZeroes = getDefaultUnitParams<E>().stripTrailingZeroes;
115
117 std::conditional_t<std::is_same_v<E, AngleUnit>, DegreesMode, detail::Units::Empty> degreesMode = getDefaultUnitParams<E>().degreesMode;
118
120
121 friend bool operator==( const UnitToStringParams&, const UnitToStringParams& ) = default;
122};
123
125using VarUnitToStringParams = std::variant<
126 #define MR_X(E) , UnitToStringParams<E>
128 #undef MR_X
129>;
130
133template <UnitEnum E, detail::Units::Scalar T>
134[[nodiscard]] MRVIEWER_API std::string valueToString( T value, const UnitToStringParams<E>& params = getDefaultUnitParams<E>() );
135
136#define MR_Y(T, E) extern template MRVIEWER_API std::string valueToString<E, T>( T value, const UnitToStringParams<E>& params );
137#define MR_X(E) DETAIL_MR_UNIT_VALUE_TYPES(MR_Y, E)
139#undef MR_X
140#undef MR_Y
141
143template <detail::Units::Scalar T>
144[[nodiscard]] MRVIEWER_API std::string valueToString( T value, const VarUnitToStringParams& params );
145
146#define MR_X(T, unused) extern template MRVIEWER_API std::string valueToString( T value, const VarUnitToStringParams& params );
148#undef MR_X
149
152template <detail::Units::Scalar T>
153[[nodiscard]] MRVIEWER_API int guessPrecision( T value );
154
158template <detail::Units::Scalar T>
159[[nodiscard]] MRVIEWER_API int guessPrecision( T min, T max );
160
162template <typename T>
164[[nodiscard]] int guessPrecision( T value )
165{
166 int ret = 0;
167 for ( int i = 0; i < VectorTraits<T>::size; i++ )
168 ret = std::max( ret, guessPrecision( VectorTraits<T>::getElem( i, value ) ) );
169 return ret;
170}
171template <typename T>
172requires (VectorTraits<T>::size > 1 && detail::Units::Scalar<typename VectorTraits<T>::BaseType>)
173[[nodiscard]] int guessPrecision( T min, T max )
174{
175 int ret = 0;
176 for ( int i = 0; i < VectorTraits<T>::size; i++ )
177 ret = std::max( ret, guessPrecision( VectorTraits<T>::getElem( i, min ), VectorTraits<T>::getElem( i, max ) ) );
178 return ret;
179}
180
181#define MR_X(T, unused) \
182 extern template MRVIEWER_API int guessPrecision( T value ); \
183 extern template MRVIEWER_API int guessPrecision( T min, T max );
185#undef MR_X
186
190template <UnitEnum E, detail::Units::Scalar T>
191[[nodiscard]] MRVIEWER_API std::string valueToImGuiFormatString( T value, const UnitToStringParams<E>& params = getDefaultUnitParams<E>() );
192
193#define MR_Y(T, E) extern template MRVIEWER_API std::string valueToImGuiFormatString( T value, const UnitToStringParams<E>& params );
194#define MR_X(E) DETAIL_MR_UNIT_VALUE_TYPES(MR_Y, E)
196#undef MR_X
197#undef MR_Y
198
200template <detail::Units::Scalar T>
201[[nodiscard]] MRVIEWER_API std::string valueToImGuiFormatString( T value, const VarUnitToStringParams& params );
202
203#define MR_X(T, unused) extern template MRVIEWER_API std::string valueToImGuiFormatString( T value, const VarUnitToStringParams& params );
205#undef MR_X
206
207}
#define MR_TRIM_LEADING_COMMA(...)
MR_TRIM_LEADING_COMMA(,a,b,c) returns a,b,c.
Definition MRMacros.h:103
Definition MRUnitInfo.h:173
bool leadingZero
If false, remove zero before the fractional point (.5 instead of 0.5).
Definition MRUnits.h:111
NumberStyle
Definition MRUnits.h:44
#define MR_X(E)
ignore for bindings to prevent GCC14 error: undefined symbol: ZN2MR11getUnitInfoITkNS_8UnitEnumENS_8T...
Definition MRUnitInfo.h:153
int precision
How many digits of precision.
Definition MRUnits.h:92
std::conditional_t< std::is_same_v< E, AngleUnit >, DegreesMode, detail::Units::Empty > degreesMode
When printing degrees, this lets you display arcminutes and possibly arcseconds. Ignored for everythi...
Definition MRUnits.h:117
#define DETAIL_MR_UNIT_VALUE_TYPES(X,...)
Definition MRUnitInfo.h:117
MRVIEWER_API int guessPrecision(T value)
Same but for vectors.
Definition MRUnits.h:164
NumberStyle style
— Precision:
Definition MRUnits.h:89
std::optional< E > sourceUnit
— Units:
Definition MRUnits.h:79
MRVIEWER_API std::string valueToString(T value, const UnitToStringParams< E > &params=getDefaultUnitParams< E >())
#define DETAIL_MR_UNIT_ENUMS(X)
A list of all unit enums, for internal use.
Definition MRUnitInfo.h:113
static constexpr int size
Definition MRMesh/MRVectorTraits.h:22
ZeroMode zeroMode
How to deal with zeroes.
Definition MRUnits.h:100
std::string_view decorationFormatString
Definition MRUnits.h:74
const UnitToStringParams< E > & getDefaultUnitParams()
void setDefaultUnitParams(const UnitToStringParams< E > &newParams)
Modifies the default parameters for converting a specific unit type to a string.
static constexpr auto && getElem(int i, U &&value)
Definition MRMesh/MRVectorTraits.h:32
MRVIEWER_API std::string valueToImGuiFormatString(T value, const UnitToStringParams< E > &params=getDefaultUnitParams< E >())
char thousandsSeparator
If non-zero, this character is inserted between every three digits to the left of the decimal point.
Definition MRUnits.h:106
bool unitSuffix
Whether to show the unit suffix.
Definition MRUnits.h:84
ZeroMode
Definition MRUnits.h:62
DegreesMode
This controls how the degrees are printed.
Definition MRUnits.h:53
char thousandsSeparatorFrac
If non-zero, this character is inserted between every three digits to the right of the decimal point.
Definition MRUnits.h:108
std::optional< E > targetUnit
The measurement unit of the resulting string. If null, no conversion is performed,...
Definition MRUnits.h:81
friend bool operator==(const UnitToStringParams &, const UnitToStringParams &)=default
If you add new fields there, update the initializer for defaultUnitToStringParams in MRUnits....
MRMESH_API std::string_view toString(DimensionsVisualizePropertyType value)
bool stripTrailingZeroes
Remove trailing zeroes after the fractional point. If the point becomes the last symbol,...
Definition MRUnits.h:114
bool plusSign
— Other:
Definition MRUnits.h:97
bool unicodeMinusSign
Use a pretty Unicode minus sign instead of the ASCII -.
Definition MRUnits.h:103
std::variant< > VarUnitToStringParams
The std::variant of UnitToStringParams<E> for all known Es (unit kinds).
Definition MRUnits.h:125
@ distributePrecision
Like f.
@ exponential
Like f, but the precision digits are spread across both decimal and integral parts.
@ maybeExponential
Like e.
@ alwaysPositive
Print as is.
@ alwaysNegative
Treat negative zero as positive zero.
@ degreesMinutes
Fractional degrees.
@ degreesMinutesSeconds
Integral degrees, fractional arcminutes.
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Controls how a value with a unit is converted to a string.
Definition MRUnits.h:71
Common traits for (mathematical) vectors.
Definition MRMesh/MRVectorTraits.h:18
Definition MRUnits.h:20