@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.
- 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 +1 -1
package/dist/section.js
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* The two local axes a section lies across, for the axis it is pushed along: (u, v, n) is right-handed, so a loop
|
|
6
|
+
* whose signed area over (u, v) is positive turns counter-clockwise seen from +n. A section's points are written with
|
|
7
|
+
* the axes' own names -- `{ x, z }` for a push along Y -- so no reader has to know which is u.
|
|
8
|
+
*/
|
|
9
|
+
export const FIGURE_SECTION_PLANE = Object.freeze({
|
|
10
|
+
x: ['y', 'z'],
|
|
11
|
+
y: ['z', 'x'],
|
|
12
|
+
z: ['x', 'y']
|
|
13
|
+
});
|
|
14
|
+
/**
|
|
15
|
+
* Lengths closer than this are one length, in millimetres (docs/shape-contract.md §6). It decides a drawn section's
|
|
16
|
+
* topology only -- whether two points coincide, whether a side has length, whether two sides touch. It is not a
|
|
17
|
+
* snapping distance, not a tolerance for comparing drawings, and not a least size: a rectangle, an ellipse or a wall is
|
|
18
|
+
* any positive length (designer's ruling 2026-09-22: a span's floor is its room plus 1e-6, never a minimum of its own).
|
|
19
|
+
*/
|
|
20
|
+
export const FIGURE_SECTION_TOLERANCE = 1e-6;
|
|
21
|
+
/** The most points a drawn section may have (docs/shape-contract.md §6). */
|
|
22
|
+
export const FIGURE_SECTION_POINT_LIMIT = 256;
|
|
23
|
+
const POINT_ID = /^[a-zA-Z][a-zA-Z0-9_-]*$/;
|
|
24
|
+
/** The id of the side joining two points: the pair, in name order, so it is the same whichever way the loop runs. */
|
|
25
|
+
export function figureSectionSideId(a, b) {
|
|
26
|
+
return a < b ? `${a}~${b}` : `${b}~${a}`;
|
|
27
|
+
}
|
|
28
|
+
const planeOf = (axis) => FIGURE_SECTION_PLANE[axis];
|
|
29
|
+
const rounded = (s) => !!s.corner && Object.values(s.corner).some(r => (r ?? 0) > 0);
|
|
30
|
+
/** A drawn section's points as (u, v). */
|
|
31
|
+
function uvOf(points, axis) {
|
|
32
|
+
const [u, v] = planeOf(axis);
|
|
33
|
+
return points.map(p => [p[u], p[v]]);
|
|
34
|
+
}
|
|
35
|
+
/** Twice the signed area of a loop over (u, v). */
|
|
36
|
+
function signedArea2(uv) {
|
|
37
|
+
let s = 0;
|
|
38
|
+
for (let i = 0; i < uv.length; i++) {
|
|
39
|
+
const [a, b] = uv[i], [c, d] = uv[(i + 1) % uv.length];
|
|
40
|
+
s += a * d - c * b;
|
|
41
|
+
}
|
|
42
|
+
return s;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* What is wrong with a section, pushed along `axis`, as a list -- empty when it is valid (ADR-0100 §4.2). Every issue
|
|
46
|
+
* names the point, side or field at fault, so a screen can mark it; none is fixed here.
|
|
47
|
+
*/
|
|
48
|
+
export function checkFigureSection(section, axis) {
|
|
49
|
+
const [u, v] = planeOf(axis);
|
|
50
|
+
if (section.kind === 'rectangle') {
|
|
51
|
+
const issues = [];
|
|
52
|
+
for (const a of [u, v]) {
|
|
53
|
+
const s = section.size[a];
|
|
54
|
+
if (typeof s !== 'number' || !Number.isFinite(s))
|
|
55
|
+
issues.push({ code: 'NON_FINITE', at: `size.${a}` });
|
|
56
|
+
else if (!(s > 0))
|
|
57
|
+
issues.push({ code: 'SIZE_NOT_POSITIVE', axis: a });
|
|
58
|
+
}
|
|
59
|
+
if (!section.corner)
|
|
60
|
+
return issues;
|
|
61
|
+
for (const a of [u, v]) {
|
|
62
|
+
const r = section.corner[a];
|
|
63
|
+
if (typeof r !== 'number' || !Number.isFinite(r))
|
|
64
|
+
issues.push({ code: 'NON_FINITE', at: `corner.${a}` });
|
|
65
|
+
else if (r < 0)
|
|
66
|
+
issues.push({ code: 'CORNER_NEGATIVE', axis: a });
|
|
67
|
+
else if (Number.isFinite(section.size[a]) && r > section.size[a] / 2 + FIGURE_SECTION_TOLERANCE)
|
|
68
|
+
issues.push({ code: 'CORNER_TOO_LARGE', axis: a, max: section.size[a] / 2 });
|
|
69
|
+
}
|
|
70
|
+
if (!issues.length && section.corner[u] > 0 !== section.corner[v] > 0)
|
|
71
|
+
issues.push({ code: 'CORNER_ONE_AXIS', axis: section.corner[u] > 0 ? u : v });
|
|
72
|
+
return issues;
|
|
73
|
+
}
|
|
74
|
+
if (section.kind === 'ellipse') {
|
|
75
|
+
const issues = [];
|
|
76
|
+
for (const a of [u, v]) {
|
|
77
|
+
const r = section.radius[a];
|
|
78
|
+
if (typeof r !== 'number' || !Number.isFinite(r))
|
|
79
|
+
issues.push({ code: 'NON_FINITE', at: `radius.${a}` });
|
|
80
|
+
else if (!(r > 0))
|
|
81
|
+
issues.push({ code: 'SIZE_NOT_POSITIVE', axis: a });
|
|
82
|
+
}
|
|
83
|
+
return issues;
|
|
84
|
+
}
|
|
85
|
+
return checkPolygon(section.points, axis);
|
|
86
|
+
}
|
|
87
|
+
function checkPolygon(points, axis) {
|
|
88
|
+
const [u, v] = planeOf(axis);
|
|
89
|
+
const issues = [];
|
|
90
|
+
const seen = new Set();
|
|
91
|
+
for (const p of points) {
|
|
92
|
+
if (typeof p.id !== 'string' || !POINT_ID.test(p.id))
|
|
93
|
+
issues.push({ code: 'BAD_POINT_ID', point: String(p.id) });
|
|
94
|
+
else if (seen.has(p.id))
|
|
95
|
+
issues.push({ code: 'DUPLICATE_POINT_ID', point: p.id });
|
|
96
|
+
else
|
|
97
|
+
seen.add(p.id);
|
|
98
|
+
for (const a of [u, v])
|
|
99
|
+
if (typeof p[a] !== 'number' || !Number.isFinite(p[a]))
|
|
100
|
+
issues.push({ code: 'NON_FINITE', at: `${p.id}.${a}` });
|
|
101
|
+
}
|
|
102
|
+
if (points.length < 3)
|
|
103
|
+
issues.push({ code: 'TOO_FEW_POINTS', count: points.length });
|
|
104
|
+
if (points.length > FIGURE_SECTION_POINT_LIMIT)
|
|
105
|
+
issues.push({ code: 'TOO_MANY_POINTS', count: points.length, limit: FIGURE_SECTION_POINT_LIMIT });
|
|
106
|
+
if (issues.length)
|
|
107
|
+
return issues;
|
|
108
|
+
const n = points.length, uv = uvOf(points, axis), side = (i) => figureSectionSideId(points[i].id, points[(i + 1) % n].id), tol = FIGURE_SECTION_TOLERANCE;
|
|
109
|
+
const lengths = uv.map((a, i) => Math.hypot(uv[(i + 1) % n][0] - a[0], uv[(i + 1) % n][1] - a[1]));
|
|
110
|
+
lengths.forEach((l, i) => {
|
|
111
|
+
if (l <= tol)
|
|
112
|
+
issues.push({ code: 'ZERO_LENGTH_SIDE', side: side(i) });
|
|
113
|
+
});
|
|
114
|
+
if (issues.length)
|
|
115
|
+
return issues;
|
|
116
|
+
/* Neighbouring sides fold when they are in one line and the second runs back along the first. */
|
|
117
|
+
for (let i = 0; i < n; i++) {
|
|
118
|
+
const a = uv[i], b = uv[(i + 1) % n], c = uv[(i + 2) % n];
|
|
119
|
+
const cross = (b[0] - a[0]) * (c[1] - b[1]) - (b[1] - a[1]) * (c[0] - b[0]), dot = (b[0] - a[0]) * (c[0] - b[0]) + (b[1] - a[1]) * (c[1] - b[1]);
|
|
120
|
+
if (Math.abs(cross) <= tol * lengths[i] && dot < 0)
|
|
121
|
+
issues.push({ code: 'SIDES_FOLD', sides: [side(i), side((i + 1) % n)] });
|
|
122
|
+
}
|
|
123
|
+
/* Sides that are not neighbours must stay apart: crossing is one fault, meeting without crossing another. */
|
|
124
|
+
for (let i = 0; i < n; i++)
|
|
125
|
+
for (let j = i + 1; j < n; j++) {
|
|
126
|
+
if (j === i + 1 || (i === 0 && j === n - 1))
|
|
127
|
+
continue;
|
|
128
|
+
const meet = segmentsMeet(uv[i], uv[(i + 1) % n], uv[j], uv[(j + 1) % n], tol);
|
|
129
|
+
if (meet)
|
|
130
|
+
issues.push({ code: meet === 'cross' ? 'SIDES_CROSS' : 'SIDES_TOUCH', sides: [side(i), side(j)] });
|
|
131
|
+
}
|
|
132
|
+
if (issues.length)
|
|
133
|
+
return issues;
|
|
134
|
+
if (Math.abs(signedArea2(uv)) / 2 <= tol)
|
|
135
|
+
issues.push({ code: 'ZERO_AREA' });
|
|
136
|
+
return issues;
|
|
137
|
+
}
|
|
138
|
+
const orient = (a, b, c) => (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
|
|
139
|
+
function pointSegmentDistance(p, a, b) {
|
|
140
|
+
const dx = b[0] - a[0], dy = b[1] - a[1], l2 = dx * dx + dy * dy;
|
|
141
|
+
const t = l2 ? Math.max(0, Math.min(1, ((p[0] - a[0]) * dx + (p[1] - a[1]) * dy) / l2)) : 0;
|
|
142
|
+
return Math.hypot(p[0] - a[0] - t * dx, p[1] - a[1] - t * dy);
|
|
143
|
+
}
|
|
144
|
+
/** Whether two segments cross (each passes strictly through the other), touch (come within `tol`), or neither. */
|
|
145
|
+
function segmentsMeet(a, b, c, d, tol) {
|
|
146
|
+
const d1 = orient(c, d, a), d2 = orient(c, d, b), d3 = orient(a, b, c), d4 = orient(a, b, d);
|
|
147
|
+
const lab = Math.hypot(b[0] - a[0], b[1] - a[1]), lcd = Math.hypot(d[0] - c[0], d[1] - c[1]);
|
|
148
|
+
/* Strictly on opposite sides, by more than the tolerance measured as a distance from each line. */
|
|
149
|
+
const apart = (x, y, l) => (x > tol * l && y < -tol * l) || (x < -tol * l && y > tol * l);
|
|
150
|
+
if (apart(d1, d2, lcd) && apart(d3, d4, lab))
|
|
151
|
+
return 'cross';
|
|
152
|
+
const gap = Math.min(pointSegmentDistance(a, c, d), pointSegmentDistance(b, c, d), pointSegmentDistance(c, a, b), pointSegmentDistance(d, a, b));
|
|
153
|
+
return gap <= tol ? 'touch' : null;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The same section written the one way the kernel keeps it (ADR-0100 §4.2): a drawn loop runs counter-clockwise seen
|
|
157
|
+
* from +axis. Only the writing changes -- the first point stays first, and no point is moved, added or dropped, so every
|
|
158
|
+
* point and side keeps its id. A section that is not valid is returned as it is; check it first.
|
|
159
|
+
*/
|
|
160
|
+
export function normalizeFigureSection(section, axis) {
|
|
161
|
+
if (section.kind !== 'polygon' || checkFigureSection(section, axis).length)
|
|
162
|
+
return structuredClone(section);
|
|
163
|
+
const points = structuredClone(section.points);
|
|
164
|
+
if (signedArea2(uvOf(points, axis)) > 0)
|
|
165
|
+
return { kind: 'polygon', points };
|
|
166
|
+
return { kind: 'polygon', points: [points[0], ...points.slice(1).reverse()] };
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* A section's sides, by id (ADR-0100 §4.1.1). A rectangle's four flat sides are named by the plane axis they face along
|
|
170
|
+
* and which way -- `x-`, `x+`, `z-`, `z+` for a push along Y -- and its rounded corners, which are there only when the
|
|
171
|
+
* corner is rounded, by the two sides they join (`corner:x-z+`). An ellipse has one curved side, `round`. A drawn
|
|
172
|
+
* section's sides are named by the pair of points they join.
|
|
173
|
+
*/
|
|
174
|
+
export function figureSectionSidesOf(section, axis) {
|
|
175
|
+
const [u, v] = planeOf(axis);
|
|
176
|
+
if (section.kind === 'ellipse')
|
|
177
|
+
return [{ id: 'round', shape: 'curved' }];
|
|
178
|
+
if (section.kind === 'rectangle') {
|
|
179
|
+
const [a, b] = [u, v].sort();
|
|
180
|
+
const flat = [a, b].flatMap(axis => [`${axis}-`, `${axis}+`]).map(id => ({ id, shape: 'flat' }));
|
|
181
|
+
if (!rounded(section))
|
|
182
|
+
return flat;
|
|
183
|
+
const corners = ['-', '+'].flatMap(sa => ['-', '+'].map(sb => ({ id: `corner:${a}${sa}${b}${sb}`, shape: 'curved' })));
|
|
184
|
+
return [...flat, ...corners];
|
|
185
|
+
}
|
|
186
|
+
const pts = section.points;
|
|
187
|
+
return pts.map((p, i) => {
|
|
188
|
+
const q = pts[(i + 1) % pts.length];
|
|
189
|
+
return { id: figureSectionSideId(p.id, q.id), shape: 'flat', from: p.id, to: q.id };
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* How the sides of a section change from `before` to `after` (ADR-0100 §5): the sides both have, the sides that go, the
|
|
194
|
+
* sides that come. Moving a point keeps every side; adding, removing or splitting sides, or a change of kind, does not --
|
|
195
|
+
* and a side that goes while something refers to it needs a mapping the author chooses, never one taken in passing.
|
|
196
|
+
*/
|
|
197
|
+
export function figureSectionTopologyChange(before, after, axis) {
|
|
198
|
+
const a = figureSectionSidesOf(before, axis).map(s => s.id), b = figureSectionSidesOf(after, axis).map(s => s.id);
|
|
199
|
+
const inB = new Set(b), inA = new Set(a);
|
|
200
|
+
return {
|
|
201
|
+
kept: a.filter(id => inB.has(id)),
|
|
202
|
+
removed: a.filter(id => !inB.has(id)),
|
|
203
|
+
added: b.filter(id => !inA.has(id))
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* The section's area in mm², exact for every kind. A rounded corner is a quarter of the ellipse its two reaches span
|
|
208
|
+
* (docs/shape-contract.md §2.1; which curve a corner is, is open question Q4).
|
|
209
|
+
*/
|
|
210
|
+
export function figureSectionAreaOf(section, axis) {
|
|
211
|
+
const [u, v] = planeOf(axis);
|
|
212
|
+
if (section.kind === 'rectangle') {
|
|
213
|
+
const cut = rounded(section) ? (4 - Math.PI) * section.corner[u] * section.corner[v] : 0;
|
|
214
|
+
return section.size[u] * section.size[v] - cut;
|
|
215
|
+
}
|
|
216
|
+
if (section.kind === 'ellipse')
|
|
217
|
+
return Math.PI * section.radius[u] * section.radius[v];
|
|
218
|
+
return Math.abs(signedArea2(uvOf(section.points, axis))) / 2;
|
|
219
|
+
}
|
|
220
|
+
/** The section's reach along each plane axis, least and most, in the part's frame. */
|
|
221
|
+
export function figureSectionBoundsOf(section, axis) {
|
|
222
|
+
const [u, v] = planeOf(axis);
|
|
223
|
+
if (section.kind === 'rectangle')
|
|
224
|
+
return {
|
|
225
|
+
[u]: { min: -section.size[u] / 2, max: section.size[u] / 2 },
|
|
226
|
+
[v]: { min: -section.size[v] / 2, max: section.size[v] / 2 }
|
|
227
|
+
};
|
|
228
|
+
if (section.kind === 'ellipse')
|
|
229
|
+
return {
|
|
230
|
+
[u]: { min: -section.radius[u], max: section.radius[u] },
|
|
231
|
+
[v]: { min: -section.radius[v], max: section.radius[v] }
|
|
232
|
+
};
|
|
233
|
+
const span = (a) => {
|
|
234
|
+
const xs = section.points.map(p => p[a]);
|
|
235
|
+
return { min: Math.min(...xs), max: Math.max(...xs) };
|
|
236
|
+
};
|
|
237
|
+
return { [u]: span(u), [v]: span(v) };
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* The inside of a rectangle or an ellipse whose walls stand `wall[side]` in from each flat side (ADR-0100 §4.3): the
|
|
241
|
+
* cavity's section, in the same plane. A rectangle's corner goes in, along each plane axis, by the thicker of the
|
|
242
|
+
* two walls facing along it (`max(r - t, 0)`, as the renderer draws today): the exact inward offset of a round corner
|
|
243
|
+
* when every wall is equal, and a declared rule otherwise -- it does not claim an even thickness around the bend. An ellipse's inside is the ellipse of radii less the
|
|
244
|
+
* walls, which is not an inward offset of an ellipse and is not called one.
|
|
245
|
+
*/
|
|
246
|
+
export function figureCavitySectionOf(outer, axis, wall) {
|
|
247
|
+
const [u, v] = planeOf(axis);
|
|
248
|
+
if (outer.kind === 'polygon')
|
|
249
|
+
return { refused: 'SECTION_KIND' };
|
|
250
|
+
const sides = [u, v].flatMap(a => [`${a}-`, `${a}+`]);
|
|
251
|
+
for (const s of sides) {
|
|
252
|
+
const t = wall[s];
|
|
253
|
+
if (typeof t !== 'number' || !Number.isFinite(t))
|
|
254
|
+
return { refused: 'NON_FINITE', side: s };
|
|
255
|
+
if (!(t > 0))
|
|
256
|
+
return { refused: 'WALL_NOT_POSITIVE', side: s };
|
|
257
|
+
}
|
|
258
|
+
const t = (s) => wall[s];
|
|
259
|
+
const inner = (a, whole) => whole - t(`${a}-`) - t(`${a}+`);
|
|
260
|
+
const centre = { [u]: (t(`${u}-`) - t(`${u}+`)) / 2, [v]: (t(`${v}-`) - t(`${v}+`)) / 2 };
|
|
261
|
+
if (outer.kind === 'rectangle') {
|
|
262
|
+
const size = { [u]: inner(u, outer.size[u]), [v]: inner(v, outer.size[v]) };
|
|
263
|
+
if (!(size[u] > 0 && size[v] > 0))
|
|
264
|
+
return { refused: 'NO_ROOM_INSIDE' };
|
|
265
|
+
if (!rounded(outer))
|
|
266
|
+
return { section: { kind: 'rectangle', size }, centre };
|
|
267
|
+
const inset = (a) => Math.max(outer.corner[a] - Math.max(t(`${a}-`), t(`${a}+`)), 0);
|
|
268
|
+
const corner = { [u]: inset(u), [v]: inset(v) };
|
|
269
|
+
/* A corner gone in to nothing along one axis is gone along both: the inside is sharp there. */
|
|
270
|
+
return { section: { kind: 'rectangle', size, ...(corner[u] > 0 && corner[v] > 0 ? { corner } : {}) }, centre };
|
|
271
|
+
}
|
|
272
|
+
const radius = { [u]: inner(u, 2 * outer.radius[u]) / 2, [v]: inner(v, 2 * outer.radius[v]) / 2 };
|
|
273
|
+
if (!(radius[u] > 0 && radius[v] > 0))
|
|
274
|
+
return { refused: 'NO_ROOM_INSIDE' };
|
|
275
|
+
return { section: { kind: 'ellipse', radius }, centre };
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section.js","sourceRoot":"","sources":["../src/section.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAkD,MAAM,CAAC,MAAM,CAAC;IAC/F,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAU;IACtB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAU;IACtB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAU;CACvB,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAA;AAE5C,4EAA4E;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAA;AA+C7C,MAAM,QAAQ,GAAG,0BAA0B,CAAA;AAE3C,qHAAqH;AACrH,MAAM,UAAU,mBAAmB,CAAC,CAAS,EAAE,CAAS;IACtD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAA;AAC1C,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;AAC1D,MAAM,OAAO,GAAG,CAAC,CAAgD,EAAE,EAAE,CACnE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AAE/D,0CAA0C;AAC1C,SAAS,IAAI,CAAC,MAA4B,EAAE,IAAU;IACpD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,mDAAmD;AACnD,SAAS,WAAW,CAAC,EAA2B;IAC9C,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,EACnB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAE,CAAA;QACnC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAsB,EAAE,IAAU;IACnE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACjC,MAAM,MAAM,GAAyB,EAAE,CAAA;QACvC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACzB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;iBACjG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QACxE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,MAAM,CAAA;QAClC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YAC3B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAA;iBACnG,IAAI,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;iBAC5D,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,GAAG,wBAAwB;gBAC9F,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE,CAAC,CAAA;QACjF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAChF,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAyB,EAAE,CAAA;QACvC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YAC3B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAA;iBACnG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QACxE,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IACD,OAAO,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAC3C,CAAC;AAED,SAAS,YAAY,CAAC,MAA4B,EAAE,IAAU;IAC5D,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,MAAM,GAAyB,EAAE,CAAA;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;aAC3G,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;;YAC5E,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACnB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IACnH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IACpF,IAAI,MAAM,CAAC,MAAM,GAAG,0BAA0B;QAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAA;IACnG,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,MAAM,CAAA;IAEhC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EACrB,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EACvB,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC,EACjF,GAAG,GAAG,wBAAwB,CAAA;IAChC,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACpG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,IAAI,CAAC,IAAI,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;IACF,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,MAAM,CAAA;IAEhC,iGAAiG;IACjG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,EACd,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,EACpB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAA;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACrE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,IAAI,GAAG,GAAG,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC5E,CAAC;IACD,6GAA6G;IAC7G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAAE,SAAQ;YACrD,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,GAAG,CAAC,CAAA;YAClF,IAAI,IAAI;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC9G,CAAC;IACH,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,MAAM,CAAA;IAChC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;IAC5E,OAAO,MAAM,CAAA;AACf,CAAC;AAGD,MAAM,MAAM,GAAG,CAAC,CAAI,EAAE,CAAI,EAAE,CAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAClG,SAAS,oBAAoB,CAAC,CAAI,EAAE,CAAI,EAAE,CAAI;IAC5C,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EACpB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAChB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IACxB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3F,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;AAC/D,CAAC;AACD,kHAAkH;AAClH,SAAS,YAAY,CAAC,CAAI,EAAE,CAAI,EAAE,CAAI,EAAE,CAAI,EAAE,GAAW;IACvD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACxB,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACpB,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACpB,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAC9C,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,mGAAmG;IACnG,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAA;IACjH,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;QAAE,OAAO,OAAO,CAAA;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7B,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7B,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7B,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAC9B,CAAA;IACD,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsB,EAAE,IAAU;IACvE,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM;QAAE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAA;IAC3G,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9C,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAA;IAC3E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAA;AAChF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAsB,EAAE,IAAU;IACrE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IACzE,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAkB,CAAA;QAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAe,EAAE,CAAC,CAAC,CAAA;QACzG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAA;QAClC,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CACtC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAiB,EAAE,CAAC,CAAC,CACtF,CAAA;QACD,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC,CAAA;IAC9B,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAA;IAC1B,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAE,CAAA;QACpC,OAAO,EAAE,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAA;IAC9F,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAqB,EACrB,KAAoB,EACpB,IAAU;IAEV,MAAM,CAAC,GAAG,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACzD,CAAC,GAAG,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EACpB,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;IAClB,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;KACpC,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAsB,EAAE,IAAU;IACpE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAO,CAAC,CAAC,CAAE,GAAG,OAAO,CAAC,MAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5F,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,GAAG,CAAA;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,CAAA;IACxF,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAC9D,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,qBAAqB,CACnC,OAAsB,EACtB,IAAU;IAEV,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;QAC9B,OAAO;YACL,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE;YAC9D,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE;SAC/D,CAAA;IACH,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAC5B,OAAO;YACL,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE;YAC1D,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE;SAC3D,CAAA;IACH,MAAM,IAAI,GAAG,CAAC,CAAO,EAAE,EAAE;QACvB,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAA;QACzC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAA;IACvD,CAAC,CAAA;IACD,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;AACvC,CAAC;AASD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAoB,EACpB,IAAU,EACV,IAAqC;IAErC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,CAAA;IAChE,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IACrD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;QAC3F,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;IAChE,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAE,CAAA;IACjC,MAAM,KAAK,GAAG,CAAC,CAAO,EAAE,KAAa,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACzE,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAA;IACzF,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,CAAA;QAC7E,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAA;QACzE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAA;QAC5E,MAAM,KAAK,GAAG,CAAC,CAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAO,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5F,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/C,+FAA+F;QAC/F,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAA;IAClH,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,EAAE,CAAA;IACnG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC7E,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAA;AACzD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Axis } from './words.ts';
|
|
2
|
+
type Dynamic = any;
|
|
3
|
+
/** A part's inside, as a command sets it: one wall for every side or one per side, and each end open or closed. */
|
|
4
|
+
export interface FigureCavityRequest {
|
|
5
|
+
/** One thickness for every wall, or one per side: `x-`, `x+`, `z-`, `z+` for a push along Y. */
|
|
6
|
+
wall: number | Partial<Record<string, number>>;
|
|
7
|
+
start: 'open' | {
|
|
8
|
+
closed: number;
|
|
9
|
+
};
|
|
10
|
+
end: 'open' | {
|
|
11
|
+
closed: number;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Round a rectangle's corners, or make them sharp again (`corner: 0`), or take the rounding away (`null`). A number
|
|
16
|
+
* rounds all four by one radius, written once and read on both plane axes; `{ x, z }` gives each axis its reach.
|
|
17
|
+
*/
|
|
18
|
+
export declare function setFigureSectionCorner(asset: Dynamic, part: string, corner: number | Partial<Record<Axis, number>> | null, drop: (ref: string, owned?: string) => void): void;
|
|
19
|
+
/** Give a pushed rectangle or ellipse an inside, change it, or take it away (`null`). */
|
|
20
|
+
export declare function setFigureCavity(asset: Dynamic, part: string, cavity: FigureCavityRequest | null, drop: (ref: string, owned?: string) => void): void;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=shape-edit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shape-edit.d.ts","sourceRoot":"","sources":["../src/shape-edit.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtC,KAAK,OAAO,GAAG,GAAG,CAAA;AAKlB,mHAAmH;AACnH,MAAM,WAAW,mBAAmB;IAClC,gGAAgG;IAChG,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC9C,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAClC,GAAG,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CACjC;AAwHD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,EACrD,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,GAC1C,IAAI,CAqCN;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,mBAAmB,GAAG,IAAI,EAClC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,GAC1C,IAAI,CAmDN"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
/*
|
|
5
|
+
* Editing a part's shape without replacing the part (ADR-0100 stage 1, A2–A4): rounding a box's corners and back,
|
|
6
|
+
* giving it an inside and opening its ends. The part keeps its id, its pose and every face something is fastened to;
|
|
7
|
+
* an edit that would take such a face away is refused with the list of what refers to it, and never unfastens it in
|
|
8
|
+
* passing (ADR-0100 §5). A value that follows something is not overwritten either: it is refused.
|
|
9
|
+
*/
|
|
10
|
+
import { FigureContractError } from "./contract.js";
|
|
11
|
+
import { figureShapeFaces } from "./graph.js";
|
|
12
|
+
import { figureExtrudeLayoutOf } from "./shape-ops.js";
|
|
13
|
+
const fail = (code, path, message) => {
|
|
14
|
+
throw new FigureContractError(code, path, message);
|
|
15
|
+
};
|
|
16
|
+
/** The named slots of an extrude node: which reference each measure is, keyed by what it means. */
|
|
17
|
+
function slotsOf(shape) {
|
|
18
|
+
const L = figureExtrudeLayoutOf(shape.params, shape.id);
|
|
19
|
+
const out = new Map([
|
|
20
|
+
['start', shape.args[0]],
|
|
21
|
+
['length', shape.args[1]]
|
|
22
|
+
]);
|
|
23
|
+
for (const [k, i] of Object.entries(L.arg.across ?? {}))
|
|
24
|
+
out.set(`across.${k}`, shape.args[i]);
|
|
25
|
+
for (const [k, i] of Object.entries(L.arg.corner ?? {}))
|
|
26
|
+
out.set(`corner.${k}`, shape.args[i]);
|
|
27
|
+
if (L.arg.jamb !== undefined)
|
|
28
|
+
out.set('jamb', shape.args[L.arg.jamb]);
|
|
29
|
+
if (L.arg.head !== undefined)
|
|
30
|
+
out.set('head', shape.args[L.arg.head]);
|
|
31
|
+
for (const [p, at] of Object.entries(L.arg.point ?? {}))
|
|
32
|
+
for (const [k, i] of Object.entries(at))
|
|
33
|
+
out.set(`point.${p}.${k}`, shape.args[i]);
|
|
34
|
+
for (const [k, i] of Object.entries(L.arg.wall ?? {}))
|
|
35
|
+
out.set(`wall.${k}`, shape.args[i]);
|
|
36
|
+
if (L.arg.startClosed !== undefined)
|
|
37
|
+
out.set('closed.start', shape.args[L.arg.startClosed]);
|
|
38
|
+
if (L.arg.endClosed !== undefined)
|
|
39
|
+
out.set('closed.end', shape.args[L.arg.endClosed]);
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
/** Write an extrude node's arguments again, in the order its (new) params fix, from its named slots. */
|
|
43
|
+
function writeSlots(shape, slots) {
|
|
44
|
+
const L = figureExtrudeLayoutOf(shape.params, shape.id);
|
|
45
|
+
const args = Array(L.count);
|
|
46
|
+
const put = (i, key) => {
|
|
47
|
+
if (i === undefined)
|
|
48
|
+
return;
|
|
49
|
+
const ref = slots.get(key);
|
|
50
|
+
if (ref === undefined)
|
|
51
|
+
fail('SCHEMA', shape.id, `no value for ${key}`);
|
|
52
|
+
args[i] = ref;
|
|
53
|
+
};
|
|
54
|
+
put(0, 'start');
|
|
55
|
+
put(1, 'length');
|
|
56
|
+
for (const [k, i] of Object.entries(L.arg.across ?? {}))
|
|
57
|
+
put(i, `across.${k}`);
|
|
58
|
+
for (const [k, i] of Object.entries(L.arg.corner ?? {}))
|
|
59
|
+
put(i, `corner.${k}`);
|
|
60
|
+
put(L.arg.jamb, 'jamb');
|
|
61
|
+
put(L.arg.head, 'head');
|
|
62
|
+
for (const [p, at] of Object.entries(L.arg.point ?? {}))
|
|
63
|
+
for (const [k, i] of Object.entries(at))
|
|
64
|
+
put(i, `point.${p}.${k}`);
|
|
65
|
+
for (const [k, i] of Object.entries(L.arg.wall ?? {}))
|
|
66
|
+
put(i, `wall.${k}`);
|
|
67
|
+
put(L.arg.startClosed, 'closed.start');
|
|
68
|
+
put(L.arg.endClosed, 'closed.end');
|
|
69
|
+
shape.args = args;
|
|
70
|
+
}
|
|
71
|
+
/** The faces of the part that something is fastened to or reads: joints, and the places and contacts named on it. */
|
|
72
|
+
function referencedFaces(asset, part, shapeOutput) {
|
|
73
|
+
const out = new Map();
|
|
74
|
+
const note = (face, who) => out.set(face, [...(out.get(face) ?? []), who]);
|
|
75
|
+
for (const j of asset.joints ?? []) {
|
|
76
|
+
if (j.body0?.part === part)
|
|
77
|
+
note(j.body0.face, `joint ${j.id}`);
|
|
78
|
+
if (j.body1?.part === part && j.body1.face !== 'centre')
|
|
79
|
+
note(j.body1.face, `joint ${j.id}`);
|
|
80
|
+
}
|
|
81
|
+
for (const n of asset.document.model.nodes)
|
|
82
|
+
if (n.op === 'feature@1' && n.args[0] === shapeOutput)
|
|
83
|
+
note(n.params.name, `feature ${n.id}`);
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
/** Refuse an edit that takes away a face something refers to, naming each face and who refers to it. */
|
|
87
|
+
function keepReferencedFaces(asset, part, shape, before) {
|
|
88
|
+
const after = figureShapeFaces(shape) ?? {};
|
|
89
|
+
const refs = referencedFaces(asset, part, shape.outputs.shape);
|
|
90
|
+
const lost = [...refs].filter(([face]) => face in before && !(face in after));
|
|
91
|
+
if (lost.length)
|
|
92
|
+
fail('FEATURE_MAPPING_REQUIRED', part, `this edit takes away ${lost.map(([face, who]) => `${face} (${who.join(', ')})`).join('; ')}; fasten those elsewhere or unfasten them first`);
|
|
93
|
+
}
|
|
94
|
+
const LENGTH_INPUT = (id) => ({ id, unit: 'mm', min: 0, max: Number.MAX_VALUE, role: 'design' });
|
|
95
|
+
/** Whether a reference is the part's own number: a design input named under the part. */
|
|
96
|
+
const ownInput = (m, part, ref) => !!ref && ref.startsWith(`${part}.`) && m.inputs.some((i) => i.id === ref && i.role === 'design');
|
|
97
|
+
/** Make or set the part's own length input, returning its id. */
|
|
98
|
+
function ownLength(asset, id, value, path) {
|
|
99
|
+
if (!(Number.isFinite(value) && value >= 0))
|
|
100
|
+
fail('GEOMETRY_DOMAIN', path, `a length of 0 or more required, not ${value}`);
|
|
101
|
+
const m = asset.document.model;
|
|
102
|
+
const input = m.inputs.find((i) => i.id === id);
|
|
103
|
+
if (input && !(input.role === 'design' && input.unit === 'mm'))
|
|
104
|
+
fail('DUPLICATE_WRITER', path, `${id} is another kind of value`);
|
|
105
|
+
if (!input) {
|
|
106
|
+
if (m.constants.some((c) => c.id === id) ||
|
|
107
|
+
m.nodes.some((n) => n.id === id || Object.values(n.outputs).includes(id)))
|
|
108
|
+
fail('DUPLICATE_WRITER', path, `${id} is already a name in the figure`);
|
|
109
|
+
m.inputs.push(LENGTH_INPUT(id));
|
|
110
|
+
}
|
|
111
|
+
asset.designInputs[id] = value;
|
|
112
|
+
return id;
|
|
113
|
+
}
|
|
114
|
+
function extrudeOf(asset, part, path) {
|
|
115
|
+
const shape = asset.document.model.nodes.find((n) => n.id === `${part}.shape`);
|
|
116
|
+
if (!shape)
|
|
117
|
+
fail('TARGET_ABSENT', path, `${part} is not a part`);
|
|
118
|
+
if (shape.op !== 'extrude@1')
|
|
119
|
+
fail('EDIT_TARGET', path, `${part} is a ${shape.op}; only a pushed section has corners and an inside`);
|
|
120
|
+
return shape;
|
|
121
|
+
}
|
|
122
|
+
/** Refuse replacing slots that follow something: the author unlinks them first. */
|
|
123
|
+
function ownSlots(asset, part, slots, keys, path) {
|
|
124
|
+
const m = asset.document.model;
|
|
125
|
+
for (const k of keys) {
|
|
126
|
+
const ref = slots.get(k);
|
|
127
|
+
if (ref !== undefined && !ownInput(m, part, ref))
|
|
128
|
+
fail('DIMENSION_LINKED', `${path}.${k}`, `${part}'s ${k} follows ${ref}; unlink it before setting it`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Round a rectangle's corners, or make them sharp again (`corner: 0`), or take the rounding away (`null`). A number
|
|
133
|
+
* rounds all four by one radius, written once and read on both plane axes; `{ x, z }` gives each axis its reach.
|
|
134
|
+
*/
|
|
135
|
+
export function setFigureSectionCorner(asset, part, corner, drop) {
|
|
136
|
+
const path = `${part}.corner`;
|
|
137
|
+
const shape = extrudeOf(asset, part, path);
|
|
138
|
+
if (shape.params.section !== 'rectangle')
|
|
139
|
+
fail('EDIT_TARGET', path, `${part}'s section is a ${shape.params.section}; only a rectangle has corners`);
|
|
140
|
+
const L = figureExtrudeLayoutOf(shape.params, shape.id);
|
|
141
|
+
const before = figureShapeFaces(shape) ?? {};
|
|
142
|
+
const slots = slotsOf(shape);
|
|
143
|
+
const old = L.plane.map(a => slots.get(`corner.${a}`)).filter((r) => !!r);
|
|
144
|
+
ownSlots(asset, part, slots, L.plane.map(a => `corner.${a}`), path);
|
|
145
|
+
if (corner === null) {
|
|
146
|
+
delete shape.params.corner;
|
|
147
|
+
for (const a of L.plane)
|
|
148
|
+
slots.delete(`corner.${a}`);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
shape.params.corner = 'round';
|
|
152
|
+
const [a, b] = L.plane;
|
|
153
|
+
if (typeof corner === 'number') {
|
|
154
|
+
const id = ownLength(asset, `${part}.dimension.round`, corner, path);
|
|
155
|
+
slots.set(`corner.${a}`, id);
|
|
156
|
+
slots.set(`corner.${b}`, id);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
for (const x of L.plane) {
|
|
160
|
+
const v = corner[x];
|
|
161
|
+
if (v === undefined)
|
|
162
|
+
fail('SCHEMA', `${path}.${x}`, `a corner's reach along ${x} is required`);
|
|
163
|
+
slots.set(`corner.${x}`, ownLength(asset, `${part}.dimension.round.${x}`, v, `${path}.${x}`));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
writeSlots(shape, slots);
|
|
168
|
+
keepReferencedFaces(asset, part, shape, before);
|
|
169
|
+
for (const ref of old)
|
|
170
|
+
if (!shape.args.includes(ref))
|
|
171
|
+
drop(ref, ref);
|
|
172
|
+
}
|
|
173
|
+
/** Give a pushed rectangle or ellipse an inside, change it, or take it away (`null`). */
|
|
174
|
+
export function setFigureCavity(asset, part, cavity, drop) {
|
|
175
|
+
const path = `${part}.cavity`;
|
|
176
|
+
const shape = extrudeOf(asset, part, path);
|
|
177
|
+
if (shape.params.section !== 'rectangle' && shape.params.section !== 'ellipse')
|
|
178
|
+
fail('SECTION_KIND', path, `${part}'s section is a ${shape.params.section}; an inside needs a rectangle or an ellipse (a drawn section's is ADR-0100 stage 4)`);
|
|
179
|
+
const L = figureExtrudeLayoutOf(shape.params, shape.id);
|
|
180
|
+
const before = figureShapeFaces(shape) ?? {};
|
|
181
|
+
const slots = slotsOf(shape);
|
|
182
|
+
const sides = L.plane.flatMap(a => [`${a}-`, `${a}+`]);
|
|
183
|
+
const cavityKeys = [...sides.map(s => `wall.${s}`), 'closed.start', 'closed.end'];
|
|
184
|
+
const old = cavityKeys.map(k => slots.get(k)).filter((r) => !!r);
|
|
185
|
+
ownSlots(asset, part, slots, cavityKeys, path);
|
|
186
|
+
for (const k of cavityKeys)
|
|
187
|
+
slots.delete(k);
|
|
188
|
+
for (const k of ['cavity', 'cavity-start', 'cavity-end'])
|
|
189
|
+
delete shape.params[k];
|
|
190
|
+
if (cavity) {
|
|
191
|
+
const name = (side) => `${part}.dimension.wall.${side[0]}.${side.endsWith('-') ? 'low' : 'high'}`;
|
|
192
|
+
if (typeof cavity.wall === 'number') {
|
|
193
|
+
const id = ownLength(asset, `${part}.dimension.wall`, cavity.wall, `${path}.wall`);
|
|
194
|
+
for (const s of sides)
|
|
195
|
+
slots.set(`wall.${s}`, id);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
const walls = cavity.wall;
|
|
199
|
+
const unknown = Object.keys(walls).filter(k => !sides.includes(k));
|
|
200
|
+
if (unknown.length)
|
|
201
|
+
fail('SCHEMA', `${path}.wall`, `${unknown.join(', ')} ${unknown.length > 1 ? 'are not sides' : 'is not a side'} of this section; its sides are ${sides.join(', ')}`);
|
|
202
|
+
for (const s of sides) {
|
|
203
|
+
const v = walls[s];
|
|
204
|
+
if (v === undefined)
|
|
205
|
+
fail('SCHEMA', `${path}.wall.${s}`, `the wall on ${s} is required`);
|
|
206
|
+
slots.set(`wall.${s}`, ownLength(asset, name(s), v, `${path}.wall.${s}`));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
shape.params.cavity = 'inside';
|
|
210
|
+
for (const end of ['start', 'end']) {
|
|
211
|
+
const e = cavity[end];
|
|
212
|
+
if (e !== 'open' && !(e && typeof e === 'object' && 'closed' in e))
|
|
213
|
+
fail('SCHEMA', `${path}.${end}`, 'open, or { closed: thickness }');
|
|
214
|
+
shape.params[`cavity-${end}`] = e === 'open' ? 'open' : 'closed';
|
|
215
|
+
if (e !== 'open')
|
|
216
|
+
slots.set(`closed.${end}`, ownLength(asset, `${part}.dimension.closed.${end}`, e.closed, `${path}.${end}`));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
writeSlots(shape, slots);
|
|
220
|
+
keepReferencedFaces(asset, part, shape, before);
|
|
221
|
+
for (const ref of new Set(old))
|
|
222
|
+
if (!shape.args.includes(ref))
|
|
223
|
+
drop(ref, ref);
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=shape-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shape-edit.js","sourceRoot":"","sources":["../src/shape-edit.ts"],"names":[],"mappings":"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"}
|