@hatiolab/figure-model 0.5.0 → 0.5.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.
Files changed (136) hide show
  1. package/dist/asset-types.d.ts +1 -1
  2. package/dist/asset-types.d.ts.map +1 -1
  3. package/dist/asset.d.ts.map +1 -1
  4. package/dist/asset.js +6 -5
  5. package/dist/asset.js.map +1 -1
  6. package/dist/authoring-actions.d.ts +2 -795
  7. package/dist/authoring-actions.d.ts.map +1 -1
  8. package/dist/authoring-actions.js +66 -3777
  9. package/dist/authoring-actions.js.map +1 -1
  10. package/dist/authoring-bindings.d.ts +35 -0
  11. package/dist/authoring-bindings.d.ts.map +1 -0
  12. package/dist/authoring-bindings.js +241 -0
  13. package/dist/authoring-bindings.js.map +1 -0
  14. package/dist/authoring-dimensions.d.ts +10 -0
  15. package/dist/authoring-dimensions.d.ts.map +1 -0
  16. package/dist/authoring-dimensions.js +88 -0
  17. package/dist/authoring-dimensions.js.map +1 -0
  18. package/dist/authoring-fastening.d.ts +24 -0
  19. package/dist/authoring-fastening.d.ts.map +1 -0
  20. package/dist/authoring-fastening.js +562 -0
  21. package/dist/authoring-fastening.js.map +1 -0
  22. package/dist/authoring-geometry.d.ts +119 -0
  23. package/dist/authoring-geometry.d.ts.map +1 -0
  24. package/dist/authoring-geometry.js +419 -0
  25. package/dist/authoring-geometry.js.map +1 -0
  26. package/dist/authoring-nodes.d.ts +77 -0
  27. package/dist/authoring-nodes.d.ts.map +1 -0
  28. package/dist/authoring-nodes.js +310 -0
  29. package/dist/authoring-nodes.js.map +1 -0
  30. package/dist/authoring-occupancy.d.ts +28 -0
  31. package/dist/authoring-occupancy.d.ts.map +1 -0
  32. package/dist/authoring-occupancy.js +784 -0
  33. package/dist/authoring-occupancy.js.map +1 -0
  34. package/dist/authoring-proportion.d.ts +27 -0
  35. package/dist/authoring-proportion.d.ts.map +1 -0
  36. package/dist/authoring-proportion.js +378 -0
  37. package/dist/authoring-proportion.js.map +1 -0
  38. package/dist/authoring-size.d.ts +17 -0
  39. package/dist/authoring-size.d.ts.map +1 -0
  40. package/dist/authoring-size.js +140 -0
  41. package/dist/authoring-size.js.map +1 -0
  42. package/dist/authoring-types.d.ts +753 -0
  43. package/dist/authoring-types.d.ts.map +1 -0
  44. package/dist/authoring-types.js +42 -0
  45. package/dist/authoring-types.js.map +1 -0
  46. package/dist/command-preview.d.ts +1 -1
  47. package/dist/command-preview.d.ts.map +1 -1
  48. package/dist/command-preview.js +1 -0
  49. package/dist/command-preview.js.map +1 -1
  50. package/dist/contract.d.ts +129 -3
  51. package/dist/contract.d.ts.map +1 -1
  52. package/dist/contract.js +1 -1
  53. package/dist/contract.js.map +1 -1
  54. package/dist/cost.d.ts.map +1 -1
  55. package/dist/cost.js +3 -0
  56. package/dist/cost.js.map +1 -1
  57. package/dist/create.d.ts +36 -0
  58. package/dist/create.d.ts.map +1 -1
  59. package/dist/create.js +60 -0
  60. package/dist/create.js.map +1 -1
  61. package/dist/document.d.ts.map +1 -1
  62. package/dist/document.js +4 -3
  63. package/dist/document.js.map +1 -1
  64. package/dist/editor-workspace.d.ts +3 -3
  65. package/dist/editor-workspace.d.ts.map +1 -1
  66. package/dist/examples.d.ts.map +1 -1
  67. package/dist/examples.js +3 -1
  68. package/dist/examples.js.map +1 -1
  69. package/dist/gate.d.ts.map +1 -1
  70. package/dist/gate.js +2 -0
  71. package/dist/gate.js.map +1 -1
  72. package/dist/graph-types.d.ts +3 -2
  73. package/dist/graph-types.d.ts.map +1 -1
  74. package/dist/graph.d.ts.map +1 -1
  75. package/dist/graph.js +3 -3
  76. package/dist/graph.js.map +1 -1
  77. package/dist/index.d.ts +10 -4
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +8 -2
  80. package/dist/index.js.map +1 -1
  81. package/dist/joint-list.js +1 -1
  82. package/dist/joint-list.js.map +1 -1
  83. package/dist/joint-part-edits.d.ts +40 -0
  84. package/dist/joint-part-edits.d.ts.map +1 -0
  85. package/dist/joint-part-edits.js +488 -0
  86. package/dist/joint-part-edits.js.map +1 -0
  87. package/dist/joint-writing.d.ts +50 -0
  88. package/dist/joint-writing.d.ts.map +1 -0
  89. package/dist/joint-writing.js +847 -0
  90. package/dist/joint-writing.js.map +1 -0
  91. package/dist/json.d.ts.map +1 -1
  92. package/dist/json.js +11 -8
  93. package/dist/json.js.map +1 -1
  94. package/dist/kernel-version.d.ts +1 -1
  95. package/dist/kernel-version.js +1 -1
  96. package/dist/package.d.ts +15 -3
  97. package/dist/package.d.ts.map +1 -1
  98. package/dist/package.js +58 -0
  99. package/dist/package.js.map +1 -1
  100. package/dist/part-edit.d.ts +1 -1
  101. package/dist/part-edit.d.ts.map +1 -1
  102. package/dist/part-edit.js +7 -4
  103. package/dist/part-edit.js.map +1 -1
  104. package/dist/proposal.d.ts +1 -1
  105. package/dist/proposal.d.ts.map +1 -1
  106. package/dist/proposal.js +5 -2
  107. package/dist/proposal.js.map +1 -1
  108. package/dist/render-batches.d.ts +10 -2
  109. package/dist/render-batches.d.ts.map +1 -1
  110. package/dist/render-batches.js +19 -5
  111. package/dist/render-batches.js.map +1 -1
  112. package/dist/resize-plan.d.ts +1 -1
  113. package/dist/resize-plan.d.ts.map +1 -1
  114. package/dist/robots.d.ts.map +1 -1
  115. package/dist/robots.js +3 -1
  116. package/dist/robots.js.map +1 -1
  117. package/dist/room.d.ts +1 -1
  118. package/dist/room.d.ts.map +1 -1
  119. package/dist/room.js +2 -1
  120. package/dist/room.js.map +1 -1
  121. package/dist/shape-edit.js +4 -4
  122. package/dist/shape-edit.js.map +1 -1
  123. package/dist/shape-ops.d.ts +62 -7
  124. package/dist/shape-ops.d.ts.map +1 -1
  125. package/dist/shape-ops.js +117 -8
  126. package/dist/shape-ops.js.map +1 -1
  127. package/dist/slot-layout-presets.d.ts +102 -0
  128. package/dist/slot-layout-presets.d.ts.map +1 -0
  129. package/dist/slot-layout-presets.js +185 -0
  130. package/dist/slot-layout-presets.js.map +1 -0
  131. package/dist/slot-layout.d.ts +16 -1
  132. package/dist/slot-layout.d.ts.map +1 -1
  133. package/dist/slot-layout.js.map +1 -1
  134. package/docs/modeller-interaction-performance-2026-10-07.md +40 -8
  135. package/docs/shape-contract.md +46 -0
  136. package/package.json +1 -1
@@ -0,0 +1,562 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ /*
5
+ * The frame nodes a part is placed by: fastened to a face or the mounting plane, posed again, and moved (see
6
+ * authoring-actions.ts for the frame chain).
7
+ */
8
+ import { figurePlacementOf } from "./asset.js";
9
+ import { AXES } from "./words.js";
10
+ import { FIGURE_FACES, SIGN } from "./authoring-types.js";
11
+ import { fail, nodeById, writerOf, partOf, namer, constantOf, scaled, measureRef, termRefs, sumOf, sourceRef, ownInput, dropIfUnused, parentOf, round6, sizeInputOf } from "./authoring-nodes.js";
12
+ import { neg, half, facesOfPart, planeOf, ownSpansOf, standingSpansOf, planeFacesOf, ACROSS } from "./authoring-geometry.js";
13
+ export function attach(asset, a, twist) {
14
+ const m = asset.document.model;
15
+ const to = a.to;
16
+ const path = `${a.part} to ${to?.plane ?? to?.part}`;
17
+ if (!to || typeof to !== 'object')
18
+ fail('SCHEMA', path, 'a target face, or the plane the figure is mounted on, is required');
19
+ if (to.plane !== undefined)
20
+ return standOnPlane(asset, a, path);
21
+ if (a.part === to.part)
22
+ fail('ATTACH_CYCLE', path, 'a part cannot be fastened to itself');
23
+ const byCentre = a.face === 'centre';
24
+ if (!byCentre && !Object.hasOwn(FIGURE_FACES, String(a.face)))
25
+ fail('SCHEMA', path, `${String(a.face)} is not a face`);
26
+ /* The target's faces are the ones its shape declares: a portal's opening as well as its outer faces. */
27
+ const target = facesOfPart(m, to.part, path);
28
+ const theirFace = Object.hasOwn(target.faces, String(to.face)) ? target.faces[to.face] : undefined;
29
+ if (!theirFace)
30
+ fail('SCHEMA', path, `${to.part} has no face ${String(to.face)}; it has ${Object.keys(target.faces).join(', ')}`);
31
+ const facing = a.facing ?? 'meet';
32
+ if (facing !== 'meet' && facing !== 'flush')
33
+ fail('SCHEMA', path, `${String(facing)} is neither meet nor flush`);
34
+ const axis = theirFace.axis;
35
+ const sign = theirFace.normal;
36
+ if (byCentre && facing !== 'meet')
37
+ fail('ATTACH_FACE', path, `${a.part} fastened by its centre sits on ${to.face}; flush has no meaning for a centre`);
38
+ /* By its centre, the part is measured as the face that would meet the target's; only its offset differs. */
39
+ if (byCentre)
40
+ a = {
41
+ ...a,
42
+ face: Object.keys(FIGURE_FACES).find(f => FIGURE_FACES[f] === axis && SIGN[f] === -sign)
43
+ };
44
+ if (FIGURE_FACES[a.face] !== axis)
45
+ fail('ATTACH_FACE', path, `${a.face} faces along ${FIGURE_FACES[a.face]} and ${to.face} along ${axis}; fastening them would need a turn, which this command does not do`);
46
+ const wanted = Object.keys(FIGURE_FACES).find(f => FIGURE_FACES[f] === axis && SIGN[f] === (facing === 'meet' ? -sign : sign));
47
+ if (facing === 'meet' && a.face !== wanted)
48
+ fail('ATTACH_FACE', path, `to meet ${to.face}, ${a.part} offers its ${wanted}; pass flush to lay ${a.face} in the same plane instead`);
49
+ if (facing === 'flush' && a.face !== wanted)
50
+ fail('ATTACH_FACE', path, `to lie flush with ${to.face}, ${a.part} offers its ${wanted}`);
51
+ if (parentOf(m, a.part) && !a.replace)
52
+ fail('ATTACH_REPLACED', path, `${a.part} is already fastened to ${parentOf(m, a.part)}; pass replace to move it, or detach it first`);
53
+ // A part cannot end up its own ancestor.
54
+ for (let up = to.part; up; up = parentOf(m, up))
55
+ if (up === a.part)
56
+ fail('ATTACH_CYCLE', path, `${to.part} already hangs from ${a.part}`);
57
+ /*
58
+ Measured in the target's own frame, where its faces are the planes its shape declares: the seat is written into
59
+ that frame. A target standing turned is met there too -- the joint record's words are turned into that frame
60
+ before this runs (`writeJoint`).
61
+ */
62
+ const theirs = ownSpansOf(m, to.part, path);
63
+ const mine = standingSpansOf(m, asset, a.part, path);
64
+ const mineAlong = mine[axis];
65
+ if ((!mineAlong || !Object.hasOwn(facesOfPart(m, a.part, path).faces, a.face)) && !byCentre)
66
+ fail('EDIT_TARGET', path, `${a.part} has no flat ${a.face} face`);
67
+ const name = namer(m, `${a.part}.on.${to.part}`);
68
+ /*
69
+ Along the face's own axis. `meet`: the part's centre is half its own depth past the target's face, plus the
70
+ gap. `flush`: the part's centre is half its own depth back from that face, so its named face lies in it.
71
+ */
72
+ const outward = facing === 'meet' ? sign : -sign;
73
+ const gap = measureRef(m, asset, name, a.gap, `gap.${axis}`, path);
74
+ /*
75
+ Split at the point fastened at: the seat is on the target's face (its centre, or level with an edge), the part's
76
+ centre is half its own depth and the gap past it. A turn added later turns about that point.
77
+ */
78
+ const zero = constantOf(m, 'mm', 0, 'd');
79
+ const translation = { x: '', y: '', z: '' };
80
+ const offset = { x: zero, y: zero, z: zero };
81
+ /* By its centre, the gap goes into the seat: the point fastened at -- and turned about -- is the part's middle. */
82
+ translation[axis] = sumOf(m, name, [...planeOf(target.shape, theirFace), ...(byCentre ? [{ ref: gap, k: outward }] : [])], `seat.${axis}`);
83
+ const ownFace = byCentre
84
+ ? mineAlong && !mineAlong.centred
85
+ ? [...half(mineAlong.lo), ...half(mineAlong.hi)]
86
+ : []
87
+ : SIGN[a.face] > 0
88
+ ? mineAlong.hi
89
+ : mineAlong.lo;
90
+ offset[axis] = byCentre
91
+ ? ownFace.length
92
+ ? sumOf(m, name, neg(ownFace), `along.${axis}`)
93
+ : zero
94
+ : sumOf(m, name, [...neg(ownFace), { ref: gap, k: outward }], `along.${axis}`);
95
+ /*
96
+ Across the face. Centred by default; min and max keep the two parts' edges level as either is resized -- and the
97
+ point fastened at is where those edges meet: the seat on the target's edge, the part's own edge on it. A door
98
+ fastened level with the frame's min edge turns about that edge, as a hinge does (2026-09-25); centred, the point
99
+ is the middle of the face. A shape not centred on its origin (a portal stands on its bottom) is centred by its
100
+ faces, not by its origin.
101
+ */
102
+ for (const other of AXES.filter(x => x !== axis)) {
103
+ const how = a.align?.[other] ?? 'centre';
104
+ const t = theirs[other], o = mine[other];
105
+ const middle = (span) => (span && !span.centred ? [...half(span.lo), ...half(span.hi)] : []);
106
+ const centreOf = (span, hint) => middle(span).length ? sumOf(m, name, middle(span), hint) : constantOf(m, 'mm', 0, 'd');
107
+ const ownCentre = () => (middle(o).length ? sumOf(m, name, neg(middle(o)), `own-centre.${other}`) : zero);
108
+ if (how === 'centre') {
109
+ translation[other] = centreOf(t, `centre.${other}`);
110
+ offset[other] = ownCentre();
111
+ }
112
+ else if (typeof how === 'object' && how && Object.hasOwn(how, 'mm')) {
113
+ const mm = measureRef(m, asset, name, how.mm, `align.${other}`, path);
114
+ translation[other] = middle(t).length
115
+ ? sumOf(m, name, [...middle(t), { ref: mm, k: 1 }], `align.${other}.from-centre`)
116
+ : mm;
117
+ offset[other] = ownCentre();
118
+ }
119
+ else if (how === 'min' || how === 'max') {
120
+ if (!t)
121
+ fail('ATTACH_FACE', path, `${to.part} has no edges along ${other} to line ${a.part} up with; give the centre or a measured offset`);
122
+ if (!o)
123
+ fail('ATTACH_FACE', path, `${a.part} has no edges along ${other} to line up; give the centre or a measured offset`);
124
+ translation[other] = sumOf(m, name, how === 'min' ? t.lo : t.hi, `edge.${other}`);
125
+ offset[other] = sumOf(m, name, neg(how === 'min' ? o.lo : o.hi), `own-edge.${other}`);
126
+ }
127
+ else
128
+ fail('SCHEMA', path, `${String(how)} is not an alignment`);
129
+ }
130
+ /*
131
+ Twisted about the face's normal: the seat is the face's centre, and the part's own offset across the face -- its
132
+ distance and its own centre -- turns with it, so a blade set out along X and twisted 120° stands out along the
133
+ blade, about the hub. With no twist this is the same place written as before.
134
+ */
135
+ if (twist && twist.deg) {
136
+ const [p, q] = ACROSS[axis];
137
+ for (const other of [p, q]) {
138
+ const how = a.align?.[other] ?? 'centre';
139
+ if (how === 'min' || how === 'max')
140
+ fail('ATTACH_FACE', path, `${a.part} is twisted ${round6(twist.deg)}° about ${axis}; its sides are not level with ${to.part}'s edges -- place it by the centre or a distance`);
141
+ }
142
+ const across = (other) => {
143
+ const how = a.align?.[other] ?? 'centre';
144
+ const o = mine[other];
145
+ const own = o && !o.centred ? neg([...half(o.lo), ...half(o.hi)]) : [];
146
+ return typeof how === 'object' && how && Object.hasOwn(how, 'mm')
147
+ ? [{ ref: measureRef(m, asset, name, how.mm, `twist.${other}`, path), k: 1 }, ...own]
148
+ : own;
149
+ };
150
+ const [vp, vq] = [across(p), across(q)];
151
+ /*
152
+ The turn's factors are named by the angle, as the record gives it -- not by their value, which may carry float
153
+ noise that depends on how it was computed, so a rewrite named them apart (JOINT_DRIFT, the architect's fan,
154
+ 2026-09-25). Their values are rounded to twelve places, which is the second defence.
155
+ */
156
+ const exact = (v) => {
157
+ const r = Math.round(v * 1e12) / 1e12;
158
+ return r === 0 ? 0 : r;
159
+ };
160
+ const tag = String(round6(twist.deg)).replace('-', 'm').replace('.', '_');
161
+ const factor = (fn) => {
162
+ const id = `twist.${fn}.${tag}`;
163
+ const rad = (twist.deg * Math.PI) / 180;
164
+ if (!m.constants.some((c) => c.id === id))
165
+ m.constants.push({
166
+ id,
167
+ unit: 'ratio',
168
+ value: exact(fn === 'cos' ? Math.cos(rad) : fn === 'sin' ? Math.sin(rad) : -Math.sin(rad))
169
+ });
170
+ return id;
171
+ };
172
+ const times = (ref, k, hint) => {
173
+ const id = name(hint);
174
+ m.nodes.push({ id, op: 'mul@1', args: [ref, k], outputs: { value: `${id}.value` } });
175
+ return `${id}.value`;
176
+ };
177
+ const plus = (a, b, hint) => {
178
+ const id = name(hint);
179
+ m.nodes.push({ id, op: 'add@1', args: [a, b], outputs: { value: `${id}.value` } });
180
+ return `${id}.value`;
181
+ };
182
+ for (const other of [p, q]) {
183
+ const t = theirs[other];
184
+ translation[other] =
185
+ t && !t.centred
186
+ ? sumOf(m, name, [...half(t.lo), ...half(t.hi)], `twist-centre.${other}`)
187
+ : constantOf(m, 'mm', 0, 'd');
188
+ }
189
+ const sp = sumOf(m, name, vp, `twist-own.${p}`), sq = sumOf(m, name, vq, `twist-own.${q}`);
190
+ offset[p] = plus(times(sp, factor('cos'), `twisted.${p}.cos`), times(sq, factor('nsin'), `twisted.${p}.sin`), `twisted.${p}`);
191
+ offset[q] = plus(times(sp, factor('sin'), `twisted.${q}.sin`), times(sq, factor('cos'), `twisted.${q}.cos`), `twisted.${q}`);
192
+ }
193
+ reseat(asset, a.part, `${to.part}.local`, {
194
+ seat: [translation.x, translation.y, translation.z],
195
+ pose: [offset.x, offset.y, offset.z]
196
+ });
197
+ return asset;
198
+ }
199
+ function standOnPlane(asset, a, path) {
200
+ const m = asset.document.model;
201
+ const to = a.to;
202
+ if (to.plane !== 'mounting-plane')
203
+ fail('SCHEMA', path, `${String(to.plane)} is not a plane a part can stand on`);
204
+ if (a.facing !== undefined && a.facing !== 'meet')
205
+ fail('SCHEMA', path, 'a part standing on the plane meets it; flush says nothing here');
206
+ /* Which plane it is, the figure's placement says: the floor or the ceiling is Y = 0, a wall is Z = 0 (ADR-0093). */
207
+ const placement = figurePlacementOf(asset);
208
+ const takes = planeFacesOf(placement);
209
+ const normal = placement === 'wall' ? 'z' : 'y';
210
+ if (!takes.includes(a.face))
211
+ fail('ATTACH_FACE', path, placement === 'wall'
212
+ ? `${String(a.face)} faces along ${FIGURE_FACES[a.face] ?? 'no axis'}; the figure hangs on a wall, the plane Z = 0, so a part is fastened to it by its back`
213
+ : `${String(a.face)} faces along ${FIGURE_FACES[a.face] ?? 'no axis'}; the plane faces along y, so a part stands on it by its bottom or hangs from it by its top`);
214
+ if (parentOf(m, a.part) && !a.replace)
215
+ fail('ATTACH_REPLACED', path, `${a.part} is already fastened to ${parentOf(m, a.part)}; pass replace to stand it on the plane instead`);
216
+ const mine = standingSpansOf(m, asset, a.part, path);
217
+ if (!mine[normal] || !Object.hasOwn(facesOfPart(m, a.part, path).faces, a.face))
218
+ fail('EDIT_TARGET', path, `${a.part} has no flat ${a.face} face`);
219
+ const name = namer(m, `${a.part}.on.plane`);
220
+ /* Out of the plane: a bottom stands up from the floor, a back comes out of the wall, a top hangs down. */
221
+ const outward = a.face === 'top' ? -1 : 1;
222
+ const gap = measureRef(m, asset, name, a.gap, `gap.${normal}`, path);
223
+ const translation = { x: '', y: '', z: '' };
224
+ translation[normal] = sumOf(m, name, [...neg(outward > 0 ? mine[normal].lo : mine[normal].hi), { ref: gap, k: outward }], `stand.${normal}`);
225
+ const zero = constantOf(m, 'mm', 0, 'd');
226
+ const pose = { x: zero, y: zero, z: zero };
227
+ pose[normal] = translation[normal];
228
+ for (const other of AXES.filter(x => x !== normal)) {
229
+ const how = a.align?.[other] ?? 'centre';
230
+ const span = mine[other];
231
+ if (how === 'centre')
232
+ translation[other] = constantOf(m, 'mm', 0, 'd');
233
+ else if (typeof how === 'object' && how && Object.hasOwn(how, 'mm'))
234
+ translation[other] = measureRef(m, asset, name, how.mm, `align.${other}`, path);
235
+ else if ((how === 'min' || how === 'max') && sizeInputOf(m, other)) {
236
+ /*
237
+ The plane has no edges, but a figure that declares its size has a box on it: its sides are half the size
238
+ either way of the origin. A part level with one keeps to it when the figure is resized -- a door's post at
239
+ the figure's left, a gantry's legs at its corners (2026-09-25).
240
+ */
241
+ if (!span)
242
+ fail('ATTACH_FACE', path, `${a.part} has no edges along ${other} to line up with the figure's side`);
243
+ const s = how === 'min' ? -1 : 1;
244
+ translation[other] = sumOf(m, name, [{ ref: sourceRef(m, asset, { of: 'instance', axis: other }, path), k: s * 0.5 }], `figure-edge.${other}`);
245
+ pose[other] = sumOf(m, name, neg(how === 'min' ? span.lo : span.hi), `own-edge.${other}`);
246
+ continue;
247
+ }
248
+ else
249
+ fail('SCHEMA', path, `the plane has no edges to line ${a.part} up with on ${other}; declare the figure's size, or give the centre or a measured offset`);
250
+ /* A shape not centred on its origin stands centred by its faces. */
251
+ if (span && !span.centred)
252
+ pose[other] = sumOf(m, name, neg([...half(span.lo), ...half(span.hi)]), `own-centre.${other}`);
253
+ }
254
+ // The point it stands on is on the plane, under its centre: a turn about the plane's normal turns it where it stands.
255
+ const seat = AXES.map(x => (x === normal ? zero : translation[x]));
256
+ reseat(asset, a.part, asset.document.capabilities.assetFrame, {
257
+ seat: [seat[0], seat[1], seat[2]],
258
+ pose: [pose.x, pose.y, pose.z]
259
+ });
260
+ return asset;
261
+ }
262
+ /**
263
+ * Put a part's pose on a new frame with a new translation, and rebuild the chain that carries it to the asset.
264
+ * The part's own id, its shape and its `placed` reference all stay as they were.
265
+ */
266
+ /**
267
+ * Where a part is fastened, in two translations that are never merged: `seat` is the point it is fastened at, in the
268
+ * frame it is fastened to -- a point on the target's face; `pose` is the part's centre from that point, in its own
269
+ * seat frame. A motion sits between the two, so a turn turns about the point the part is fastened at: a hinge, a
270
+ * joint, a lid (chief architect's ruling 2026-09-25; before this the seat was the target's centre and a fastened
271
+ * part swung about the middle of what it was fastened to).
272
+ *
273
+ * <id>.local --pose--> <id>.seat [--motion--> <id>.joint] --seat.rigid--> <to>
274
+ *
275
+ * Without `place` the part keeps both translations and only its frames are rewired (a motion added or taken away).
276
+ */
277
+ function reseat(asset, id, to, place) {
278
+ const m = asset.document.model;
279
+ const { place: placed, pose } = partOf(m, id, id);
280
+ const old = place ? pose.args.slice(0, 3) : [];
281
+ if (place)
282
+ pose.args = [...place.pose, ...pose.args.slice(3)];
283
+ pose.params = { ...pose.params, to: `${id}.seat` };
284
+ const motion = nodeById(m, `${id}.motion`);
285
+ const zero = constantOf(m, 'mm', 0, 'd');
286
+ const noTurn = constantOf(m, 'deg', 0, 'a');
287
+ let seat = nodeById(m, `${id}.seat.rigid`);
288
+ if (!seat) {
289
+ seat = {
290
+ id: `${id}.seat.rigid`,
291
+ op: 'rigid@1',
292
+ args: [zero, zero, zero, noTurn, noTurn, noTurn],
293
+ outputs: { pose: `${id}.seat.value` },
294
+ params: {}
295
+ };
296
+ m.nodes.push(seat);
297
+ }
298
+ const oldSeat = place ? seat.args.slice(0, 3) : [];
299
+ if (place)
300
+ seat.args = [...place.seat, ...seat.args.slice(3)];
301
+ seat.params = { from: motion ? `${id}.joint` : `${id}.seat`, to };
302
+ // The motion turns the seat frame about its origin -- the point fastened at -- into the joint frame.
303
+ let turned = nodeById(m, `${id}.turned`);
304
+ if (motion) {
305
+ motion.params = { ...motion.params, from: `${id}.seat`, to: `${id}.joint` };
306
+ if (!turned) {
307
+ turned = {
308
+ id: `${id}.turned`,
309
+ op: 'compose@1',
310
+ args: [motion.outputs.pose, pose.outputs.pose],
311
+ outputs: { pose: `${id}.turned.value` }
312
+ };
313
+ m.nodes.push(turned);
314
+ }
315
+ else
316
+ turned.args = [motion.outputs.pose, pose.outputs.pose];
317
+ }
318
+ else if (turned)
319
+ m.nodes = m.nodes.filter((n) => n !== turned);
320
+ let chain = nodeById(m, `${id}.chain`);
321
+ if (!chain) {
322
+ chain = { id: `${id}.chain`, op: 'compose@1', args: ['', ''], outputs: { pose: `${id}.chain.value` } };
323
+ m.nodes.push(chain);
324
+ }
325
+ chain.args = [seat.outputs.pose, motion ? turned.outputs.pose : pose.outputs.pose];
326
+ const parent = /^(.*)\.local$/.exec(to);
327
+ let world = nodeById(m, `${id}.world`);
328
+ if (parent && parent[1] !== id) {
329
+ /* A row's template has no chain of its own: what hangs from it hangs in its copy's frame, turned as it turns. */
330
+ const above = nodeById(m, `${parent[1]}.world`)?.outputs?.pose ??
331
+ nodeById(m, `${parent[1]}.chain`)?.outputs?.pose ??
332
+ nodeById(m, `${parent[1]}.turned`)?.outputs?.pose ??
333
+ nodeById(m, `${parent[1]}.pose`).outputs.pose;
334
+ if (!world) {
335
+ world = {
336
+ id: `${id}.world`,
337
+ op: 'compose@1',
338
+ args: [above, chain.outputs.pose],
339
+ outputs: { pose: `${id}.world.value` }
340
+ };
341
+ m.nodes.push(world);
342
+ }
343
+ else
344
+ world.args = [above, chain.outputs.pose];
345
+ placed.args = [placed.args[0], world.outputs.pose];
346
+ }
347
+ else {
348
+ if (world)
349
+ m.nodes = m.nodes.filter((n) => n !== world);
350
+ placed.args = [placed.args[0], chain.outputs.pose];
351
+ }
352
+ /*
353
+ The part's own position numbers, once nothing reads them, go with the old pose: a fastened part left its
354
+ position fields in the editor, and typing into them changed nothing (seen on :3300, 2026-09-24).
355
+ */
356
+ for (const ref of [...old, ...oldSeat])
357
+ dropIfUnused(asset, ref, ownInput(m, id, ref) ? ref : undefined);
358
+ }
359
+ /** The frame a part is fastened into: its parent's, or the asset's. */
360
+ const attachmentFrameOf = (asset, id) => {
361
+ const parent = parentOf(asset.document.model, id);
362
+ return parent ? `${parent}.local` : asset.document.capabilities.assetFrame;
363
+ };
364
+ export function addMotion(asset, a, follow, sign = 1) {
365
+ const m = asset.document.model;
366
+ const path = a.part;
367
+ partOf(m, a.part, path);
368
+ if (!a.motion || (a.motion.kind !== 'slide' && a.motion.kind !== 'turn'))
369
+ fail('SCHEMA', path, 'a slide or a turn is required');
370
+ if (!AXES.includes(a.motion.axis))
371
+ fail('SCHEMA', path, `${String(a.motion.axis)} is not an axis`);
372
+ if (nodeById(m, `${a.part}.motion`) && !a.replace)
373
+ fail('MOTION_REPLACED', path, `${a.part} already moves; pass replace to change how, or remove the motion first`);
374
+ if (nodeById(m, `${a.part}.motion`))
375
+ removeMotion(asset, { kind: 'remove-motion', part: a.part });
376
+ const frame = a.motion.frame ?? 'attachment';
377
+ const seatedIn = attachmentFrameOf(asset, a.part);
378
+ if (frame === 'asset' && seatedIn !== asset.document.capabilities.assetFrame)
379
+ fail('MOTION_FRAME', path, `${a.part} is fastened into ${seatedIn}; an axis in the asset frame would have to be re-expressed there, which this command does not do`);
380
+ else if (frame !== 'attachment' && frame !== 'asset')
381
+ fail('SCHEMA', path, `${String(frame)} is not a frame for the axis`);
382
+ const st = a.state;
383
+ const name = namer(m, `${a.part}.motion`);
384
+ let quantity = st?.id;
385
+ if (follow) {
386
+ /*
387
+ A mimic: the leader's value times k plus c, and no control of its own. A sum is each leader's value times its own
388
+ k, added up, then c -- written with the same mul@1 and add@1 a one-leader mimic is, so a pose step runs it as it
389
+ runs that (ADR-0108), and the gate reads it by the same operators.
390
+ */
391
+ if (!follow.sum) {
392
+ const scaledId = name('mimic');
393
+ m.nodes.push({
394
+ id: scaledId,
395
+ op: 'mul@1',
396
+ args: [follow.terms[0].of, constantOf(m, 'ratio', follow.terms[0].k, 'k')],
397
+ outputs: { value: `${scaledId}.value` }
398
+ });
399
+ quantity = `${scaledId}.value`;
400
+ }
401
+ else
402
+ for (const [i, t] of follow.terms.entries()) {
403
+ const scaledId = name(`mimic.${i}`);
404
+ m.nodes.push({
405
+ id: scaledId,
406
+ op: 'mul@1',
407
+ args: [t.of, constantOf(m, 'ratio', t.k, 'k')],
408
+ outputs: { value: `${scaledId}.value` }
409
+ });
410
+ if (!i)
411
+ quantity = `${scaledId}.value`;
412
+ else {
413
+ const added = name(`mimic.${i}.sum`);
414
+ m.nodes.push({
415
+ id: added,
416
+ op: 'add@1',
417
+ args: [quantity, `${scaledId}.value`],
418
+ outputs: { value: `${added}.value` }
419
+ });
420
+ quantity = `${added}.value`;
421
+ }
422
+ }
423
+ if (follow.c) {
424
+ const plus = name('mimic.offset');
425
+ /* The offset is in the follower's own unit: millimetres for a slide, degrees for a turn. */
426
+ const unitOf = a.motion.kind === 'slide' ? 'mm' : 'deg';
427
+ m.nodes.push({
428
+ id: plus,
429
+ op: 'add@1',
430
+ args: [quantity, constantOf(m, unitOf, follow.c, 'd')],
431
+ outputs: { value: `${plus}.value` }
432
+ });
433
+ quantity = `${plus}.value`;
434
+ }
435
+ }
436
+ else {
437
+ if (!st || typeof st.id !== 'string' || !st.id.trim())
438
+ fail('SCHEMA', path, 'a state input id is required');
439
+ const same = m.inputs.find((i) => i.id === st.id && i.role === 'state' && i.unit === st.unit && i.min === st.min && i.max === st.max);
440
+ if (same) {
441
+ /*
442
+ The same control, written again: the joint's nodes are made again from its record, and the control stays -- a
443
+ lamp shown while it is at least so much still reads it, and a value a board wrote keeps its meaning.
444
+ */
445
+ }
446
+ else if (m.inputs.some((i) => i.id === st.id)) {
447
+ /*
448
+ A control nothing reads any more -- its part re-made, its lamp moved to another -- is taken over under its name,
449
+ so what a connector or a board writes to it keeps arriving. One something still reads is refused.
450
+ */
451
+ const read = m.nodes.some((n) => n.args.includes(st.id)) ||
452
+ (asset.drivers ?? []).some((d) => d.state === st.id) ||
453
+ asset.appearance.some((look) => look.visibility === st.id);
454
+ if (read)
455
+ fail('DUPLICATE_WRITER', path, `${st.id} already exists`);
456
+ m.inputs = m.inputs.filter((i) => i.id !== st.id);
457
+ delete asset.stateDefaults[st.id];
458
+ if (asset.stateInputs?.[st.id]) {
459
+ const { [st.id]: _gone, ...rest } = asset.stateInputs;
460
+ asset.stateInputs = rest;
461
+ }
462
+ }
463
+ const wanted = a.motion.kind === 'turn' ? ['deg'] : ['mm', 'ratio'];
464
+ if (!wanted.includes(st.unit))
465
+ fail('SCHEMA', path, `a ${a.motion.kind} takes a ${wanted.join(' or ')} control, not ${String(st.unit)}`);
466
+ if (!(Number.isFinite(st.min) && Number.isFinite(st.max) && st.max > st.min))
467
+ fail('SCHEMA', path, 'a range with max above min is required');
468
+ const start = st.start ?? st.min;
469
+ if (!(start >= st.min && start <= st.max))
470
+ fail('SCHEMA', path, 'the starting value is outside the range');
471
+ if (!same) {
472
+ m.inputs.push({ id: st.id, unit: st.unit, min: st.min, max: st.max, role: 'state' });
473
+ asset.stateDefaults[st.id] = start;
474
+ }
475
+ if (st.label !== undefined || st.sweep !== undefined) {
476
+ asset.stateInputs = { ...(asset.stateInputs ?? {}) };
477
+ asset.stateInputs[st.id] = {
478
+ ...(st.label !== undefined ? { label: st.label } : {}),
479
+ ...(st.sweep !== undefined ? { sweep: st.sweep } : {})
480
+ };
481
+ }
482
+ }
483
+ if (a.motion.kind === 'slide' && st.unit === 'ratio') {
484
+ if (!a.travel)
485
+ fail('SCHEMA', path, 'a ratio control needs travel: how far the part goes at 1');
486
+ const travel = a.travel;
487
+ let length;
488
+ if (Object.hasOwn(travel, 'sum')) {
489
+ /* A stroke that is a sum of lengths: the terms added, then the margin, as any followed length (ADR-0107). */
490
+ const plus = travel.plus ?? 0;
491
+ length = scaled(m, name, sumOf(m, name, termRefs(m, asset, travel.sum, plus, `${path}.travel`), 'travel.sum'), 1, plus, 'travel');
492
+ }
493
+ else {
494
+ const base = travel.source ? sourceRef(m, asset, travel.source, path) : constantOf(m, 'mm', travel.plus ?? 0, 'd');
495
+ length = travel.source ? scaled(m, name, base, travel.times ?? 1, travel.plus ?? 0, 'travel') : base;
496
+ }
497
+ const id = name('distance');
498
+ m.nodes.push({ id, op: 'mul@1', args: [quantity, length], outputs: { value: `${id}.value` } });
499
+ quantity = `${id}.value`;
500
+ }
501
+ else if (a.motion.kind === 'slide' && a.travel)
502
+ fail('SCHEMA', path, 'a mm control is the distance; travel would say it twice');
503
+ const unit = AXES.map(x => constantOf(m, 'ratio', x === a.motion.axis ? sign : 0, 'axis'));
504
+ m.nodes.push({
505
+ id: `${a.part}.motion`,
506
+ op: a.motion.kind === 'slide' ? 'axis-slide@1' : 'axis-turn@1',
507
+ args: [...unit, quantity],
508
+ outputs: { pose: `${a.part}.motion.value` },
509
+ params: { from: `${a.part}.seat`, to: seatedIn }
510
+ });
511
+ reseat(asset, a.part, seatedIn);
512
+ if (a.clip) {
513
+ const c = a.clip;
514
+ if (typeof c.name !== 'string' || !c.name.trim())
515
+ fail('SCHEMA', path, 'a clip is named');
516
+ if (!(Number.isFinite(c.duration) && c.duration > 0))
517
+ fail('SCHEMA', path, 'a clip runs for a positive number of seconds');
518
+ asset.drivers = [
519
+ ...(asset.drivers ?? []),
520
+ {
521
+ id: `${a.part}/${c.name}`,
522
+ clip: c.name,
523
+ state: st.id,
524
+ time: { unit: 's', duration: c.duration },
525
+ keys: structuredClone(c.keys),
526
+ interpolation: 'linear',
527
+ loop: c.loop ?? 'wrap',
528
+ accumulates: c.accumulates ?? false
529
+ }
530
+ ];
531
+ }
532
+ return asset;
533
+ }
534
+ /** "This part does not move any more." The control it created goes with it, and so does its clip. */
535
+ export function removeMotion(asset, a) {
536
+ const m = asset.document.model;
537
+ const motion = nodeById(m, `${a.part}.motion`);
538
+ if (!motion)
539
+ fail('EDIT_TARGET', a.part, `${a.part} does not move`);
540
+ const quantity = motion.args[3];
541
+ const to = nodeById(m, `${a.part}.seat.rigid`)?.params?.to ?? motion.params.to;
542
+ // Which control this motion introduced, read before the nodes that name it are taken away.
543
+ const state = m.inputs.find((i) => i.id === quantity && i.role === 'state') ??
544
+ m.inputs.find((i) => i.role === 'state' && (writerOf(m, quantity)?.args ?? []).includes(i.id));
545
+ m.nodes = m.nodes.filter((n) => n !== motion);
546
+ reseat(asset, a.part, to);
547
+ dropIfUnused(asset, quantity, quantity);
548
+ if (state && !m.nodes.some((n) => n.args.includes(state.id))) {
549
+ m.inputs = m.inputs.filter((i) => i !== state);
550
+ delete asset.stateDefaults[state.id];
551
+ if (asset.stateInputs)
552
+ delete asset.stateInputs[state.id];
553
+ if (asset.drivers)
554
+ asset.drivers = asset.drivers.filter((d) => d.state !== state.id);
555
+ if (asset.drivers && !asset.drivers.length)
556
+ delete asset.drivers;
557
+ if (asset.stateInputs && !Object.keys(asset.stateInputs).length)
558
+ delete asset.stateInputs;
559
+ }
560
+ return asset;
561
+ }
562
+ //# sourceMappingURL=authoring-fastening.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoring-fastening.js","sourceRoot":"","sources":["../src/authoring-fastening.ts"],"names":[],"mappings":"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"}