KiCad PCB EDA Suite
Loading...
Searching...
No Matches
units_provider.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#ifndef UNITS_PROVIDER_H
25#define UNITS_PROVIDER_H
26
27#include <eda_units.h>
28#include <origin_transforms.h>
29#include <core/minoptmax.h>
30#include <optional>
31#include <utility>
32
33
35{
36public:
37 UNITS_PROVIDER( const EDA_IU_SCALE& aIuScale, EDA_UNITS aUnits ) :
38 m_iuScale( aIuScale ),
39 m_userUnits( aUnits )
40 {}
41
43 {}
44
46 void SetUserUnits( EDA_UNITS aUnits ) { m_userUnits = aUnits; }
47
48 virtual void GetUnitPair( EDA_UNITS& aPrimaryUnit, EDA_UNITS& aSecondaryUnits )
49 {
50 aPrimaryUnit = GetUserUnits();
51 aSecondaryUnits = EDA_UNIT_UTILS::IsImperialUnit( aPrimaryUnit ) ? EDA_UNITS::MM
52 : EDA_UNITS::MILS;
53 }
54
55 const EDA_IU_SCALE& GetIuScale() const { return m_iuScale; }
56 // No SetIuScale(); scale is invariant
57
59 {
60 static ORIGIN_TRANSFORMS identityTransform;
61
62 return identityTransform;
63 }
64
79 wxString StringFromValue( double aValue, bool aAddUnitLabel = false,
80 EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE ) const
81 {
83 aAddUnitLabel, aType );
84 }
85
100 wxString StringFromOptionalValue( std::optional<int> aValue, bool aAddUnitLabel = false,
101 EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE ) const
102 {
103 if( !aValue )
104 return NullUiString;
105 else
107 aValue.value(), aAddUnitLabel, aType );
108 }
109
110 wxString StringFromValue( const EDA_ANGLE& aValue, bool aAddUnitLabel = false ) const
111 {
112 return EDA_UNIT_UTILS::UI::StringFromValue( unityScale, EDA_UNITS::DEGREES,
113 aValue.AsDegrees(), aAddUnitLabel,
114 EDA_DATA_TYPE::DISTANCE );
115 }
116
123 wxString MessageTextFromValue( double aValue, bool aAddUnitLabel = true,
124 EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE ) const
125 {
127 aValue, aAddUnitLabel, aType );
128 }
129
130 wxString MessageTextFromValue( const EDA_ANGLE& aValue, bool aAddUnitLabel = true ) const
131 {
132 return EDA_UNIT_UTILS::UI::MessageTextFromValue( unityScale, EDA_UNITS::DEGREES,
133 aValue.AsDegrees(), aAddUnitLabel,
134 EDA_DATA_TYPE::DISTANCE );
135 }
136
138 EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE ) const
139 {
141 };
142
152 int ValueFromString( const wxString& aTextValue,
153 EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE ) const
154 {
156 GetIuScale(), GetUnitsFromType( aType ), aTextValue, aType );
157
158
159 return KiROUND<double, int>( value );
160 }
161
172 std::optional<int>
173 OptionalValueFromString( const wxString& aTextValue,
174 EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE ) const
175 {
176 // Handle null (empty) values
177 if( aTextValue == NullUiString )
178 return {};
179
181 GetIuScale(), GetUnitsFromType( aType ), aTextValue, aType );
182
183 return KiROUND<double, int>( value );
184 }
185
186 EDA_ANGLE AngleValueFromString( const wxString& aTextValue ) const
187 {
188 double angle = EDA_UNIT_UTILS::UI::DoubleValueFromString( GetIuScale(), EDA_UNITS::DEGREES,
189 aTextValue );
190
191 return EDA_ANGLE( angle, DEGREES_T );
192 }
193
198 {
199 // Get the unit type depending on the requested unit type and the underlying user setting
200 if( aType == EDA_DATA_TYPE::TIME )
201 {
202 return EDA_UNITS::PS;
203 }
204 else if( aType == EDA_DATA_TYPE::LENGTH_DELAY )
205 {
207 return EDA_UNITS::PS_PER_CM;
208 else
209 return EDA_UNITS::PS_PER_INCH;
210 }
211
212 return GetUserUnits();
213 }
214
220 {
221 switch( aUnits )
222 {
223 case EDA_UNITS::INCH:
224 case EDA_UNITS::MM:
225 case EDA_UNITS::UM:
226 case EDA_UNITS::CM:
227 case EDA_UNITS::MILS:
228 return EDA_DATA_TYPE::DISTANCE;
229 case EDA_UNITS::DEGREES:
230 case EDA_UNITS::PERCENT:
231 case EDA_UNITS::UNSCALED:
232 return EDA_DATA_TYPE::UNITLESS;
233 case EDA_UNITS::FS:
234 case EDA_UNITS::PS:
235 return EDA_DATA_TYPE::TIME;
236 case EDA_UNITS::PS_PER_INCH:
237 case EDA_UNITS::PS_PER_CM:
238 case EDA_UNITS::PS_PER_MM:
239 return EDA_DATA_TYPE::LENGTH_DELAY;
240 }
241
242 wxString msg = wxString::Format( wxT( "Unhandled unit data type %d" ), static_cast<int>( aUnits ) );
243 wxCHECK_MSG( false, EDA_DATA_TYPE::UNITLESS, msg );
244 return EDA_DATA_TYPE::UNITLESS; // Note that this is unreachable but g++-12 doesn't know that.
245 }
246
248 static inline const wxString NullUiString = "";
249
250private:
253};
254
255#endif // UNITS_PROVIDER_H
constexpr EDA_IU_SCALE unityScale
Definition: base_units.h:113
double AsDegrees() const
Definition: eda_angle.h:116
A class to perform either relative or absolute display origin transforms for a single axis of a point...
wxString MessageTextFromValue(const EDA_ANGLE &aValue, bool aAddUnitLabel=true) const
EDA_UNITS m_userUnits
EDA_ANGLE AngleValueFromString(const wxString &aTextValue) const
const EDA_IU_SCALE & m_iuScale
const EDA_IU_SCALE & GetIuScale() const
virtual void GetUnitPair(EDA_UNITS &aPrimaryUnit, EDA_UNITS &aSecondaryUnits)
EDA_UNITS GetUnitsFromType(EDA_DATA_TYPE aType) const
Gets the units to use in the conversion based on the underlying user units.
static const wxString NullUiString
The string that is used in the UI to represent a null value.
virtual ~UNITS_PROVIDER()
std::optional< int > OptionalValueFromString(const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aTextValue in aUnits to internal units used by the frame.
virtual ORIGIN_TRANSFORMS & GetOriginTransforms()
UNITS_PROVIDER(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits)
wxString StringFromOptionalValue(std::optional< int > aValue, bool aAddUnitLabel=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts an optional aValue in internal units into a united string.
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
wxString MessageTextFromMinOptMax(const MINOPTMAX< int > &aValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
EDA_UNITS GetUserUnits() const
void SetUserUnits(EDA_UNITS aUnits)
static EDA_DATA_TYPE GetTypeFromUnits(const EDA_UNITS aUnits)
Gets the inferred type from the given units.
wxString StringFromValue(double aValue, bool aAddUnitLabel=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aValue in internal units into a united string.
wxString StringFromValue(const EDA_ANGLE &aValue, bool aAddUnitLabel=false) const
int ValueFromString(const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aTextValue in aUnits to internal units used by the frame.
@ DEGREES_T
Definition: eda_angle.h:31
EDA_DATA_TYPE
The type of unit.
Definition: eda_units.h:38
EDA_UNITS
Definition: eda_units.h:48
KICOMMON_API wxString MessageTextFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
A helper to convert the double length aValue to a string in inches, millimeters, or unscaled units.
Definition: eda_units.cpp:404
KICOMMON_API wxString StringFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Return the string from aValue according to aUnits (inch, mm ...) for display.
Definition: eda_units.cpp:310
KICOMMON_API wxString MessageTextFromMinOptMax(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, const MINOPTMAX< int > &aValue)
Definition: eda_units.cpp:468
KICOMMON_API double DoubleValueFromString(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Convert aTextValue to a double.
Definition: eda_units.cpp:559
KICOMMON_API bool IsImperialUnit(EDA_UNITS aUnit)
Definition: eda_units.cpp:47
KICOMMON_API bool IsMetricUnit(EDA_UNITS aUnit)
Definition: eda_units.cpp:61