Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
units.h
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Inkscape Units
4 * These classes are used for defining different unit systems.
5 *
6 * Authors:
7 * Matthew Petroff <matthew@mpetroff.net>
8 *
9 * Copyright (C) 2013 Matthew Petroff
10 *
11 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
12 */
13
14#ifndef INKSCAPE_UTIL_UNITS_H
15#define INKSCAPE_UTIL_UNITS_H
16
17#include <unordered_map>
18#include <boost/operators.hpp>
19#include <glibmm/ustring.h>
20#include <glibmm/ustring_hash.h>
21#include <2geom/coord.h>
22
23#include "svg/svg-length.h"
24
25#ifndef DOXYGEN_SHOULD_SKIP_THIS
26#define DEFAULT_UNIT_NAME "mm"
27#endif
28
29namespace Inkscape {
30namespace Util {
31
42
43const char DEG[] = "°";
44
45class Unit
46 : boost::equality_comparable<Unit>
47{
48public:
49 Unit();
51 double factor,
52 Glib::ustring name,
53 Glib::ustring name_plural,
54 Glib::ustring abbr,
55 Glib::ustring description);
56
57 void clear();
58
59 bool isAbsolute() const { return type != UNIT_TYPE_DIMENSIONLESS; }
60
65 int defaultDigits() const;
66
68 bool compatibleWith(Unit const *u) const;
69 bool compatibleWith(Glib::ustring const &) const;
70 bool compatibleWith(char const *) const;
71
73 double factor;
74 Glib::ustring name;
75 Glib::ustring name_plural;
76 Glib::ustring abbr;
77 Glib::ustring description;
78
80 bool operator==(Unit const &other) const;
81
83 int svgUnit() const;
84
86 double convert(double from_dist, Unit const *to) const;
87 double convert(double from_dist, Glib::ustring const &to) const;
88 double convert(double from_dist, char const *to) const;
89};
90
92 : boost::totally_ordered<Quantity>
93{
94public:
95 Unit const *unit;
96 double quantity;
97
99 Quantity(double q, Unit const *u);
100 Quantity(double q, Glib::ustring const &u);
101 Quantity(double q, char const *u);
102
104 bool compatibleWith(Unit const *u) const;
105 bool compatibleWith(Glib::ustring const &u) const;
106 bool compatibleWith(char const *u) const;
107
109 double value(Unit const *u) const;
110 double value(Glib::ustring const &u) const;
111 double value(char const *u) const;
112
114 Glib::ustring string(Unit const *u) const;
115 Glib::ustring string(Glib::ustring const &u) const;
116 Glib::ustring string() const;
117
120 static double convert(double from_dist, Unit const *from, Unit const *to);
121 static double convert(double from_dist, Glib::ustring const &from, Unit const *to);
122 static double convert(double from_dist, Unit const *from, Glib::ustring const &to);
123 static double convert(double from_dist, Glib::ustring const &from, Glib::ustring const &to);
124 static double convert(double from_dist, char const *from, char const *to);
125
127 bool operator<(Quantity const &rhs) const;
128 bool operator==(Quantity const &other) const;
129};
130
131inline bool are_near(Quantity const &a, Quantity const &b, double eps=Geom::EPSILON)
132{
133 return Geom::are_near(a.quantity, b.value(a.unit), eps);
134}
135
137public:
143 UnitTable();
144 virtual ~UnitTable();
145
146 typedef std::unordered_map<Glib::ustring, Unit> UnitMap;
147 typedef std::unordered_map<unsigned, Unit*> UnitCodeMap;
148
150 void addUnit(Unit const &u, bool primary);
151
153 Unit const *getUnit(Glib::ustring const &name) const;
154 Unit const *getUnit(char const *name) const;
155
157 Unit const *findUnit(double factor, UnitType type) const;
158
160 Unit const *getUnit(SVGLength::Unit u) const;
161
163 Quantity parseQuantity(Glib::ustring const &q) const;
164
167 //bool deleteUnit(Unit const &u);
168
170 bool hasUnit(Glib::ustring const &name) const;
171
173 UnitMap units(UnitType type) const;
174
176 Glib::ustring primary(UnitType type) const;
177
178 double getScale() const;
179
180 void setScale();
181
189 bool load(std::string const &filename);
190
191 /* * Saves the current UnitTable to the given file. */
192 //bool save(std::string const &filename);
193
194 static UnitTable &get();
195
196protected:
199
202
203private:
206
207};
208
209} // namespace Util
210} // namespace Inkscape
211
212#endif // define INKSCAPE_UTIL_UNITS_H
213/*
214 Local Variables:
215 mode:c++
216 c-file-style:"stroustrup"
217 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
218 indent-tabs-mode:nil
219 fill-column:99
220 End:
221*/
222// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
bool compatibleWith(Unit const *u) const
Checks if a quantity is compatible with the specified unit.
Definition units.cpp:489
double value(Unit const *u) const
Return the quantity's value in the specified unit.
Definition units.cpp:502
Glib::ustring string() const
Definition units.cpp:521
bool operator==(Quantity const &other) const
Definition units.cpp:554
bool operator<(Quantity const &rhs) const
Comparison operators.
Definition units.cpp:546
Unit const * unit
Definition units.h:95
static double convert(double from_dist, Unit const *from, Unit const *to)
Convert distances.
Definition units.cpp:525
Unit const * findUnit(double factor, UnitType type) const
Try to find a unit based on its conversion factor to the primary.
Definition units.cpp:302
Glib::ustring primary(UnitType type) const
Returns the default unit abbr for the given type.
Definition units.cpp:387
UnitCodeMap _unit_map
Definition units.h:197
Quantity parseQuantity(Glib::ustring const &q) const
Retrieve a quantity based on its string identifier.
Definition units.cpp:324
std::unordered_map< Glib::ustring, Unit > UnitMap
Definition units.h:146
UnitMap units(UnitType type) const
Provides an iterable list of items in the given unit table.
Definition units.cpp:375
UnitTable operator=(UnitTable const &t)
bool load(std::string const &filename)
Load units from an XML file.
Definition units.cpp:392
void addUnit(Unit const &u, bool primary)
Add a new unit to the table.
Definition units.cpp:268
bool hasUnit(Glib::ustring const &name) const
Remove a unit definition from the given unit type table * / DISABLED, unsafe with the current passing...
Definition units.cpp:369
UnitTable(UnitTable const &t)
std::unordered_map< unsigned, Unit * > UnitCodeMap
Definition units.h:147
Glib::ustring _primary_unit[UNIT_TYPE_QTY]
Definition units.h:198
static UnitTable & get()
Definition units.cpp:410
Unit const * getUnit(Glib::ustring const &name) const
Retrieve a given unit based on its string identifier.
Definition units.cpp:285
static Unit _empty_unit
Definition units.h:201
UnitTable()
Initializes the unit tables and identifies the primary unit types.
Definition units.cpp:254
Glib::ustring description
Definition units.h:77
double convert(double from_dist, Unit const *to) const
Convert value from this unit.
Definition units.cpp:226
Glib::ustring name_plural
Definition units.h:75
UnitType type
Definition units.h:72
int defaultDigits() const
Returns the suggested precision to use for displaying numbers of this unit.
Definition units.cpp:178
bool isAbsolute() const
Definition units.h:59
bool compatibleWith(char const *) const
bool compatibleWith(Unit const *u) const
Checks if a unit is compatible with the specified unit.
Definition units.cpp:189
int svgUnit() const
Get SVG unit code.
Definition units.cpp:214
bool operator==(Unit const &other) const
Check if units are equal.
Definition units.cpp:209
Glib::ustring abbr
Definition units.h:76
Glib::ustring name
Definition units.h:74
Integral and real coordinate types and some basic utilities.
constexpr Coord EPSILON
Default "acceptably small" value.
Definition coord.h:84
bool are_near(Affine const &a1, Affine const &a2, Coord eps=EPSILON)
Miscellaneous supporting code.
Definition document.h:95
const char DEG[]
Definition units.h:43
@ UNIT_TYPE_LINEAR_SCALED
Definition units.h:35
@ UNIT_TYPE_DIMENSIONLESS
Definition units.h:33
@ UNIT_TYPE_FONT_HEIGHT
Definition units.h:38
@ UNIT_TYPE_RADIAL
Definition units.h:36
@ UNIT_TYPE_LINEAR
Definition units.h:34
@ UNIT_TYPE_QTY
Definition units.h:39
@ UNIT_TYPE_NONE
Definition units.h:40
@ UNIT_TYPE_TIME
Definition units.h:37
bool are_near(Quantity const &a, Quantity const &b, double eps=Geom::EPSILON)
Definition units.h:131
Helper class to stream background task notifications as a series of messages.
Glib::ustring name
Definition toolbars.cpp:55