three-cad-viewer 2.1.2 → 2.2.0

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.
package/src/display.js CHANGED
@@ -11,7 +11,11 @@ function TEMPLATE(id) {
11
11
  const shift = KeyMapper.getshortcuts("shift");
12
12
  const ctrl = KeyMapper.getshortcuts("ctrl");
13
13
  const meta = KeyMapper.getshortcuts("meta");
14
- var html = template.replaceAll("{{id}}", id).replaceAll("{{shift}}", shift).replaceAll("{{ctrl}}", ctrl).replaceAll("{{meta}}", meta);
14
+ var html = template
15
+ .replaceAll("{{id}}", id)
16
+ .replaceAll("{{shift}}", shift)
17
+ .replaceAll("{{ctrl}}", ctrl)
18
+ .replaceAll("{{meta}}", meta);
15
19
  return html;
16
20
  }
17
21
 
@@ -19,12 +23,7 @@ function px(val) {
19
23
  return `${val}px`;
20
24
  }
21
25
 
22
- const buttons = [
23
- "plane",
24
- "play",
25
- "pause",
26
- "stop",
27
- ];
26
+ const buttons = ["plane", "play", "pause", "stop"];
28
27
 
29
28
  class Display {
30
29
  /**
@@ -42,11 +41,20 @@ class Display {
42
41
  this.cadBody = this._getElement("tcv_cad_body");
43
42
 
44
43
  // this.cadTool = this._getElement("tcv_cad_toolbar");
45
- this.cadTool = new Toolbar(this._getElement("tcv_cad_toolbar"), container.id);
44
+ this.cadTool = new Toolbar(
45
+ this._getElement("tcv_cad_toolbar"),
46
+ container.id,
47
+ );
46
48
  this.cadView = this._getElement("tcv_cad_view");
47
- this.distanceMeasurementPanel = this._getElement("tcv_distance_measurement_panel");
48
- this.propertiesMeasurementPanel = this._getElement("tcv_properties_measurement_panel");
49
- this.angleMeasurementPanel = this._getElement("tcv_angle_measurement_panel");
49
+ this.distanceMeasurementPanel = this._getElement(
50
+ "tcv_distance_measurement_panel",
51
+ );
52
+ this.propertiesMeasurementPanel = this._getElement(
53
+ "tcv_properties_measurement_panel",
54
+ );
55
+ this.angleMeasurementPanel = this._getElement(
56
+ "tcv_angle_measurement_panel",
57
+ );
50
58
  this.cadTree = this._getElement("tcv_cad_tree_container");
51
59
  this.cadTreeToggles = this._getElement("tcv_cad_tree_toggles");
52
60
  this.cadClip = this._getElement("tcv_cad_clip_container");
@@ -79,6 +87,7 @@ class Display {
79
87
  this.cadClip.style.display = "none";
80
88
  this.cadMaterial.style.display = "none";
81
89
  this.clipSliders = null;
90
+ this.explodeFlag = false;
82
91
 
83
92
  this.lastPlaneState = false;
84
93
 
@@ -108,50 +117,147 @@ class Display {
108
117
 
109
118
  this.toolbarButtons = {};
110
119
 
111
- this.toolbarButtons["axes"] = new ClickButton(theme, "axes", "Show axes", this.setAxes);
120
+ this.toolbarButtons["axes"] = new ClickButton(
121
+ theme,
122
+ "axes",
123
+ "Show axes",
124
+ this.setAxes,
125
+ );
112
126
  this.cadTool.addButton(this.toolbarButtons["axes"]);
113
- this.toolbarButtons["axes0"] = new ClickButton(theme, "axes0", "Show axes at origin (0,0,0)", this.setAxes0);
127
+ this.toolbarButtons["axes0"] = new ClickButton(
128
+ theme,
129
+ "axes0",
130
+ "Show axes at origin (0,0,0)",
131
+ this.setAxes0,
132
+ );
114
133
  this.cadTool.addButton(this.toolbarButtons["axes0"]);
115
- this.toolbarButtons["grid"] = new ClickButton(theme, "grid", "Show grid", this.setGrid, null, ["xy", "xz", "yz"]);
134
+ this.toolbarButtons["grid"] = new ClickButton(
135
+ theme,
136
+ "grid",
137
+ "Show grid",
138
+ this.setGrid,
139
+ null,
140
+ ["xy", "xz", "yz"],
141
+ );
116
142
  this.cadTool.addButton(this.toolbarButtons["grid"]);
117
143
  this.cadTool.addSeparator();
118
- this.toolbarButtons["perspective"] = new ClickButton(theme, "perspective", "Use perspective camera", this.setOrtho);
144
+ this.toolbarButtons["perspective"] = new ClickButton(
145
+ theme,
146
+ "perspective",
147
+ "Use perspective camera",
148
+ this.setOrtho,
149
+ );
119
150
  this.cadTool.addButton(this.toolbarButtons["perspective"]);
120
- this.toolbarButtons["transparent"] = new ClickButton(theme, "transparent", "Show transparent faces", this.setTransparent);
151
+ this.toolbarButtons["transparent"] = new ClickButton(
152
+ theme,
153
+ "transparent",
154
+ "Show transparent faces",
155
+ this.setTransparent,
156
+ );
121
157
  this.cadTool.addButton(this.toolbarButtons["transparent"]);
122
- this.toolbarButtons["blackedges"] = new ClickButton(theme, "blackedges", "Show black edges", this.setBlackEdges);
158
+ this.toolbarButtons["blackedges"] = new ClickButton(
159
+ theme,
160
+ "blackedges",
161
+ "Show black edges",
162
+ this.setBlackEdges,
163
+ );
123
164
  this.cadTool.addButton(this.toolbarButtons["blackedges"]);
124
165
  this.cadTool.addSeparator();
125
166
 
126
- this.toolbarButtons["reset"] = new Button(theme, "reset", "Reset view", this.reset);
167
+ this.toolbarButtons["reset"] = new Button(
168
+ theme,
169
+ "reset",
170
+ "Reset view",
171
+ this.reset,
172
+ );
127
173
  this.cadTool.addButton(this.toolbarButtons["reset"]);
128
- this.toolbarButtons["resize"] = new Button(theme, "resize", "Resize object", this.resize);
174
+ this.toolbarButtons["resize"] = new Button(
175
+ theme,
176
+ "resize",
177
+ "Resize object",
178
+ this.resize,
179
+ );
129
180
  this.cadTool.addButton(this.toolbarButtons["resize"]);
130
181
  this.cadTool.addSeparator();
131
182
 
132
- this.toolbarButtons["iso"] = new Button(theme, "iso", "Switch to iso view", this.setView);
183
+ this.toolbarButtons["iso"] = new Button(
184
+ theme,
185
+ "iso",
186
+ "Switch to iso view",
187
+ this.setView,
188
+ );
133
189
  this.cadTool.addButton(this.toolbarButtons["iso"]);
134
- this.toolbarButtons["front"] = new Button(theme, "front", "Switch to front view", this.setView);
190
+ this.toolbarButtons["front"] = new Button(
191
+ theme,
192
+ "front",
193
+ "Switch to front view",
194
+ this.setView,
195
+ );
135
196
  this.cadTool.addButton(this.toolbarButtons["front"]);
136
- this.toolbarButtons["rear"] = new Button(theme, "rear", "Switch to back view", this.setView);
197
+ this.toolbarButtons["rear"] = new Button(
198
+ theme,
199
+ "rear",
200
+ "Switch to back view",
201
+ this.setView,
202
+ );
137
203
  this.cadTool.addButton(this.toolbarButtons["rear"]);
138
- this.toolbarButtons["top"] = new Button(theme, "top", "Switch to top view", this.setView);
204
+ this.toolbarButtons["top"] = new Button(
205
+ theme,
206
+ "top",
207
+ "Switch to top view",
208
+ this.setView,
209
+ );
139
210
  this.cadTool.addButton(this.toolbarButtons["top"]);
140
- this.toolbarButtons["bottom"] = new Button(theme, "bottom", "Switch to bottom view", this.setView);
211
+ this.toolbarButtons["bottom"] = new Button(
212
+ theme,
213
+ "bottom",
214
+ "Switch to bottom view",
215
+ this.setView,
216
+ );
141
217
  this.cadTool.addButton(this.toolbarButtons["bottom"]);
142
- this.toolbarButtons["left"] = new Button(theme, "left", "Switch to left view", this.setView);
218
+ this.toolbarButtons["left"] = new Button(
219
+ theme,
220
+ "left",
221
+ "Switch to left view",
222
+ this.setView,
223
+ );
143
224
  this.cadTool.addButton(this.toolbarButtons["left"]);
144
- this.toolbarButtons["right"] = new Button(theme, "right", "Switch to right view", this.setView);
225
+ this.toolbarButtons["right"] = new Button(
226
+ theme,
227
+ "right",
228
+ "Switch to right view",
229
+ this.setView,
230
+ );
145
231
  this.cadTool.addButton(this.toolbarButtons["right"]);
146
232
  this.cadTool.addSeparator();
147
233
 
148
- this.toolbarButtons["explode"] = new ClickButton(theme, "explode", "Explode tool", this.setExplode);
234
+ this.toolbarButtons["explode"] = new ClickButton(
235
+ theme,
236
+ "explode",
237
+ "Explode tool",
238
+ this.setExplode,
239
+ );
149
240
  this.cadTool.addButton(this.toolbarButtons["explode"]);
150
- this.toolbarButtons["distance"] = new ClickButton(theme, "distance", "Measure distance between shapes", this.setTool);
241
+ this.toolbarButtons["distance"] = new ClickButton(
242
+ theme,
243
+ "distance",
244
+ "Measure distance between shapes",
245
+ this.setTool,
246
+ );
151
247
  this.cadTool.addButton(this.toolbarButtons["distance"]);
152
- this.toolbarButtons["properties"] = new ClickButton(theme, "properties", "Show shape properties", this.setTool);
248
+ this.toolbarButtons["properties"] = new ClickButton(
249
+ theme,
250
+ "properties",
251
+ "Show shape properties",
252
+ this.setTool,
253
+ );
153
254
  this.cadTool.addButton(this.toolbarButtons["properties"]);
154
- this.toolbarButtons["angle"] = new ClickButton(theme, "angle", "Measure angle between shapes", this.setTool);
255
+ this.toolbarButtons["angle"] = new ClickButton(
256
+ theme,
257
+ "angle",
258
+ "Measure angle between shapes",
259
+ this.setTool,
260
+ );
155
261
  this.cadTool.addButton(this.toolbarButtons["angle"]);
156
262
 
157
263
  this.cadTool.defineGroup([
@@ -161,18 +267,26 @@ class Display {
161
267
  this.toolbarButtons["angle"],
162
268
  ]);
163
269
 
164
- this.toolbarButtons["help"] = new Button(theme, "help", "Help", this.toggleHelp);
270
+ this.toolbarButtons["help"] = new Button(
271
+ theme,
272
+ "help",
273
+ "Help",
274
+ this.toggleHelp,
275
+ );
165
276
  this.toolbarButtons["help"].alignRight();
166
277
  this.cadTool.addButton(this.toolbarButtons["help"]);
167
- this.toolbarButtons["pin"] = new Button(theme, "pin", "Pin viewer as png", this.pinAsPng);
278
+ this.toolbarButtons["pin"] = new Button(
279
+ theme,
280
+ "pin",
281
+ "Pin viewer as png",
282
+ this.pinAsPng,
283
+ );
168
284
  this.toolbarButtons["pin"].alignRight();
169
285
  this.cadTool.addButton(this.toolbarButtons["pin"]);
170
286
  this.shapeFilterDropDownMenu = new FilterByDropDownMenu(this);
171
287
 
172
-
173
288
  this.showPinning(options.pinning);
174
289
  // this.showMeasureTools(options.measureTools);
175
-
176
290
  }
177
291
 
178
292
  _setupCheckEvent(name, fn, flag) {
@@ -192,8 +306,8 @@ class Display {
192
306
  }
193
307
 
194
308
  /**
195
- *
196
- * @param {string} name Name of the DOM element
309
+ *
310
+ * @param {string} name Name of the DOM element
197
311
  * @returns {DOMElement}
198
312
  */
199
313
  _getElement(name) {
@@ -219,6 +333,7 @@ class Display {
219
333
  * Use More fropdown if overall width < 970px else just check boxes
220
334
  * @param {number} fullWidth - overall width of tree and cad view (taking glass mode into account)
221
335
  */
336
+ // eslint-disable-next-line no-unused-vars
222
337
  handleMoreButton(fullWidth) {
223
338
  // const moreButton = this._getElement("tcv_more-btn");
224
339
  // const moreContent = this._getElement("tcv_more-wrapper");
@@ -264,7 +379,9 @@ class Display {
264
379
  }
265
380
 
266
381
  if (options.tools && !options.glass) {
267
- this.cadTool.container.style.width = px(options.treeWidth + options.cadWidth + 4);
382
+ this.cadTool.container.style.width = px(
383
+ options.treeWidth + options.cadWidth + 4,
384
+ );
268
385
  this.cadBody.style.width = px(options.treeWidth + options.cadWidth + 4);
269
386
  } else {
270
387
  this.cadTool.container.style.width = px(options.cadWidth + 2);
@@ -286,6 +403,8 @@ class Display {
286
403
  this._setupClickEvent("tcv_collapse_all", this.handleCollapseNodes);
287
404
  this._setupClickEvent("tcv_expand", this.handleCollapseNodes);
288
405
 
406
+ this._setupClickEvent("tcv_material_reset", this.handleMaterialReset);
407
+
289
408
  this._setupClickEvent("tcv_toggle_info", this.toggleInfo);
290
409
 
291
410
  this.help_shown = true;
@@ -316,6 +435,7 @@ class Display {
316
435
  this.setClipIntersection,
317
436
  false,
318
437
  );
438
+ this._setupCheckEvent("tcv_clip_caps", this.setObjectColorCaps, false);
319
439
 
320
440
  for (i = 1; i < 4; i++) {
321
441
  this._setupClickEvent(
@@ -511,17 +631,22 @@ class Display {
511
631
  * @param {boolean} flag - to set or not
512
632
  */
513
633
  setExplode = (name, flag) => {
634
+ if (flag && this.explodeFlag) return;
635
+ if (!flag && !this.explodeFlag) return;
636
+
514
637
  if (flag) {
515
638
  if (this.viewer.hasAnimation()) {
516
639
  this.viewer.backupAnimation();
517
640
  }
518
641
  this.viewer.explode();
642
+ this.explodeFlag = true;
519
643
  } else {
520
644
  if (this.viewer.hasAnimation()) {
521
645
  this.controlAnimationByName("stop");
522
646
  this.viewer.clearAnimation();
523
647
  this.viewer.restoreAnimation();
524
648
  }
649
+ this.explodeFlag = false;
525
650
  }
526
651
  };
527
652
 
@@ -567,12 +692,10 @@ class Display {
567
692
  } else if (name == "properties") {
568
693
  this.viewer.cadTools.enable(ToolTypes.PROPERTIES);
569
694
  this.viewer.checkChanges({ activeTool: ToolTypes.PROPERTIES });
570
- }
571
- else if (name == "angle") {
695
+ } else if (name == "angle") {
572
696
  this.viewer.cadTools.enable(ToolTypes.ANGLE);
573
697
  this.viewer.checkChanges({ activeTool: ToolTypes.ANGLE });
574
698
  }
575
-
576
699
  } else {
577
700
  this.viewer.checkChanges({ activeTool: ToolTypes.NONE });
578
701
  this.viewer.clearSelection();
@@ -632,7 +755,7 @@ class Display {
632
755
 
633
756
  /**
634
757
  * Show or hides measurement tools, measurement tools needs a backend to be used.
635
- * @param {boolean} flag
758
+ * @param {boolean} flag
636
759
  */
637
760
  showMeasureTools = (flag) => {
638
761
  this.toolbarButtons["distance"].show(flag);
@@ -660,6 +783,26 @@ class Display {
660
783
  el.checked = flag;
661
784
  };
662
785
 
786
+ /**
787
+ * Checkbox Handler for toggling the clip caps
788
+ * @function
789
+ * @param {*} e
790
+ */
791
+ setObjectColorCaps = (e) => {
792
+ const flag = !!e.target.checked;
793
+ this.viewer.setClipObjectColorCaps(flag);
794
+ };
795
+
796
+ /**
797
+ * Check or uncheck the Intersection checkbox
798
+ * @function
799
+ * @param {boolean} flag - whether to check or uncheck the object colors checkbox
800
+ */
801
+ setClipObjectColorsCheck = (flag) => {
802
+ const el = this._getElement("tcv_clip_caps");
803
+ el.checked = flag;
804
+ };
805
+
663
806
  /**
664
807
  * Handler to reset position, zoom and up of the camera
665
808
  * @function
@@ -681,15 +824,7 @@ class Display {
681
824
  * Clear all highlights of navigation tree entries
682
825
  */
683
826
  clearHighlights() {
684
- const buttons = [
685
- "front",
686
- "rear",
687
- "top",
688
- "bottom",
689
- "left",
690
- "right",
691
- "iso",
692
- ];
827
+ const buttons = ["front", "rear", "top", "bottom", "left", "right", "iso"];
693
828
  buttons.forEach((btn) => {
694
829
  var el = this.toolbarButtons[btn];
695
830
  el.highlight(false);
@@ -805,6 +940,16 @@ class Display {
805
940
  this.roughnessSlider.setValue(val * 100);
806
941
  };
807
942
 
943
+ /**
944
+ * Reset material values to original values
945
+ * @function
946
+ * @param {Event} e - a DOM click event
947
+ */
948
+ // eslint-disable-next-line no-unused-vars
949
+ handleMaterialReset = (e) => {
950
+ this.viewer.resetMaterial();
951
+ };
952
+
808
953
  /**
809
954
  * Activate the UI tab given the name of the tab
810
955
  * @param {string} tab - name of the tab "tree" or "clip"
@@ -821,6 +966,7 @@ class Display {
821
966
  this.cadMaterial.style.display = "none";
822
967
  this.viewer.nestedGroup.setBackVisible(false);
823
968
  this.viewer.setLocalClipping(false);
969
+ this.viewer.clipping.setVisible(false);
824
970
  // copy state since setClipHelpers(false) will set to false
825
971
  var lastPlaneState = this.viewer.getClipPlaneHelpers();
826
972
  this.viewer.setClipPlaneHelpers(false);
@@ -832,7 +978,10 @@ class Display {
832
978
  this.cadMaterial.style.display = "none";
833
979
  this.viewer.nestedGroup.setBackVisible(true);
834
980
  this.viewer.setLocalClipping(true);
981
+ this.viewer.setClipIntersection(this.viewer.clipIntersection);
835
982
  this.viewer.setClipPlaneHelpers(this.lastPlaneState);
983
+ this.viewer.clipping.setVisible(true);
984
+ this.viewer.update(true, false);
836
985
  } else if (tab === "material" && this.activeTab !== "material") {
837
986
  this.cadTree.style.display = "none";
838
987
  this.cadTreeToggles.style.display = "none";
@@ -841,6 +990,7 @@ class Display {
841
990
  this.viewer.nestedGroup.setBackVisible(false);
842
991
  this.viewer.setLocalClipping(false);
843
992
  this.viewer.setClipPlaneHelpers(false);
993
+ this.viewer.clipping.setVisible(false);
844
994
  }
845
995
  this.activeTab = tab;
846
996
 
@@ -1008,16 +1158,16 @@ class Display {
1008
1158
 
1009
1159
  /**
1010
1160
  * Show or hide the distance measurement panel
1011
- * @param {boolean} flag
1161
+ * @param {boolean} flag
1012
1162
  */
1013
1163
  showDistancePanel = (flag) => {
1014
1164
  this.distanceMeasurementPanel.style.display = flag ? "block" : "none";
1015
1165
  };
1016
1166
 
1017
1167
  /**
1018
- * Show or hide the properties measurement panel
1019
- * @param {boolean} flag
1020
- */
1168
+ * Show or hide the properties measurement panel
1169
+ * @param {boolean} flag
1170
+ */
1021
1171
  showPropertiesPanel = (flag) => {
1022
1172
  this.propertiesMeasurementPanel.style.display = flag ? "block" : "none";
1023
1173
  };
@@ -1117,8 +1267,8 @@ class Display {
1117
1267
  };
1118
1268
  this.setSizes(options);
1119
1269
 
1120
- const fullWidth = this.cadWidth + (this.glass ? 0 : this.treeWidth);
1121
- this.handleMoreButton(fullWidth);
1270
+ // const fullWidth = this.cadWidth + (this.glass ? 0 : this.treeWidth);
1271
+ // this.handleMoreButton(fullWidth);
1122
1272
  }
1123
1273
 
1124
1274
  updateHelp(before, after) {
package/src/font.js CHANGED
@@ -18,6 +18,78 @@ export const helvetiker = {
18
18
  ha: 849,
19
19
  o: "m 779 0 l 0 0 l 0 113 l 621 896 l 40 896 l 40 1013 l 779 1013 l 778 887 l 171 124 l 779 124 l 779 0 ",
20
20
  },
21
+ 0: {
22
+ x_min: 73,
23
+ x_max: 715,
24
+ ha: 792,
25
+ o: "m 394 -29 q 153 129 242 -29 q 73 479 73 272 q 152 829 73 687 q 394 989 241 989 q 634 829 545 989 q 715 479 715 684 q 635 129 715 270 q 394 -29 546 -29 m 394 89 q 546 211 489 89 q 598 479 598 322 q 548 748 598 640 q 394 871 491 871 q 241 748 298 871 q 190 479 190 637 q 239 211 190 319 q 394 89 296 89 ",
26
+ },
27
+ 1: {
28
+ x_min: 215.671875,
29
+ x_max: 574,
30
+ ha: 792,
31
+ o: "m 574 0 l 442 0 l 442 697 l 215 697 l 215 796 q 386 833 330 796 q 475 986 447 875 l 574 986 l 574 0 ",
32
+ },
33
+ 2: {
34
+ x_min: 59,
35
+ x_max: 731,
36
+ ha: 792,
37
+ o: "m 731 0 l 59 0 q 197 314 59 188 q 457 487 199 315 q 598 691 598 580 q 543 819 598 772 q 411 867 488 867 q 272 811 328 867 q 209 630 209 747 l 81 630 q 182 901 81 805 q 408 986 271 986 q 629 909 536 986 q 731 694 731 826 q 613 449 731 541 q 378 316 495 383 q 201 122 235 234 l 731 122 l 731 0 ",
38
+ },
39
+ 3: {
40
+ x_min: 54,
41
+ x_max: 737,
42
+ ha: 792,
43
+ o: "m 737 284 q 635 55 737 141 q 399 -25 541 -25 q 156 52 248 -25 q 54 308 54 140 l 185 308 q 245 147 185 202 q 395 96 302 96 q 539 140 484 96 q 602 280 602 190 q 510 429 602 390 q 324 454 451 454 l 324 565 q 487 584 441 565 q 565 719 565 617 q 515 835 565 791 q 395 879 466 879 q 255 824 307 879 q 203 661 203 769 l 78 661 q 166 909 78 822 q 387 992 250 992 q 603 921 513 992 q 701 723 701 844 q 669 607 701 656 q 578 524 637 558 q 696 434 655 499 q 737 284 737 369 ",
44
+ },
45
+ 4: {
46
+ x_min: 48,
47
+ x_max: 742.453125,
48
+ ha: 792,
49
+ o: "m 742 243 l 602 243 l 602 0 l 476 0 l 476 243 l 48 243 l 48 368 l 476 958 l 602 958 l 602 354 l 742 354 l 742 243 m 476 354 l 476 792 l 162 354 l 476 354 ",
50
+ },
51
+ 5: {
52
+ x_min: 54.171875,
53
+ x_max: 738,
54
+ ha: 792,
55
+ o: "m 738 314 q 626 60 738 153 q 382 -23 526 -23 q 155 47 248 -23 q 54 256 54 125 l 183 256 q 259 132 204 174 q 382 91 314 91 q 533 149 471 91 q 602 314 602 213 q 538 469 602 411 q 386 528 475 528 q 284 506 332 528 q 197 439 237 484 l 81 439 l 159 958 l 684 958 l 684 840 l 254 840 l 214 579 q 306 627 258 612 q 407 643 354 643 q 636 552 540 643 q 738 314 738 457 ",
56
+ },
57
+ 6: {
58
+ x_min: 53,
59
+ x_max: 739,
60
+ ha: 792,
61
+ o: "m 739 312 q 633 62 739 162 q 400 -31 534 -31 q 162 78 257 -31 q 53 439 53 206 q 178 859 53 712 q 441 986 284 986 q 643 912 559 986 q 732 713 732 833 l 601 713 q 544 830 594 786 q 426 875 494 875 q 268 793 331 875 q 193 517 193 697 q 301 597 240 570 q 427 624 362 624 q 643 540 552 624 q 739 312 739 451 m 603 298 q 540 461 603 400 q 404 516 484 516 q 268 461 323 516 q 207 300 207 401 q 269 137 207 198 q 405 83 325 83 q 541 137 486 83 q 603 298 603 197 ",
62
+ },
63
+ 7: {
64
+ x_min: 58.71875,
65
+ x_max: 730.953125,
66
+ ha: 792,
67
+ o: "m 730 839 q 469 448 560 641 q 335 0 378 255 l 192 0 q 328 441 235 252 q 593 830 421 630 l 58 830 l 58 958 l 730 958 l 730 839 ",
68
+ },
69
+ 8: {
70
+ x_min: 55,
71
+ x_max: 736,
72
+ ha: 792,
73
+ o: "m 571 527 q 694 424 652 491 q 736 280 736 358 q 648 71 736 158 q 395 -26 551 -26 q 142 69 238 -26 q 55 279 55 157 q 96 425 55 359 q 220 527 138 491 q 120 615 153 562 q 88 726 88 668 q 171 904 88 827 q 395 986 261 986 q 618 905 529 986 q 702 727 702 830 q 670 616 702 667 q 571 527 638 565 m 394 565 q 519 610 475 565 q 563 717 563 655 q 521 823 563 781 q 392 872 474 872 q 265 824 312 872 q 224 720 224 783 q 265 613 224 656 q 394 565 312 565 m 395 91 q 545 150 488 91 q 597 280 597 204 q 546 408 597 355 q 395 465 492 465 q 244 408 299 465 q 194 280 194 356 q 244 150 194 203 q 395 91 299 91 ",
74
+ },
75
+ 9: {
76
+ x_min: 53,
77
+ x_max: 739,
78
+ ha: 792,
79
+ o: "m 739 524 q 619 94 739 241 q 362 -32 516 -32 q 150 47 242 -32 q 59 244 59 126 l 191 244 q 246 129 191 176 q 373 82 301 82 q 526 161 466 82 q 597 440 597 255 q 363 334 501 334 q 130 432 216 334 q 53 650 53 521 q 134 880 53 786 q 383 986 226 986 q 659 841 566 986 q 739 524 739 719 m 388 449 q 535 514 480 449 q 585 658 585 573 q 535 805 585 744 q 388 873 480 873 q 242 809 294 873 q 191 658 191 745 q 239 514 191 572 q 388 449 292 449 ",
80
+ },
81
+ "-": {
82
+ x_min: 8.71875,
83
+ x_max: 350.390625,
84
+ ha: 478,
85
+ o: "m 350 317 l 8 317 l 8 428 l 350 428 l 350 317 ",
86
+ },
87
+ ".": {
88
+ x_min: 0,
89
+ x_max: 142,
90
+ ha: 239,
91
+ o: "m 142 0 l 0 0 l 0 151 l 142 151 l 142 0 ",
92
+ },
21
93
  },
22
94
  cssFontWeight: "normal",
23
95
  ascender: 1189,