@hatiolab/figure-model 0.1.95 → 0.2.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/CHANGELOG.md +14 -0
- package/dist/asset.d.ts.map +1 -1
- package/dist/asset.js +3 -1
- package/dist/asset.js.map +1 -1
- package/dist/authoring-actions.d.ts +19 -0
- package/dist/authoring-actions.d.ts.map +1 -1
- package/dist/authoring-actions.js +106 -63
- package/dist/authoring-actions.js.map +1 -1
- package/dist/command-preview.d.ts +3 -1
- package/dist/command-preview.d.ts.map +1 -1
- package/dist/command-preview.js +52 -27
- package/dist/command-preview.js.map +1 -1
- package/dist/cost.d.ts +1 -1
- package/dist/cost.d.ts.map +1 -1
- package/dist/cost.js +30 -25
- package/dist/cost.js.map +1 -1
- package/dist/create.d.ts.map +1 -1
- package/dist/create.js +112 -31
- package/dist/create.js.map +1 -1
- package/dist/document.d.ts.map +1 -1
- package/dist/document.js +3 -2
- package/dist/document.js.map +1 -1
- package/dist/fixtures/shape-nodes.d.ts +12 -0
- package/dist/fixtures/shape-nodes.d.ts.map +1 -0
- package/dist/fixtures/shape-nodes.js +20 -0
- package/dist/fixtures/shape-nodes.js.map +1 -0
- package/dist/follow.d.ts.map +1 -1
- package/dist/follow.js +5 -2
- package/dist/follow.js.map +1 -1
- package/dist/gate.d.ts.map +1 -1
- package/dist/gate.js +31 -59
- package/dist/gate.js.map +1 -1
- package/dist/graph-types.d.ts +7 -6
- package/dist/graph-types.d.ts.map +1 -1
- package/dist/graph.d.ts +17 -12
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +24 -292
- package/dist/graph.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/kernel-version.d.ts +1 -1
- package/dist/kernel-version.d.ts.map +1 -1
- package/dist/kernel-version.js +1 -1
- package/dist/kernel-version.js.map +1 -1
- package/dist/part-edit.d.ts.map +1 -1
- package/dist/part-edit.js +8 -6
- package/dist/part-edit.js.map +1 -1
- package/dist/proposal.d.ts +1 -1
- package/dist/proposal.d.ts.map +1 -1
- package/dist/proposal.js +14 -2
- package/dist/proposal.js.map +1 -1
- package/dist/recipe-from-parts.d.ts.map +1 -1
- package/dist/recipe-from-parts.js +107 -24
- package/dist/recipe-from-parts.js.map +1 -1
- package/dist/render-batches.d.ts.map +1 -1
- package/dist/render-batches.js +11 -2
- package/dist/render-batches.js.map +1 -1
- package/dist/resize-plan.d.ts.map +1 -1
- package/dist/resize-plan.js +22 -8
- package/dist/resize-plan.js.map +1 -1
- package/dist/section.d.ts +164 -0
- package/dist/section.d.ts.map +1 -0
- package/dist/section.js +277 -0
- package/dist/section.js.map +1 -0
- package/dist/shape-edit.d.ts +22 -0
- package/dist/shape-edit.d.ts.map +1 -0
- package/dist/shape-edit.js +225 -0
- package/dist/shape-edit.js.map +1 -0
- package/dist/shape-features.d.ts +83 -0
- package/dist/shape-features.d.ts.map +1 -0
- package/dist/shape-features.js +102 -0
- package/dist/shape-features.js.map +1 -0
- package/dist/shape-ops.d.ts +154 -0
- package/dist/shape-ops.d.ts.map +1 -0
- package/dist/shape-ops.js +571 -0
- package/dist/shape-ops.js.map +1 -0
- package/dist/shape-provider.d.ts +16 -23
- package/dist/shape-provider.d.ts.map +1 -1
- package/dist/shape-provider.js +18 -56
- package/dist/shape-provider.js.map +1 -1
- package/dist/shape-sampling.d.ts +0 -8
- package/dist/shape-sampling.d.ts.map +1 -1
- package/dist/shape-sampling.js +67 -101
- package/dist/shape-sampling.js.map +1 -1
- package/dist/size-edit.js +2 -2
- package/dist/size-edit.js.map +1 -1
- package/dist/surface.d.ts.map +1 -1
- package/dist/surface.js +10 -17
- package/dist/surface.js.map +1 -1
- package/dist/words.d.ts +7 -0
- package/dist/words.d.ts.map +1 -1
- package/dist/words.js +7 -0
- package/dist/words.js.map +1 -1
- package/docs/document-contract.md +1 -1
- package/docs/shape-contract.md +439 -0
- package/package.json +2 -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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"}
|