@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.
Files changed (98) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/asset.d.ts.map +1 -1
  3. package/dist/asset.js +3 -1
  4. package/dist/asset.js.map +1 -1
  5. package/dist/authoring-actions.d.ts +19 -0
  6. package/dist/authoring-actions.d.ts.map +1 -1
  7. package/dist/authoring-actions.js +106 -63
  8. package/dist/authoring-actions.js.map +1 -1
  9. package/dist/command-preview.d.ts +3 -1
  10. package/dist/command-preview.d.ts.map +1 -1
  11. package/dist/command-preview.js +52 -27
  12. package/dist/command-preview.js.map +1 -1
  13. package/dist/cost.d.ts +1 -1
  14. package/dist/cost.d.ts.map +1 -1
  15. package/dist/cost.js +30 -25
  16. package/dist/cost.js.map +1 -1
  17. package/dist/create.d.ts.map +1 -1
  18. package/dist/create.js +112 -31
  19. package/dist/create.js.map +1 -1
  20. package/dist/document.d.ts.map +1 -1
  21. package/dist/document.js +3 -2
  22. package/dist/document.js.map +1 -1
  23. package/dist/fixtures/shape-nodes.d.ts +12 -0
  24. package/dist/fixtures/shape-nodes.d.ts.map +1 -0
  25. package/dist/fixtures/shape-nodes.js +20 -0
  26. package/dist/fixtures/shape-nodes.js.map +1 -0
  27. package/dist/follow.d.ts.map +1 -1
  28. package/dist/follow.js +5 -2
  29. package/dist/follow.js.map +1 -1
  30. package/dist/gate.d.ts.map +1 -1
  31. package/dist/gate.js +31 -59
  32. package/dist/gate.js.map +1 -1
  33. package/dist/graph-types.d.ts +7 -6
  34. package/dist/graph-types.d.ts.map +1 -1
  35. package/dist/graph.d.ts +17 -12
  36. package/dist/graph.d.ts.map +1 -1
  37. package/dist/graph.js +24 -292
  38. package/dist/graph.js.map +1 -1
  39. package/dist/index.d.ts +4 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +5 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/kernel-version.d.ts +1 -1
  44. package/dist/kernel-version.d.ts.map +1 -1
  45. package/dist/kernel-version.js +1 -1
  46. package/dist/kernel-version.js.map +1 -1
  47. package/dist/part-edit.d.ts.map +1 -1
  48. package/dist/part-edit.js +8 -6
  49. package/dist/part-edit.js.map +1 -1
  50. package/dist/proposal.d.ts +1 -1
  51. package/dist/proposal.d.ts.map +1 -1
  52. package/dist/proposal.js +14 -2
  53. package/dist/proposal.js.map +1 -1
  54. package/dist/recipe-from-parts.d.ts.map +1 -1
  55. package/dist/recipe-from-parts.js +107 -24
  56. package/dist/recipe-from-parts.js.map +1 -1
  57. package/dist/render-batches.d.ts.map +1 -1
  58. package/dist/render-batches.js +11 -2
  59. package/dist/render-batches.js.map +1 -1
  60. package/dist/resize-plan.d.ts.map +1 -1
  61. package/dist/resize-plan.js +22 -8
  62. package/dist/resize-plan.js.map +1 -1
  63. package/dist/section.d.ts +164 -0
  64. package/dist/section.d.ts.map +1 -0
  65. package/dist/section.js +277 -0
  66. package/dist/section.js.map +1 -0
  67. package/dist/shape-edit.d.ts +22 -0
  68. package/dist/shape-edit.d.ts.map +1 -0
  69. package/dist/shape-edit.js +225 -0
  70. package/dist/shape-edit.js.map +1 -0
  71. package/dist/shape-features.d.ts +83 -0
  72. package/dist/shape-features.d.ts.map +1 -0
  73. package/dist/shape-features.js +102 -0
  74. package/dist/shape-features.js.map +1 -0
  75. package/dist/shape-ops.d.ts +154 -0
  76. package/dist/shape-ops.d.ts.map +1 -0
  77. package/dist/shape-ops.js +571 -0
  78. package/dist/shape-ops.js.map +1 -0
  79. package/dist/shape-provider.d.ts +16 -23
  80. package/dist/shape-provider.d.ts.map +1 -1
  81. package/dist/shape-provider.js +18 -56
  82. package/dist/shape-provider.js.map +1 -1
  83. package/dist/shape-sampling.d.ts +0 -8
  84. package/dist/shape-sampling.d.ts.map +1 -1
  85. package/dist/shape-sampling.js +67 -101
  86. package/dist/shape-sampling.js.map +1 -1
  87. package/dist/size-edit.js +2 -2
  88. package/dist/size-edit.js.map +1 -1
  89. package/dist/surface.d.ts.map +1 -1
  90. package/dist/surface.js +10 -17
  91. package/dist/surface.js.map +1 -1
  92. package/dist/words.d.ts +7 -0
  93. package/dist/words.d.ts.map +1 -1
  94. package/dist/words.js +7 -0
  95. package/dist/words.js.map +1 -1
  96. package/docs/document-contract.md +1 -1
  97. package/docs/shape-contract.md +439 -0
  98. package/package.json +2 -1
@@ -52,10 +52,12 @@ export interface FigureFaceArea {
52
52
  };
53
53
  /** A round face (a cylinder's end): `size` is its diameter both ways. */
54
54
  round?: boolean;
55
+ /** A plane touching a curved side (a cylinder's): the contact is a line, `size` 0 across it. */
56
+ line?: boolean;
55
57
  }
56
58
  /**
57
59
  * Where a part's named face lies in the figure, at the values given: from the shape's provider, as attaching reads it.
58
- * Nothing for a face the shape does not declare, a part drawn in a row, or a shape whose section is not a plain box or
60
+ * Nothing for a face the shape does not declare, a part drawn in a row, or a face whose outline is not a rectangle or a
59
61
  * disc -- a highlight in a guessed place would point at the wrong face.
60
62
  */
61
63
  export declare function figurePartFaceOf(source: FigureAsset, part: string, face: string, values?: Record<string, number>): FigureFaceArea | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"command-preview.d.ts","sourceRoot":"","sources":["../src/command-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAKzF,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAWnD,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAGnC,wGAAwG;AACxG,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,GAAG,CAAA;IACd,0HAA0H;IAC1H,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CACxD;AAED,MAAM,WAAW,oBAAoB;IACnC,iCAAiC;IACjC,KAAK,EAAE,WAAW,CAAA;IAClB,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,mEAAmE;IACnE,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,2FAA2F;IAC3F,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,sFAAsF;IACtF,YAAY,EAAE,cAAc,EAAE,CAAA;CAC/B;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CASpD;AA8BD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,oBAAoB,CAwBlJ;AAED,4GAA4G;AAC5G,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,GAAG,CAAA;IACX,MAAM,EAAE,GAAG,CAAA;IACX,CAAC,EAAE,GAAG,CAAA;IACN,CAAC,EAAE,GAAG,CAAA;IACN,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9B,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,cAAc,GAAG,SAAS,CA2CjJ;AAED,+GAA+G;AAC/G,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,yDAAyD;IACzD,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,wFAAwF;IACxF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACvC,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wDAAwD;IACxD,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACnD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,gBAAgB,GAAG,SAAS,CAgChI;AAED,4HAA4H;AAC5H,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAClC;;;;;;;OAOG;IACH,KAAK,EAAE,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAA;IAC3D,0GAA0G;IAC1G,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzE,sDAAsD;IACtD,KAAK,EAAE,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAA;IAC7B,uFAAuF;IACvF,QAAQ,EAAE,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAA;CACjC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,kBAAkB,GAAG,SAAS,CA6C3I"}
1
+ {"version":3,"file":"command-preview.d.ts","sourceRoot":"","sources":["../src/command-preview.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { applyFigureAuthoring } from "./authoring-actions.js";
2
2
  import { compileFigureAsset, upgradeFigurePlacement } from "./asset.js";
3
3
  import { compileFigureGraph } from "./graph.js";
4
4
  import { figureShapeProviderOf } from "./shape-provider.js";
5
+ import { figureShapeBoundsOf, figureShapeDescriptionOf } from "./shape-ops.js";
5
6
  import { figureOccupiedBoxesOf, figureWritersOf } from "./gate.js";
6
7
  import { FigureClipsDroppedError } from "./clip-keeping.js";
7
8
  const round = (v, places = 3) => Math.round(v * 10 ** places) / 10 ** places || 0;
@@ -90,7 +91,7 @@ export function previewFigureCommand(source, action, values = {}) {
90
91
  }
91
92
  /**
92
93
  * Where a part's named face lies in the figure, at the values given: from the shape's provider, as attaching reads it.
93
- * Nothing for a face the shape does not declare, a part drawn in a row, or a shape whose section is not a plain box or
94
+ * Nothing for a face the shape does not declare, a part drawn in a row, or a face whose outline is not a rectangle or a
94
95
  * disc -- a highlight in a guessed place would point at the wrong face.
95
96
  */
96
97
  export function figurePartFaceOf(source, part, face, values = {}) {
@@ -100,48 +101,72 @@ export function figurePartFaceOf(source, part, face, values = {}) {
100
101
  if (!place)
101
102
  return undefined;
102
103
  const shape = m.nodes.find((n) => Object.values(n.outputs ?? {}).includes(place.args[0]));
103
- const provider = shape && figureShapeProviderOf(shape.op);
104
- const f = provider?.faces[face];
105
- if (!f)
104
+ if (!figureShapeDescriptionOf(shape)?.faces[face])
106
105
  return undefined;
107
- const box = ['box-shape@1', 'rounded-box@1', 'hollow-box@2'].includes(shape.op);
108
- const disc = shape.op === 'cylinder-shape@1';
109
- if (!box && !disc)
110
- return undefined;
111
- const inputs = { ...asset.designInputs, ...asset.stateDefaults, ...pick(values, { ...asset.designInputs, ...asset.stateDefaults }) };
112
- const got = compileFigureGraph(m).evaluate(inputs).values;
113
- const arg = (i) => got[shape.args[i]];
114
- const along = f.plane.reduce((s, p) => s + p.k * arg(p.arg), 0);
115
- const reach = (axis) => {
116
- const terms = provider.measure[axis];
117
- return terms === 'profile' ? NaN : Math.max(...terms.map((t) => t.k * arg(t.arg)));
118
- };
119
- const axes = ['x', 'y', 'z'].filter(a => a !== f.axis);
106
+ return shapeOperationFace(asset, part, face, values);
107
+ }
108
+ /**
109
+ * A named face of a shape operation, from the evaluated shape itself. A rectangle's or a circle's face is a plate or a
110
+ * disc; an inside face is the inside's own size. A drawn section's or a door frame's side, and an end the inside opens
111
+ * through, give nothing: their outline is not a rectangle, and a filled one would point at material that is not there.
112
+ */
113
+ function shapeOperationFace(asset, part, face, values) {
120
114
  const body = evaluate(asset, values).find(b => b.id === part);
121
115
  if (!body?.pose)
122
116
  return undefined;
123
- const { r, t } = body.pose;
124
- const column = (i) => [r[0][i], r[1][i], r[2][i]];
117
+ const s = body.shape;
118
+ const at = s.faces[face];
119
+ const e = s.extrusion;
120
+ if (!at || !e || (e.section.kind !== 'rectangle' && e.section.kind !== 'ellipse'))
121
+ return undefined;
122
+ const c = s.cavity;
123
+ if (c && ((face === FACES_LOW[e.axis] && c.start === 'open') || (face === FACES_HIGH[e.axis] && c.end === 'open')))
124
+ return undefined;
125
+ const bounds = figureShapeBoundsOf(s);
126
+ if (face.startsWith('inside-') && c) {
127
+ for (const x of ['x', 'y', 'z']) {
128
+ if (x === e.axis) {
129
+ bounds[x] = {
130
+ min: e.start + (c.start === 'open' ? 0 : c.start.closed),
131
+ max: e.end - (c.end === 'open' ? 0 : c.end.closed)
132
+ };
133
+ }
134
+ else
135
+ bounds[x] = { min: bounds[x].min + c.wall[`${x}-`], max: bounds[x].max - c.wall[`${x}+`] };
136
+ }
137
+ }
125
138
  const index = { x: 0, y: 1, z: 2 };
126
139
  const local = [0, 0, 0];
127
- local[index[f.axis]] = along;
140
+ for (const x of ['x', 'y', 'z'])
141
+ local[index[x]] = x === at.axis ? at.at : (bounds[x].min + bounds[x].max) / 2;
142
+ const { r, t } = body.pose;
143
+ const column = (i) => [r[0][i], r[1][i], r[2][i]];
128
144
  const centre = [0, 1, 2].map(i => round(r[i][0] * local[0] + r[i][1] * local[1] + r[i][2] * local[2] + t[i]));
129
- const normal = column(index[f.axis]).map(v => round(v * f.normal, 6));
130
- const [a, b] = axes;
131
- const size = { u: reach(a), v: reach(b) };
132
- if (!Number.isFinite(size.u) || !Number.isFinite(size.v))
133
- return undefined;
145
+ const [a, b] = ['x', 'y', 'z'].filter(x => x !== at.axis);
146
+ const size = { u: bounds[a].max - bounds[a].min, v: bounds[b].max - bounds[b].min };
147
+ const disc = e.section.kind === 'ellipse' && at.axis === e.axis;
148
+ /* A plane touching a curved side touches it along a line on the push axis (Q3): a line is shown, not a plate. */
149
+ const line = e.section.kind === 'ellipse' && at.axis !== e.axis;
150
+ if (line) {
151
+ if (a !== e.axis)
152
+ size.u = 0;
153
+ if (b !== e.axis)
154
+ size.v = 0;
155
+ }
134
156
  return {
135
157
  part,
136
158
  face,
137
159
  centre,
138
- normal,
160
+ normal: column(index[at.axis]).map(v => round(v * at.normal, 6)),
139
161
  u: column(index[a]).map(v => round(v, 6)),
140
162
  v: column(index[b]).map(v => round(v, 6)),
141
163
  size: disc ? { u: Math.max(size.u, size.v), v: Math.max(size.u, size.v) } : size,
142
- ...(disc ? { round: true } : {})
164
+ ...(disc ? { round: true } : {}),
165
+ ...(line ? { line: true } : {})
143
166
  };
144
167
  }
168
+ const FACES_LOW = { x: 'left', y: 'bottom', z: 'back' };
169
+ const FACES_HIGH = { x: 'right', y: 'top', z: 'front' };
145
170
  /**
146
171
  * A row read from what the figure draws (ADR-0097 §5.5): the count, the spacing and the ends as they come out, never
147
172
  * worked out again by a formula of the screen's own. Read on a preview's figure, it is the row a command would make.
@@ -1 +1 @@
1
- {"version":3,"file":"command-preview.js","sourceRoot":"","sources":["../src/command-preview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-preview.js","sourceRoot":"","sources":["../src/command-preview.ts"],"names":[],"mappings":"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"}
package/dist/cost.d.ts CHANGED
@@ -7,7 +7,7 @@ export interface FigureCost {
7
7
  /** Bodies the asset evaluates but hides. Counted so a reader can see why the numbers are smaller. */
8
8
  hidden: number;
9
9
  }
10
- /** The triangles one drawn body costs. Unknown providers count as a box rather than as nothing. */
10
+ /** The triangles one drawn body costs, the way the renderer draws it. Anything else counts as a box rather than as nothing. */
11
11
  export declare function figureTrianglesOf(body: FigureAssetGeometry): number;
12
12
  /** What one instance of this asset costs to draw. Evaluates the asset at its own design and state defaults. */
13
13
  export declare function figureCostOf(asset: FigureAsset): FigureCost;
@@ -1 +1 @@
1
- {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAExE,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAA;IACjB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAA;IACd,qGAAqG;IACrG,MAAM,EAAE,MAAM,CAAA;CACf;AAMD,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAqCnE;AAED,+GAA+G;AAC/G,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAU3D"}
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAExE,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAA;IACjB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAA;IACd,qGAAqG;IACrG,MAAM,EAAE,MAAM,CAAA;CACf;AAaD,+HAA+H;AAC/H,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CA+BnE;AAED,+GAA+G;AAC/G,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAU3D"}
package/dist/cost.js CHANGED
@@ -10,13 +10,22 @@
10
10
  * A body the asset hides is not drawn, so it costs nothing. It is still evaluated, placed and gated
11
11
  * (designer's ruling 2026-09-22); this counts what reaches the screen.
12
12
  */
13
+ import { figureCavitySectionOf } from "./section.js";
13
14
  import { figureRenderBatchesOf } from "./render-batches.js";
14
15
  import { SEGMENT_PRESETS } from "./words.js";
15
16
  import { compileFigureAsset } from "./asset.js";
16
17
  const DEFAULT_SEGMENTS = 12;
17
18
  /** The corner curve of a rounded outline, drawn with the same point count the renderer uses. */
18
19
  const ROUND_OUTLINE_POINTS = 4 * SEGMENT_PRESETS[0] + 4;
19
- /** The triangles one drawn body costs. Unknown providers count as a box rather than as nothing. */
20
+ /** How many points a section's outline is drawn with: a rounded corner as an elliptic quarter of the smallest preset. */
21
+ function outlinePoints(section, seg) {
22
+ if (section.kind === 'polygon')
23
+ return section.points.length;
24
+ if (section.kind === 'ellipse')
25
+ return seg;
26
+ return section.corner ? ROUND_OUTLINE_POINTS : 4;
27
+ }
28
+ /** The triangles one drawn body costs, the way the renderer draws it. Anything else counts as a box rather than as nothing. */
20
29
  export function figureTrianglesOf(body) {
21
30
  if (!('shape' in body))
22
31
  return 0; // a scalar body carries no mesh
@@ -24,33 +33,29 @@ export function figureTrianglesOf(body) {
24
33
  const seg = body.segments ?? DEFAULT_SEGMENTS;
25
34
  const ring = (outer, inner, capped) => 4 * (outer + inner) + (capped ? 4 * outer - 4 : 0);
26
35
  switch (shape.provider) {
27
- case 'cylinder':
28
- case 'ellipticCylinder':
29
- case 'frustum':
30
- return 4 * seg;
31
- case 'sphere': {
36
+ case 'extrude': {
37
+ /*
38
+ The outline pushed, as the renderer builds it: two triangles a side for every loop, and at each end a cap of
39
+ n - 2 (a closed end: the outside's cap and the inside's floor) or a ring of n + m (an end the inside opens through).
40
+ */
41
+ const e = shape.extrusion;
42
+ const n = outlinePoints(e.section, seg);
43
+ const c = shape.cavity;
44
+ if (!c)
45
+ return 4 * n - 4;
46
+ const inside = figureCavitySectionOf(e.section, e.axis, c.wall);
47
+ const m = 'section' in inside ? outlinePoints(inside.section, seg) : n;
48
+ const end = (open) => (open ? n + m : n - 2 + (m - 2));
49
+ return 2 * (n + m) + end(c.start === 'open') + end(c.end === 'open');
50
+ }
51
+ case 'revolve': {
52
+ const p = shape.revolution.profile;
53
+ /* A taper: a side row and a cap for each end that has a radius; a cone's point has neither. */
54
+ if (p.kind === 'taper')
55
+ return 2 * seg * ((p.startRadius > 0 ? 1 : 0) + (p.endRadius > 0 ? 1 : 0));
32
56
  const h = Math.max(2, Math.round(seg / 2));
33
57
  return 2 * seg * (h - 1);
34
58
  }
35
- case 'roundedBox':
36
- case 'roundedBoxXZ': {
37
- const rounded = Object.entries(shape.dimensions).some(([k, v]) => k.startsWith('round') && v > 0);
38
- return 4 * (rounded ? ROUND_OUTLINE_POINTS : 4) - 4;
39
- }
40
- case 'hollowBox':
41
- case 'hollowBoxXZ': {
42
- const rounded = Object.entries(shape.dimensions).some(([k, v]) => k.startsWith('round') && v > 0);
43
- const outer = rounded ? ROUND_OUTLINE_POINTS : 4;
44
- // A floor of zero means the ring is open at both ends, so no cap is drawn.
45
- const floor = (shape.dimensions['floor'] ?? shape.dimensions['wall'] ?? 0) > 0;
46
- return ring(outer, outer, floor);
47
- }
48
- case 'polygon':
49
- return 4 * (shape.profile?.length ?? 3) - 4;
50
- case 'portal':
51
- // A portal is an extruded outline with an opening: the outer ring and the opening's ring, both capped.
52
- return ring(4, 4, true);
53
- case 'box':
54
59
  default:
55
60
  return 12;
56
61
  }
package/dist/cost.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cost.js","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
package/dist/create.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { compileFigureAsset } from "./asset.js";
2
2
  import { FigureContractError } from "./contract.js";
3
+ import { normalizeFigureSection } from "./section.js";
3
4
  /** New assets start empty. A box is created only by an explicit authoring action. */
4
5
  export function createFigureAsset(name) {
5
6
  const asset = {
@@ -18,27 +19,84 @@ export function createFigureAsset(name) {
18
19
  compileFigureAsset(asset);
19
20
  return asset;
20
21
  }
21
- /** Authoring recipes use existing providers; they introduce no extra evaluation rules. */
22
22
  /** The dimensions that are sizes: never below zero, so a bound can add them up without knowing their values. */
23
23
  const MEASURES = new Set(['width', 'height', 'depth', 'jamb', 'head', 'roundX', 'roundZ', 'wallX', 'wallZ', 'floor', 'radius', 'length', 'round', 'radiusX', 'radiusY', 'radiusZ', 'radiusTop', 'radiusBottom']);
24
+ const RECIPES = {
25
+ box: { op: 'extrude@1',
26
+ params: { axis: 'y', section: 'rectangle' }, keys: ['width', 'height', 'depth'],
27
+ push: 'height',
28
+ args: () => ['width', 'depth']
29
+ },
30
+ cylinder: { op: 'extrude@1',
31
+ params: { axis: 'y', section: 'ellipse' }, keys: ['radius', 'length'],
32
+ push: 'length',
33
+ args: () => ['radius', 'radius']
34
+ },
35
+ 'rounded-box': { op: 'extrude@1',
36
+ params: { axis: 'y', section: 'rectangle', corner: 'round' }, keys: ['width', 'height', 'depth', 'round'],
37
+ push: 'height',
38
+ args: () => ['width', 'depth', 'round', 'round'] },
39
+ 'hollow-box': { op: 'extrude@1',
40
+ params: { axis: 'y', section: 'rectangle', corner: 'round', cavity: 'inside', 'cavity-end': 'open' }, keys: ['width', 'height', 'depth', 'roundX', 'roundZ', 'wallX', 'wallZ', 'floor'],
41
+ push: 'height',
42
+ /* A floor of 0 is a tube: the inside is open at its start too, which is written, not inferred from the number. */
43
+ args: d => [
44
+ 'width',
45
+ 'depth',
46
+ 'roundX',
47
+ 'roundZ',
48
+ 'wallX',
49
+ 'wallX',
50
+ 'wallZ',
51
+ 'wallZ',
52
+ ...(d.floor > 0 ? ['floor'] : [])
53
+ ],
54
+ drop: d => (d.floor > 0 ? [] : ['floor'])
55
+ },
56
+ portal: {
57
+ op: 'extrude@1',
58
+ params: { axis: 'z', section: 'portal' },
59
+ keys: ['width', 'height', 'depth', 'jamb', 'head'],
60
+ push: 'depth',
61
+ args: () => ['width', 'height', 'jamb', 'head']
62
+ },
63
+ sphere: { op: 'revolve@1',
64
+ params: { axis: 'y', profile: 'half-ellipse' }, keys: ['radiusX', 'radiusY', 'radiusZ'],
65
+ args: () => ['radiusX', 'radiusY'],
66
+ drop: () => ['radiusZ']
67
+ },
68
+ frustum: { op: 'revolve@1',
69
+ params: { axis: 'y', profile: 'taper' }, keys: ['radiusTop', 'radiusBottom', 'height'],
70
+ push: 'height',
71
+ args: () => ['radiusBottom', 'radiusTop']
72
+ },
73
+ polygon: { op: 'extrude@1',
74
+ params: { axis: 'y', section: 'polygon' }, keys: ['height'], push: 'height',
75
+ args: () => [] }
76
+ };
77
+ /**
78
+ * Write a part's push: its length is the part's own input, and its start half of that below the origin. Linking the
79
+ * length later routes it through the part's dimension node and takes the start along (stableDimension).
80
+ */
81
+ function pushOf(asset, part, _axis, length) {
82
+ const m = asset.document.model;
83
+ const start = `${part}.start`;
84
+ m.constants.push({ id: `${part}.k.centre`, unit: 'ratio', value: -0.5 });
85
+ m.nodes.push({ id: start, op: 'mul@1', args: [length, `${part}.k.centre`], outputs: { value: `${start}.value` } });
86
+ return [`${start}.value`, length];
87
+ }
24
88
  export function addFigurePrimitive(source, part) {
25
- const recipes = {
26
- box: { op: 'box-shape@1', keys: ['width', 'height', 'depth'] },
27
- cylinder: { op: 'cylinder-shape@1', keys: ['radius', 'length'] },
28
- 'rounded-box': { op: 'rounded-box@1', keys: ['width', 'height', 'depth', 'round'] },
29
- portal: { op: 'portal-profile@2', keys: ['width', 'height', 'depth', 'jamb', 'head'] },
30
- 'hollow-box': { op: 'hollow-box@2', keys: ['width', 'height', 'depth', 'roundX', 'roundZ', 'wallX', 'wallZ', 'floor'] },
31
- sphere: { op: 'sphere-shape@1', keys: ['radiusX', 'radiusY', 'radiusZ'] },
32
- frustum: { op: 'frustum-shape@1', keys: ['radiusTop', 'radiusBottom', 'height'] },
33
- polygon: { op: 'polygon-shape@1', keys: ['height'] }
34
- };
35
- if (!part || !Object.hasOwn(recipes, part.kind))
89
+ if (!part || !Object.hasOwn(RECIPES, part.kind))
36
90
  throw new FigureContractError('PROVIDER', 'part', 'unknown primitive');
37
- const recipe = recipes[part.kind];
91
+ const recipe = RECIPES[part.kind];
38
92
  if (!part.dimensions ||
39
93
  Object.keys(part.dimensions).length !== recipe.keys.length ||
40
94
  recipe.keys.some(k => !Object.hasOwn(part.dimensions, k)))
41
95
  throw new FigureContractError('SCHEMA', part.id, 'provider dimensions must match declared fields');
96
+ const dims = part.dimensions;
97
+ /* A turned body is round about its axis (Q6): a sphere's two radii across are one value. */
98
+ if (part.kind === 'sphere' && dims.radiusX !== dims.radiusZ)
99
+ throw new FigureContractError('GEOMETRY_DOMAIN', part.id, 'a sphere is turned about Y: its X and Z radii are one radius');
42
100
  const asset = addFigureBox(source, {
43
101
  id: part.id,
44
102
  size: { x: 1, y: 1, z: 1 },
@@ -46,20 +104,26 @@ export function addFigurePrimitive(source, part) {
46
104
  ...(part.rotation ? { rotation: part.rotation } : {}),
47
105
  ...(part.material ? { material: part.material } : {})
48
106
  });
49
- const model = asset.document.model, removed = new Set(['x', 'y', 'z'].map(a => part.id + '.size.' + a));
50
- model.inputs = model.inputs.filter(i => !removed.has(i.id));
51
- for (const id of removed)
52
- delete asset.designInputs[id];
107
+ const model = asset.document.model;
108
+ /* The box addFigureBox wrote goes: its inputs, its start and its constant. */
109
+ const boxOwn = new Set([...['x', 'y', 'z'].map(a => `${part.id}.size.${a}`), `${part.id}.start`, `${part.id}.k.centre`]);
110
+ model.inputs = model.inputs.filter(i => !boxOwn.has(i.id));
111
+ model.constants = model.constants.filter(c => !boxOwn.has(c.id));
112
+ model.nodes = model.nodes.filter(n => !boxOwn.has(n.id));
113
+ for (const a of ['x', 'y', 'z'])
114
+ delete asset.designInputs[`${part.id}.size.${a}`];
53
115
  const shape = model.nodes.find(n => n.id === part.id + '.shape');
54
- shape.op = recipe.op;
55
- shape.args = [];
56
116
  const existing = new Set([
57
117
  ...model.inputs.map(i => i.id),
58
118
  ...model.constants.map(c => c.id),
59
119
  ...model.nodes.flatMap(n => [n.id, ...Object.values(n.outputs)])
60
120
  ]);
121
+ const dropped = new Set(recipe.drop?.(dims) ?? []);
122
+ const inputOf = (key) => part.id + '.dimension.' + key;
61
123
  for (const key of recipe.keys) {
62
- const id = part.id + '.dimension.' + key, value = part.dimensions[key];
124
+ if (dropped.has(key))
125
+ continue;
126
+ const id = inputOf(key), value = dims[key];
63
127
  if (existing.has(id))
64
128
  throw new FigureContractError('DUPLICATE_WRITER', id, 'input already exists');
65
129
  if (!Number.isFinite(value))
@@ -70,28 +134,42 @@ export function addFigurePrimitive(source, part) {
70
134
  throw new FigureContractError('SCHEMA', id, `${key} is a size, zero or more`);
71
135
  model.inputs.push({ id, unit: 'mm', min, max: Number.MAX_VALUE, role: 'design' });
72
136
  asset.designInputs[id] = value;
73
- shape.args.push(id);
74
137
  }
75
- /* A polygon's corners are its own numbers too, so a corner can later follow something as a dimension does. */
138
+ const args = recipe.push
139
+ ? pushOf(asset, part.id, recipe.params.axis, inputOf(recipe.push))
140
+ : [];
141
+ args.push(...recipe.args(dims)
142
+ .map(inputOf));
143
+ shape.op = recipe.op;
144
+ shape.params = { frame: shape.params.frame, ...recipe.params };
145
+ /* A drawn section's points are its own numbers too, so a point can later follow something as a dimension does (Q9: p1, p2 ...). */
76
146
  if (part.kind === 'polygon') {
77
- const points = Array.isArray(part.points) ? part.points : [];
78
- if (points.length < 3)
147
+ const raw = Array.isArray(part.points) ? part.points : [];
148
+ if (raw.length < 3)
79
149
  throw new FigureContractError('SCHEMA', part.id, 'a polygon has at least three corners');
80
- points.forEach((point, i) => {
150
+ const drawn = normalizeFigureSection({ kind: 'polygon', points: raw.map((q, i) => ({
151
+ id: `p${i + 1}`, x: q?.x, z: q?.z
152
+ })) }, 'y');
153
+ if (drawn.kind !== 'polygon')
154
+ throw new FigureContractError('SCHEMA', part.id, 'a polygon has corners');
155
+ for (const q of drawn.points)
81
156
  for (const axis of ['x', 'z']) {
82
- const id = `${part.id}.corner.${i}.${axis}`, value = point?.[axis];
157
+ const id = `${part.id}.point.${q.id}.${axis}`, value = q[axis];
83
158
  if (existing.has(id))
84
159
  throw new FigureContractError('DUPLICATE_WRITER', id, 'input already exists');
85
160
  if (typeof value !== 'number' || !Number.isFinite(value))
86
161
  throw new FigureContractError('NON_FINITE', id, 'finite corner required');
87
162
  model.inputs.push({ id, unit: 'mm', min: -Number.MAX_VALUE, max: Number.MAX_VALUE, role: 'design' });
88
163
  asset.designInputs[id] = value;
89
- shape.args.push(id);
164
+ args.push(id);
90
165
  }
91
- });
166
+ shape.params.points = drawn.points.map(q => q.id).join('.');
92
167
  }
93
168
  else if (part.points !== undefined)
94
169
  throw new FigureContractError('SCHEMA', part.id, 'only a polygon has corners');
170
+ if (part.kind === 'hollow-box')
171
+ shape.params['cavity-start'] = dims.floor > 0 ? 'closed' : 'open';
172
+ shape.args = args;
95
173
  if (part.kind === 'cylinder')
96
174
  asset.appearance.find(a => a.target === part.id).segments = 12;
97
175
  if (part.kind === 'sphere' || part.kind === 'frustum')
@@ -124,6 +202,8 @@ export function addFigureBox(source, box) {
124
202
  `${prefix}.pose`,
125
203
  `${prefix}.poseValue`,
126
204
  `${prefix}.placed`,
205
+ `${prefix}.start`,
206
+ `${prefix}.k.centre`,
127
207
  ...keys.map(k => `${prefix}.${k}`)
128
208
  ]);
129
209
  const existing = [
@@ -155,12 +235,13 @@ export function addFigureBox(source, box) {
155
235
  }
156
236
  }
157
237
  const local = `${prefix}.local`;
238
+ const [start, height] = pushOf(asset, prefix, 'y', `${prefix}.size.y`);
158
239
  model.nodes.push({
159
240
  id: `${prefix}.shape`,
160
- op: 'box-shape@1',
161
- args: keys.slice(0, 3).map(k => `${prefix}.${k}`),
241
+ op: 'extrude@1',
242
+ args: [start, height, `${prefix}.size.x`, `${prefix}.size.z`],
162
243
  outputs: { shape: `${prefix}.shapeValue` },
163
- params: { frame: local }
244
+ params: { frame: local, axis: 'y', section: 'rectangle' }
164
245
  }, {
165
246
  id: `${prefix}.pose`,
166
247
  op: 'rigid@1',