rvc3python 0.2.3__py3-none-any.whl → 0.9.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- RVC3/__init__.py +5 -0
- RVC3/bin/bdsim_path.py +10 -0
- RVC3/bin/rvctool.py +354 -0
- RVC3/examples/hershey/genhershey.py +136 -0
- RVC3/examples/hershey/hershey.json +1 -0
- RVC3/examples/hershey/hershey.txt +2324 -0
- RVC3/examples/hershey/roman-plain.txt +8 -0
- RVC3/examples/hershey/roman-simplex.txt +8 -0
- RVC3/examples/hershey/roman-triplex.txt +8 -0
- RVC3/models/IBVS-arm-main.py +14 -16
- RVC3/models/IBVS-arm.bd +1486 -0
- RVC3/models/IBVS-holonomic-main.py +21 -13
- RVC3/models/IBVS-holonomic.bd +1382 -0
- RVC3/models/IBVS-main.py +1 -8
- RVC3/models/IBVS-nonholonomic-main.py +42 -32
- RVC3/models/IBVS-nonholonomic.bd +2388 -0
- RVC3/models/IBVS-partitioned-main.py +16 -18
- RVC3/models/IBVS-partitioned.bd +1630 -0
- RVC3/models/IBVS-quadrotor-main.py +97 -37
- RVC3/models/IBVS-quadrotor.bd +2343 -0
- RVC3/models/IBVS.bd +1036 -0
- RVC3/models/RRMC.bd +383 -0
- RVC3/models/RRMC.py +16 -19
- RVC3/models/RRMC2.bd +640 -0
- RVC3/models/RRMC2.py +15 -10
- RVC3/models/SEA-main.py +30 -0
- RVC3/models/SEA.bd +1470 -0
- RVC3/models/SEA.py +25 -15
- RVC3/models/braitenberg.bd +906 -0
- RVC3/models/braitenberg.py +34 -23
- RVC3/models/cartspace.bd +258 -0
- RVC3/models/computed-torque-main.py +26 -0
- RVC3/models/computed-torque.bd +925 -0
- RVC3/models/driveconfig.bd +1550 -0
- RVC3/models/driveconfig.py +69 -45
- RVC3/models/driveline.bd +917 -0
- RVC3/models/driveline.py +34 -20
- RVC3/models/drivepoint.bd +963 -0
- RVC3/models/drivepoint.py +33 -21
- RVC3/models/drivepursuit.bd +807 -0
- RVC3/models/drivepursuit.py +38 -33
- RVC3/models/feedforward-main.py +32 -0
- RVC3/models/feedforward.bd +1174 -0
- RVC3/models/jointspace.bd +323 -0
- RVC3/models/jointspace.py +10 -5
- RVC3/models/lanechange.bd +202 -0
- RVC3/models/lanechange.py +12 -5
- RVC3/models/opspace-main.py +84 -0
- RVC3/models/opspace.bd +2084 -0
- RVC3/models/opspace.py +50 -34
- RVC3/models/ploop.bd +826 -0
- RVC3/models/ploop.py +18 -11
- RVC3/models/ploop_test.bd +417 -0
- RVC3/models/ploop_test.py +18 -15
- RVC3/models/quad_model.py +132 -0
- RVC3/models/quadrotor-main.py +23 -14
- RVC3/models/quadrotor.bd +1914 -0
- RVC3/models/quadrotor.py +51 -30
- RVC3/models/vloop.bd +1217 -0
- RVC3/models/vloop.py +19 -14
- RVC3/models/vloop_test.bd +625 -0
- RVC3/models/vloop_test.py +19 -21
- RVC3/models/zerotorque.bd +138 -0
- RVC3/models/zerotorque.py +10 -4
- {rvc3python-0.2.3.dist-info → rvc3python-0.9.1.dist-info}/METADATA +142 -51
- rvc3python-0.9.1.dist-info/RECORD +81 -0
- {rvc3python-0.2.3.dist-info → rvc3python-0.9.1.dist-info}/WHEEL +1 -1
- rvc3python-0.9.1.dist-info/entry_points.txt +3 -0
- rvc3python-0.9.1.dist-info/top_level.txt +1 -0
- RVC3/models/puma_collapse.py +0 -33
- rvc3python-0.2.3.data/scripts/bdsim_path +0 -6
- rvc3python-0.2.3.data/scripts/rvctool +0 -296
- rvc3python-0.2.3.dist-info/RECORD +0 -67
- rvc3python-0.2.3.dist-info/top_level.txt +0 -2
- tools/bookcheck.py +0 -107
- tools/bookurls.py +0 -63
- tools/crop.py +0 -55
- tools/export.py +0 -19
- tools/fixidx.py +0 -23
- tools/grepall.py +0 -56
- tools/https.py +0 -69
- tools/ipy.py +0 -54
- tools/m2p.py +0 -109
- tools/mgrepall.py +0 -56
- tools/pvplus.py +0 -444
- tools/pycon.py +0 -30
- tools/pyrun (original).py +0 -650
- tools/pyrun-old.py +0 -168
- tools/pyrun-old2.py +0 -648
- tools/pyrun-working.py +0 -147
- tools/pyrun.py +0 -679
- tools/rmfigs.py +0 -50
- tools/rmoldfigs.py +0 -36
- tools/runall.py +0 -59
- tools/rvcprint.py +0 -164
- tools/test1.py +0 -47
- tools/tex2py.py +0 -51
- {tools → RVC3/bin}/__init__.py +0 -0
- {rvc3python-0.2.3.dist-info → rvc3python-0.9.1.dist-info}/LICENSE +0 -0
RVC3/__init__.py
CHANGED
RVC3/bin/bdsim_path.py
ADDED
RVC3/bin/rvctool.py
ADDED
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
# a simple Robotics & Vision Toolbox "shell", runs Python3 and loads
|
|
4
|
+
# NumPy, SciPy, RTB-P, SMTB-P, MVTB-P.
|
|
5
|
+
#
|
|
6
|
+
# Run it from the shell
|
|
7
|
+
# $ rvctool
|
|
8
|
+
#
|
|
9
|
+
# Default switches can be set using the environent variables RVCTOOL, eg.
|
|
10
|
+
#
|
|
11
|
+
# setenv RVCTOOL "-n"
|
|
12
|
+
# export RVCTOOL="-n"
|
|
13
|
+
|
|
14
|
+
# import stuff
|
|
15
|
+
import os
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
import sys
|
|
18
|
+
from importlib.metadata import version
|
|
19
|
+
import argparse
|
|
20
|
+
|
|
21
|
+
from pygments.token import Token
|
|
22
|
+
from IPython.terminal.prompts import Prompts
|
|
23
|
+
from IPython.terminal.prompts import ClassicPrompts
|
|
24
|
+
from traitlets.config import Config
|
|
25
|
+
import IPython
|
|
26
|
+
import matplotlib as mpl
|
|
27
|
+
|
|
28
|
+
try:
|
|
29
|
+
from colored import fg, bg, attr
|
|
30
|
+
|
|
31
|
+
_colored = True
|
|
32
|
+
# print('using colored output')
|
|
33
|
+
except ImportError:
|
|
34
|
+
# print('colored not found')
|
|
35
|
+
_colored = False
|
|
36
|
+
|
|
37
|
+
# imports for use by IPython and user
|
|
38
|
+
from math import pi # lgtm [py/unused-import]
|
|
39
|
+
import numpy as np
|
|
40
|
+
from scipy import linalg, optimize
|
|
41
|
+
import matplotlib.pyplot as plt # lgtm [py/unused-import]
|
|
42
|
+
from spatialmath import * # lgtm [py/polluting-import]
|
|
43
|
+
from spatialmath.base import *
|
|
44
|
+
from spatialmath.base import sym
|
|
45
|
+
from spatialgeometry import * # lgtm [py/polluting-import]
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def parse_arguments():
|
|
49
|
+
parser = argparse.ArgumentParser(
|
|
50
|
+
prog="rvctool",
|
|
51
|
+
epilog=(
|
|
52
|
+
"To set defaults put the relevant command line switches as a string in the"
|
|
53
|
+
" environment varible RVCTOOL."
|
|
54
|
+
),
|
|
55
|
+
description=(
|
|
56
|
+
"Interactive python enviroment for exploring the Robotics & Machine Vision"
|
|
57
|
+
" toolboxes for Python"
|
|
58
|
+
),
|
|
59
|
+
)
|
|
60
|
+
parser.add_argument("script", default=None, nargs="?", help="specify script to run")
|
|
61
|
+
|
|
62
|
+
parser.add_argument(
|
|
63
|
+
"-B", "--backend", default=None, help="specify graphics backend"
|
|
64
|
+
)
|
|
65
|
+
parser.add_argument(
|
|
66
|
+
"-C",
|
|
67
|
+
"--color",
|
|
68
|
+
default="neutral",
|
|
69
|
+
help=(
|
|
70
|
+
"specify terminal color scheme (neutral, lightbg, nocolor, linux), linux is"
|
|
71
|
+
" for dark mode"
|
|
72
|
+
),
|
|
73
|
+
)
|
|
74
|
+
parser.add_argument("--confirmexit", "-x", default=False, help="confirm exit")
|
|
75
|
+
parser.add_argument("--prompt", "-p", default=None, help="input prompt")
|
|
76
|
+
parser.add_argument(
|
|
77
|
+
"-r",
|
|
78
|
+
"--resultprefix",
|
|
79
|
+
default=None,
|
|
80
|
+
help="execution result prefix, include {} for execution count number",
|
|
81
|
+
)
|
|
82
|
+
parser.add_argument(
|
|
83
|
+
"-b",
|
|
84
|
+
"--no-banner",
|
|
85
|
+
dest="banner",
|
|
86
|
+
default=True,
|
|
87
|
+
action="store_false",
|
|
88
|
+
help="suppress startup banner",
|
|
89
|
+
)
|
|
90
|
+
parser.add_argument(
|
|
91
|
+
"-c",
|
|
92
|
+
"--nocwd",
|
|
93
|
+
dest="cwd",
|
|
94
|
+
default=True,
|
|
95
|
+
action="store_false",
|
|
96
|
+
help="suppress cwd to RVC3 folder",
|
|
97
|
+
)
|
|
98
|
+
parser.add_argument(
|
|
99
|
+
"-a",
|
|
100
|
+
"--showassign",
|
|
101
|
+
default=False,
|
|
102
|
+
action="store_true",
|
|
103
|
+
help="do not display the result of assignments",
|
|
104
|
+
)
|
|
105
|
+
parser.add_argument(
|
|
106
|
+
"-n",
|
|
107
|
+
"--normal",
|
|
108
|
+
dest="book",
|
|
109
|
+
default=True,
|
|
110
|
+
action="store_false",
|
|
111
|
+
help="use normal ipython settings for prompts and display on assignment",
|
|
112
|
+
)
|
|
113
|
+
parser.add_argument(
|
|
114
|
+
"-R",
|
|
115
|
+
"--no-robot",
|
|
116
|
+
dest="robot",
|
|
117
|
+
default=True,
|
|
118
|
+
action="store_false",
|
|
119
|
+
help="do not import robotics toolbox (RTB-P)",
|
|
120
|
+
)
|
|
121
|
+
parser.add_argument(
|
|
122
|
+
"-V",
|
|
123
|
+
"--no-vision",
|
|
124
|
+
dest="vision",
|
|
125
|
+
default=True,
|
|
126
|
+
action="store_false",
|
|
127
|
+
help="do not import vision toolbox (MVTB-P)",
|
|
128
|
+
)
|
|
129
|
+
parser.add_argument(
|
|
130
|
+
"--ansi",
|
|
131
|
+
default=False,
|
|
132
|
+
action="store_true",
|
|
133
|
+
help="use ANSImatrix to display matrices",
|
|
134
|
+
)
|
|
135
|
+
parser.add_argument(
|
|
136
|
+
"-e",
|
|
137
|
+
"--examples",
|
|
138
|
+
default=False,
|
|
139
|
+
action="store_true",
|
|
140
|
+
help="change working directory to shipped examples",
|
|
141
|
+
)
|
|
142
|
+
parser.add_argument(
|
|
143
|
+
"-s",
|
|
144
|
+
"--swift",
|
|
145
|
+
default=False,
|
|
146
|
+
action="store_true",
|
|
147
|
+
help="use Swift as default backend",
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# add options for light/dark mode
|
|
151
|
+
|
|
152
|
+
env = os.getenv("RVCTOOL")
|
|
153
|
+
if env is not None:
|
|
154
|
+
# if envariable is set, parse it just like command line options
|
|
155
|
+
args = parser.parse_args(env.split())
|
|
156
|
+
# then use it to set the defaults for the actual command line parsing
|
|
157
|
+
parser.set_defaults(**args.__dict__)
|
|
158
|
+
|
|
159
|
+
args, rest = parser.parse_known_args()
|
|
160
|
+
|
|
161
|
+
# remove the arguments we've just parsed from sys.argv so that IPython can have a
|
|
162
|
+
# go at them later
|
|
163
|
+
sys.argv = [sys.argv[0]] + rest
|
|
164
|
+
|
|
165
|
+
if args.script is not None:
|
|
166
|
+
args.banner = False
|
|
167
|
+
|
|
168
|
+
return args
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def make_banner(args):
|
|
172
|
+
# http://patorjk.com/software/taag/#p=display&f=Standard&t=RVC%203
|
|
173
|
+
# print the banner: standard
|
|
174
|
+
# https://patorjk.com/software/taag/#p=display&f=Standard&t=Robotics%2C%20Vision%20%26%20Control%203
|
|
175
|
+
|
|
176
|
+
banner = fg("yellow")
|
|
177
|
+
banner += r""" ____ _ _ _ __ ___ _ ___ ____ _ _ _____
|
|
178
|
+
| _ \ ___ | |__ ___ | |_(_) ___ ___ \ \ / (_)___(_) ___ _ __ ( _ ) / ___|___ _ __ | |_ _ __ ___ | | |___ /
|
|
179
|
+
| |_) / _ \| '_ \ / _ \| __| |/ __/ __| \ \ / /| / __| |/ _ \| '_ \ / _ \/\ | | / _ \| '_ \| __| '__/ _ \| | |_ \
|
|
180
|
+
| _ < (_) | |_) | (_) | |_| | (__\__ \_ \ V / | \__ \ | (_) | | | | | (_> < | |__| (_) | | | | |_| | | (_) | | ___) |
|
|
181
|
+
|_| \_\___/|_.__/ \___/ \__|_|\___|___( ) \_/ |_|___/_|\___/|_| |_| \___/\/ \____\___/|_| |_|\__|_| \___/|_| |____/
|
|
182
|
+
|/
|
|
183
|
+
for Python"""
|
|
184
|
+
|
|
185
|
+
versions = []
|
|
186
|
+
if args.robot:
|
|
187
|
+
versions.append(f"RTB=={version('roboticstoolbox-python')}")
|
|
188
|
+
if args.vision:
|
|
189
|
+
versions.append(f"MVTB=={version('machinevision-toolbox-python')}")
|
|
190
|
+
try:
|
|
191
|
+
versions.append(f"SG=={version('spatialmath-python')}")
|
|
192
|
+
except:
|
|
193
|
+
pass
|
|
194
|
+
versions.append(f"SMTB=={version('spatialmath-python')}")
|
|
195
|
+
versions.append(f"NumPy=={version('numpy')}")
|
|
196
|
+
versions.append(f"SciPy=={version('scipy')}")
|
|
197
|
+
versions.append(f"Matplotlib=={version('matplotlib')}")
|
|
198
|
+
|
|
199
|
+
# create banner
|
|
200
|
+
banner += " (" + ", ".join(versions) + ")"
|
|
201
|
+
banner += r"""
|
|
202
|
+
|
|
203
|
+
import math
|
|
204
|
+
import numpy as np
|
|
205
|
+
from scipy import linalg, optimize
|
|
206
|
+
import matplotlib.pyplot as plt
|
|
207
|
+
from spatialmath import *
|
|
208
|
+
from spatialmath.base import *
|
|
209
|
+
from spatialmath.base import sym
|
|
210
|
+
from spatialgeometry import *
|
|
211
|
+
"""
|
|
212
|
+
if args.robot:
|
|
213
|
+
banner += "from roboticstoolbox import *\n"
|
|
214
|
+
if args.vision:
|
|
215
|
+
banner += """ from machinevisiontoolbox import *
|
|
216
|
+
import machinevisiontoolbox.base as mvb
|
|
217
|
+
"""
|
|
218
|
+
|
|
219
|
+
banner += r"""
|
|
220
|
+
# useful variables
|
|
221
|
+
from math import pi
|
|
222
|
+
puma = models.DH.Puma560()
|
|
223
|
+
panda = models.DH.Panda()
|
|
224
|
+
|
|
225
|
+
func/object? - show brief help
|
|
226
|
+
help(func/object) - show detailed help
|
|
227
|
+
func/object?? - show source code
|
|
228
|
+
"""
|
|
229
|
+
banner += attr(0)
|
|
230
|
+
|
|
231
|
+
return banner
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def startup():
|
|
235
|
+
plt.ion()
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def main():
|
|
239
|
+
args = parse_arguments()
|
|
240
|
+
# print(args)
|
|
241
|
+
|
|
242
|
+
if args.book:
|
|
243
|
+
# set book options
|
|
244
|
+
args.resultprefix = ""
|
|
245
|
+
args.prompt = ">>> "
|
|
246
|
+
args.showassign = True
|
|
247
|
+
args.ansi = False
|
|
248
|
+
args.examples = True
|
|
249
|
+
|
|
250
|
+
# setup defaults
|
|
251
|
+
np.set_printoptions(
|
|
252
|
+
linewidth=120,
|
|
253
|
+
formatter={"float": lambda x: f"{x:8.4g}" if abs(x) > 1e-10 else f"{0:8.4g}"},
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
globs = globals()
|
|
257
|
+
if args.robot:
|
|
258
|
+
exec("from roboticstoolbox import *", globs)
|
|
259
|
+
from roboticstoolbox import __path__
|
|
260
|
+
|
|
261
|
+
sys.path.append(str(Path(__path__[0]) / "examples"))
|
|
262
|
+
|
|
263
|
+
# load some robot models
|
|
264
|
+
globs["puma"] = models.DH.Puma560()
|
|
265
|
+
globs["panda"] = models.DH.Panda()
|
|
266
|
+
|
|
267
|
+
# set default backend for Robot.plot
|
|
268
|
+
if args.swift:
|
|
269
|
+
Robot.default_backend = "swift"
|
|
270
|
+
|
|
271
|
+
if args.vision:
|
|
272
|
+
exec("from machinevisiontoolbox import *", globs)
|
|
273
|
+
exec("import machinevisiontoolbox.base as mvbase", globs)
|
|
274
|
+
|
|
275
|
+
# set matrix printing mode for spatialmath
|
|
276
|
+
SE3._ansimatrix = args.ansi
|
|
277
|
+
|
|
278
|
+
# set default matplotlib backend
|
|
279
|
+
if args.backend is not None:
|
|
280
|
+
print(f"Using matplotlib backend {args.backend}")
|
|
281
|
+
mpl.use(args.backend)
|
|
282
|
+
|
|
283
|
+
if args.banner:
|
|
284
|
+
banner = make_banner(args)
|
|
285
|
+
print(banner)
|
|
286
|
+
|
|
287
|
+
if args.showassign and args.banner:
|
|
288
|
+
print(
|
|
289
|
+
fg("red")
|
|
290
|
+
+ "Results of assignments will be displayed, use trailing ; to suppress"
|
|
291
|
+
+ attr(0)
|
|
292
|
+
+ "\n"
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
# append to the module path
|
|
296
|
+
# - RVC3 models and examples
|
|
297
|
+
# - RTB examples
|
|
298
|
+
root = Path(__file__).absolute().parent.parent
|
|
299
|
+
sys.path.append(str(root / "models"))
|
|
300
|
+
sys.path.append(str(root / "examples"))
|
|
301
|
+
|
|
302
|
+
if args.cwd:
|
|
303
|
+
os.chdir(root)
|
|
304
|
+
|
|
305
|
+
class MyPrompt(Prompts):
|
|
306
|
+
def in_prompt_tokens(self, cli=None):
|
|
307
|
+
if args.prompt is None:
|
|
308
|
+
return super().in_prompt_tokens()
|
|
309
|
+
else:
|
|
310
|
+
return [(Token.Prompt, args.prompt)]
|
|
311
|
+
|
|
312
|
+
def out_prompt_tokens(self, cli=None):
|
|
313
|
+
if args.resultprefix is None:
|
|
314
|
+
# traditional behaviour
|
|
315
|
+
return super().out_prompt_tokens()
|
|
316
|
+
else:
|
|
317
|
+
return [
|
|
318
|
+
(Token.Prompt, args.resultprefix.format(self.shell.execution_count))
|
|
319
|
+
]
|
|
320
|
+
|
|
321
|
+
# set configuration options, there are lots, see
|
|
322
|
+
# https://ipython.readthedocs.io/en/stable/config/options/terminal.html
|
|
323
|
+
c = Config()
|
|
324
|
+
c.InteractiveShellEmbed.colors = args.color
|
|
325
|
+
c.InteractiveShell.confirm_exit = args.confirmexit
|
|
326
|
+
# c.InteractiveShell.prompts_class = ClassicPrompts
|
|
327
|
+
c.InteractiveShell.prompts_class = MyPrompt
|
|
328
|
+
if args.showassign:
|
|
329
|
+
c.InteractiveShell.ast_node_interactivity = "last_expr_or_assign"
|
|
330
|
+
c.TerminalIPythonApp.display_banner = args.banner
|
|
331
|
+
|
|
332
|
+
# set precision, same as %precision
|
|
333
|
+
c.PlainTextFormatter.float_precision = "%.3f"
|
|
334
|
+
|
|
335
|
+
# set up a script to be executed by IPython when we get there
|
|
336
|
+
code = None
|
|
337
|
+
if args.script is not None:
|
|
338
|
+
path = Path(args.script)
|
|
339
|
+
if not path.exists():
|
|
340
|
+
raise ValueError(f"script does not exist: {args.script}")
|
|
341
|
+
code = path.open("r").readlines()
|
|
342
|
+
|
|
343
|
+
if code is None:
|
|
344
|
+
code = [
|
|
345
|
+
"startup()",
|
|
346
|
+
"%precision %.3g;",
|
|
347
|
+
]
|
|
348
|
+
|
|
349
|
+
c.InteractiveShellApp.exec_lines = code
|
|
350
|
+
IPython.start_ipython(config=c, user_ns=globals())
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
if __name__ == "__main__":
|
|
354
|
+
main()
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# http://paulbourke.net/dataformats/hershey/
|
|
2
|
+
import math
|
|
3
|
+
from collections import namedtuple
|
|
4
|
+
import matplotlib.pyplot as plt
|
|
5
|
+
import numpy as np
|
|
6
|
+
import json
|
|
7
|
+
|
|
8
|
+
"""
|
|
9
|
+
Read Hershey JH-format font data and create a cell array that maps ASCII code
|
|
10
|
+
to stroke data.
|
|
11
|
+
|
|
12
|
+
Each character is drawn within a 1x1 grid, with origin at the bottom left.
|
|
13
|
+
|
|
14
|
+
hershey{'B'} is a struct with elements:
|
|
15
|
+
- width, width of the character
|
|
16
|
+
- height, height of the character
|
|
17
|
+
- top, largest y-coordinate
|
|
18
|
+
- bottom, smallest y-coordinate
|
|
19
|
+
- stroke, 2xN array of waypoints. A column of NaNs indicates the end of
|
|
20
|
+
one stroke and the beginning of the next.
|
|
21
|
+
|
|
22
|
+
Hershey's original fonts were encoded in a compact ASCII format by
|
|
23
|
+
James Hurt (JH).
|
|
24
|
+
|
|
25
|
+
References:
|
|
26
|
+
- `Wikipedia <https://en.wikipedia.org/wiki/Hershey_fonts>`_
|
|
27
|
+
- `Hershey vector fonts library, tools, and glyphs <https://github.com/kamalmostafa/hershey-fonts>`_
|
|
28
|
+
- `Hershey Vector Font by Paul Bourke <http://paulbourke.net/dataformats/hershey>`_
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
## READ the glyph indices
|
|
32
|
+
#
|
|
33
|
+
# this file lists the glyph indices in ASCII order, starting at 32 (space)
|
|
34
|
+
# comprises numbers N and ranges N-M
|
|
35
|
+
with open('roman-simplex.txt', 'r') as f:
|
|
36
|
+
|
|
37
|
+
fontmap = []
|
|
38
|
+
|
|
39
|
+
for number in f.read().split():
|
|
40
|
+
if '-' in number:
|
|
41
|
+
s = list(map(int, number.split('-')))
|
|
42
|
+
fontmap.extend(range(s[0], s[1]+1))
|
|
43
|
+
else:
|
|
44
|
+
fontmap.append(int(number))
|
|
45
|
+
|
|
46
|
+
# we now have a list of glyph indices in ASCII code order, starting at 32
|
|
47
|
+
|
|
48
|
+
## READ the glyph data
|
|
49
|
+
#
|
|
50
|
+
# read lines, each line has a maximum width of 72 chars
|
|
51
|
+
# lines of 72 chars have implicit continuation lines
|
|
52
|
+
# line[:5] is the glyph number
|
|
53
|
+
|
|
54
|
+
glyphdata = {}
|
|
55
|
+
|
|
56
|
+
with open('hershey.txt', 'r') as f:
|
|
57
|
+
longline = None
|
|
58
|
+
for line in f:
|
|
59
|
+
line = line.rstrip()
|
|
60
|
+
if len(line) == 0:
|
|
61
|
+
continue
|
|
62
|
+
if longline is None:
|
|
63
|
+
longline = line
|
|
64
|
+
else:
|
|
65
|
+
longline += line
|
|
66
|
+
if len(line) == 72:
|
|
67
|
+
continue
|
|
68
|
+
fn = int(longline[:5])
|
|
69
|
+
glyphdata[fn] = longline
|
|
70
|
+
longline = None
|
|
71
|
+
|
|
72
|
+
# glyphdict[glyphindex] -> glyph data
|
|
73
|
+
|
|
74
|
+
hdict = {}
|
|
75
|
+
hershey = namedtuple('hershey', 'strokes width top bottom')
|
|
76
|
+
|
|
77
|
+
for i, glyphindex in enumerate(fontmap):
|
|
78
|
+
|
|
79
|
+
data = glyphdata[glyphindex]
|
|
80
|
+
npairs = int(data[5:8]) - 1
|
|
81
|
+
left = ord(data[8]) - ord('R')
|
|
82
|
+
right = ord(data[9]) - ord('R')
|
|
83
|
+
stroke = []
|
|
84
|
+
data = data[10:]
|
|
85
|
+
|
|
86
|
+
strokes = []
|
|
87
|
+
ydata = []
|
|
88
|
+
|
|
89
|
+
# build a list of continuous strokes, each is a list of (x,y) data
|
|
90
|
+
for _ in range(npairs):
|
|
91
|
+
pair = data[:2]
|
|
92
|
+
data = data[2:]
|
|
93
|
+
|
|
94
|
+
if pair == ' R':
|
|
95
|
+
# end of a stroke
|
|
96
|
+
strokes.append(stroke)
|
|
97
|
+
stroke = []
|
|
98
|
+
else:
|
|
99
|
+
# part of a stroke
|
|
100
|
+
x = ord(pair[0]) - ord('R') - left
|
|
101
|
+
y = ord(pair[1]) - ord('R') + 9
|
|
102
|
+
stroke.append((x / 25, -y / 25))
|
|
103
|
+
ydata.append(y)
|
|
104
|
+
|
|
105
|
+
if len(stroke) > 0:
|
|
106
|
+
strokes.append(stroke)
|
|
107
|
+
width = right - left
|
|
108
|
+
if len(ydata) > 0:
|
|
109
|
+
top = max(ydata)
|
|
110
|
+
bottom = min(ydata)
|
|
111
|
+
else:
|
|
112
|
+
top = 0
|
|
113
|
+
bottom = 0
|
|
114
|
+
|
|
115
|
+
width = (right - left) / 25
|
|
116
|
+
|
|
117
|
+
hdict[chr(i+32)] = {
|
|
118
|
+
'strokes': strokes,
|
|
119
|
+
'width': width,
|
|
120
|
+
'top': top / 25,
|
|
121
|
+
'bottom': bottom / 25
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
# plt.figure()
|
|
125
|
+
# if len(strokes) > 0:
|
|
126
|
+
# for stroke in strokes:
|
|
127
|
+
# xy = np.r_[stroke]
|
|
128
|
+
# plt.plot(xy[:,0], xy[:,1], linewidth=4)
|
|
129
|
+
# plt.xlim(0,1.5)
|
|
130
|
+
# plt.ylim(-1,0.5)
|
|
131
|
+
# plt.title(chr(i+32))
|
|
132
|
+
|
|
133
|
+
# plt.pause(0.2)
|
|
134
|
+
|
|
135
|
+
#pickle.dump(hdict, open("hershey.pickle", 'wb'))
|
|
136
|
+
json.dump(hdict, open("hershey.json", 'w'))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{" ": {"strokes": [], "width": 0.64, "top": 0.0, "bottom": 0.0}, "!": {"strokes": [[[0.2, 0.12], [0.2, -0.44]], [[0.2, -0.64], [0.16, -0.68], [0.2, -0.72], [0.24, -0.68], [0.2, -0.64]]], "width": 0.4, "top": 0.72, "bottom": -0.12}, "\"": {"strokes": [[[0.16, 0.12], [0.16, -0.16]], [[0.48, 0.12], [0.48, -0.16]]], "width": 0.64, "top": 0.16, "bottom": -0.12}, "#": {"strokes": [[[0.44, 0.28], [0.16, -1.0]], [[0.68, 0.28], [0.4, -1.0]], [[0.16, -0.24], [0.72, -0.24]], [[0.12, -0.48], [0.68, -0.48]]], "width": 0.84, "top": 1.0, "bottom": -0.28}, "$": {"strokes": [[[0.32, 0.28], [0.32, -0.88]], [[0.48, 0.28], [0.48, -0.88]], [[0.68, 0.0], [0.6, 0.08], [0.48, 0.12], [0.32, 0.12], [0.2, 0.08], [0.12, 0.0], [0.12, -0.08], [0.16, -0.16], [0.2, -0.2], [0.28, -0.24], [0.52, -0.32], [0.6, -0.36], [0.64, -0.4], [0.68, -0.48], [0.68, -0.6], [0.6, -0.68], [0.48, -0.72], [0.32, -0.72], [0.2, -0.68], [0.12, -0.6]]], "width": 0.8, "top": 0.88, "bottom": -0.28}, "%": {"strokes": [[[0.84, 0.12], [0.12, -0.72]], [[0.32, 0.12], [0.4, 0.04], [0.4, -0.04], [0.36, -0.12], [0.28, -0.16], [0.2, -0.16], [0.12, -0.08], [0.12, 0.0], [0.16, 0.08], [0.24, 0.12], [0.32, 0.12], [0.4, 0.08], [0.52, 0.04], [0.64, 0.04], [0.76, 0.08], [0.84, 0.12]], [[0.68, -0.44], [0.6, -0.48], [0.56, -0.56], [0.56, -0.64], [0.64, -0.72], [0.72, -0.72], [0.8, -0.68], [0.84, -0.6], [0.84, -0.52], [0.76, -0.44], [0.68, -0.44]]], "width": 0.96, "top": 0.72, "bottom": -0.12}, "&": {"strokes": [[[0.92, -0.24], [0.92, -0.2], [0.88, -0.16], [0.84, -0.16], [0.8, -0.2], [0.76, -0.28], [0.68, -0.48], [0.6, -0.6], [0.52, -0.68], [0.44, -0.72], [0.28, -0.72], [0.2, -0.68], [0.16, -0.64], [0.12, -0.56], [0.12, -0.48], [0.16, -0.4], [0.2, -0.36], [0.48, -0.2], [0.52, -0.16], [0.56, -0.08], [0.56, 0.0], [0.52, 0.08], [0.44, 0.12], [0.36, 0.08], [0.32, 0.0], [0.32, -0.08], [0.36, -0.2], [0.44, -0.32], [0.64, -0.6], [0.72, -0.68], [0.8, -0.72], [0.88, -0.72], [0.92, -0.68], [0.92, -0.64]]], "width": 1.04, "top": 0.72, "bottom": -0.12}, "'": {"strokes": [[[0.2, 0.04], [0.16, 0.08], [0.2, 0.12], [0.24, 0.08], [0.24, 0.0], [0.2, -0.08], [0.16, -0.12]]], "width": 0.4, "top": 0.12, "bottom": -0.12}, "(": {"strokes": [[[0.44, 0.28], [0.36, 0.2], [0.28, 0.08], [0.2, -0.08], [0.16, -0.28], [0.16, -0.44], [0.2, -0.64], [0.28, -0.8], [0.36, -0.92], [0.44, -1.0]]], "width": 0.56, "top": 1.0, "bottom": -0.28}, ")": {"strokes": [[[0.12, 0.28], [0.2, 0.2], [0.28, 0.08], [0.36, -0.08], [0.4, -0.28], [0.4, -0.44], [0.36, -0.64], [0.28, -0.8], [0.2, -0.92], [0.12, -1.0]]], "width": 0.56, "top": 1.0, "bottom": -0.28}, "*": {"strokes": [[[0.32, 0.12], [0.32, -0.36]], [[0.12, 0.0], [0.52, -0.24]], [[0.52, 0.0], [0.12, -0.24]]], "width": 0.64, "top": 0.36, "bottom": -0.12}, "+": {"strokes": [[[0.52, 0.0], [0.52, -0.72]], [[0.16, -0.36], [0.88, -0.36]]], "width": 1.04, "top": 0.72, "bottom": 0.0}, ",": {"strokes": [[[0.24, -0.68], [0.2, -0.72], [0.16, -0.68], [0.2, -0.64], [0.24, -0.68], [0.24, -0.76], [0.2, -0.84], [0.16, -0.88]]], "width": 0.4, "top": 0.88, "bottom": 0.64}, "-": {"strokes": [[[0.16, -0.36], [0.88, -0.36]]], "width": 1.04, "top": 0.36, "bottom": 0.36}, ".": {"strokes": [[[0.2, -0.64], [0.16, -0.68], [0.2, -0.72], [0.24, -0.68], [0.2, -0.64]]], "width": 0.4, "top": 0.72, "bottom": 0.64}, "/": {"strokes": [[[0.8, 0.28], [0.08, -1.0]]], "width": 0.88, "top": 1.0, "bottom": -0.28}, "0": {"strokes": [[[0.36, 0.12], [0.24, 0.08], [0.16, -0.04], [0.12, -0.24], [0.12, -0.36], [0.16, -0.56], [0.24, -0.68], [0.36, -0.72], [0.44, -0.72], [0.56, -0.68], [0.64, -0.56], [0.68, -0.36], [0.68, -0.24], [0.64, -0.04], [0.56, 0.08], [0.44, 0.12], [0.36, 0.12]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, "1": {"strokes": [[[0.24, -0.04], [0.32, 0.0], [0.44, 0.12], [0.44, -0.72]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, "2": {"strokes": [[[0.16, -0.08], [0.16, -0.04], [0.2, 0.04], [0.24, 0.08], [0.32, 0.12], [0.48, 0.12], [0.56, 0.08], [0.6, 0.04], [0.64, -0.04], [0.64, -0.12], [0.6, -0.2], [0.52, -0.32], [0.12, -0.72], [0.68, -0.72]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, "3": {"strokes": [[[0.2, 0.12], [0.64, 0.12], [0.4, -0.2], [0.52, -0.2], [0.6, -0.24], [0.64, -0.28], [0.68, -0.4], [0.68, -0.48], [0.64, -0.6], [0.56, -0.68], [0.44, -0.72], [0.32, -0.72], [0.2, -0.68], [0.16, -0.64], [0.12, -0.56]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, "4": {"strokes": [[[0.52, 0.12], [0.12, -0.44], [0.72, -0.44]], [[0.52, 0.12], [0.52, -0.72]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, "5": {"strokes": [[[0.6, 0.12], [0.2, 0.12], [0.16, -0.24], [0.2, -0.2], [0.32, -0.16], [0.44, -0.16], [0.56, -0.2], [0.64, -0.28], [0.68, -0.4], [0.68, -0.48], [0.64, -0.6], [0.56, -0.68], [0.44, -0.72], [0.32, -0.72], [0.2, -0.68], [0.16, -0.64], [0.12, -0.56]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, "6": {"strokes": [[[0.64, 0.0], [0.6, 0.08], [0.48, 0.12], [0.4, 0.12], [0.28, 0.08], [0.2, -0.04], [0.16, -0.24], [0.16, -0.44], [0.2, -0.6], [0.28, -0.68], [0.4, -0.72], [0.44, -0.72], [0.56, -0.68], [0.64, -0.6], [0.68, -0.48], [0.68, -0.44], [0.64, -0.32], [0.56, -0.24], [0.44, -0.2], [0.4, -0.2], [0.28, -0.24], [0.2, -0.32], [0.16, -0.44]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, "7": {"strokes": [[[0.68, 0.12], [0.28, -0.72]], [[0.12, 0.12], [0.68, 0.12]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, "8": {"strokes": [[[0.32, 0.12], [0.2, 0.08], [0.16, 0.0], [0.16, -0.08], [0.2, -0.16], [0.28, -0.2], [0.44, -0.24], [0.56, -0.28], [0.64, -0.36], [0.68, -0.44], [0.68, -0.56], [0.64, -0.64], [0.6, -0.68], [0.48, -0.72], [0.32, -0.72], [0.2, -0.68], [0.16, -0.64], [0.12, -0.56], [0.12, -0.44], [0.16, -0.36], [0.24, -0.28], [0.36, -0.24], [0.52, -0.2], [0.6, -0.16], [0.64, -0.08], [0.64, 0.0], [0.6, 0.08], [0.48, 0.12], [0.32, 0.12]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, "9": {"strokes": [[[0.64, -0.16], [0.6, -0.28], [0.52, -0.36], [0.4, -0.4], [0.36, -0.4], [0.24, -0.36], [0.16, -0.28], [0.12, -0.16], [0.12, -0.12], [0.16, 0.0], [0.24, 0.08], [0.36, 0.12], [0.4, 0.12], [0.52, 0.08], [0.6, 0.0], [0.64, -0.16], [0.64, -0.36], [0.6, -0.56], [0.52, -0.68], [0.4, -0.72], [0.32, -0.72], [0.2, -0.68], [0.16, -0.6]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, ":": {"strokes": [[[0.2, -0.16], [0.16, -0.2], [0.2, -0.24], [0.24, -0.2], [0.2, -0.16]], [[0.2, -0.64], [0.16, -0.68], [0.2, -0.72], [0.24, -0.68], [0.2, -0.64]]], "width": 0.4, "top": 0.72, "bottom": 0.16}, ";": {"strokes": [[[0.2, -0.16], [0.16, -0.2], [0.2, -0.24], [0.24, -0.2], [0.2, -0.16]], [[0.24, -0.68], [0.2, -0.72], [0.16, -0.68], [0.2, -0.64], [0.24, -0.68], [0.24, -0.76], [0.2, -0.84], [0.16, -0.88]]], "width": 0.4, "top": 0.88, "bottom": 0.16}, "<": {"strokes": [[[0.8, 0.0], [0.16, -0.36], [0.8, -0.72]]], "width": 0.96, "top": 0.72, "bottom": 0.0}, "=": {"strokes": [[[0.16, -0.24], [0.88, -0.24]], [[0.16, -0.48], [0.88, -0.48]]], "width": 1.04, "top": 0.48, "bottom": 0.24}, ">": {"strokes": [[[0.16, 0.0], [0.8, -0.36], [0.16, -0.72]]], "width": 0.96, "top": 0.72, "bottom": 0.0}, "?": {"strokes": [[[0.12, -0.08], [0.12, -0.04], [0.16, 0.04], [0.2, 0.08], [0.28, 0.12], [0.44, 0.12], [0.52, 0.08], [0.56, 0.04], [0.6, -0.04], [0.6, -0.12], [0.56, -0.2], [0.52, -0.24], [0.36, -0.32], [0.36, -0.44]], [[0.36, -0.64], [0.32, -0.68], [0.36, -0.72], [0.4, -0.68], [0.36, -0.64]]], "width": 0.72, "top": 0.72, "bottom": -0.12}, "@": {"strokes": [[[0.72, -0.2], [0.68, -0.12], [0.6, -0.08], [0.48, -0.08], [0.4, -0.12], [0.36, -0.16], [0.32, -0.28], [0.32, -0.4], [0.36, -0.48], [0.44, -0.52], [0.56, -0.52], [0.64, -0.48], [0.68, -0.4]], [[0.48, -0.08], [0.4, -0.16], [0.36, -0.28], [0.36, -0.4], [0.4, -0.48], [0.44, -0.52]], [[0.72, -0.08], [0.68, -0.4], [0.68, -0.48], [0.76, -0.52], [0.84, -0.52], [0.92, -0.44], [0.96, -0.32], [0.96, -0.24], [0.92, -0.12], [0.88, -0.04], [0.8, 0.04], [0.72, 0.08], [0.6, 0.12], [0.48, 0.12], [0.36, 0.08], [0.28, 0.04], [0.2, -0.04], [0.16, -0.12], [0.12, -0.24], [0.12, -0.36], [0.16, -0.48], [0.2, -0.56], [0.28, -0.64], [0.36, -0.68], [0.48, -0.72], [0.6, -0.72], [0.72, -0.68], [0.8, -0.64], [0.84, -0.6]], [[0.76, -0.08], [0.72, -0.4], [0.72, -0.48], [0.76, -0.52]]], "width": 1.08, "top": 0.72, "bottom": -0.12}, "A": {"strokes": [[[0.36, 0.12], [0.04, -0.72]], [[0.36, 0.12], [0.68, -0.72]], [[0.16, -0.44], [0.56, -0.44]]], "width": 0.72, "top": 0.72, "bottom": -0.12}, "B": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.16, 0.12], [0.52, 0.12], [0.64, 0.08], [0.68, 0.04], [0.72, -0.04], [0.72, -0.12], [0.68, -0.2], [0.64, -0.24], [0.52, -0.28]], [[0.16, -0.28], [0.52, -0.28], [0.64, -0.32], [0.68, -0.36], [0.72, -0.44], [0.72, -0.56], [0.68, -0.64], [0.64, -0.68], [0.52, -0.72], [0.16, -0.72]]], "width": 0.84, "top": 0.72, "bottom": -0.12}, "C": {"strokes": [[[0.72, -0.08], [0.68, 0.0], [0.6, 0.08], [0.52, 0.12], [0.36, 0.12], [0.28, 0.08], [0.2, 0.0], [0.16, -0.08], [0.12, -0.2], [0.12, -0.4], [0.16, -0.52], [0.2, -0.6], [0.28, -0.68], [0.36, -0.72], [0.52, -0.72], [0.6, -0.68], [0.68, -0.6], [0.72, -0.52]]], "width": 0.84, "top": 0.72, "bottom": -0.12}, "D": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.16, 0.12], [0.44, 0.12], [0.56, 0.08], [0.64, 0.0], [0.68, -0.08], [0.72, -0.2], [0.72, -0.4], [0.68, -0.52], [0.64, -0.6], [0.56, -0.68], [0.44, -0.72], [0.16, -0.72]]], "width": 0.84, "top": 0.72, "bottom": -0.12}, "E": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.16, 0.12], [0.68, 0.12]], [[0.16, -0.28], [0.48, -0.28]], [[0.16, -0.72], [0.68, -0.72]]], "width": 0.76, "top": 0.72, "bottom": -0.12}, "F": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.16, 0.12], [0.68, 0.12]], [[0.16, -0.28], [0.48, -0.28]]], "width": 0.72, "top": 0.72, "bottom": -0.12}, "G": {"strokes": [[[0.72, -0.08], [0.68, 0.0], [0.6, 0.08], [0.52, 0.12], [0.36, 0.12], [0.28, 0.08], [0.2, 0.0], [0.16, -0.08], [0.12, -0.2], [0.12, -0.4], [0.16, -0.52], [0.2, -0.6], [0.28, -0.68], [0.36, -0.72], [0.52, -0.72], [0.6, -0.68], [0.68, -0.6], [0.72, -0.52], [0.72, -0.4]], [[0.52, -0.4], [0.72, -0.4]]], "width": 0.84, "top": 0.72, "bottom": -0.12}, "H": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.72, 0.12], [0.72, -0.72]], [[0.16, -0.28], [0.72, -0.28]]], "width": 0.88, "top": 0.72, "bottom": -0.12}, "I": {"strokes": [[[0.16, 0.12], [0.16, -0.72]]], "width": 0.32, "top": 0.72, "bottom": -0.12}, "J": {"strokes": [[[0.48, 0.12], [0.48, -0.52], [0.44, -0.64], [0.4, -0.68], [0.32, -0.72], [0.24, -0.72], [0.16, -0.68], [0.12, -0.64], [0.08, -0.52], [0.08, -0.44]]], "width": 0.64, "top": 0.72, "bottom": -0.12}, "K": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.72, 0.12], [0.16, -0.44]], [[0.36, -0.24], [0.72, -0.72]]], "width": 0.84, "top": 0.72, "bottom": -0.12}, "L": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.16, -0.72], [0.64, -0.72]]], "width": 0.68, "top": 0.72, "bottom": -0.12}, "M": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.16, 0.12], [0.48, -0.72]], [[0.8, 0.12], [0.48, -0.72]], [[0.8, 0.12], [0.8, -0.72]]], "width": 0.96, "top": 0.72, "bottom": -0.12}, "N": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.16, 0.12], [0.72, -0.72]], [[0.72, 0.12], [0.72, -0.72]]], "width": 0.88, "top": 0.72, "bottom": -0.12}, "O": {"strokes": [[[0.36, 0.12], [0.28, 0.08], [0.2, 0.0], [0.16, -0.08], [0.12, -0.2], [0.12, -0.4], [0.16, -0.52], [0.2, -0.6], [0.28, -0.68], [0.36, -0.72], [0.52, -0.72], [0.6, -0.68], [0.68, -0.6], [0.72, -0.52], [0.76, -0.4], [0.76, -0.2], [0.72, -0.08], [0.68, 0.0], [0.6, 0.08], [0.52, 0.12], [0.36, 0.12]]], "width": 0.88, "top": 0.72, "bottom": -0.12}, "P": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.16, 0.12], [0.52, 0.12], [0.64, 0.08], [0.68, 0.04], [0.72, -0.04], [0.72, -0.16], [0.68, -0.24], [0.64, -0.28], [0.52, -0.32], [0.16, -0.32]]], "width": 0.84, "top": 0.72, "bottom": -0.12}, "Q": {"strokes": [[[0.36, 0.12], [0.28, 0.08], [0.2, 0.0], [0.16, -0.08], [0.12, -0.2], [0.12, -0.4], [0.16, -0.52], [0.2, -0.6], [0.28, -0.68], [0.36, -0.72], [0.52, -0.72], [0.6, -0.68], [0.68, -0.6], [0.72, -0.52], [0.76, -0.4], [0.76, -0.2], [0.72, -0.08], [0.68, 0.0], [0.6, 0.08], [0.52, 0.12], [0.36, 0.12]], [[0.48, -0.56], [0.72, -0.8]]], "width": 0.88, "top": 0.8, "bottom": -0.12}, "R": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.16, 0.12], [0.52, 0.12], [0.64, 0.08], [0.68, 0.04], [0.72, -0.04], [0.72, -0.12], [0.68, -0.2], [0.64, -0.24], [0.52, -0.28], [0.16, -0.28]], [[0.44, -0.28], [0.72, -0.72]]], "width": 0.84, "top": 0.72, "bottom": -0.12}, "S": {"strokes": [[[0.68, 0.0], [0.6, 0.08], [0.48, 0.12], [0.32, 0.12], [0.2, 0.08], [0.12, 0.0], [0.12, -0.08], [0.16, -0.16], [0.2, -0.2], [0.28, -0.24], [0.52, -0.32], [0.6, -0.36], [0.64, -0.4], [0.68, -0.48], [0.68, -0.6], [0.6, -0.68], [0.48, -0.72], [0.32, -0.72], [0.2, -0.68], [0.12, -0.6]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, "T": {"strokes": [[[0.32, 0.12], [0.32, -0.72]], [[0.04, 0.12], [0.6, 0.12]]], "width": 0.64, "top": 0.72, "bottom": -0.12}, "U": {"strokes": [[[0.16, 0.12], [0.16, -0.48], [0.2, -0.6], [0.28, -0.68], [0.4, -0.72], [0.48, -0.72], [0.6, -0.68], [0.68, -0.6], [0.72, -0.48], [0.72, 0.12]]], "width": 0.88, "top": 0.72, "bottom": -0.12}, "V": {"strokes": [[[0.04, 0.12], [0.36, -0.72]], [[0.68, 0.12], [0.36, -0.72]]], "width": 0.72, "top": 0.72, "bottom": -0.12}, "W": {"strokes": [[[0.08, 0.12], [0.28, -0.72]], [[0.48, 0.12], [0.28, -0.72]], [[0.48, 0.12], [0.68, -0.72]], [[0.88, 0.12], [0.68, -0.72]]], "width": 0.96, "top": 0.72, "bottom": -0.12}, "X": {"strokes": [[[0.12, 0.12], [0.68, -0.72]], [[0.68, 0.12], [0.12, -0.72]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, "Y": {"strokes": [[[0.04, 0.12], [0.36, -0.28], [0.36, -0.72]], [[0.68, 0.12], [0.36, -0.28]]], "width": 0.72, "top": 0.72, "bottom": -0.12}, "Z": {"strokes": [[[0.68, 0.12], [0.12, -0.72]], [[0.12, 0.12], [0.68, 0.12]], [[0.12, -0.72], [0.68, -0.72]]], "width": 0.8, "top": 0.72, "bottom": -0.12}, "[": {"strokes": [[[0.16, 0.28], [0.16, -1.0]], [[0.2, 0.28], [0.2, -1.0]], [[0.16, 0.28], [0.44, 0.28]], [[0.16, -1.0], [0.44, -1.0]]], "width": 0.56, "top": 1.0, "bottom": -0.28}, "\\": {"strokes": [[[0.0, 0.12], [0.56, -0.84]]], "width": 0.56, "top": 0.84, "bottom": -0.12}, "]": {"strokes": [[[0.36, 0.28], [0.36, -1.0]], [[0.4, 0.28], [0.4, -1.0]], [[0.12, 0.28], [0.4, 0.28]], [[0.12, -1.0], [0.4, -1.0]]], "width": 0.56, "top": 1.0, "bottom": -0.28}, "^": {"strokes": [[[0.24, -0.12], [0.32, 0.0], [0.4, -0.12]], [[0.12, -0.24], [0.32, -0.04], [0.52, -0.24]], [[0.32, -0.04], [0.32, -0.72]]], "width": 0.64, "top": 0.72, "bottom": 0.0}, "_": {"strokes": [[[0.0, -0.8], [0.64, -0.8]]], "width": 0.64, "top": 0.8, "bottom": 0.8}, "`": {"strokes": [[[0.24, 0.12], [0.2, 0.08], [0.16, 0.0], [0.16, -0.08], [0.2, -0.12], [0.24, -0.08], [0.2, -0.04]]], "width": 0.4, "top": 0.12, "bottom": -0.12}, "a": {"strokes": [[[0.6, -0.16], [0.6, -0.72]], [[0.6, -0.28], [0.52, -0.2], [0.44, -0.16], [0.32, -0.16], [0.24, -0.2], [0.16, -0.28], [0.12, -0.4], [0.12, -0.48], [0.16, -0.6], [0.24, -0.68], [0.32, -0.72], [0.44, -0.72], [0.52, -0.68], [0.6, -0.6]]], "width": 0.76, "top": 0.72, "bottom": 0.16}, "b": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.16, -0.28], [0.24, -0.2], [0.32, -0.16], [0.44, -0.16], [0.52, -0.2], [0.6, -0.28], [0.64, -0.4], [0.64, -0.48], [0.6, -0.6], [0.52, -0.68], [0.44, -0.72], [0.32, -0.72], [0.24, -0.68], [0.16, -0.6]]], "width": 0.76, "top": 0.72, "bottom": -0.12}, "c": {"strokes": [[[0.6, -0.28], [0.52, -0.2], [0.44, -0.16], [0.32, -0.16], [0.24, -0.2], [0.16, -0.28], [0.12, -0.4], [0.12, -0.48], [0.16, -0.6], [0.24, -0.68], [0.32, -0.72], [0.44, -0.72], [0.52, -0.68], [0.6, -0.6]]], "width": 0.72, "top": 0.72, "bottom": 0.16}, "d": {"strokes": [[[0.6, 0.12], [0.6, -0.72]], [[0.6, -0.28], [0.52, -0.2], [0.44, -0.16], [0.32, -0.16], [0.24, -0.2], [0.16, -0.28], [0.12, -0.4], [0.12, -0.48], [0.16, -0.6], [0.24, -0.68], [0.32, -0.72], [0.44, -0.72], [0.52, -0.68], [0.6, -0.6]]], "width": 0.76, "top": 0.72, "bottom": -0.12}, "e": {"strokes": [[[0.12, -0.4], [0.6, -0.4], [0.6, -0.32], [0.56, -0.24], [0.52, -0.2], [0.44, -0.16], [0.32, -0.16], [0.24, -0.2], [0.16, -0.28], [0.12, -0.4], [0.12, -0.48], [0.16, -0.6], [0.24, -0.68], [0.32, -0.72], [0.44, -0.72], [0.52, -0.68], [0.6, -0.6]]], "width": 0.72, "top": 0.72, "bottom": 0.16}, "f": {"strokes": [[[0.4, 0.12], [0.32, 0.12], [0.24, 0.08], [0.2, -0.04], [0.2, -0.72]], [[0.08, -0.16], [0.36, -0.16]]], "width": 0.48, "top": 0.72, "bottom": -0.12}, "g": {"strokes": [[[0.6, -0.16], [0.6, -0.8], [0.56, -0.92], [0.52, -0.96], [0.44, -1.0], [0.32, -1.0], [0.24, -0.96]], [[0.6, -0.28], [0.52, -0.2], [0.44, -0.16], [0.32, -0.16], [0.24, -0.2], [0.16, -0.28], [0.12, -0.4], [0.12, -0.48], [0.16, -0.6], [0.24, -0.68], [0.32, -0.72], [0.44, -0.72], [0.52, -0.68], [0.6, -0.6]]], "width": 0.76, "top": 1.0, "bottom": 0.16}, "h": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.16, -0.32], [0.28, -0.2], [0.36, -0.16], [0.48, -0.16], [0.56, -0.2], [0.6, -0.32], [0.6, -0.72]]], "width": 0.76, "top": 0.72, "bottom": -0.12}, "i": {"strokes": [[[0.12, 0.12], [0.16, 0.08], [0.2, 0.12], [0.16, 0.16], [0.12, 0.12]], [[0.16, -0.16], [0.16, -0.72]]], "width": 0.32, "top": 0.72, "bottom": -0.16}, "j": {"strokes": [[[0.2, 0.12], [0.24, 0.08], [0.28, 0.12], [0.24, 0.16], [0.2, 0.12]], [[0.24, -0.16], [0.24, -0.84], [0.2, -0.96], [0.12, -1.0], [0.04, -1.0]]], "width": 0.4, "top": 1.0, "bottom": -0.16}, "k": {"strokes": [[[0.16, 0.12], [0.16, -0.72]], [[0.56, -0.16], [0.16, -0.56]], [[0.32, -0.4], [0.6, -0.72]]], "width": 0.68, "top": 0.72, "bottom": -0.12}, "l": {"strokes": [[[0.16, 0.12], [0.16, -0.72]]], "width": 0.32, "top": 0.72, "bottom": -0.12}, "m": {"strokes": [[[0.16, -0.16], [0.16, -0.72]], [[0.16, -0.32], [0.28, -0.2], [0.36, -0.16], [0.48, -0.16], [0.56, -0.2], [0.6, -0.32], [0.6, -0.72]], [[0.6, -0.32], [0.72, -0.2], [0.8, -0.16], [0.92, -0.16], [1.0, -0.2], [1.04, -0.32], [1.04, -0.72]]], "width": 1.2, "top": 0.72, "bottom": 0.16}, "n": {"strokes": [[[0.16, -0.16], [0.16, -0.72]], [[0.16, -0.32], [0.28, -0.2], [0.36, -0.16], [0.48, -0.16], [0.56, -0.2], [0.6, -0.32], [0.6, -0.72]]], "width": 0.76, "top": 0.72, "bottom": 0.16}, "o": {"strokes": [[[0.32, -0.16], [0.24, -0.2], [0.16, -0.28], [0.12, -0.4], [0.12, -0.48], [0.16, -0.6], [0.24, -0.68], [0.32, -0.72], [0.44, -0.72], [0.52, -0.68], [0.6, -0.6], [0.64, -0.48], [0.64, -0.4], [0.6, -0.28], [0.52, -0.2], [0.44, -0.16], [0.32, -0.16]]], "width": 0.76, "top": 0.72, "bottom": 0.16}, "p": {"strokes": [[[0.16, -0.16], [0.16, -1.0]], [[0.16, -0.28], [0.24, -0.2], [0.32, -0.16], [0.44, -0.16], [0.52, -0.2], [0.6, -0.28], [0.64, -0.4], [0.64, -0.48], [0.6, -0.6], [0.52, -0.68], [0.44, -0.72], [0.32, -0.72], [0.24, -0.68], [0.16, -0.6]]], "width": 0.76, "top": 1.0, "bottom": 0.16}, "q": {"strokes": [[[0.6, -0.16], [0.6, -1.0]], [[0.6, -0.28], [0.52, -0.2], [0.44, -0.16], [0.32, -0.16], [0.24, -0.2], [0.16, -0.28], [0.12, -0.4], [0.12, -0.48], [0.16, -0.6], [0.24, -0.68], [0.32, -0.72], [0.44, -0.72], [0.52, -0.68], [0.6, -0.6]]], "width": 0.76, "top": 1.0, "bottom": 0.16}, "r": {"strokes": [[[0.16, -0.16], [0.16, -0.72]], [[0.16, -0.4], [0.2, -0.28], [0.28, -0.2], [0.36, -0.16], [0.48, -0.16]]], "width": 0.52, "top": 0.72, "bottom": 0.16}, "s": {"strokes": [[[0.56, -0.28], [0.52, -0.2], [0.4, -0.16], [0.28, -0.16], [0.16, -0.2], [0.12, -0.28], [0.16, -0.36], [0.24, -0.4], [0.44, -0.44], [0.52, -0.48], [0.56, -0.56], [0.56, -0.6], [0.52, -0.68], [0.4, -0.72], [0.28, -0.72], [0.16, -0.68], [0.12, -0.6]]], "width": 0.68, "top": 0.72, "bottom": 0.16}, "t": {"strokes": [[[0.2, 0.12], [0.2, -0.56], [0.24, -0.68], [0.32, -0.72], [0.4, -0.72]], [[0.08, -0.16], [0.36, -0.16]]], "width": 0.48, "top": 0.72, "bottom": -0.12}, "u": {"strokes": [[[0.16, -0.16], [0.16, -0.56], [0.2, -0.68], [0.28, -0.72], [0.4, -0.72], [0.48, -0.68], [0.6, -0.56]], [[0.6, -0.16], [0.6, -0.72]]], "width": 0.76, "top": 0.72, "bottom": 0.16}, "v": {"strokes": [[[0.08, -0.16], [0.32, -0.72]], [[0.56, -0.16], [0.32, -0.72]]], "width": 0.64, "top": 0.72, "bottom": 0.16}, "w": {"strokes": [[[0.12, -0.16], [0.28, -0.72]], [[0.44, -0.16], [0.28, -0.72]], [[0.44, -0.16], [0.6, -0.72]], [[0.76, -0.16], [0.6, -0.72]]], "width": 0.88, "top": 0.72, "bottom": 0.16}, "x": {"strokes": [[[0.12, -0.16], [0.56, -0.72]], [[0.56, -0.16], [0.12, -0.72]]], "width": 0.68, "top": 0.72, "bottom": 0.16}, "y": {"strokes": [[[0.08, -0.16], [0.32, -0.72]], [[0.56, -0.16], [0.32, -0.72], [0.24, -0.88], [0.16, -0.96], [0.08, -1.0], [0.04, -1.0]]], "width": 0.64, "top": 1.0, "bottom": 0.16}, "z": {"strokes": [[[0.56, -0.16], [0.12, -0.72]], [[0.12, -0.16], [0.56, -0.16]], [[0.12, -0.72], [0.56, -0.72]]], "width": 0.68, "top": 0.72, "bottom": 0.16}, "{": {"strokes": [[[0.36, 0.28], [0.28, 0.24], [0.24, 0.2], [0.2, 0.12], [0.2, 0.04], [0.24, -0.04], [0.28, -0.08], [0.32, -0.16], [0.32, -0.24], [0.24, -0.32]], [[0.28, 0.24], [0.24, 0.16], [0.24, 0.08], [0.28, 0.0], [0.32, -0.04], [0.36, -0.12], [0.36, -0.2], [0.32, -0.28], [0.16, -0.36], [0.32, -0.44], [0.36, -0.52], [0.36, -0.6], [0.32, -0.68], [0.28, -0.72], [0.24, -0.8], [0.24, -0.88], [0.28, -0.96]], [[0.24, -0.4], [0.32, -0.48], [0.32, -0.56], [0.28, -0.64], [0.24, -0.68], [0.2, -0.76], [0.2, -0.84], [0.24, -0.92], [0.28, -0.96], [0.36, -1.0]]], "width": 0.56, "top": 1.0, "bottom": -0.28}, "|": {"strokes": [[[0.16, 0.28], [0.16, -1.0]]], "width": 0.32, "top": 1.0, "bottom": -0.28}, "}": {"strokes": [[[0.2, 0.28], [0.28, 0.24], [0.32, 0.2], [0.36, 0.12], [0.36, 0.04], [0.32, -0.04], [0.28, -0.08], [0.24, -0.16], [0.24, -0.24], [0.32, -0.32]], [[0.28, 0.24], [0.32, 0.16], [0.32, 0.08], [0.28, 0.0], [0.24, -0.04], [0.2, -0.12], [0.2, -0.2], [0.24, -0.28], [0.4, -0.36], [0.24, -0.44], [0.2, -0.52], [0.2, -0.6], [0.24, -0.68], [0.28, -0.72], [0.32, -0.8], [0.32, -0.88], [0.28, -0.96]], [[0.32, -0.4], [0.24, -0.48], [0.24, -0.56], [0.28, -0.64], [0.32, -0.68], [0.36, -0.76], [0.36, -0.84], [0.32, -0.92], [0.28, -0.96], [0.2, -1.0]]], "width": 0.56, "top": 1.0, "bottom": -0.28}, "~": {"strokes": [[[0.12, -0.48], [0.12, -0.4], [0.16, -0.28], [0.24, -0.24], [0.32, -0.24], [0.4, -0.28], [0.56, -0.4], [0.64, -0.44], [0.72, -0.44], [0.8, -0.4], [0.84, -0.32]], [[0.12, -0.4], [0.16, -0.32], [0.24, -0.28], [0.32, -0.28], [0.4, -0.32], [0.56, -0.44], [0.64, -0.48], [0.72, -0.48], [0.8, -0.44], [0.84, -0.32], [0.84, -0.24]]], "width": 0.96, "top": 0.48, "bottom": 0.24}, "\u007f": {"strokes": [[[0.24, 0.12], [0.16, 0.08], [0.12, 0.0], [0.12, -0.08], [0.16, -0.16], [0.24, -0.2], [0.32, -0.2], [0.4, -0.16], [0.44, -0.08], [0.44, 0.0], [0.4, 0.08], [0.32, 0.12], [0.24, 0.12]]], "width": 0.56, "top": 0.2, "bottom": -0.12}}
|