@horizon36596/zenith-core 0.1.1
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/LICENSE +21 -0
- package/NOTICE +18 -0
- package/README.md +16 -0
- package/dist/canonicalize.d.ts +25 -0
- package/dist/canonicalize.d.ts.map +1 -0
- package/dist/canonicalize.js +199 -0
- package/dist/canonicalize.js.map +1 -0
- package/dist/check.d.ts +26 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +231 -0
- package/dist/check.js.map +1 -0
- package/dist/checks/heading.d.ts +17 -0
- package/dist/checks/heading.d.ts.map +1 -0
- package/dist/checks/heading.js +78 -0
- package/dist/checks/heading.js.map +1 -0
- package/dist/checks/intake.d.ts +28 -0
- package/dist/checks/intake.d.ts.map +1 -0
- package/dist/checks/intake.js +131 -0
- package/dist/checks/intake.js.map +1 -0
- package/dist/checks/motion.d.ts +28 -0
- package/dist/checks/motion.d.ts.map +1 -0
- package/dist/checks/motion.js +252 -0
- package/dist/checks/motion.js.map +1 -0
- package/dist/checks/schedule.d.ts +29 -0
- package/dist/checks/schedule.d.ts.map +1 -0
- package/dist/checks/schedule.js +166 -0
- package/dist/checks/schedule.js.map +1 -0
- package/dist/checks/season.d.ts +6 -0
- package/dist/checks/season.d.ts.map +1 -0
- package/dist/checks/season.js +126 -0
- package/dist/checks/season.js.map +1 -0
- package/dist/continuity.d.ts +38 -0
- package/dist/continuity.d.ts.map +1 -0
- package/dist/continuity.js +69 -0
- package/dist/continuity.js.map +1 -0
- package/dist/diff.d.ts +37 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +258 -0
- package/dist/diff.js.map +1 -0
- package/dist/edit/command.d.ts +4 -0
- package/dist/edit/command.d.ts.map +1 -0
- package/dist/edit/command.js +16 -0
- package/dist/edit/command.js.map +1 -0
- package/dist/edit/errors.d.ts +9 -0
- package/dist/edit/errors.d.ts.map +1 -0
- package/dist/edit/errors.js +12 -0
- package/dist/edit/errors.js.map +1 -0
- package/dist/edit/fields.d.ts +40 -0
- package/dist/edit/fields.d.ts.map +1 -0
- package/dist/edit/fields.js +150 -0
- package/dist/edit/fields.js.map +1 -0
- package/dist/edit/finish.d.ts +15 -0
- package/dist/edit/finish.d.ts.map +1 -0
- package/dist/edit/finish.js +36 -0
- package/dist/edit/finish.js.map +1 -0
- package/dist/edit/groups.d.ts +66 -0
- package/dist/edit/groups.d.ts.map +1 -0
- package/dist/edit/groups.js +277 -0
- package/dist/edit/groups.js.map +1 -0
- package/dist/edit/ids.d.ts +39 -0
- package/dist/edit/ids.d.ts.map +1 -0
- package/dist/edit/ids.js +76 -0
- package/dist/edit/ids.js.map +1 -0
- package/dist/edit/index.d.ts +22 -0
- package/dist/edit/index.d.ts.map +1 -0
- package/dist/edit/index.js +22 -0
- package/dist/edit/index.js.map +1 -0
- package/dist/edit/meta.d.ts +15 -0
- package/dist/edit/meta.d.ts.map +1 -0
- package/dist/edit/meta.js +13 -0
- package/dist/edit/meta.js.map +1 -0
- package/dist/edit/path.d.ts +36 -0
- package/dist/edit/path.d.ts.map +1 -0
- package/dist/edit/path.js +135 -0
- package/dist/edit/path.js.map +1 -0
- package/dist/edit/steps.d.ts +53 -0
- package/dist/edit/steps.d.ts.map +1 -0
- package/dist/edit/steps.js +0 -0
- package/dist/edit/steps.js.map +1 -0
- package/dist/edit/template.d.ts +18 -0
- package/dist/edit/template.d.ts.map +1 -0
- package/dist/edit/template.js +30 -0
- package/dist/edit/template.js.map +1 -0
- package/dist/edit/timing.d.ts +11 -0
- package/dist/edit/timing.d.ts.map +1 -0
- package/dist/edit/timing.js +23 -0
- package/dist/edit/timing.js.map +1 -0
- package/dist/edit/tree.d.ts +32 -0
- package/dist/edit/tree.d.ts.map +1 -0
- package/dist/edit/tree.js +90 -0
- package/dist/edit/tree.js.map +1 -0
- package/dist/estimate.d.ts +48 -0
- package/dist/estimate.d.ts.map +1 -0
- package/dist/estimate.js +443 -0
- package/dist/estimate.js.map +1 -0
- package/dist/findingHelp.d.ts +18 -0
- package/dist/findingHelp.d.ts.map +1 -0
- package/dist/findingHelp.js +114 -0
- package/dist/findingHelp.js.map +1 -0
- package/dist/fix.d.ts +21 -0
- package/dist/fix.d.ts.map +1 -0
- package/dist/fix.js +180 -0
- package/dist/fix.js.map +1 -0
- package/dist/footprint.d.ts +33 -0
- package/dist/footprint.d.ts.map +1 -0
- package/dist/footprint.js +71 -0
- package/dist/footprint.js.map +1 -0
- package/dist/geometry/angle.d.ts +13 -0
- package/dist/geometry/angle.d.ts.map +1 -0
- package/dist/geometry/angle.js +21 -0
- package/dist/geometry/angle.js.map +1 -0
- package/dist/geometry/curve.d.ts +24 -0
- package/dist/geometry/curve.d.ts.map +1 -0
- package/dist/geometry/curve.js +78 -0
- package/dist/geometry/curve.js.map +1 -0
- package/dist/geometry/path.d.ts +29 -0
- package/dist/geometry/path.d.ts.map +1 -0
- package/dist/geometry/path.js +61 -0
- package/dist/geometry/path.js.map +1 -0
- package/dist/geometry/quadrature.d.ts +13 -0
- package/dist/geometry/quadrature.d.ts.map +1 -0
- package/dist/geometry/quadrature.js +57 -0
- package/dist/geometry/quadrature.js.map +1 -0
- package/dist/geometry/sat.d.ts +40 -0
- package/dist/geometry/sat.d.ts.map +1 -0
- package/dist/geometry/sat.js +86 -0
- package/dist/geometry/sat.js.map +1 -0
- package/dist/geometry/vec.d.ts +27 -0
- package/dist/geometry/vec.d.ts.map +1 -0
- package/dist/geometry/vec.js +30 -0
- package/dist/geometry/vec.js.map +1 -0
- package/dist/heading.d.ts +77 -0
- package/dist/heading.d.ts.map +1 -0
- package/dist/heading.js +164 -0
- package/dist/heading.js.map +1 -0
- package/dist/headingRanges.d.ts +48 -0
- package/dist/headingRanges.d.ts.map +1 -0
- package/dist/headingRanges.js +132 -0
- package/dist/headingRanges.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/kinematics.d.ts +63 -0
- package/dist/kinematics.d.ts.map +1 -0
- package/dist/kinematics.js +71 -0
- package/dist/kinematics.js.map +1 -0
- package/dist/ledger.d.ts +49 -0
- package/dist/ledger.d.ts.map +1 -0
- package/dist/ledger.js +136 -0
- package/dist/ledger.js.map +1 -0
- package/dist/load.d.ts +12 -0
- package/dist/load.d.ts.map +1 -0
- package/dist/load.js +12 -0
- package/dist/load.js.map +1 -0
- package/dist/mirror.d.ts +81 -0
- package/dist/mirror.d.ts.map +1 -0
- package/dist/mirror.js +282 -0
- package/dist/mirror.js.map +1 -0
- package/dist/plan.d.ts +29 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +159 -0
- package/dist/plan.js.map +1 -0
- package/dist/prBody.d.ts +24 -0
- package/dist/prBody.d.ts.map +1 -0
- package/dist/prBody.js +112 -0
- package/dist/prBody.js.map +1 -0
- package/dist/provenance.d.ts +21 -0
- package/dist/provenance.d.ts.map +1 -0
- package/dist/provenance.js +46 -0
- package/dist/provenance.js.map +1 -0
- package/dist/render.d.ts +18 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +464 -0
- package/dist/render.js.map +1 -0
- package/dist/resolve.d.ts +39 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +172 -0
- package/dist/resolve.js.map +1 -0
- package/dist/season.d.ts +65 -0
- package/dist/season.d.ts.map +1 -0
- package/dist/season.js +16 -0
- package/dist/season.js.map +1 -0
- package/dist/sim/commands.d.ts +97 -0
- package/dist/sim/commands.d.ts.map +1 -0
- package/dist/sim/commands.js +185 -0
- package/dist/sim/commands.js.map +1 -0
- package/dist/sim/curves.d.ts +37 -0
- package/dist/sim/curves.d.ts.map +1 -0
- package/dist/sim/curves.js +187 -0
- package/dist/sim/curves.js.map +1 -0
- package/dist/sim/follower.d.ts +124 -0
- package/dist/sim/follower.d.ts.map +1 -0
- package/dist/sim/follower.js +472 -0
- package/dist/sim/follower.js.map +1 -0
- package/dist/sim/ideal.d.ts +103 -0
- package/dist/sim/ideal.d.ts.map +1 -0
- package/dist/sim/ideal.js +393 -0
- package/dist/sim/ideal.js.map +1 -0
- package/dist/sim/index.d.ts +11 -0
- package/dist/sim/index.d.ts.map +1 -0
- package/dist/sim/index.js +10 -0
- package/dist/sim/index.js.map +1 -0
- package/dist/sim/params.d.ts +91 -0
- package/dist/sim/params.d.ts.map +1 -0
- package/dist/sim/params.js +195 -0
- package/dist/sim/params.js.map +1 -0
- package/dist/sim/pedroPath.d.ts +41 -0
- package/dist/sim/pedroPath.d.ts.map +1 -0
- package/dist/sim/pedroPath.js +191 -0
- package/dist/sim/pedroPath.js.map +1 -0
- package/dist/sim/plant.d.ts +59 -0
- package/dist/sim/plant.d.ts.map +1 -0
- package/dist/sim/plant.js +128 -0
- package/dist/sim/plant.js.map +1 -0
- package/dist/sim/residuals.d.ts +36 -0
- package/dist/sim/residuals.d.ts.map +1 -0
- package/dist/sim/residuals.js +86 -0
- package/dist/sim/residuals.js.map +1 -0
- package/dist/sim/simulate.d.ts +27 -0
- package/dist/sim/simulate.d.ts.map +1 -0
- package/dist/sim/simulate.js +924 -0
- package/dist/sim/simulate.js.map +1 -0
- package/dist/sim/types.d.ts +209 -0
- package/dist/sim/types.d.ts.map +1 -0
- package/dist/sim/types.js +2 -0
- package/dist/sim/types.js.map +1 -0
- package/dist/tokens.d.ts +93 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +93 -0
- package/dist/tokens.js.map +1 -0
- package/dist/trace.d.ts +89 -0
- package/dist/trace.d.ts.map +1 -0
- package/dist/trace.js +187 -0
- package/dist/trace.js.map +1 -0
- package/dist/types.d.ts +219 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/unimplemented.d.ts +8 -0
- package/dist/unimplemented.d.ts.map +1 -0
- package/dist/unimplemented.js +11 -0
- package/dist/unimplemented.js.map +1 -0
- package/package.json +59 -0
package/dist/render.js
ADDED
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import { markerT } from "./checks/intake.js";
|
|
2
|
+
import { fieldBounds } from "./footprint.js";
|
|
3
|
+
import { totalBound } from "./estimate.js";
|
|
4
|
+
import { robotHeightIn } from "./kinematics.js";
|
|
5
|
+
import { mirrorForField, mirrorHeadingRad, mirrorVec, shouldMirror } from "./mirror.js";
|
|
6
|
+
import { ALPHA, FONTS, severityColour, TOKENS } from "./tokens.js";
|
|
7
|
+
/**
|
|
8
|
+
* `render`: one SVG string that the pull
|
|
9
|
+
* request, the CLI's `--png` and the editor's static layer all share.
|
|
10
|
+
*
|
|
11
|
+
* Frame: `field.json` says the audience is at the bottom and +Y runs away from them, so the
|
|
12
|
+
* drawing flips Y. Everything is in field inches until the last moment, where `at()` turns a point
|
|
13
|
+
* into pixels.
|
|
14
|
+
*
|
|
15
|
+
* Colours are the literal hex of `tokens.ts`, not CSS custom properties, because an SVG that is
|
|
16
|
+
* rasterised has no stylesheet to read them from.
|
|
17
|
+
*/
|
|
18
|
+
/** How far apart the footprint ghosts are in seconds of estimated time; density shows speed. */
|
|
19
|
+
export const GHOST_EVERY_S = 0.5;
|
|
20
|
+
/** How far apart they are in inches when there is no estimate to place them by. */
|
|
21
|
+
export const GHOST_EVERY_IN = 12;
|
|
22
|
+
const LEDGER_WIDTH_PX = 300;
|
|
23
|
+
const MARGIN_PX = 16;
|
|
24
|
+
const HEADER_PX = 34;
|
|
25
|
+
/** Two decimals, no exponent and no minus zero, so the same plan always writes the same bytes. */
|
|
26
|
+
const n = (value) => {
|
|
27
|
+
const rounded = Number(value.toFixed(2));
|
|
28
|
+
return String(rounded === 0 ? 0 : rounded);
|
|
29
|
+
};
|
|
30
|
+
const escapeText = (value) => value
|
|
31
|
+
.split("&")
|
|
32
|
+
.join("&")
|
|
33
|
+
.split("<")
|
|
34
|
+
.join("<")
|
|
35
|
+
.split(">")
|
|
36
|
+
.join(">")
|
|
37
|
+
.split('"')
|
|
38
|
+
.join(""");
|
|
39
|
+
export function render(plan, estimateResult, findings, ledgerRows, options = {}) {
|
|
40
|
+
const field = plan.field;
|
|
41
|
+
const bounds = fieldBounds(field);
|
|
42
|
+
const fieldWidthIn = bounds.maxXIn - bounds.minXIn;
|
|
43
|
+
const fieldHeightIn = bounds.maxYIn - bounds.minYIn;
|
|
44
|
+
const showLedger = options.showLedger === true && ledgerRows.length > 0;
|
|
45
|
+
const fieldPx = options.widthPx ?? 720;
|
|
46
|
+
const scale = fieldPx / fieldWidthIn;
|
|
47
|
+
const fieldHeightPx = fieldHeightIn * scale;
|
|
48
|
+
// A file's poses are in its own alliance's frame, so the routine is mirrored only when it is viewed
|
|
49
|
+
// as the other alliance, by the symmetry the field declares. `shouldMirror`/`mirrorForField` are
|
|
50
|
+
// the shared rule: the editor's canvas asks the same two questions of the same two files and gets
|
|
51
|
+
// the same answer, and both agree with the robot runtime. The field itself is never mirrored.
|
|
52
|
+
const view = options.alliance ?? plan.auto.alliance;
|
|
53
|
+
const mode = mirrorForField(field);
|
|
54
|
+
const mirrorFor = (auto) => shouldMirror(auto, field, view) ? (p) => mirrorVec(p, mode) : (p) => p;
|
|
55
|
+
const mirrored = shouldMirror(plan.auto, field, view);
|
|
56
|
+
const point = mirrorFor(plan.auto);
|
|
57
|
+
const heading = (h) => (mirrored ? mirrorHeadingRad(h, mode) : h);
|
|
58
|
+
const frame = {
|
|
59
|
+
scale,
|
|
60
|
+
fieldWidthPx: fieldPx,
|
|
61
|
+
fieldHeightPx,
|
|
62
|
+
// +Y is up on screen because the audience is at the bottom, so the y axis is flipped here and
|
|
63
|
+
// nowhere else.
|
|
64
|
+
at: (p) => ({
|
|
65
|
+
x: MARGIN_PX + (p.xIn - bounds.minXIn) * scale,
|
|
66
|
+
y: HEADER_PX + (bounds.maxYIn - p.yIn) * scale,
|
|
67
|
+
}),
|
|
68
|
+
};
|
|
69
|
+
const widthPx = MARGIN_PX * 2 + fieldPx + (showLedger ? LEDGER_WIDTH_PX : 0);
|
|
70
|
+
const heightPx = options.heightPx ?? HEADER_PX + fieldHeightPx + MARGIN_PX;
|
|
71
|
+
const parts = [];
|
|
72
|
+
parts.push(`<svg xmlns="http://www.w3.org/2000/svg" width="${n(widthPx)}" height="${n(heightPx)}" viewBox="0 0 ${n(widthPx)} ${n(heightPx)}" font-family="${FONTS.ui}">`);
|
|
73
|
+
parts.push(`<rect width="${n(widthPx)}" height="${n(heightPx)}" fill="${TOKENS.bgCanvas}"/>`);
|
|
74
|
+
parts.push(...drawHeader(plan, estimateResult, findings, widthPx, options));
|
|
75
|
+
parts.push(...drawField(field, plan, frame, point, options));
|
|
76
|
+
// The base version is in its own file's frame, which is not this one's when the change flipped
|
|
77
|
+
// the alliance, so it is drawn for the same view by its own mirror.
|
|
78
|
+
if (options.base !== undefined)
|
|
79
|
+
parts.push(...drawBase(options.base, frame, mirrorFor(options.base.auto)));
|
|
80
|
+
parts.push(...drawFindings(plan, findings, frame, point, options));
|
|
81
|
+
parts.push(...drawPaths(plan, frame, point));
|
|
82
|
+
parts.push(...drawGhosts(plan, estimateResult, frame, point, heading, options));
|
|
83
|
+
parts.push(...drawMarkers(plan, frame, point));
|
|
84
|
+
if (showLedger) {
|
|
85
|
+
parts.push(...drawLedger(ledgerRows, MARGIN_PX + fieldPx, heightPx));
|
|
86
|
+
}
|
|
87
|
+
parts.push("</svg>");
|
|
88
|
+
return `${parts.join("\n")}\n`;
|
|
89
|
+
}
|
|
90
|
+
/** The header's suffix for a total that is a bound (see `totalBound`). */
|
|
91
|
+
function boundSuffix(estimateResult) {
|
|
92
|
+
const bound = totalBound(estimateResult);
|
|
93
|
+
return bound === "lower" ? " at least" : bound === "upper" ? " at most" : "";
|
|
94
|
+
}
|
|
95
|
+
/** The title bar: the routine's name, its estimate and how many findings it has. */
|
|
96
|
+
function drawHeader(plan, estimateResult, findings, widthPx, options) {
|
|
97
|
+
const alliance = options.alliance ?? plan.auto.alliance;
|
|
98
|
+
const title = options.title ?? plan.auto.title ?? plan.auto.name;
|
|
99
|
+
const errors = findings.filter((finding) => finding.severity === "error").length;
|
|
100
|
+
const warnings = findings.filter((finding) => finding.severity === "warning").length;
|
|
101
|
+
const timing = estimateResult === null || estimateResult.nominalS === null
|
|
102
|
+
? "no estimate"
|
|
103
|
+
: `${n(estimateResult.nominalS)} s (${n(estimateResult.lowS ?? 0)}-${n(estimateResult.highS ?? 0)})${boundSuffix(estimateResult)}`;
|
|
104
|
+
const counts = errors + warnings === 0
|
|
105
|
+
? "no findings"
|
|
106
|
+
: `${String(errors)} error${errors === 1 ? "" : "s"}, ${String(warnings)} warning${warnings === 1 ? "" : "s"}`;
|
|
107
|
+
return [
|
|
108
|
+
`<g id="header">`,
|
|
109
|
+
`<text x="${n(MARGIN_PX)}" y="${n(HEADER_PX - 14)}" fill="${TOKENS.textHi}" font-size="15">${escapeText(title)}</text>`,
|
|
110
|
+
`<text x="${n(widthPx - MARGIN_PX)}" y="${n(HEADER_PX - 14)}" fill="${TOKENS.textMid}" font-size="12" text-anchor="end" font-family="${FONTS.mono}">${escapeText(`${alliance} · ${timing} · ${counts}`)}</text>`,
|
|
111
|
+
`</g>`,
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
/** The field itself: the grid, the perimeter, the zones, the obstacles, the elements and targets. */
|
|
115
|
+
function drawField(field, plan, frame, point, options) {
|
|
116
|
+
const bounds = fieldBounds(field);
|
|
117
|
+
const parts = [`<g id="field">`];
|
|
118
|
+
const image = drawFieldImage(field, frame, options);
|
|
119
|
+
parts.push(...image);
|
|
120
|
+
const line = (a, b, stroke, width) => {
|
|
121
|
+
const from = frame.at(a);
|
|
122
|
+
const to = frame.at(b);
|
|
123
|
+
return `<line x1="${n(from.x)}" y1="${n(from.y)}" x2="${n(to.x)}" y2="${n(to.y)}" stroke="${stroke}" stroke-width="${n(width)}"/>`;
|
|
124
|
+
};
|
|
125
|
+
// A 24 in tile grid, halved to 12 in so a pose can be read off by eye, with the axes brightest.
|
|
126
|
+
// A field picture carries its own tiles, so the grid is left out under one.
|
|
127
|
+
for (let xIn = bounds.minXIn; image.length === 0 && xIn <= bounds.maxXIn + 1e-9; xIn += 12) {
|
|
128
|
+
const major = Math.abs(xIn % 24) < 1e-9;
|
|
129
|
+
const axis = Math.abs(xIn) < 1e-9;
|
|
130
|
+
parts.push(line({ xIn, yIn: bounds.minYIn }, { xIn, yIn: bounds.maxYIn }, axis ? TOKENS.gridAxis : major ? TOKENS.gridMajor : TOKENS.gridMinor, axis ? 1 : 0.5));
|
|
131
|
+
}
|
|
132
|
+
for (let yIn = bounds.minYIn; image.length === 0 && yIn <= bounds.maxYIn + 1e-9; yIn += 12) {
|
|
133
|
+
const major = Math.abs(yIn % 24) < 1e-9;
|
|
134
|
+
const axis = Math.abs(yIn) < 1e-9;
|
|
135
|
+
parts.push(line({ xIn: bounds.minXIn, yIn }, { xIn: bounds.maxXIn, yIn }, axis ? TOKENS.gridAxis : major ? TOKENS.gridMajor : TOKENS.gridMinor, axis ? 1 : 0.5));
|
|
136
|
+
}
|
|
137
|
+
const corner = frame.at({ xIn: bounds.minXIn, yIn: bounds.maxYIn });
|
|
138
|
+
parts.push(`<rect x="${n(corner.x)}" y="${n(corner.y)}" width="${n(frame.fieldWidthPx)}" height="${n(frame.fieldHeightPx)}" fill="none" stroke="${TOKENS.borderDefault}" stroke-width="1.5"/>`);
|
|
139
|
+
for (const zone of field.zones ?? []) {
|
|
140
|
+
parts.push(boxRect(zone, frame, TOKENS.fieldZone, TOKENS.fieldZone, ALPHA.zoneFill, "4 4"), boxLabel(zone, zone.id, frame, TOKENS.fieldZone));
|
|
141
|
+
}
|
|
142
|
+
// Obstacles are drawn by their z class: one the robot would hit is filled, because you cannot
|
|
143
|
+
// drive there; one it passes under is an outline, because you can (`03` section 4, STRUCTURE).
|
|
144
|
+
const heightIn = robotHeightIn(plan.robot);
|
|
145
|
+
for (const obstacle of field.obstacles ?? []) {
|
|
146
|
+
const blocks = (obstacle.solidToRobot ?? true) && obstacle.minZIn < heightIn;
|
|
147
|
+
parts.push(blocks
|
|
148
|
+
? boxRect(obstacle, frame, TOKENS.fieldObstacle, TOKENS.fieldObstacleFill, 1)
|
|
149
|
+
: boxRect(obstacle, frame, TOKENS.fieldObstacle, "none", 0, "3 3"));
|
|
150
|
+
}
|
|
151
|
+
for (const element of field.elements ?? []) {
|
|
152
|
+
parts.push(...drawElement(element, frame));
|
|
153
|
+
}
|
|
154
|
+
for (const target of field.targets ?? []) {
|
|
155
|
+
parts.push(...drawTarget(target, field, frame));
|
|
156
|
+
}
|
|
157
|
+
if (options.waypoints !== undefined) {
|
|
158
|
+
parts.push(...drawWaypoints(options.waypoints, frame, point));
|
|
159
|
+
}
|
|
160
|
+
parts.push(`</g>`);
|
|
161
|
+
return parts;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* The field picture under the vector layer, placed the way site/docs/file-format.md says: crop
|
|
165
|
+
* the stored image to `pxBoundsIn`, turn it clockwise on screen by `rotationDeg`, and stretch it
|
|
166
|
+
* over the field's rectangle. SVG's `rotate` is clockwise on screen because its y axis points down,
|
|
167
|
+
* so the angle goes in as it is written.
|
|
168
|
+
*/
|
|
169
|
+
function drawFieldImage(field, frame, options) {
|
|
170
|
+
const spec = field.image;
|
|
171
|
+
const supplied = options.fieldImage;
|
|
172
|
+
if (spec === undefined || supplied === undefined)
|
|
173
|
+
return [];
|
|
174
|
+
const bounds = fieldBounds(field);
|
|
175
|
+
const corner = frame.at({ xIn: bounds.minXIn, yIn: bounds.maxYIn });
|
|
176
|
+
const widthPx = frame.fieldWidthPx;
|
|
177
|
+
const heightPx = frame.fieldHeightPx;
|
|
178
|
+
const cx = corner.x + widthPx / 2;
|
|
179
|
+
const cy = corner.y + heightPx / 2;
|
|
180
|
+
const rotation = spec.rotationDeg ?? 0;
|
|
181
|
+
const quarter = rotation === 90 || rotation === 270;
|
|
182
|
+
// The box the crop fills before it is turned, so that it fills the field after.
|
|
183
|
+
const w = quarter ? heightPx : widthPx;
|
|
184
|
+
const h = quarter ? widthPx : heightPx;
|
|
185
|
+
const x = cx - w / 2;
|
|
186
|
+
const y = cy - h / 2;
|
|
187
|
+
const href = escapeText(supplied.href);
|
|
188
|
+
const turn = rotation === 0 ? "" : ` transform="rotate(${String(rotation)} ${n(cx)} ${n(cy)})"`;
|
|
189
|
+
if (spec.pxBoundsIn === "fullBleed") {
|
|
190
|
+
return [
|
|
191
|
+
`<image href="${href}" x="${n(x)}" y="${n(y)}" width="${n(w)}" height="${n(h)}" preserveAspectRatio="none"${turn}/>`,
|
|
192
|
+
];
|
|
193
|
+
}
|
|
194
|
+
if (supplied.widthPx === undefined || supplied.heightPx === undefined)
|
|
195
|
+
return [];
|
|
196
|
+
const box = spec.pxBoundsIn;
|
|
197
|
+
return [
|
|
198
|
+
`<g${turn}>`,
|
|
199
|
+
`<svg x="${n(x)}" y="${n(y)}" width="${n(w)}" height="${n(h)}" viewBox="${n(box.left)} ${n(box.top)} ${n(box.right - box.left)} ${n(box.bottom - box.top)}" preserveAspectRatio="none">`,
|
|
200
|
+
`<image href="${href}" width="${n(supplied.widthPx)}" height="${n(supplied.heightPx)}"/>`,
|
|
201
|
+
`</svg>`,
|
|
202
|
+
`</g>`,
|
|
203
|
+
];
|
|
204
|
+
}
|
|
205
|
+
function boxRect(box, frame, stroke, fill, fillOpacity, dash) {
|
|
206
|
+
const corner = frame.at({ xIn: box.minXIn, yIn: box.maxYIn });
|
|
207
|
+
const width = (box.maxXIn - box.minXIn) * frame.scale;
|
|
208
|
+
const height = (box.maxYIn - box.minYIn) * frame.scale;
|
|
209
|
+
const dashAttribute = dash === undefined ? "" : ` stroke-dasharray="${dash}"`;
|
|
210
|
+
const fillAttribute = fill === "none" ? ` fill="none"` : ` fill="${fill}" fill-opacity="${n(fillOpacity)}"`;
|
|
211
|
+
return `<rect x="${n(corner.x)}" y="${n(corner.y)}" width="${n(width)}" height="${n(height)}"${fillAttribute} stroke="${stroke}" stroke-width="1"${dashAttribute}/>`;
|
|
212
|
+
}
|
|
213
|
+
function boxLabel(box, text, frame, fill) {
|
|
214
|
+
const at = frame.at({ xIn: (box.minXIn + box.maxXIn) / 2, yIn: (box.minYIn + box.maxYIn) / 2 });
|
|
215
|
+
return `<text x="${n(at.x)}" y="${n(at.y)}" fill="${fill}" font-size="9" text-anchor="middle" font-family="${FONTS.mono}" opacity="0.7">${escapeText(text)}</text>`;
|
|
216
|
+
}
|
|
217
|
+
/** A game element: a loose piece as a circle of its own radius, a container as a labelled ring. */
|
|
218
|
+
function drawElement(element, frame) {
|
|
219
|
+
const pivot = element["pivotIn"];
|
|
220
|
+
const centre = element.xIn !== undefined && element.yIn !== undefined
|
|
221
|
+
? { xIn: element.xIn, yIn: element.yIn }
|
|
222
|
+
: typeof pivot === "object" && pivot !== null
|
|
223
|
+
? {
|
|
224
|
+
xIn: Number(pivot["xIn"] ?? 0),
|
|
225
|
+
yIn: Number(pivot["yIn"] ?? 0),
|
|
226
|
+
}
|
|
227
|
+
: null;
|
|
228
|
+
if (centre === null)
|
|
229
|
+
return [];
|
|
230
|
+
const at = frame.at(centre);
|
|
231
|
+
const isContainer = element.container !== null && element.container !== undefined;
|
|
232
|
+
const radiusIn = element.radiusIn ?? (isContainer ? 3 : 1.4);
|
|
233
|
+
const radiusPx = radiusIn * frame.scale;
|
|
234
|
+
const parts = [
|
|
235
|
+
`<circle cx="${n(at.x)}" cy="${n(at.y)}" r="${n(radiusPx)}" fill="${TOKENS.fieldElement}" fill-opacity="${n(ALPHA.elementFill)}" stroke="${TOKENS.fieldElement}" stroke-width="1"${isContainer ? ' stroke-dasharray="2 2"' : ""}/>`,
|
|
236
|
+
];
|
|
237
|
+
if (isContainer) {
|
|
238
|
+
parts.push(`<text x="${n(at.x)}" y="${n(at.y - radiusPx - 3)}" fill="${TOKENS.fieldElement}" font-size="9" text-anchor="middle" font-family="${FONTS.mono}">${escapeText(element.id)}</text>`);
|
|
239
|
+
}
|
|
240
|
+
return parts;
|
|
241
|
+
}
|
|
242
|
+
/** A scoring target as a reticle, placed on whatever element or hive it names. */
|
|
243
|
+
function drawTarget(target, field, frame) {
|
|
244
|
+
const row = target;
|
|
245
|
+
const ofId = typeof row["element"] === "string" ? row["element"] : row["hive"];
|
|
246
|
+
const element = (field.elements ?? []).find((candidate) => candidate.id === ofId);
|
|
247
|
+
if (element === undefined)
|
|
248
|
+
return [];
|
|
249
|
+
const pivot = element["pivotIn"];
|
|
250
|
+
const centre = element.xIn !== undefined && element.yIn !== undefined
|
|
251
|
+
? { xIn: element.xIn, yIn: element.yIn }
|
|
252
|
+
: typeof pivot === "object" && pivot !== null
|
|
253
|
+
? {
|
|
254
|
+
xIn: Number(pivot["xIn"] ?? 0),
|
|
255
|
+
yIn: Number(pivot["yIn"] ?? 0),
|
|
256
|
+
}
|
|
257
|
+
: null;
|
|
258
|
+
if (centre === null)
|
|
259
|
+
return [];
|
|
260
|
+
const at = frame.at(centre);
|
|
261
|
+
const r = 5;
|
|
262
|
+
return [
|
|
263
|
+
`<g id="target-${escapeText(target.id)}" stroke="${TOKENS.fieldTarget}" stroke-width="1" fill="none">`,
|
|
264
|
+
`<circle cx="${n(at.x)}" cy="${n(at.y)}" r="${n(r)}"/>`,
|
|
265
|
+
`<line x1="${n(at.x - r - 3)}" y1="${n(at.y)}" x2="${n(at.x + r + 3)}" y2="${n(at.y)}"/>`,
|
|
266
|
+
`<line x1="${n(at.x)}" y1="${n(at.y - r - 3)}" x2="${n(at.x)}" y2="${n(at.y + r + 3)}"/>`,
|
|
267
|
+
`</g>`,
|
|
268
|
+
];
|
|
269
|
+
}
|
|
270
|
+
function drawWaypoints(waypoints, frame, point) {
|
|
271
|
+
const parts = [`<g id="waypoints">`];
|
|
272
|
+
for (const [name, waypoint] of Object.entries(waypoints.waypoints)) {
|
|
273
|
+
const at = frame.at(point({ xIn: waypoint.xIn, yIn: waypoint.yIn }));
|
|
274
|
+
parts.push(`<circle cx="${n(at.x)}" cy="${n(at.y)}" r="2.5" fill="none" stroke="${TOKENS.fieldWaypoint}" stroke-width="1"/>`, `<text x="${n(at.x + 5)}" y="${n(at.y - 4)}" fill="${TOKENS.fieldWaypoint}" font-size="9" font-family="${FONTS.mono}">${escapeText(name)}</text>`);
|
|
275
|
+
}
|
|
276
|
+
parts.push(`</g>`);
|
|
277
|
+
return parts;
|
|
278
|
+
}
|
|
279
|
+
/** Every path step's polyline, in the plan's own order. */
|
|
280
|
+
function pathPoints(step, frame, point) {
|
|
281
|
+
return step.samples
|
|
282
|
+
.map((sample) => {
|
|
283
|
+
const at = frame.at(point(sample.pose));
|
|
284
|
+
return `${n(at.x)},${n(at.y)}`;
|
|
285
|
+
})
|
|
286
|
+
.join(" ");
|
|
287
|
+
}
|
|
288
|
+
function drawPaths(plan, frame, point) {
|
|
289
|
+
const parts = [`<g id="paths" fill="none" stroke-linejoin="round" stroke-linecap="round">`];
|
|
290
|
+
for (const step of flat(plan.steps)) {
|
|
291
|
+
if (step.samples.length < 2)
|
|
292
|
+
continue;
|
|
293
|
+
parts.push(`<polyline id="path-${escapeText(step.id)}" points="${pathPoints(step, frame, point)}" stroke="${TOKENS.pathEstimated}" stroke-width="2"/>`);
|
|
294
|
+
}
|
|
295
|
+
parts.push(`</g>`);
|
|
296
|
+
return parts;
|
|
297
|
+
}
|
|
298
|
+
/** The plan being compared against, drawn dashed and dim underneath (`06` section 4, review mode). */
|
|
299
|
+
function drawBase(base, frame, point) {
|
|
300
|
+
const parts = [`<g id="base" fill="none" opacity="${n(ALPHA.pathGhost)}">`];
|
|
301
|
+
for (const step of flat(base.steps)) {
|
|
302
|
+
if (step.samples.length < 2)
|
|
303
|
+
continue;
|
|
304
|
+
parts.push(`<polyline points="${pathPoints(step, frame, point)}" stroke="${TOKENS.pathEstimated}" stroke-width="2" stroke-dasharray="4 4"/>`);
|
|
305
|
+
}
|
|
306
|
+
parts.push(`</g>`);
|
|
307
|
+
return parts;
|
|
308
|
+
}
|
|
309
|
+
/** The part of a path a finding points at, widened underneath it in the severity's colour. */
|
|
310
|
+
function drawFindings(plan, findings, frame, point, options) {
|
|
311
|
+
if (options.showFindings === false)
|
|
312
|
+
return [];
|
|
313
|
+
const steps = new Map(flat(plan.steps).map((step) => [step.id, step]));
|
|
314
|
+
const parts = [`<g id="findings" fill="none" stroke-linecap="round">`];
|
|
315
|
+
for (const finding of findings) {
|
|
316
|
+
if (finding.severity === "info")
|
|
317
|
+
continue;
|
|
318
|
+
const colour = severityColour(finding.severity);
|
|
319
|
+
const step = steps.get(finding.stepId);
|
|
320
|
+
if (step !== undefined && step.samples.length >= 2) {
|
|
321
|
+
const around = finding.t === undefined
|
|
322
|
+
? step.samples
|
|
323
|
+
: step.samples.filter((sample) => Math.abs(sample.t - (finding.t ?? 0)) <= 0.06);
|
|
324
|
+
const chosen = around.length >= 2 ? around : step.samples;
|
|
325
|
+
const points = chosen
|
|
326
|
+
.map((sample) => {
|
|
327
|
+
const at = frame.at(point(sample.pose));
|
|
328
|
+
return `${n(at.x)},${n(at.y)}`;
|
|
329
|
+
})
|
|
330
|
+
.join(" ");
|
|
331
|
+
parts.push(`<polyline points="${points}" stroke="${colour}" stroke-width="6" opacity="${n(ALPHA.findingHighlight)}"/>`);
|
|
332
|
+
}
|
|
333
|
+
const spot = finding.geometry?.pointIn;
|
|
334
|
+
if (spot !== undefined) {
|
|
335
|
+
const at = frame.at(point(spot));
|
|
336
|
+
parts.push(`<circle cx="${n(at.x)}" cy="${n(at.y)}" r="4" fill="none" stroke="${colour}" stroke-width="1.5"/>`);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
parts.push(`</g>`);
|
|
340
|
+
return parts;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* The footprint stamped every half second of estimated time, with a tick along the nose. Where the
|
|
344
|
+
* robot is slow the stamps crowd together and where it is quick they spread out, so the picture
|
|
345
|
+
* shows the speed without a single number on it.
|
|
346
|
+
*/
|
|
347
|
+
function drawGhosts(plan, estimateResult, frame, point, heading, options) {
|
|
348
|
+
const everyS = options.ghostEveryS ?? GHOST_EVERY_S;
|
|
349
|
+
const everyIn = options.ghostEveryIn ?? GHOST_EVERY_IN;
|
|
350
|
+
const parts = [`<g id="ghosts">`];
|
|
351
|
+
for (const step of flat(plan.steps)) {
|
|
352
|
+
if (step.samples.length < 2)
|
|
353
|
+
continue;
|
|
354
|
+
const times = estimateResult?.byStepId[step.id]?.timeAtSampleS;
|
|
355
|
+
const chosen = times !== undefined && times.length === step.samples.length
|
|
356
|
+
? samplesEvery(step, times, everyS)
|
|
357
|
+
: samplesEveryInch(step, everyIn);
|
|
358
|
+
for (const sample of chosen) {
|
|
359
|
+
const pose = { ...point(sample.pose), headingRad: heading(sample.pose.headingRad) };
|
|
360
|
+
const corners = sample.footprintIn
|
|
361
|
+
.map((cornerIn) => {
|
|
362
|
+
const at = frame.at(point(cornerIn));
|
|
363
|
+
return `${n(at.x)},${n(at.y)}`;
|
|
364
|
+
})
|
|
365
|
+
.join(" ");
|
|
366
|
+
const at = frame.at(pose);
|
|
367
|
+
const nose = frame.at({
|
|
368
|
+
xIn: pose.xIn + Math.cos(pose.headingRad) * 6,
|
|
369
|
+
yIn: pose.yIn + Math.sin(pose.headingRad) * 6,
|
|
370
|
+
});
|
|
371
|
+
parts.push(`<polygon points="${corners}" fill="${TOKENS.pathEstimated}" fill-opacity="${n(ALPHA.ghostFootprint)}" stroke="${TOKENS.pathEstimated}" stroke-width="0.5" stroke-opacity="0.5"/>`, `<line x1="${n(at.x)}" y1="${n(at.y)}" x2="${n(nose.x)}" y2="${n(nose.y)}" stroke="${TOKENS.handleHeading}" stroke-width="1"/>`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
parts.push(`</g>`);
|
|
375
|
+
return parts;
|
|
376
|
+
}
|
|
377
|
+
/** The samples nearest each half second of the step's own estimated time, the first and last always. */
|
|
378
|
+
function samplesEvery(step, times, everyS) {
|
|
379
|
+
const last = times[times.length - 1] ?? 0;
|
|
380
|
+
const chosen = [];
|
|
381
|
+
const taken = new Set();
|
|
382
|
+
for (let at = 0; at <= last + 1e-9; at += everyS) {
|
|
383
|
+
let best = 0;
|
|
384
|
+
for (let i = 1; i < times.length; i += 1) {
|
|
385
|
+
if (Math.abs(times[i] - at) < Math.abs(times[best] - at))
|
|
386
|
+
best = i;
|
|
387
|
+
}
|
|
388
|
+
if (!taken.has(best)) {
|
|
389
|
+
taken.add(best);
|
|
390
|
+
chosen.push(step.samples[best]);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
const end = step.samples.length - 1;
|
|
394
|
+
if (!taken.has(end))
|
|
395
|
+
chosen.push(step.samples[end]);
|
|
396
|
+
return chosen;
|
|
397
|
+
}
|
|
398
|
+
/** The fallback when there is no estimate: one footprint per foot of arc. */
|
|
399
|
+
function samplesEveryInch(step, everyIn) {
|
|
400
|
+
const chosen = [];
|
|
401
|
+
let next = 0;
|
|
402
|
+
for (const sample of step.samples) {
|
|
403
|
+
if (sample.sIn + 1e-9 >= next) {
|
|
404
|
+
chosen.push(sample);
|
|
405
|
+
next = sample.sIn + everyIn;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
const end = step.samples[step.samples.length - 1];
|
|
409
|
+
if (end !== undefined && chosen[chosen.length - 1] !== end)
|
|
410
|
+
chosen.push(end);
|
|
411
|
+
return chosen;
|
|
412
|
+
}
|
|
413
|
+
/** Every marker as a labelled pin at the point on the path it fires at. */
|
|
414
|
+
function drawMarkers(plan, frame, point) {
|
|
415
|
+
const parts = [`<g id="markers">`];
|
|
416
|
+
for (const step of flat(plan.steps)) {
|
|
417
|
+
if (step.step.kind !== "path")
|
|
418
|
+
continue;
|
|
419
|
+
const markers = step.step.markers ?? [];
|
|
420
|
+
for (const marker of markers) {
|
|
421
|
+
const t = markerT(marker.at, step.lengthIn);
|
|
422
|
+
const where = step.geometry?.pointAt(t);
|
|
423
|
+
if (where === undefined)
|
|
424
|
+
continue;
|
|
425
|
+
const at = frame.at(point(where));
|
|
426
|
+
parts.push(`<line x1="${n(at.x)}" y1="${n(at.y)}" x2="${n(at.x)}" y2="${n(at.y - 12)}" stroke="${TOKENS.markerPin}" stroke-width="1"/>`, `<circle cx="${n(at.x)}" cy="${n(at.y - 14)}" r="3" fill="${TOKENS.markerPin}"/>`, `<text x="${n(at.x + 5)}" y="${n(at.y - 16)}" fill="${TOKENS.markerPin}" font-size="9" font-family="${FONTS.mono}">${escapeText(marker.command.name)}</text>`);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
parts.push(`</g>`);
|
|
430
|
+
return parts;
|
|
431
|
+
}
|
|
432
|
+
/** The ledger as a side table, the same rows the pull-request body prints. */
|
|
433
|
+
function drawLedger(rows, leftPx, heightPx) {
|
|
434
|
+
const x = leftPx + MARGIN_PX;
|
|
435
|
+
const parts = [
|
|
436
|
+
`<g id="ledger">`,
|
|
437
|
+
`<rect x="${n(leftPx)}" y="${n(HEADER_PX)}" width="${n(LEDGER_WIDTH_PX)}" height="${n(heightPx - HEADER_PX - MARGIN_PX)}" fill="${TOKENS.bgPanel}" stroke="${TOKENS.borderSubtle}" stroke-width="1"/>`,
|
|
438
|
+
`<text x="${n(x)}" y="${n(HEADER_PX + 18)}" fill="${TOKENS.textHi}" font-size="12">Ledger</text>`,
|
|
439
|
+
];
|
|
440
|
+
let y = HEADER_PX + 38;
|
|
441
|
+
for (const row of rows) {
|
|
442
|
+
if (y > heightPx - MARGIN_PX - 8)
|
|
443
|
+
break;
|
|
444
|
+
parts.push(`<text x="${n(x)}" y="${n(y)}" fill="${TOKENS.textMid}" font-size="11" font-family="${FONTS.mono}">${escapeText(row.label)}</text>`);
|
|
445
|
+
if (row.detail !== undefined) {
|
|
446
|
+
parts.push(`<text x="${n(x)}" y="${n(y + 13)}" fill="${TOKENS.textLo}" font-size="10" font-family="${FONTS.mono}">${escapeText(row.detail)}</text>`);
|
|
447
|
+
y += 13;
|
|
448
|
+
}
|
|
449
|
+
y += 20;
|
|
450
|
+
}
|
|
451
|
+
parts.push(`</g>`);
|
|
452
|
+
return parts;
|
|
453
|
+
}
|
|
454
|
+
/** Every step, parallel and branch children included, in order. */
|
|
455
|
+
function flat(steps) {
|
|
456
|
+
const out = [];
|
|
457
|
+
for (const step of steps) {
|
|
458
|
+
out.push(step);
|
|
459
|
+
if (step.children !== undefined)
|
|
460
|
+
out.push(...flat(step.children));
|
|
461
|
+
}
|
|
462
|
+
return out;
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type Auto, type Segment, type Step, type Waypoints } from "@horizon36596/zenith-schema";
|
|
2
|
+
import type { Pose, Vec2 } from "./geometry/vec.js";
|
|
3
|
+
import type { Finding } from "./types.js";
|
|
4
|
+
export interface ResolvedSegment {
|
|
5
|
+
kind: Segment["kind"];
|
|
6
|
+
/** The control polygon: start, any control points, end. */
|
|
7
|
+
pointsIn: Vec2[];
|
|
8
|
+
fromPose: Pose;
|
|
9
|
+
toPose: Pose;
|
|
10
|
+
}
|
|
11
|
+
export interface ResolvedStep {
|
|
12
|
+
id: string;
|
|
13
|
+
kind: Step["kind"];
|
|
14
|
+
step: Step;
|
|
15
|
+
startPose: Pose;
|
|
16
|
+
endPose: Pose;
|
|
17
|
+
segments?: ResolvedSegment[];
|
|
18
|
+
children?: ResolvedStep[];
|
|
19
|
+
}
|
|
20
|
+
export interface ResolvedAuto {
|
|
21
|
+
auto: Auto;
|
|
22
|
+
startPose: Pose;
|
|
23
|
+
steps: ResolvedStep[];
|
|
24
|
+
/** SCHEMA findings for unresolvable references, CONTINUITY for a `current` with no previous. */
|
|
25
|
+
findings: Finding[];
|
|
26
|
+
}
|
|
27
|
+
/** Resolves waypoint references to poses and `"current"` to the previous step's end pose. */
|
|
28
|
+
export declare function resolve(auto: Auto, waypoints?: Waypoints): ResolvedAuto;
|
|
29
|
+
/** Anything shaped like a step tree: a resolved step, a planned step or a step estimate. */
|
|
30
|
+
export interface StepTree {
|
|
31
|
+
kind: Step["kind"];
|
|
32
|
+
children?: readonly StepTree[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* True for a path step, or a group with a path step somewhere inside it: the members of a parallel
|
|
36
|
+
* group that can decide where the robot ends up, and the ones whose exit speed carries on.
|
|
37
|
+
*/
|
|
38
|
+
export declare function containsPath(step: StepTree): boolean;
|
|
39
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,IAAI,EAAmB,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAI9H,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,2DAA2D;IAC3D,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,IAAI,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,gGAAgG;IAChG,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAID,6FAA6F;AAC7F,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,YAAY,CAkJvE;AAED,4FAA4F;AAC5F,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAGpD"}
|