@danielsimonjr/sciengjs 0.7.0 → 0.8.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.
@@ -0,0 +1,300 @@
1
+ import { RenderError } from "../errors.js";
2
+ /** The default number of segments of a full circle. */
3
+ export const DEFAULT_SEGMENTS = 32;
4
+ /** The range of a segments value. */
5
+ export const MIN_SEGMENTS = 3;
6
+ export const MAX_SEGMENTS = 1024;
7
+ const STYLE_KEYS = ["type", "name", "color"];
8
+ /** The keys of each node type, after the style keys. */
9
+ const NODE_KEYS = {
10
+ cube: ["size", "center"],
11
+ cylinder: ["height", "radius", "radius1", "radius2", "center", "segments"],
12
+ sphere: ["radius", "segments"],
13
+ polyhedron: ["points", "faces"],
14
+ rectangle: ["size", "center"],
15
+ circle: ["radius", "segments"],
16
+ polygon: ["points"],
17
+ extrude: ["height", "child", "twist", "scale", "divisions", "center"],
18
+ revolve: ["child", "degrees", "segments"],
19
+ union: ["children"],
20
+ difference: ["children"],
21
+ intersection: ["children"],
22
+ translate: ["offset", "child"],
23
+ rotate: ["angles", "child"],
24
+ scale: ["factor", "child"],
25
+ mirror: ["normal", "child"],
26
+ };
27
+ const PROFILE_TYPES = ["rectangle", "circle", "polygon"];
28
+ /** The largest number of extrude divisions. */
29
+ const MAX_DIVISIONS = 1024;
30
+ const fail = (path, why) => {
31
+ throw new RenderError("E_INPUT", `${path} ${why}`);
32
+ };
33
+ function isObject(value) {
34
+ return typeof value === "object" && value !== null && !Array.isArray(value);
35
+ }
36
+ function finite(value, path) {
37
+ if (typeof value !== "number" || !Number.isFinite(value))
38
+ return fail(path, "must be a finite number");
39
+ return value;
40
+ }
41
+ function positive(value, path) {
42
+ const n = finite(value, path);
43
+ if (n <= 0)
44
+ fail(path, "must be greater than 0");
45
+ return n;
46
+ }
47
+ function nonNegative(value, path) {
48
+ const n = finite(value, path);
49
+ if (n < 0)
50
+ fail(path, "must not be negative");
51
+ return n;
52
+ }
53
+ function vector(value, length, path, check = finite) {
54
+ if (!Array.isArray(value) || value.length !== length)
55
+ return fail(path, `must be a list of ${length} numbers`);
56
+ return value.map((v, i) => check(v, `${path}[${i}]`));
57
+ }
58
+ function sizeOf(value, length, path) {
59
+ if (typeof value === "number")
60
+ positive(value, path);
61
+ else
62
+ vector(value, length, path, positive);
63
+ }
64
+ function bool(value, path) {
65
+ if (typeof value !== "boolean")
66
+ fail(path, "must be true or false");
67
+ }
68
+ function segmentsOf(value, path) {
69
+ const n = finite(value, path);
70
+ if (!Number.isInteger(n) || n < MIN_SEGMENTS || n > MAX_SEGMENTS) {
71
+ fail(path, `must be a whole number from ${MIN_SEGMENTS} to ${MAX_SEGMENTS}`);
72
+ }
73
+ return n;
74
+ }
75
+ function list(value, path, min) {
76
+ if (!Array.isArray(value) || value.length < min)
77
+ return fail(path, `must be a list of ${min} or more items`);
78
+ return value;
79
+ }
80
+ function countNode(walk) {
81
+ walk.nodes += 1;
82
+ if (walk.nodes > walk.limits.maxNodes) {
83
+ throw new RenderError("E_LIMIT", `the document has more than ${walk.limits.maxNodes} nodes`);
84
+ }
85
+ }
86
+ function addFacets(walk, facets) {
87
+ walk.facets += facets;
88
+ if (walk.facets > walk.limits.maxFacets) {
89
+ throw new RenderError("E_LIMIT", `the model needs more than ${walk.limits.maxFacets} facets`);
90
+ }
91
+ }
92
+ /** The facets of a sphere: the engine refines an octahedron, so the segments round up to a multiple of 4. */
93
+ export function sphereFacets(segments) {
94
+ const k = Math.ceil(segments / 4);
95
+ return 8 * k * k;
96
+ }
97
+ function checkStyle(node, path) {
98
+ if (node.name !== undefined && typeof node.name !== "string")
99
+ fail(`${path}.name`, "must be a string");
100
+ if (node.color !== undefined) {
101
+ vector(node.color, 3, `${path}.color`, (v, p) => {
102
+ const n = finite(v, p);
103
+ if (n < 0 || n > 1)
104
+ fail(p, "must be from 0 to 1");
105
+ return n;
106
+ });
107
+ }
108
+ }
109
+ function checkKeys(node, type, path) {
110
+ const allowed = [...STYLE_KEYS, ...NODE_KEYS[type]];
111
+ for (const key of Object.keys(node)) {
112
+ if (!allowed.includes(key))
113
+ fail(`${path}.${key}`, `is not a key of ${type}`);
114
+ }
115
+ }
116
+ function required(node, key, path) {
117
+ if (node[key] === undefined)
118
+ fail(`${path}.${key}`, "is missing");
119
+ return node[key];
120
+ }
121
+ function nodeSegments(node, path, walk) {
122
+ return node.segments === undefined ? walk.segments : segmentsOf(node.segments, `${path}.segments`);
123
+ }
124
+ /** Checks one profile and returns its number of edges. */
125
+ function checkProfile(value, path, walk) {
126
+ if (!isObject(value))
127
+ return fail(path, "must be an object");
128
+ const type = value.type;
129
+ if (typeof type !== "string" || !PROFILE_TYPES.includes(type)) {
130
+ return fail(`${path}.type`, "must be a 2D profile: rectangle, circle or polygon");
131
+ }
132
+ countNode(walk);
133
+ checkKeys(value, type, path);
134
+ checkStyle(value, path);
135
+ switch (type) {
136
+ case "rectangle":
137
+ sizeOf(required(value, "size", path), 2, `${path}.size`);
138
+ if (value.center !== undefined)
139
+ bool(value.center, `${path}.center`);
140
+ return 4;
141
+ case "circle":
142
+ positive(required(value, "radius", path), `${path}.radius`);
143
+ return nodeSegments(value, path, walk);
144
+ default: {
145
+ const points = list(required(value, "points", path), `${path}.points`, 3);
146
+ points.forEach((p, i) => vector(p, 2, `${path}.points[${i}]`));
147
+ return points.length;
148
+ }
149
+ }
150
+ }
151
+ /** Checks one 3D node and its subtree. */
152
+ function checkSolid(value, path, walk) {
153
+ if (!isObject(value))
154
+ return fail(path, "must be an object");
155
+ const type = value.type;
156
+ if (typeof type !== "string" || !Object.hasOwn(NODE_KEYS, type))
157
+ return fail(`${path}.type`, "is not a node type");
158
+ if (PROFILE_TYPES.includes(type))
159
+ return fail(`${path}.type`, `${type} is a 2D profile; use it as the child of extrude or revolve`);
160
+ countNode(walk);
161
+ checkKeys(value, type, path);
162
+ checkStyle(value, path);
163
+ const childOf = () => checkSolid(required(value, "child", path), `${path}.child`, walk);
164
+ switch (type) {
165
+ case "cube":
166
+ sizeOf(required(value, "size", path), 3, `${path}.size`);
167
+ if (value.center !== undefined)
168
+ bool(value.center, `${path}.center`);
169
+ addFacets(walk, 12);
170
+ return;
171
+ case "cylinder": {
172
+ positive(required(value, "height", path), `${path}.height`);
173
+ if (value.radius !== undefined) {
174
+ if (value.radius1 !== undefined || value.radius2 !== undefined)
175
+ fail(`${path}.radius`, "excludes radius1 and radius2");
176
+ positive(value.radius, `${path}.radius`);
177
+ }
178
+ else {
179
+ const r1 = nonNegative(required(value, "radius1", path), `${path}.radius1`);
180
+ const r2 = nonNegative(required(value, "radius2", path), `${path}.radius2`);
181
+ if (r1 === 0 && r2 === 0)
182
+ fail(`${path}.radius1`, "and radius2 must not both be 0");
183
+ }
184
+ if (value.center !== undefined)
185
+ bool(value.center, `${path}.center`);
186
+ addFacets(walk, 4 * nodeSegments(value, path, walk));
187
+ return;
188
+ }
189
+ case "sphere":
190
+ positive(required(value, "radius", path), `${path}.radius`);
191
+ addFacets(walk, sphereFacets(nodeSegments(value, path, walk)));
192
+ return;
193
+ case "polyhedron": {
194
+ const points = list(required(value, "points", path), `${path}.points`, 4);
195
+ points.forEach((p, i) => vector(p, 3, `${path}.points[${i}]`));
196
+ const faces = list(required(value, "faces", path), `${path}.faces`, 4);
197
+ let facets = 0;
198
+ faces.forEach((f, i) => {
199
+ const face = list(f, `${path}.faces[${i}]`, 3);
200
+ face.forEach((v, j) => {
201
+ if (!Number.isInteger(v) || v < 0 || v >= points.length) {
202
+ fail(`${path}.faces[${i}][${j}]`, `must be a point index from 0 to ${points.length - 1}`);
203
+ }
204
+ });
205
+ facets += face.length - 2;
206
+ });
207
+ addFacets(walk, facets);
208
+ return;
209
+ }
210
+ case "extrude": {
211
+ positive(required(value, "height", path), `${path}.height`);
212
+ if (value.twist !== undefined)
213
+ finite(value.twist, `${path}.twist`);
214
+ if (value.scale !== undefined) {
215
+ if (typeof value.scale === "number")
216
+ nonNegative(value.scale, `${path}.scale`);
217
+ else
218
+ vector(value.scale, 2, `${path}.scale`, nonNegative);
219
+ }
220
+ let divisions = 0;
221
+ if (value.divisions !== undefined) {
222
+ divisions = finite(value.divisions, `${path}.divisions`);
223
+ if (!Number.isInteger(divisions) || divisions < 0 || divisions > MAX_DIVISIONS) {
224
+ fail(`${path}.divisions`, `must be a whole number from 0 to ${MAX_DIVISIONS}`);
225
+ }
226
+ }
227
+ if (value.center !== undefined)
228
+ bool(value.center, `${path}.center`);
229
+ const edges = checkProfile(required(value, "child", path), `${path}.child`, walk);
230
+ addFacets(walk, 2 * edges * (divisions + 1) + 2 * edges);
231
+ return;
232
+ }
233
+ case "revolve": {
234
+ if (value.degrees !== undefined) {
235
+ const d = positive(value.degrees, `${path}.degrees`);
236
+ if (d > 360)
237
+ fail(`${path}.degrees`, "must not be more than 360");
238
+ }
239
+ const segments = nodeSegments(value, path, walk);
240
+ const edges = checkProfile(required(value, "child", path), `${path}.child`, walk);
241
+ addFacets(walk, 2 * edges * segments + 2 * edges);
242
+ return;
243
+ }
244
+ case "union":
245
+ case "difference":
246
+ case "intersection": {
247
+ const children = list(required(value, "children", path), `${path}.children`, 1);
248
+ children.forEach((c, i) => checkSolid(c, `${path}.children[${i}]`, walk));
249
+ return;
250
+ }
251
+ case "translate":
252
+ vector(required(value, "offset", path), 3, `${path}.offset`);
253
+ return childOf();
254
+ case "rotate":
255
+ vector(required(value, "angles", path), 3, `${path}.angles`);
256
+ return childOf();
257
+ case "scale": {
258
+ const factor = required(value, "factor", path);
259
+ if (typeof factor === "number")
260
+ positive(factor, `${path}.factor`);
261
+ else
262
+ vector(factor, 3, `${path}.factor`, positive);
263
+ return childOf();
264
+ }
265
+ default: {
266
+ const n = vector(required(value, "normal", path), 3, `${path}.normal`);
267
+ if (n.every((c) => c === 0))
268
+ fail(`${path}.normal`, "must not be the zero vector");
269
+ return childOf();
270
+ }
271
+ }
272
+ }
273
+ /** Checks a parsed document. The function rejects with E_INPUT on a bad value and with E_LIMIT over a limit. */
274
+ export function checkCadDocument(value, limits) {
275
+ if (!isObject(value))
276
+ return fail("document", "must be an object");
277
+ for (const key of Object.keys(value)) {
278
+ if (!["version", "model", "segments"].includes(key))
279
+ fail(key, "is not a key of the document");
280
+ }
281
+ if (value.version !== 1)
282
+ fail("version", "must be 1");
283
+ const walk = { nodes: 0, facets: 0, limits, segments: DEFAULT_SEGMENTS };
284
+ if (value.segments !== undefined)
285
+ walk.segments = segmentsOf(value.segments, "segments");
286
+ checkSolid(required(value, "model", "document"), "model", walk);
287
+ return { document: value, nodes: walk.nodes, facetEstimate: walk.facets };
288
+ }
289
+ /** Parses and checks the JSON text of a CAD document. Text that is not JSON rejects with E_INPUT. */
290
+ export function parseCadDocument(text, limits) {
291
+ let value;
292
+ try {
293
+ value = JSON.parse(text);
294
+ }
295
+ catch (error) {
296
+ throw new RenderError("E_INPUT", `the CAD document is not JSON: ${error instanceof Error ? error.message : String(error)}`);
297
+ }
298
+ return checkCadDocument(value, limits);
299
+ }
300
+ //# sourceMappingURL=cad-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cad-document.js","sourceRoot":"","sources":["../../src/mesh/cad-document.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
- /** The mesh stage: STEP, IGES and BREP through occt-import-js, and the glTF binary writer. */
1
+ /** The mesh stage: STEP, IGES and BREP through occt-import-js, CAD documents through manifold-3d, and the glTF and STL writers. */
2
2
  export { readCad } from "./read.ts";
3
3
  export type { CadFormat, CadFace, CadMesh, LinearUnit } from "./read.ts";
4
4
  export { writeGlb } from "./glb.ts";
5
5
  export { readMeshOptions } from "./backend-glb.ts";
6
+ export { writeStl } from "./stl.ts";
7
+ export { checkCadDocument, parseCadDocument, DEFAULT_SEGMENTS, MAX_SEGMENTS, MIN_SEGMENTS } from "./cad-document.ts";
8
+ export type * from "./cad-document.ts";
9
+ export { buildCad } from "./cad-build.ts";
10
+ export type { CadBuildResult } from "./cad-build.ts";
11
+ export * as cad from "./cad-builder.ts";
@@ -1,5 +1,9 @@
1
- /** The mesh stage: STEP, IGES and BREP through occt-import-js, and the glTF binary writer. */
1
+ /** The mesh stage: STEP, IGES and BREP through occt-import-js, CAD documents through manifold-3d, and the glTF and STL writers. */
2
2
  export { readCad } from "./read.js";
3
3
  export { writeGlb } from "./glb.js";
4
4
  export { readMeshOptions } from "./backend-glb.js";
5
+ export { writeStl } from "./stl.js";
6
+ export { checkCadDocument, parseCadDocument, DEFAULT_SEGMENTS, MAX_SEGMENTS, MIN_SEGMENTS } from "./cad-document.js";
7
+ export { buildCad } from "./cad-build.js";
8
+ export * as cad from "./cad-builder.js";
5
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"AAAA,mIAAmI;AACnI,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAErH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { CadMesh } from "./read.ts";
2
+ /** The number of facets of the meshes. */
3
+ export declare function stlFacetCount(meshes: CadMesh[]): number;
4
+ /** The size of the binary STL file of the meshes, in bytes. */
5
+ export declare function stlByteLength(meshes: CadMesh[]): number;
6
+ /**
7
+ * Writes the meshes as one binary STL file, little-endian. Each facet normal comes from the vertices of the facet
8
+ * (right-hand rule). STL holds no colour and no name, so the writer drops them.
9
+ */
10
+ export declare function writeStl(meshes: CadMesh[]): Uint8Array;
@@ -0,0 +1,49 @@
1
+ /** The bytes of the STL header. */
2
+ const HEADER_BYTES = 80;
3
+ /** The bytes of one facet: a normal, three vertices (12 floats) and an attribute word. */
4
+ const FACET_BYTES = 50;
5
+ /** The text of the STL header. A binary STL header must not start with "solid". */
6
+ const HEADER_TEXT = "binary STL from sciengjs";
7
+ /** The number of facets of the meshes. */
8
+ export function stlFacetCount(meshes) {
9
+ return meshes.reduce((n, m) => n + m.indices.length / 3, 0);
10
+ }
11
+ /** The size of the binary STL file of the meshes, in bytes. */
12
+ export function stlByteLength(meshes) {
13
+ return HEADER_BYTES + 4 + FACET_BYTES * stlFacetCount(meshes);
14
+ }
15
+ /**
16
+ * Writes the meshes as one binary STL file, little-endian. Each facet normal comes from the vertices of the facet
17
+ * (right-hand rule). STL holds no colour and no name, so the writer drops them.
18
+ */
19
+ export function writeStl(meshes) {
20
+ const bytes = new Uint8Array(stlByteLength(meshes));
21
+ const view = new DataView(bytes.buffer);
22
+ bytes.set(new TextEncoder().encode(HEADER_TEXT));
23
+ view.setUint32(HEADER_BYTES, stlFacetCount(meshes), true);
24
+ let at = HEADER_BYTES + 4;
25
+ for (const mesh of meshes) {
26
+ const p = mesh.positions;
27
+ for (let t = 0; t < mesh.indices.length; t += 3) {
28
+ const [a, b, c] = [mesh.indices[t] * 3, mesh.indices[t + 1] * 3, mesh.indices[t + 2] * 3];
29
+ const u = [p[b] - p[a], p[b + 1] - p[a + 1], p[b + 2] - p[a + 2]];
30
+ const v = [p[c] - p[a], p[c + 1] - p[a + 1], p[c + 2] - p[a + 2]];
31
+ const n = [u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0]];
32
+ const length = Math.hypot(n[0], n[1], n[2]) || 1;
33
+ for (const value of [n[0] / length, n[1] / length, n[2] / length]) {
34
+ view.setFloat32(at, value, true);
35
+ at += 4;
36
+ }
37
+ for (const vertex of [a, b, c]) {
38
+ for (let k = 0; k < 3; k++) {
39
+ view.setFloat32(at, p[vertex + k], true);
40
+ at += 4;
41
+ }
42
+ }
43
+ view.setUint16(at, 0, true);
44
+ at += 2;
45
+ }
46
+ }
47
+ return bytes;
48
+ }
49
+ //# sourceMappingURL=stl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stl.js","sourceRoot":"","sources":["../../src/mesh/stl.ts"],"names":[],"mappings":"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"}
package/dist/registry.js CHANGED
@@ -31,6 +31,10 @@ export const DEFAULT_REGISTRY = {
31
31
  "step:png": { backend: "mesh/occt+viewer+browser/chromium", moduleUrl: backendUrl("mesh/backend-png") },
32
32
  "iges:png": { backend: "mesh/occt+viewer+browser/chromium", moduleUrl: backendUrl("mesh/backend-png") },
33
33
  "brep:png": { backend: "mesh/occt+viewer+browser/chromium", moduleUrl: backendUrl("mesh/backend-png") },
34
+ "cad:glb": { backend: "mesh/manifold+glb", moduleUrl: backendUrl("mesh/backend-glb") },
35
+ "cad:stl": { backend: "mesh/manifold+stl", moduleUrl: backendUrl("mesh/backend-stl") },
36
+ "cad:html": { backend: "mesh/manifold+viewer", moduleUrl: backendUrl("mesh/backend-html") },
37
+ "cad:png": { backend: "mesh/manifold+viewer+browser/chromium", moduleUrl: backendUrl("mesh/backend-png") },
34
38
  };
35
39
  /** Builds the registry key of a pair. */
36
40
  export function registryKey(type, format) {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const ENGINE_VERSION = "0.7.0";
1
+ export declare const ENGINE_VERSION = "0.8.0";
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Generated by scripts/prepare-build.mjs from package.json. Do not edit this file by hand.
2
- export const ENGINE_VERSION = "0.7.0";
2
+ export const ENGINE_VERSION = "0.8.0";
3
3
  //# sourceMappingURL=version.js.map
@@ -16,6 +16,10 @@ export interface BackendSettings {
16
16
  allowNetwork: NetworkPolicy;
17
17
  /** The time limit of one remote image download, in milliseconds. */
18
18
  imageTimeoutMs: number;
19
+ /** The node limit of one CAD document. */
20
+ maxCadNodes: number;
21
+ /** The facet limit of one CAD model. */
22
+ maxCadFacets: number;
19
23
  /** The size limit of one remote image body, in bytes. */
20
24
  maxImageBytes: number;
21
25
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danielsimonjr/sciengjs",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "private": false,
5
5
  "description": "A local rendering engine for science and engineering diagrams, documents and models",
6
6
  "license": "MIT",
@@ -95,6 +95,7 @@
95
95
  "@mathjax/src": "4.1.3",
96
96
  "@resvg/resvg-wasm": "2.6.2",
97
97
  "@viz-js/viz": "3.31.0",
98
+ "manifold-3d": "3.2.1",
98
99
  "occt-import-js": "0.0.23",
99
100
  "parse5": "8.1.0"
100
101
  }