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
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,
81 {
83 aAddUnitLabel, aType );
84 }
85
100 wxString StringFromOptionalValue( std::optional<int> aValue, bool aAddUnitLabel = false,
102 {
103 if( !aValue )
104 {
105 return NullUiString;
106 }
107 else
108 {
110 aValue.value(), aAddUnitLabel, aType );
111 }
112 }
113
114 wxString StringFromValue( const EDA_ANGLE& aValue, bool aAddUnitLabel = false ) const
115 {
117 aValue.AsDegrees(), aAddUnitLabel,
119 }
120
127 wxString MessageTextFromValue( double aValue, bool aAddUnitLabel = true,
129 {
131 aValue, aAddUnitLabel, aType );
132 }
133
134 wxString MessageTextFromValue( const EDA_ANGLE& aValue, bool aAddUnitLabel = true ) const
135 {
137 aValue.AsDegrees(), aAddUnitLabel,
139 }
140
143 {
145 };
146
156 int ValueFromString( const wxString& aTextValue, EDA_DATA_TYPE aType = EDA_DATA_TYPE::DISTANCE ) const
157 {
159 aTextValue, aType );
160
161
162 return KiROUND<double, int>( value );
163 }
164
175 std::optional<int> OptionalValueFromString( const wxString& aTextValue,
177 {
178 // Handle null (empty) values
179 if( aTextValue == NullUiString )
180 return {};
181
183 aTextValue, aType );
184
185 return KiROUND<double, int>( value );
186 }
187
188 EDA_ANGLE AngleValueFromString( const wxString& aTextValue ) const
189 {
191 aTextValue );
192
193 return EDA_ANGLE( angle, DEGREES_T );
194 }
195
200 {
201 // Get the unit type depending on the requested unit type and the underlying user setting
202 if( aType == EDA_DATA_TYPE::TIME )
203 {
204 return EDA_UNITS::PS;
205 }
206 else if( aType == EDA_DATA_TYPE::LENGTH_DELAY )
207 {
210 else
212 }
213
214 return GetUserUnits();
215 }
216
222 {
223 switch( aUnits )
224 {
225 case EDA_UNITS::INCH:
226 case EDA_UNITS::MM:
227 case EDA_UNITS::UM:
228 case EDA_UNITS::CM:
229 case EDA_UNITS::MILS:
235 case EDA_UNITS::FS:
236 case EDA_UNITS::PS:
237 return EDA_DATA_TYPE::TIME;
242 }
243
244 wxString msg = wxString::Format( wxT( "Unhandled unit data type %d" ), static_cast<int>( aUnits ) );
245 wxCHECK_MSG( false, EDA_DATA_TYPE::UNITLESS, msg );
246 return EDA_DATA_TYPE::UNITLESS; // Note that this is unreachable but g++-12 doesn't know that.
247 }
248
250 static inline const wxString NullUiString = "";
251
252private:
255};
256
257#endif // UNITS_PROVIDER_H
constexpr EDA_IU_SCALE unityScale
Definition base_units.h:115
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:990
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
@ PS_PER_INCH
Definition eda_units.h:59
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.
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.
KICOMMON_API wxString MessageTextFromMinOptMax(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, const MINOPTMAX< int > &aValue)
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.
KICOMMON_API bool IsImperialUnit(EDA_UNITS aUnit)
Definition eda_units.cpp:47
KICOMMON_API bool IsMetricUnit(EDA_UNITS aUnit)
Definition eda_units.cpp:61