@hatiolab/figure-model 0.1.95 → 0.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.
Files changed (98) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/asset.d.ts.map +1 -1
  3. package/dist/asset.js +3 -1
  4. package/dist/asset.js.map +1 -1
  5. package/dist/authoring-actions.d.ts +19 -0
  6. package/dist/authoring-actions.d.ts.map +1 -1
  7. package/dist/authoring-actions.js +106 -63
  8. package/dist/authoring-actions.js.map +1 -1
  9. package/dist/command-preview.d.ts +3 -1
  10. package/dist/command-preview.d.ts.map +1 -1
  11. package/dist/command-preview.js +52 -27
  12. package/dist/command-preview.js.map +1 -1
  13. package/dist/cost.d.ts +1 -1
  14. package/dist/cost.d.ts.map +1 -1
  15. package/dist/cost.js +30 -25
  16. package/dist/cost.js.map +1 -1
  17. package/dist/create.d.ts.map +1 -1
  18. package/dist/create.js +112 -31
  19. package/dist/create.js.map +1 -1
  20. package/dist/document.d.ts.map +1 -1
  21. package/dist/document.js +3 -2
  22. package/dist/document.js.map +1 -1
  23. package/dist/fixtures/shape-nodes.d.ts +12 -0
  24. package/dist/fixtures/shape-nodes.d.ts.map +1 -0
  25. package/dist/fixtures/shape-nodes.js +20 -0
  26. package/dist/fixtures/shape-nodes.js.map +1 -0
  27. package/dist/follow.d.ts.map +1 -1
  28. package/dist/follow.js +5 -2
  29. package/dist/follow.js.map +1 -1
  30. package/dist/gate.d.ts.map +1 -1
  31. package/dist/gate.js +31 -59
  32. package/dist/gate.js.map +1 -1
  33. package/dist/graph-types.d.ts +7 -6
  34. package/dist/graph-types.d.ts.map +1 -1
  35. package/dist/graph.d.ts +17 -12
  36. package/dist/graph.d.ts.map +1 -1
  37. package/dist/graph.js +24 -292
  38. package/dist/graph.js.map +1 -1
  39. package/dist/index.d.ts +4 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +5 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/kernel-version.d.ts +1 -1
  44. package/dist/kernel-version.d.ts.map +1 -1
  45. package/dist/kernel-version.js +1 -1
  46. package/dist/kernel-version.js.map +1 -1
  47. package/dist/part-edit.d.ts.map +1 -1
  48. package/dist/part-edit.js +8 -6
  49. package/dist/part-edit.js.map +1 -1
  50. package/dist/proposal.d.ts +1 -1
  51. package/dist/proposal.d.ts.map +1 -1
  52. package/dist/proposal.js +14 -2
  53. package/dist/proposal.js.map +1 -1
  54. package/dist/recipe-from-parts.d.ts.map +1 -1
  55. package/dist/recipe-from-parts.js +107 -24
  56. package/dist/recipe-from-parts.js.map +1 -1
  57. package/dist/render-batches.d.ts.map +1 -1
  58. package/dist/render-batches.js +11 -2
  59. package/dist/render-batches.js.map +1 -1
  60. package/dist/resize-plan.d.ts.map +1 -1
  61. package/dist/resize-plan.js +22 -8
  62. package/dist/resize-plan.js.map +1 -1
  63. package/dist/section.d.ts +164 -0
  64. package/dist/section.d.ts.map +1 -0
  65. package/dist/section.js +277 -0
  66. package/dist/section.js.map +1 -0
  67. package/dist/shape-edit.d.ts +22 -0
  68. package/dist/shape-edit.d.ts.map +1 -0
  69. package/dist/shape-edit.js +225 -0
  70. package/dist/shape-edit.js.map +1 -0
  71. package/dist/shape-features.d.ts +83 -0
  72. package/dist/shape-features.d.ts.map +1 -0
  73. package/dist/shape-features.js +102 -0
  74. package/dist/shape-features.js.map +1 -0
  75. package/dist/shape-ops.d.ts +154 -0
  76. package/dist/shape-ops.d.ts.map +1 -0
  77. package/dist/shape-ops.js +571 -0
  78. package/dist/shape-ops.js.map +1 -0
  79. package/dist/shape-provider.d.ts +16 -23
  80. package/dist/shape-provider.d.ts.map +1 -1
  81. package/dist/shape-provider.js +18 -56
  82. package/dist/shape-provider.js.map +1 -1
  83. package/dist/shape-sampling.d.ts +0 -8
  84. package/dist/shape-sampling.d.ts.map +1 -1
  85. package/dist/shape-sampling.js +67 -101
  86. package/dist/shape-sampling.js.map +1 -1
  87. package/dist/size-edit.js +2 -2
  88. package/dist/size-edit.js.map +1 -1
  89. package/dist/surface.d.ts.map +1 -1
  90. package/dist/surface.js +10 -17
  91. package/dist/surface.js.map +1 -1
  92. package/dist/words.d.ts +7 -0
  93. package/dist/words.d.ts.map +1 -1
  94. package/dist/words.js +7 -0
  95. package/dist/words.js.map +1 -1
  96. package/docs/document-contract.md +1 -1
  97. package/docs/shape-contract.md +439 -0
  98. package/package.json +1 -1
@@ -0,0 +1,571 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ /*
5
+ * The shape operations (ADR-0100, docs/shape-contract.md): `extrude@1` pushes a section along one of the part's own
6
+ * axes, `revolve@1` turns a half-section about one. They are the only operators that make a shape.
7
+ *
8
+ * A node is the record of its shape: its params say what it is -- the axis, the kind of section, the names of a drawn
9
+ * section's points, whether it has an inside and which of its ends are open -- and its arguments are the values that
10
+ * size it, in an order the params fix. Nothing outside this file reads an argument by its place: every reader asks
11
+ * `figureShapeDescriptionOf(node)` which argument is which measure and where each face lies.
12
+ */
13
+ import { FigureContractError } from "./contract.js";
14
+ import { checkFigureSection, FIGURE_SECTION_PLANE } from "./section.js";
15
+ import { figureExtrusionFeaturesOf } from "./shape-features.js";
16
+ import { AXES } from "./words.js";
17
+ const fail = (code, path, detail) => {
18
+ throw new FigureContractError(code, path, detail);
19
+ };
20
+ const isLength = (t) => Array.isArray(t) && t.length === 3 && t[0] === 1 && t[1] === 0 && t[2] === 0;
21
+ /** The words the part's outer faces go by, low then high, along each of its own axes. */
22
+ export const FIGURE_OUTER_FACES = Object.freeze({
23
+ x: ['left', 'right'],
24
+ y: ['bottom', 'top'],
25
+ z: ['back', 'front']
26
+ });
27
+ export const FIGURE_SECTION_KINDS = ['rectangle', 'ellipse', 'polygon', 'portal'];
28
+ const ID = /^[a-zA-Z][a-zA-Z0-9_-]*$/;
29
+ /** Read an extrude node's params into its layout, or fail naming what is wrong. */
30
+ export function figureExtrudeLayoutOf(params, path) {
31
+ const p = params ?? {};
32
+ const axis = p.axis;
33
+ if (!AXES.includes(axis))
34
+ fail('PARAM', path, `axis is x, y or z, not ${String(p.axis)}`);
35
+ const section = p.section;
36
+ if (!FIGURE_SECTION_KINDS.includes(section))
37
+ fail('PARAM', path, `section is ${FIGURE_SECTION_KINDS.join(', ')}, not ${String(p.section)}`);
38
+ const plane = [...FIGURE_SECTION_PLANE[axis]].sort();
39
+ const [a, b] = plane;
40
+ const rounded = p.corner === 'round';
41
+ if (p.corner !== undefined && (!rounded || section !== 'rectangle'))
42
+ fail('PARAM', path, 'corner is `round`, and only a rectangle has corners');
43
+ const points = section === 'polygon' ? String(p.points ?? '').split('.') : [];
44
+ if (section === 'polygon') {
45
+ if (points.length < 3 || points.some(q => !ID.test(q)))
46
+ fail('PARAM', path, 'a drawn section names three points or more, joined by `.`');
47
+ if (new Set(points).size !== points.length)
48
+ fail('PARAM', path, 'a point is named twice');
49
+ }
50
+ else if (p.points !== undefined)
51
+ fail('PARAM', path, 'only a drawn section has points');
52
+ let n = 2;
53
+ const next = () => n++;
54
+ const arg = { start: 0, length: 1 };
55
+ if (section === 'rectangle' || section === 'ellipse' || section === 'portal')
56
+ arg.across = { [a]: next(), [b]: next() };
57
+ if (rounded)
58
+ arg.corner = { [a]: next(), [b]: next() };
59
+ if (section === 'portal') {
60
+ arg.jamb = next();
61
+ arg.head = next();
62
+ }
63
+ if (section === 'polygon')
64
+ arg.point = Object.fromEntries(points.map(q => [q, { [a]: next(), [b]: next() }]));
65
+ let cavity;
66
+ if (p.cavity !== undefined) {
67
+ if (section !== 'rectangle' && section !== 'ellipse')
68
+ fail('SECTION_KIND', path, `a ${section} section has no inside yet (ADR-0100 stage 4)`);
69
+ const end = (k) => {
70
+ const v = p[k];
71
+ if (v !== 'open' && v !== 'closed')
72
+ fail('PARAM', path, `${k} is open or closed`);
73
+ return v;
74
+ };
75
+ cavity = { id: p.cavity, start: end('cavity-start'), end: end('cavity-end') };
76
+ arg.wall = Object.fromEntries([a, b].flatMap(x => [`${x}-`, `${x}+`]).map(s => [s, next()]));
77
+ if (cavity.start === 'closed')
78
+ arg.startClosed = next();
79
+ if (cavity.end === 'closed')
80
+ arg.endClosed = next();
81
+ }
82
+ else if (p['cavity-start'] !== undefined || p['cavity-end'] !== undefined)
83
+ fail('PARAM', path, 'the ends of an inside need the inside');
84
+ return { axis, plane, section, points, rounded, ...(cavity ? { cavity } : {}), arg, count: n };
85
+ }
86
+ /* --------------------------------------------------------------------------------------------------- descriptions */
87
+ const term = (arg, k = 1) => [{ arg, k }];
88
+ /**
89
+ * Where a push's two ends lie, as sums of its arguments: the start (argument 0) and the start plus the length
90
+ * (argument 1). When the start is written as half the length below the origin (`<start> = <length> × -0.5`), the ends
91
+ * are written as ±half the length instead -- the same plane, and the same one a centred box has always had, so what is
92
+ * fastened to it is made of the same nodes whether the part was drawn now or rewritten (ADR-0100 §10). That needs the
93
+ * graph; without it the general sums are given.
94
+ */
95
+ function endsOf(node, model) {
96
+ const general = {
97
+ lo: [{ arg: 0, k: 1 }],
98
+ hi: [
99
+ { arg: 0, k: 1 },
100
+ { arg: 1, k: 1 }
101
+ ]
102
+ };
103
+ if (!model)
104
+ return general;
105
+ const start = node.args?.[0], length = node.args?.[1];
106
+ const writer = model.nodes.find((n) => n.outputs && Object.values(n.outputs).includes(start));
107
+ if (writer?.op !== 'mul@1' || writer.args.length !== 2 || writer.args[0] !== length)
108
+ return general;
109
+ if (model.constants.find((c) => c.id === writer.args[1])?.value !== -0.5)
110
+ return general;
111
+ return { lo: [{ arg: 1, k: -0.5 }], hi: [{ arg: 1, k: 0.5 }] };
112
+ }
113
+ /** The description of an extrude node. */
114
+ function extrudeDescription(node, model) {
115
+ const L = figureExtrudeLayoutOf(node.params, node.id);
116
+ const [a, b] = L.plane;
117
+ const measure = {};
118
+ const edit = {};
119
+ const faces = {};
120
+ const [lo, hi] = FIGURE_OUTER_FACES[L.axis];
121
+ const ends = endsOf(node, model);
122
+ measure[L.axis] = term(1);
123
+ edit[L.axis] = { arg: 1, k: 1 };
124
+ faces[lo] = { axis: L.axis, normal: -1, plane: ends.lo };
125
+ faces[hi] = { axis: L.axis, normal: 1, plane: ends.hi };
126
+ if (L.section === 'polygon') {
127
+ for (const x of [a, b]) {
128
+ measure[x] = 'profile';
129
+ edit[x] = { refused: 'SECTION_CORNERS' };
130
+ }
131
+ return { measure, edit, faces, kind: 'polygon' };
132
+ }
133
+ const across = L.arg.across;
134
+ const k = L.section === 'ellipse' ? 2 : 1;
135
+ for (const x of [a, b]) {
136
+ measure[x] = term(across[x], k);
137
+ edit[x] = { arg: across[x], k };
138
+ }
139
+ /* A round section whose two radii are one value goes with that value: editing either edits both. */
140
+ if (node.args?.[across[a]] !== undefined && node.args[across[a]] === node.args[across[b]])
141
+ edit[b] = { arg: across[b], k, sameAs: a };
142
+ if (L.section === 'portal') {
143
+ /* Width centred on the first plane axis; height standing on 0 along the second, the opening reaching its low side. */
144
+ const [la, ha] = FIGURE_OUTER_FACES[a], [lb, hb] = FIGURE_OUTER_FACES[b];
145
+ faces[la] = { axis: a, normal: -1, plane: [{ arg: across[a], k: -0.5 }] };
146
+ faces[ha] = { axis: a, normal: 1, plane: [{ arg: across[a], k: 0.5 }] };
147
+ faces[lb] = { axis: b, normal: -1, plane: [] };
148
+ faces[hb] = { axis: b, normal: 1, plane: [{ arg: across[b], k: 1 }] };
149
+ faces[`opening-${la}`] = {
150
+ axis: a,
151
+ normal: 1,
152
+ plane: [
153
+ { arg: across[a], k: -0.5 },
154
+ { arg: L.arg.jamb, k: 1 }
155
+ ]
156
+ };
157
+ faces[`opening-${ha}`] = {
158
+ axis: a,
159
+ normal: -1,
160
+ plane: [
161
+ { arg: across[a], k: 0.5 },
162
+ { arg: L.arg.jamb, k: -1 }
163
+ ]
164
+ };
165
+ faces[`opening-${hb}`] = {
166
+ axis: b,
167
+ normal: -1,
168
+ plane: [
169
+ { arg: across[b], k: 1 },
170
+ { arg: L.arg.head, k: -1 }
171
+ ]
172
+ };
173
+ return { measure, edit, faces, kind: 'portal' };
174
+ }
175
+ /* A rectangle's sides are planes; an ellipse's are the planes that touch it at its extremes (Q3: a line contact). */
176
+ const half = L.section === 'ellipse' ? 1 : 0.5;
177
+ const line = L.section === 'ellipse' ? { contact: 'line' } : {};
178
+ for (const x of [a, b]) {
179
+ const [l, h] = FIGURE_OUTER_FACES[x];
180
+ faces[l] = { axis: x, normal: -1, plane: [{ arg: across[x], k: -half }], ...line };
181
+ faces[h] = { axis: x, normal: 1, plane: [{ arg: across[x], k: half }], ...line };
182
+ }
183
+ if (L.cavity) {
184
+ const w = L.arg.wall;
185
+ for (const x of [a, b]) {
186
+ const [l, h] = FIGURE_OUTER_FACES[x];
187
+ faces[`inside-${l}`] = {
188
+ axis: x,
189
+ normal: 1,
190
+ plane: [
191
+ { arg: across[x], k: -half },
192
+ { arg: w[`${x}-`], k: 1 }
193
+ ],
194
+ ...line
195
+ };
196
+ faces[`inside-${h}`] = {
197
+ axis: x,
198
+ normal: -1,
199
+ plane: [
200
+ { arg: across[x], k: half },
201
+ { arg: w[`${x}+`], k: -1 }
202
+ ],
203
+ ...line
204
+ };
205
+ }
206
+ if (L.arg.startClosed !== undefined)
207
+ faces[`inside-${lo}`] = { axis: L.axis, normal: 1, plane: [...ends.lo, { arg: L.arg.startClosed, k: 1 }] };
208
+ if (L.arg.endClosed !== undefined)
209
+ faces[`inside-${hi}`] = { axis: L.axis, normal: -1, plane: [...ends.hi, { arg: L.arg.endClosed, k: -1 }] };
210
+ }
211
+ return { measure, edit, faces, kind: L.section };
212
+ }
213
+ function revolveLayoutOf(params, path) {
214
+ const p = params ?? {};
215
+ const axis = p.axis;
216
+ if (!AXES.includes(axis))
217
+ fail('PARAM', path, `axis is x, y or z, not ${String(p.axis)}`);
218
+ if (p.profile !== 'half-ellipse' && p.profile !== 'taper')
219
+ fail('PARAM', path, `profile is half-ellipse or taper, not ${String(p.profile)}`);
220
+ return { axis, profile: p.profile, count: p.profile === 'taper' ? 4 : 2 };
221
+ }
222
+ /*
223
+ * A revolve's arguments. half-ellipse: (radial, axial) -- a sphere, or a spheroid, centred on the origin.
224
+ * taper: (start, length, start radius, end radius) -- a cone or a frustum along the axis.
225
+ */
226
+ function revolveDescription(node, model) {
227
+ const L = revolveLayoutOf(node.params, node.id);
228
+ const [a, b] = [...FIGURE_SECTION_PLANE[L.axis]].sort();
229
+ const measure = {};
230
+ const edit = {};
231
+ if (L.profile === 'half-ellipse') {
232
+ measure[L.axis] = term(1, 2);
233
+ edit[L.axis] = { arg: 1, k: 2 };
234
+ measure[a] = measure[b] = term(0, 2);
235
+ edit[a] = { arg: 0, k: 2 };
236
+ edit[b] = { arg: 0, k: 2, sameAs: a };
237
+ return { measure, edit, faces: {}, kind: 'sphere' };
238
+ }
239
+ const [lo, hi] = FIGURE_OUTER_FACES[L.axis];
240
+ measure[L.axis] = term(1);
241
+ edit[L.axis] = { arg: 1, k: 1 };
242
+ /*
243
+ As wide as the wider end, whichever that is. A width edits both ends in proportion, so the taper stays; its measure is
244
+ the end radius -- a hopper's mouth -- and the start keeps its proportion to it.
245
+ */
246
+ const across = [
247
+ { arg: 2, k: 2 },
248
+ { arg: 3, k: 2 }
249
+ ];
250
+ measure[a] = measure[b] = across;
251
+ edit[a] = { arg: 3, k: 2, with: [2] };
252
+ edit[b] = { arg: 3, k: 2, with: [2], sameAs: a };
253
+ const ends = endsOf(node, model);
254
+ const faces = {
255
+ [lo]: { axis: L.axis, normal: -1, plane: ends.lo },
256
+ [hi]: { axis: L.axis, normal: 1, plane: ends.hi }
257
+ };
258
+ return { measure, edit, faces, kind: 'taper' };
259
+ }
260
+ /** The shape operators, by name. */
261
+ export const FIGURE_SHAPE_OPERATOR_NAMES = ['extrude@1', 'revolve@1'];
262
+ /**
263
+ * What a shape node offers, or undefined for a node that is not a shape. Given the graph, a centred push's ends are
264
+ * written as ±half its length (`endsOf`); the planes are the same either way.
265
+ */
266
+ export function figureShapeDescriptionOf(node, model) {
267
+ if (node?.op === 'extrude@1')
268
+ return extrudeDescription(node, model);
269
+ if (node?.op === 'revolve@1')
270
+ return revolveDescription(node, model);
271
+ return undefined;
272
+ }
273
+ const facesAt = (faces, args) => Object.fromEntries(Object.entries(faces).map(([name, f]) => [
274
+ name,
275
+ { axis: f.axis, normal: f.normal, at: f.plane.reduce((s, t) => s + t.k * args[t.arg], 0) }
276
+ ]));
277
+ /** A portal's outline: the outer rectangle less the opening, which reaches its low side on the second plane axis. */
278
+ function portalSection(a, b, width, height, jamb, head) {
279
+ const l = -width / 2, r = width / 2, il = l + jamb, ir = r - jamb, it = height - head;
280
+ const at = (id, u, v) => ({ id, [a]: u, [b]: v });
281
+ const points = [
282
+ at('p1', l, 0),
283
+ at('p2', l, height),
284
+ at('p3', r, height),
285
+ at('p4', r, 0),
286
+ at('p5', ir, 0),
287
+ at('p6', ir, it),
288
+ at('p7', il, it),
289
+ at('p8', il, 0)
290
+ ];
291
+ return { kind: 'polygon', points: orient(points, a, b) };
292
+ }
293
+ /** A loop written counter-clockwise seen from the push axis (`FIGURE_SECTION_PLANE`), keeping its first point. */
294
+ function orient(points, a, b) {
295
+ const axis = AXES.find(x => x !== a && x !== b);
296
+ const [u, v] = FIGURE_SECTION_PLANE[axis];
297
+ let s = 0;
298
+ for (let i = 0; i < points.length; i++) {
299
+ const p = points[i], q = points[(i + 1) % points.length];
300
+ s += p[u] * q[v] - q[u] * p[v];
301
+ }
302
+ return s > 0 ? points : [points[0], ...points.slice(1).reverse()];
303
+ }
304
+ function signedArea2(section, axis) {
305
+ const [u, v] = FIGURE_SECTION_PLANE[axis];
306
+ let s = 0;
307
+ const pts = section.points;
308
+ for (let i = 0; i < pts.length; i++) {
309
+ const p = pts[i], q = pts[(i + 1) % pts.length];
310
+ s += p[u] * q[v] - q[u] * p[v];
311
+ }
312
+ return s;
313
+ }
314
+ function runExtrude(args, path, node) {
315
+ const L = figureExtrudeLayoutOf(node.params, path);
316
+ const [a, b] = L.plane;
317
+ const start = args[0], length = args[1];
318
+ if (!(length > 0))
319
+ fail('GEOMETRY_DOMAIN', path, `a push of positive length required, not ${length}`);
320
+ const dimensions = { start, length };
321
+ let section;
322
+ if (L.section === 'polygon') {
323
+ const points = L.points.map(id => ({
324
+ id,
325
+ [a]: args[L.arg.point[id][a]],
326
+ [b]: args[L.arg.point[id][b]]
327
+ }));
328
+ points.forEach(q => {
329
+ dimensions[`point.${q.id}.${a}`] = q[a];
330
+ dimensions[`point.${q.id}.${b}`] = q[b];
331
+ });
332
+ section = { kind: 'polygon', points };
333
+ }
334
+ else if (L.section === 'portal') {
335
+ const width = args[L.arg.across[a]], height = args[L.arg.across[b]], jamb = args[L.arg.jamb], head = args[L.arg.head];
336
+ if (!(width > 0 && height > 0 && jamb > 0 && head > 0 && 2 * jamb < width && head < height))
337
+ fail('GEOMETRY_DOMAIN', path, 'positive measures, jambs narrower than half the width and a head lower than the height required');
338
+ Object.assign(dimensions, { [`size.${a}`]: width, [`size.${b}`]: height, jamb, head });
339
+ section = portalSection(a, b, width, height, jamb, head);
340
+ }
341
+ else {
342
+ const across = { [a]: args[L.arg.across[a]], [b]: args[L.arg.across[b]] };
343
+ const name = L.section === 'ellipse' ? 'radius' : 'size';
344
+ dimensions[`${name}.${a}`] = across[a];
345
+ dimensions[`${name}.${b}`] = across[b];
346
+ if (L.section === 'ellipse')
347
+ section = { kind: 'ellipse', radius: across };
348
+ else {
349
+ section = { kind: 'rectangle', size: across };
350
+ if (L.rounded) {
351
+ const corner = { [a]: args[L.arg.corner[a]], [b]: args[L.arg.corner[b]] };
352
+ dimensions[`corner.${a}`] = corner[a];
353
+ dimensions[`corner.${b}`] = corner[b];
354
+ /* A corner of 0 on both axes is a sharp one; a rounded rectangle may be drawn down to it and back. */
355
+ if (corner[a] > 0 || corner[b] > 0)
356
+ section = { kind: 'rectangle', size: across, corner };
357
+ }
358
+ }
359
+ }
360
+ const issues = checkFigureSection(section, L.axis);
361
+ if (issues.length)
362
+ fail('GEOMETRY_DOMAIN', path, `the section is not valid: ${issues.map(i => i.code).join(', ')}`);
363
+ if (section.kind === 'polygon' && L.section === 'polygon' && !(signedArea2(section, L.axis) > 0))
364
+ fail('SECTION_WINDING', path, 'a drawn section runs counter-clockwise seen from its push axis; write it with normalizeFigureSection');
365
+ const extrusion = { axis: L.axis, section, start, end: start + length };
366
+ let cavity;
367
+ if (L.cavity) {
368
+ const wall = Object.fromEntries(Object.entries(L.arg.wall).map(([s, i]) => [s, args[i]]));
369
+ cavity = {
370
+ id: L.cavity.id,
371
+ wall,
372
+ start: L.cavity.start === 'open' ? 'open' : { closed: args[L.arg.startClosed] },
373
+ end: L.cavity.end === 'open' ? 'open' : { closed: args[L.arg.endClosed] }
374
+ };
375
+ for (const [s, t] of Object.entries(wall))
376
+ dimensions[`wall.${s}`] = t;
377
+ if (cavity.start !== 'open')
378
+ dimensions['closed.start'] = cavity.start.closed;
379
+ if (cavity.end !== 'open')
380
+ dimensions['closed.end'] = cavity.end.closed;
381
+ const r = figureExtrusionFeaturesOf(extrusion, [cavity]);
382
+ if ('refused' in r)
383
+ fail('GEOMETRY_DOMAIN', path, `the inside is not valid: ${r.refused.code}${'refused' in r.refused ? ` ${r.refused.refused}` : ''}`);
384
+ }
385
+ return {
386
+ provider: 'extrude',
387
+ dimensions,
388
+ extrusion,
389
+ ...(cavity ? { cavity } : {}),
390
+ faces: facesAt(extrudeDescription(node).faces, args)
391
+ };
392
+ }
393
+ function runRevolve(args, path, node) {
394
+ const L = revolveLayoutOf(node.params, path);
395
+ const faces = facesAt(revolveDescription(node).faces, args);
396
+ if (L.profile === 'half-ellipse') {
397
+ const [radial, axial] = args;
398
+ if (!(radial > 0 && axial > 0))
399
+ fail('GEOMETRY_DOMAIN', path, 'positive radii required');
400
+ return {
401
+ provider: 'revolve',
402
+ dimensions: { radial, axial },
403
+ revolution: { axis: L.axis, profile: { kind: 'half-ellipse', radial, axial } },
404
+ faces
405
+ };
406
+ }
407
+ const [start, length, startRadius, endRadius] = args;
408
+ if (!(length > 0 && startRadius >= 0 && endRadius >= 0 && startRadius + endRadius > 0))
409
+ fail('GEOMETRY_DOMAIN', path, 'a positive length and radii of 0 or more, not both 0, required');
410
+ return {
411
+ provider: 'revolve',
412
+ dimensions: { start, length, startRadius, endRadius },
413
+ revolution: { axis: L.axis, profile: { kind: 'taper', start, end: start + length, startRadius, endRadius } },
414
+ faces
415
+ };
416
+ }
417
+ /** The shape's value type: its frame, and the directions of its flat faces, which a reader checks names against. */
418
+ function shapeType(provider, n, faces) {
419
+ return {
420
+ kind: 'shape',
421
+ provider,
422
+ frame: n.params.frame,
423
+ faces: Object.fromEntries(Object.entries(faces).map(([k, f]) => [k, f.contact ? [f.axis, f.normal, f.contact] : [f.axis, f.normal]]))
424
+ };
425
+ }
426
+ /** The two operators, in the graph's operator shape. */
427
+ export const FIGURE_SHAPE_OPERATORS = {
428
+ 'extrude@1': {
429
+ ports: ['shape'],
430
+ params: ['frame', 'axis', 'section'],
431
+ optionalParams: ['points', 'corner', 'cavity', 'cavity-start', 'cavity-end'],
432
+ types(t, p, n) {
433
+ const L = figureExtrudeLayoutOf(n.params, p);
434
+ if (t.length !== L.count || !t.every(isLength))
435
+ fail('TYPE', p, `a ${L.section} push takes ${L.count} lengths, not ${t.length}`);
436
+ return [shapeType('extrude', n, extrudeDescription(n).faces)];
437
+ },
438
+ run: (args, p, n) => [runExtrude(args, p, n)]
439
+ },
440
+ 'revolve@1': {
441
+ ports: ['shape'],
442
+ params: ['frame', 'axis', 'profile'],
443
+ types(t, p, n) {
444
+ const L = revolveLayoutOf(n.params, p);
445
+ if (t.length !== L.count || !t.every(isLength))
446
+ fail('TYPE', p, `a ${L.profile} turn takes ${L.count} lengths, not ${t.length}`);
447
+ return [shapeType('revolve', n, revolveDescription(n).faces)];
448
+ },
449
+ run: (args, p, n) => [runRevolve(args, p, n)]
450
+ }
451
+ };
452
+ /* ----------------------------------------------------------------------------------------------- evaluated readers */
453
+ /** How far an evaluated shape reaches along each of its own axes: least and most, in its own frame. */
454
+ export function figureShapeBoundsOf(shape) {
455
+ const out = {};
456
+ if (shape.extrusion) {
457
+ const e = shape.extrusion;
458
+ const [u, v] = FIGURE_SECTION_PLANE[e.axis];
459
+ out[e.axis] = { min: e.start, max: e.end };
460
+ const s = e.section;
461
+ for (const x of [u, v]) {
462
+ if (s.kind === 'rectangle')
463
+ out[x] = { min: -s.size[x] / 2, max: s.size[x] / 2 };
464
+ else if (s.kind === 'ellipse')
465
+ out[x] = { min: -s.radius[x], max: s.radius[x] };
466
+ else {
467
+ const xs = s.points.map(q => q[x]);
468
+ out[x] = { min: Math.min(...xs), max: Math.max(...xs) };
469
+ }
470
+ }
471
+ return out;
472
+ }
473
+ const r = shape.revolution;
474
+ const [u, v] = FIGURE_SECTION_PLANE[r.axis];
475
+ if (r.profile.kind === 'half-ellipse') {
476
+ out[r.axis] = { min: -r.profile.axial, max: r.profile.axial };
477
+ for (const x of [u, v])
478
+ out[x] = { min: -r.profile.radial, max: r.profile.radial };
479
+ }
480
+ else {
481
+ const w = Math.max(r.profile.startRadius, r.profile.endRadius);
482
+ out[r.axis] = { min: r.profile.start, max: r.profile.end };
483
+ for (const x of [u, v])
484
+ out[x] = { min: -w, max: w };
485
+ }
486
+ return out;
487
+ }
488
+ /**
489
+ * How far a turned shape reaches along a direction `d` (a unit vector in the shape's frame), from its own origin: the
490
+ * support function. A box's is the sum over its corners; a round body's is its axis half-length times how much it
491
+ * points along `d` plus its section's own reach -- a wheel at 45° is not its square's diagonal (the forklift, 2026-09).
492
+ */
493
+ export function figureShapeSupportOf(shape, d) {
494
+ const idx = { x: 0, y: 1, z: 2 };
495
+ const dot = (p) => AXES.reduce((s, x) => s + (p[x] ?? 0) * d[idx[x]], 0);
496
+ const span = (pts) => {
497
+ const vs = pts.map(dot);
498
+ return { max: Math.max(...vs), min: Math.min(...vs) };
499
+ };
500
+ const disc = (axis, at, ru, rv) => {
501
+ const [u, v] = FIGURE_SECTION_PLANE[axis];
502
+ const c = at * d[idx[axis]], r = Math.hypot(ru * d[idx[u]], rv * d[idx[v]]);
503
+ return { max: c + r, min: c - r };
504
+ };
505
+ const union = (xs) => ({
506
+ max: Math.max(...xs.map(x => x.max)),
507
+ min: Math.min(...xs.map(x => x.min))
508
+ });
509
+ if (shape.extrusion) {
510
+ const e = shape.extrusion;
511
+ const [u, v] = FIGURE_SECTION_PLANE[e.axis];
512
+ const s = e.section;
513
+ if (s.kind === 'ellipse')
514
+ return union([disc(e.axis, e.start, s.radius[u], s.radius[v]), disc(e.axis, e.end, s.radius[u], s.radius[v])]);
515
+ const outline = s.kind === 'polygon'
516
+ ? s.points
517
+ : [-1, 1].flatMap(su => [-1, 1].map(sv => ({ [u]: (su * s.size[u]) / 2, [v]: (sv * s.size[v]) / 2 })));
518
+ return span(outline.flatMap(p => [e.start, e.end].map(t => ({ ...p, [e.axis]: t }))));
519
+ }
520
+ const r = shape.revolution;
521
+ if (r.profile.kind === 'half-ellipse') {
522
+ const [u, v] = FIGURE_SECTION_PLANE[r.axis];
523
+ const m = Math.hypot(r.profile.radial * d[idx[u]], r.profile.axial * d[idx[r.axis]], r.profile.radial * d[idx[v]]);
524
+ return { max: m, min: -m };
525
+ }
526
+ return union([
527
+ disc(r.axis, r.profile.start, r.profile.startRadius, r.profile.startRadius),
528
+ disc(r.axis, r.profile.end, r.profile.endRadius, r.profile.endRadius)
529
+ ]);
530
+ }
531
+ /**
532
+ * Where a named feature of an evaluated shape sits, in its own frame: the middle of the face (of the inside, for an
533
+ * inside face), the middle of the shape for `centre`, and for a sphere, which has no flat face, its six extremes.
534
+ */
535
+ export function figureShapeFeaturePointOf(shape, name) {
536
+ const bounds = figureShapeBoundsOf(shape);
537
+ const mid = AXES.map(x => (bounds[x].min + bounds[x].max) / 2);
538
+ if (name === 'centre')
539
+ return mid;
540
+ const face = shape.faces[name];
541
+ const idx = { x: 0, y: 1, z: 2 };
542
+ if (face) {
543
+ const at = [...mid];
544
+ at[idx[face.axis]] = face.at;
545
+ if (name.startsWith('inside-') && shape.cavity && shape.extrusion) {
546
+ const e = shape.extrusion, c = shape.cavity, w = c.wall;
547
+ for (const x of FIGURE_SECTION_PLANE[e.axis])
548
+ if (x !== face.axis)
549
+ at[idx[x]] = mid[idx[x]] + (w[`${x}-`] - w[`${x}+`]) / 2;
550
+ if (face.axis !== e.axis) {
551
+ const lo = e.start + (c.start === 'open' ? 0 : c.start.closed), hi = e.end - (c.end === 'open' ? 0 : c.end.closed);
552
+ at[idx[e.axis]] = (lo + hi) / 2;
553
+ }
554
+ }
555
+ return at;
556
+ }
557
+ if (shape.revolution?.profile.kind === 'half-ellipse') {
558
+ const extreme = Object.entries(FIGURE_OUTER_FACES).flatMap(([x, [l, h]]) => [
559
+ [l, x, -1],
560
+ [h, x, 1]
561
+ ]);
562
+ const hit = extreme.find(([n]) => n === name);
563
+ if (!hit)
564
+ return undefined;
565
+ const at = [...mid];
566
+ at[idx[hit[1]]] = hit[2] < 0 ? bounds[hit[1]].min : bounds[hit[1]].max;
567
+ return at;
568
+ }
569
+ return undefined;
570
+ }
571
+ //# sourceMappingURL=shape-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-ops.js","sourceRoot":"","sources":["../src/shape-ops.ts"],"names":[],"mappings":"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"}