abstract-3d 4.1.6 → 4.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 (60) hide show
  1. package/lib/abstract-3d.d.ts +63 -6
  2. package/lib/abstract-3d.d.ts.map +1 -1
  3. package/lib/abstract-3d.js +277 -74
  4. package/lib/abstract-3d.js.map +1 -1
  5. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.d.ts +2 -2
  6. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.d.ts.map +1 -1
  7. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.js +6 -6
  8. package/lib/renderers/dxf/dxf-encoding/dxf-dimension.js.map +1 -1
  9. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.d.ts +2 -2
  10. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.d.ts.map +1 -1
  11. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.js +3 -3
  12. package/lib/renderers/dxf/dxf-geometries/dxf-dimension.js.map +1 -1
  13. package/lib/renderers/dxf/dxf.d.ts.map +1 -1
  14. package/lib/renderers/dxf/dxf.js +12 -8
  15. package/lib/renderers/dxf/dxf.js.map +1 -1
  16. package/lib/renderers/ifc/ifc.d.ts.map +1 -1
  17. package/lib/renderers/ifc/ifc.js +5 -3
  18. package/lib/renderers/ifc/ifc.js.map +1 -1
  19. package/lib/renderers/step/step.d.ts.map +1 -1
  20. package/lib/renderers/step/step.js +3 -2
  21. package/lib/renderers/step/step.js.map +1 -1
  22. package/lib/renderers/stl/stl.d.ts.map +1 -1
  23. package/lib/renderers/stl/stl.js +7 -3
  24. package/lib/renderers/stl/stl.js.map +1 -1
  25. package/lib/renderers/svg/svg-geometries/svg-text.d.ts +1 -1
  26. package/lib/renderers/svg/svg-geometries/svg-text.d.ts.map +1 -1
  27. package/lib/renderers/svg/svg-geometries/svg-text.js +2 -2
  28. package/lib/renderers/svg/svg-geometries/svg-text.js.map +1 -1
  29. package/lib/renderers/svg/svg.d.ts.map +1 -1
  30. package/lib/renderers/svg/svg.js +13 -10
  31. package/lib/renderers/svg/svg.js.map +1 -1
  32. package/lib/renderers/svg-bsp/svg-geometries/svg-text.d.ts +1 -1
  33. package/lib/renderers/svg-bsp/svg-geometries/svg-text.d.ts.map +1 -1
  34. package/lib/renderers/svg-bsp/svg-geometries/svg-text.js +2 -2
  35. package/lib/renderers/svg-bsp/svg-geometries/svg-text.js.map +1 -1
  36. package/lib/renderers/svg-bsp/svg.d.ts.map +1 -1
  37. package/lib/renderers/svg-bsp/svg.js +13 -10
  38. package/lib/renderers/svg-bsp/svg.js.map +1 -1
  39. package/lib/renderers/three/build/build.js +1 -1
  40. package/lib/renderers/three/build/build.js.map +1 -1
  41. package/lib/renderers/three/compile/compile.d.ts +2 -0
  42. package/lib/renderers/three/compile/compile.d.ts.map +1 -1
  43. package/lib/renderers/three/compile/compile.js +6 -4
  44. package/lib/renderers/three/compile/compile.js.map +1 -1
  45. package/package.json +1 -1
  46. package/src/abstract-3d.test.ts +254 -0
  47. package/src/abstract-3d.ts +427 -85
  48. package/src/renderers/dxf/dxf-encoding/dxf-dimension.ts +22 -2
  49. package/src/renderers/dxf/dxf-geometries/dxf-dimension.ts +12 -2
  50. package/src/renderers/dxf/dxf.ts +21 -4
  51. package/src/renderers/ifc/ifc.ts +16 -3
  52. package/src/renderers/step/step.ts +3 -2
  53. package/src/renderers/stl/stl.ts +12 -4
  54. package/src/renderers/svg/svg-geometries/svg-text.ts +3 -2
  55. package/src/renderers/svg/svg.ts +29 -9
  56. package/src/renderers/svg-bsp/svg-geometries/svg-text.ts +3 -2
  57. package/src/renderers/svg-bsp/svg.ts +29 -9
  58. package/src/renderers/three/build/build.test.ts +2 -2
  59. package/src/renderers/three/build/build.ts +1 -1
  60. package/src/renderers/three/compile/compile.ts +22 -4
@@ -1 +1 @@
1
- {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../../src/renderers/three/compile/compile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../../src/renderers/three/compile/compile.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abstract-3d",
3
- "version": "4.1.6",
3
+ "version": "4.2.1",
4
4
  "gitHead": "17921b59da5eee6cc446fd37a2134165af4d1901",
5
5
  "description": "Abstract 3D",
6
6
  "license": "MIT",
@@ -0,0 +1,254 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import type { DimensionAligned, Mesh } from "./abstract-3d.js";
3
+ import {
4
+ alignedDimension,
5
+ box,
6
+ dimensionConvertToTypeMesh,
7
+ dimensionPlacements,
8
+ group,
9
+ groupTextBackgrounds,
10
+ sceneTextHeight,
11
+ text,
12
+ textHeightForSize,
13
+ textSize,
14
+ vec2,
15
+ vec3,
16
+ vec3Zero,
17
+ } from "./abstract-3d.js";
18
+ import { render } from "./renderers/svg/svg.js";
19
+
20
+ const material = { normal: "rgb(0,0,0)" };
21
+
22
+ describe("textHeightForSize", () => {
23
+ it("is 32 up to the base size, then a 2^¼ step for each 2^¼ the longest side is past it, rounded up", () => {
24
+ expect([1000, 3600, 3601, 3600 * 2 ** (1 / 4), 7200, 7201, 9000, 14400].map((x) => textHeightForSize(vec3(x, 500, 500)))).toEqual([
25
+ 32,
26
+ 32,
27
+ expect.closeTo(32 * 2 ** (1 / 4)),
28
+ expect.closeTo(32 * 2 ** (1 / 4)),
29
+ expect.closeTo(64),
30
+ expect.closeTo(64 * 2 ** (1 / 4)),
31
+ // 2.5 is 5.3 steps, rounded up to 6
32
+ expect.closeTo(32 * 2 ** (6 / 4)),
33
+ expect.closeTo(128),
34
+ ]);
35
+ expect(textHeightForSize(vec3(500, 500, 7200))).toBeCloseTo(64);
36
+ });
37
+ });
38
+
39
+ describe("sceneTextHeight", () => {
40
+ it("is for the size of the scene's objects, without its texts", () => {
41
+ const unit = group([box(vec3(7200, 1000, 1000), material)]);
42
+ expect(sceneTextHeight([unit])).toBeCloseTo(64);
43
+ // A text far off, as a title, doesn't make the scene larger
44
+ expect(sceneTextHeight([unit, group([text(vec3(20000, 0, 0), "title", 500, material)])])).toBeCloseTo(64);
45
+ expect(sceneTextHeight([])).toBe(32);
46
+ });
47
+
48
+ it("sizes the texts without a font size and the dimensions in the svg", () => {
49
+ const image = render(
50
+ {
51
+ size_deprecated: vec3(8200, 2000, 1000),
52
+ groups: [group([box(vec3(7200, 1000, 1000), material), text(vec3(0, 0, 600), "label", undefined, material)])],
53
+ dimensions_deprecated: { dimensions: [dim(-3000, 3000, -600)], material },
54
+ },
55
+ { view: "front" }
56
+ ).image;
57
+ expect([...image.matchAll(/font-size="([\d.]+)px"/g)].map((m) => Number(m[1]))).toEqual([expect.closeTo(64), expect.closeTo(64)]);
58
+ });
59
+ });
60
+
61
+ describe("groupTextBackgrounds", () => {
62
+ const background = { padding: 30, outline: 10, depth: 0.2, material, outlineMaterial: material } as const;
63
+
64
+ it("draws a text's rectangle background behind it, padded past the text at its font size", () => {
65
+ const g = groupTextBackgrounds(group([text(vec3(100, 0, 0), "ab", 16, material, vec3Zero, { ...background, shape: "rectangle" })]), 44);
66
+ const backgroundGroup = g.groups?.at(0);
67
+ expect(backgroundGroup?.pos).toEqual(vec3(100, 0, 0));
68
+ // The fill inside the outline, then its four sides
69
+ expect(backgroundGroup?.meshes?.map((m) => m.geometry.type)).toEqual(["Plane", "Box", "Box", "Box", "Box"]);
70
+ expect(backgroundGroup?.meshes?.at(0)?.geometry).toMatchObject({ size: vec2(2 * 9 + 60 - 20, 16 * 1.2 + 60 - 20), pos: vec3(0, 0, -0.2) });
71
+ });
72
+
73
+ it("draws a circle background around the text, sized by the text height without a font size", () => {
74
+ const g = groupTextBackgrounds(
75
+ group([], vec3Zero, vec3Zero, [group([text(vec3Zero, "ab", undefined, material, vec3Zero, { ...background, shape: "circle" })])]),
76
+ 88
77
+ );
78
+ // The background of the text in the child group, in a group of the child's own
79
+ const backgroundGroup = g.groups?.at(0)?.groups?.at(0);
80
+ // Half the padded text's larger side, its height
81
+ const radius = (88 * 1.2 + 60) / 2;
82
+ expect(backgroundGroup?.meshes?.map((m) => m.geometry)).toMatchObject([
83
+ { type: "Cylinder", radius: radius - 10 },
84
+ { type: "Cylinder", radius },
85
+ ]);
86
+ });
87
+
88
+ it("leaves a group without backgrounds as it is", () => {
89
+ const g = group([text(vec3Zero, "ab", 16, material)]);
90
+ expect(groupTextBackgrounds({ ...g, groups: undefined }, 44)).toEqual({ ...g, groups: undefined });
91
+ });
92
+ });
93
+
94
+ describe("textSize", () => {
95
+ it("measures the widest row and the rows", () => {
96
+ expect(textSize("ab\nabcd", 16)).toEqual(vec2(4 * 9, 2 * 16 * 1.2));
97
+ });
98
+ });
99
+
100
+ // A dimension along x measured from `from` to `to`, its line at y, 110 and 220 out as products' rows
101
+ const dim = (from: number, to: number, y = -110): DimensionAligned =>
102
+ alignedDimension(vec3(from, 0, 0), vec3(to, 0, 0), vec3(0, y, 0), `${Math.abs(to - from)}`, ["front"]);
103
+
104
+ const centred = { inward: false } as const;
105
+ const geometries = (dims: ReadonlyArray<DimensionAligned>, i: number, textHeight?: number): ReadonlyArray<Mesh["geometry"]> =>
106
+ dimensionConvertToTypeMesh(dims[i] ?? dim(0, 0), vec3Zero, undefined, textHeight, dimensionPlacements(dims, textHeight)[i]).meshes.map(
107
+ (m) => m.geometry
108
+ );
109
+
110
+ // A run of neighbours `width` wide, `gap` apart, between a 1000 and the rest of 2000
111
+ const run = (width: number, count: number, gap: number): ReadonlyArray<DimensionAligned> => [
112
+ dim(0, 1000),
113
+ ...Array.from({ length: count }, (_, i) => dim(1000 + gap + i * (width + gap), 1000 + gap + i * (width + gap) + width)),
114
+ dim(1000 + gap + count * (width + gap), 2000),
115
+ ];
116
+
117
+ describe("dimensionPlacements", () => {
118
+ it("draws the text a gap out from the line, out from the dimension's middle, extension lines to marks across the line at its ends and arrows inside them", () => {
119
+ expect(dimensionPlacements([dim(0, 1000)])).toEqual([expect.objectContaining({ text: centred })]);
120
+ // Extension lines from the measured points to marks 10 to each side of the line, arrows 22.5 long pointing at them, the text a gap of 8 and half the
121
+ // text height of 44 out from it
122
+ expect(geometries([dim(0, 1000)], 0)).toEqual([
123
+ expect.objectContaining({ type: "CulledLine", start: vec3(0, 0, 0), end: vec3(0, -100, 0) }),
124
+ expect.objectContaining({ type: "CulledLine", start: vec3(0, -100, 0), end: vec3(0, -120, 0) }),
125
+ expect.objectContaining({ type: "CulledLine", start: vec3(1000, 0, 0), end: vec3(1000, -100, 0) }),
126
+ expect.objectContaining({ type: "CulledLine", start: vec3(1000, -100, 0), end: vec3(1000, -120, 0) }),
127
+ expect.objectContaining({ type: "CulledLine", start: vec3(0, -110, 0), end: vec3(1000, -110, 0) }),
128
+ expect.objectContaining({
129
+ type: "Polygon",
130
+ points: expect.arrayContaining([
131
+ vec3(0, -110, 0),
132
+ vec3(44 * (22.5 / 44), -110 + 44 * (5.625 / 44), 0),
133
+ vec3(44 * (22.5 / 44), -110 - 44 * (5.625 / 44), 0),
134
+ ]),
135
+ }),
136
+ expect.objectContaining({
137
+ type: "Polygon",
138
+ points: expect.arrayContaining([
139
+ vec3(1000, -110, 0),
140
+ vec3(1000 - 44 * (22.5 / 44), -110 + 44 * (5.625 / 44), 0),
141
+ vec3(1000 - 44 * (22.5 / 44), -110 - 44 * (5.625 / 44), 0),
142
+ ]),
143
+ }),
144
+ expect.objectContaining({ type: "Text", pos: vec3(500, -140, 0) }),
145
+ ]);
146
+ });
147
+
148
+ it("leaves the arrows out where they don't both fit with a gap between them", () => {
149
+ // Two arrows of 22.5 and a gap of 8
150
+ expect(geometries([dim(0, 53)], 0).map((g) => g.type)).toContain("Polygon");
151
+ expect(geometries([dim(0, 52)], 0).map((g) => g.type)).not.toContain("Polygon");
152
+ });
153
+
154
+ it("draws the first row of a text of several over the line, as the text reads, and the rest under it, 1.2 text heights apart", () => {
155
+ const texts = geometries([alignedDimension(vec3Zero, vec3(1000, 0, 0), vec3(0, -200, 0), "1000\nkg\n10 kg", ["front"])], 0).flatMap((g) =>
156
+ g.type === "Text" ? [[g.text, g.pos.y]] : []
157
+ );
158
+ expect(texts).toEqual([
159
+ ["1000", expect.closeTo(-200 + 8 + 22)],
160
+ ["kg", expect.closeTo(-200 - 8 - 22)],
161
+ ["10 kg", expect.closeTo(-200 - 8 - 22 - 1.2 * 44)],
162
+ ]);
163
+ });
164
+
165
+ it("leaves the room a text of several rows takes on both sides of the line", () => {
166
+ // The outer line moved out past the inner line's text and a gap, and a gap and its text's two rows under the line, on the inner line's side too
167
+ const dims = [dim(0, 1000), alignedDimension(vec3Zero, vec3(1000, 0, 0), vec3(0, -150, 0), "1000\nkg\n10 kg", ["front"])];
168
+ expect(dimensionPlacements(dims).map((p) => p?.linePosition.y)).toEqual([-110, expect.closeTo(-(110 + 8 + 44 + 8 + 8 + 44 + 1.2 * 44))]);
169
+ });
170
+
171
+ it("lets a text wider than its dimension overhang it where nothing's in the way", () => {
172
+ expect(dimensionPlacements([dim(0, 1000), dim(1000, 1040), dim(1040, 2000)]).map((p) => p?.text)).toEqual([centred, centred, centred]);
173
+ });
174
+
175
+ it("draws a text on the other side of the line, towards the measured points, where a neighbour's is in the way", () => {
176
+ // The 40's text out from its middle would be within two gaps of the 100's
177
+ expect(dimensionPlacements([dim(0, 100), dim(100, 140), dim(140, 1000)]).map((p) => p?.text)).toEqual([centred, { inward: true }, centred]);
178
+ });
179
+
180
+ it("breaks an extension line half a gap short of a text it'd cross", () => {
181
+ // The 40's text, from 58 to 102 out, crosses the 100's extension line at 100
182
+ expect(dimensionPlacements([dim(0, 100), dim(100, 140), dim(140, 1000)])[0]?.endLines).toEqual([
183
+ [vec3(0, 0, 0), vec3(0, -100, 0)],
184
+ [vec3(0, -100, 0), vec3(0, -120, 0)],
185
+ [vec3(100, 0, 0), vec3(100, -54, 0)],
186
+ [vec3(100, -100, 0), vec3(100, -120, 0)],
187
+ ]);
188
+ });
189
+
190
+ it("alternates the texts of neighbours too narrow for them across the line, moving it out for the texts towards the measured points", () => {
191
+ const dims = run(30, 4, 10).map((d) => ({ ...d, linePosition: vec3(0, -50, 0) }));
192
+ const placements = dimensionPlacements(dims);
193
+ expect(placements.slice(1, 5).map((p) => p?.text.inward)).toEqual([false, true, false, true]);
194
+ // A gap and the text height past the measured points, and a gap
195
+ expect(placements.map((p) => p?.linePosition.y)).toEqual(dims.map(() => -(8 + 44 + 8)));
196
+ expect(geometries(dims, 2)).toContainEqual(expect.objectContaining({ type: "Text", pos: vec3(1065, -60 + 8 + 22, 0) }));
197
+ });
198
+
199
+ it("alternates the texts even where every other one's still clash, rather than two neighbours' on one side", () => {
200
+ // Four 30s at the text height 128, each text far wider than two of them
201
+ expect(dimensionPlacements([dim(0, 30, -300), dim(30, 60, -300), dim(60, 90, -300), dim(90, 120, -300)], 128).map((p) => p?.text.inward)).toEqual(
202
+ [false, true, false, true]
203
+ );
204
+ });
205
+
206
+ it("keeps the text of a dimension at the end of a line out from it, with room past it, its neighbour's on the other side instead", () => {
207
+ expect(dimensionPlacements([dim(0, 1000), dim(1000, 1040), dim(1040, 1080)]).map((p) => p?.text.inward)).toEqual([false, true, false]);
208
+ expect(dimensionPlacements([dim(0, 40), dim(40, 80), dim(80, 1000)]).map((p) => p?.text.inward)).toEqual([false, true, false]);
209
+ });
210
+
211
+ it("draws each dimension with its own text, where neighbours are too crowded for their texts on either side of the line too", () => {
212
+ const dims = run(10, 6, 0);
213
+ expect(dims.map((_, i) => geometries(dims, i).flatMap((g) => (g.type === "Text" ? [g.text] : [])))).toEqual(
214
+ ["1000", "10", "10", "10", "10", "10", "10", "940"].map((t) => [t])
215
+ );
216
+ });
217
+
218
+ it("moves a line out past the texts of the line inside it, a gap and its marks, and leaves it where there's room", () => {
219
+ expect(dimensionPlacements([dim(0, 1000), dim(0, 1000, -150), dim(0, 2000, -400)]).map((p) => p?.linePosition.y)).toEqual([
220
+ -110,
221
+ -(110 + 8 + 44 + 8 + 10),
222
+ -400,
223
+ ]);
224
+ });
225
+
226
+ it("leaves the dimensions on another line out", () => {
227
+ expect(dimensionPlacements([dim(0, 1200), dim(1200, 1240, -220)]).map((p) => p?.text)).toEqual([centred, centred]);
228
+ });
229
+
230
+ it("bounds what a dimension draws, from its extension lines to its text's outer edge", () => {
231
+ expect(dimensionPlacements([dim(0, 1000)])[0]?.bounds).toEqual({ min: vec3(0, -110 - 8 - 44, 0), max: vec3(1000, 0, 0) });
232
+ // The text past the dimension's ends
233
+ expect(dimensionPlacements([dim(0, 20)])[0]?.bounds.min.x).toBeCloseTo(10 - (2 * (9 / 16) * 44) / 2);
234
+ });
235
+
236
+ it("sizes the text, gaps and marks by the text height", () => {
237
+ expect(geometries([dim(0, 1000)], 0, 88)).toEqual([
238
+ expect.objectContaining({ start: vec3(0, 0, 0), end: vec3(0, -90, 0) }),
239
+ expect.objectContaining({ start: vec3(0, -90, 0), end: vec3(0, -130, 0) }),
240
+ expect.anything(),
241
+ expect.anything(),
242
+ expect.anything(),
243
+ expect.objectContaining({ type: "Polygon", points: expect.arrayContaining([vec3(88 * (22.5 / 44), -110 + 88 * (5.625 / 44), 0)]) }),
244
+ expect.anything(),
245
+ expect.objectContaining({ type: "Text", fontSize: 88, pos: vec3(500, -110 - 16 - 44, 0) }),
246
+ ]);
247
+ });
248
+
249
+ it("draws the dimension at its moved line", () => {
250
+ expect(geometries([dim(0, 1000), dim(0, 2000, -150)], 1)).toContainEqual(
251
+ expect.objectContaining({ type: "Text", pos: vec3(1000, -180 - 8 - 22, 0) })
252
+ );
253
+ });
254
+ });