@danielsimonjr/sciengjs 0.7.1 → 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 @@
1
+ {"version":3,"file":"cad-build.js","sourceRoot":"","sources":["../../src/mesh/cad-build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { BooleanNode, CadDocument, CadStyle, CircleNode, CubeNode, CylinderNode, ExtrudeNode, MirrorNode, PolygonNode, PolyhedronNode, ProfileNode, RectangleNode, RevolveNode, RotateNode, ScaleNode, SolidNode, SphereNode, TranslateNode, Vec2, Vec3 } from "./cad-document.ts";
2
+ /** The options of a cube. */
3
+ export type CubeOptions = CadStyle & {
4
+ center?: boolean;
5
+ };
6
+ /** The options of a node with segments. */
7
+ export type RoundOptions = CadStyle & {
8
+ segments?: number;
9
+ };
10
+ /** A box. A number gives a box with equal sides. */
11
+ export declare function cube(size: number | Vec3, options?: CubeOptions): CubeNode;
12
+ /** A cylinder. Give one radius, or the bottom and the top radius for a cone. */
13
+ export declare function cylinder(height: number, radius: number | [number, number], options?: RoundOptions & {
14
+ center?: boolean;
15
+ }): CylinderNode;
16
+ /** A sphere centred on the origin. */
17
+ export declare function sphere(radius: number, options?: RoundOptions): SphereNode;
18
+ /** A closed solid from points and convex faces, counter-clockwise seen from outside. */
19
+ export declare function polyhedron(points: Vec3[], faces: number[][], options?: CadStyle): PolyhedronNode;
20
+ /** A rectangle profile. */
21
+ export declare function rectangle(size: number | Vec2, options?: CubeOptions): RectangleNode;
22
+ /** A circle profile. */
23
+ export declare function circle(radius: number, options?: RoundOptions): CircleNode;
24
+ /** A polygon profile, counter-clockwise. */
25
+ export declare function polygon(points: Vec2[], options?: CadStyle): PolygonNode;
26
+ /** The options of an extrusion. */
27
+ export type ExtrudeOptions = CadStyle & {
28
+ twist?: number;
29
+ scale?: number | Vec2;
30
+ divisions?: number;
31
+ center?: boolean;
32
+ };
33
+ /** Pulls a profile along the z axis. */
34
+ export declare function extrude(profile: ProfileNode, height: number, options?: ExtrudeOptions): ExtrudeNode;
35
+ /** Turns a profile around its y axis. */
36
+ export declare function revolve(profile: ProfileNode, options?: RoundOptions & {
37
+ degrees?: number;
38
+ }): RevolveNode;
39
+ /** The union of the solids. */
40
+ export declare function union(children: SolidNode[], options?: CadStyle): BooleanNode;
41
+ /** The first solid minus the others. */
42
+ export declare function difference(children: SolidNode[], options?: CadStyle): BooleanNode;
43
+ /** The common part of the solids. */
44
+ export declare function intersection(children: SolidNode[], options?: CadStyle): BooleanNode;
45
+ /** Moves a solid. */
46
+ export declare function translate(offset: Vec3, child: SolidNode, options?: CadStyle): TranslateNode;
47
+ /** Turns a solid about x, then y, then z, in degrees. */
48
+ export declare function rotate(angles: Vec3, child: SolidNode, options?: CadStyle): RotateNode;
49
+ /** Scales a solid. */
50
+ export declare function scale(factor: number | Vec3, child: SolidNode, options?: CadStyle): ScaleNode;
51
+ /** Reflects a solid through the plane through the origin with this normal. */
52
+ export declare function mirror(normal: Vec3, child: SolidNode, options?: CadStyle): MirrorNode;
53
+ /** Writes the document of a model. Give the result to `render` as `JSON.stringify(document)`. */
54
+ export declare function cadDocument(model: SolidNode, options?: {
55
+ segments?: number;
56
+ }): CadDocument;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * The builder API: functions that write the nodes of a CAD document. A program that uses the builder functions runs in the
3
+ * caller's process. The engine receives only the document, as data.
4
+ */
5
+ /** Returns the object without the keys whose value is undefined, so the document holds only given keys. */
6
+ function compact(value) {
7
+ return Object.fromEntries(Object.entries(value).filter(([, v]) => v !== undefined));
8
+ }
9
+ /** A box. A number gives a box with equal sides. */
10
+ export function cube(size, options = {}) {
11
+ return compact({ type: "cube", size, ...options });
12
+ }
13
+ /** A cylinder. Give one radius, or the bottom and the top radius for a cone. */
14
+ export function cylinder(height, radius, options = {}) {
15
+ const radii = typeof radius === "number" ? { radius } : { radius1: radius[0], radius2: radius[1] };
16
+ return compact({ type: "cylinder", height, ...radii, ...options });
17
+ }
18
+ /** A sphere centred on the origin. */
19
+ export function sphere(radius, options = {}) {
20
+ return compact({ type: "sphere", radius, ...options });
21
+ }
22
+ /** A closed solid from points and convex faces, counter-clockwise seen from outside. */
23
+ export function polyhedron(points, faces, options = {}) {
24
+ return compact({ type: "polyhedron", points, faces, ...options });
25
+ }
26
+ /** A rectangle profile. */
27
+ export function rectangle(size, options = {}) {
28
+ return compact({ type: "rectangle", size, ...options });
29
+ }
30
+ /** A circle profile. */
31
+ export function circle(radius, options = {}) {
32
+ return compact({ type: "circle", radius, ...options });
33
+ }
34
+ /** A polygon profile, counter-clockwise. */
35
+ export function polygon(points, options = {}) {
36
+ return compact({ type: "polygon", points, ...options });
37
+ }
38
+ /** Pulls a profile along the z axis. */
39
+ export function extrude(profile, height, options = {}) {
40
+ return compact({ type: "extrude", height, child: profile, ...options });
41
+ }
42
+ /** Turns a profile around its y axis. */
43
+ export function revolve(profile, options = {}) {
44
+ return compact({ type: "revolve", child: profile, ...options });
45
+ }
46
+ /** The union of the solids. */
47
+ export function union(children, options = {}) {
48
+ return compact({ type: "union", children, ...options });
49
+ }
50
+ /** The first solid minus the others. */
51
+ export function difference(children, options = {}) {
52
+ return compact({ type: "difference", children, ...options });
53
+ }
54
+ /** The common part of the solids. */
55
+ export function intersection(children, options = {}) {
56
+ return compact({ type: "intersection", children, ...options });
57
+ }
58
+ /** Moves a solid. */
59
+ export function translate(offset, child, options = {}) {
60
+ return compact({ type: "translate", offset, child, ...options });
61
+ }
62
+ /** Turns a solid about x, then y, then z, in degrees. */
63
+ export function rotate(angles, child, options = {}) {
64
+ return compact({ type: "rotate", angles, child, ...options });
65
+ }
66
+ /** Scales a solid. */
67
+ export function scale(factor, child, options = {}) {
68
+ return compact({ type: "scale", factor, child, ...options });
69
+ }
70
+ /** Reflects a solid through the plane through the origin with this normal. */
71
+ export function mirror(normal, child, options = {}) {
72
+ return compact({ type: "mirror", normal, child, ...options });
73
+ }
74
+ /** Writes the document of a model. Give the result to `render` as `JSON.stringify(document)`. */
75
+ export function cadDocument(model, options = {}) {
76
+ return compact({ version: 1, model, ...options });
77
+ }
78
+ //# sourceMappingURL=cad-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cad-builder.js","sourceRoot":"","sources":["../../src/mesh/cad-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ /** A point or a size in 2D. */
2
+ export type Vec2 = [number, number];
3
+ /** A point, a size or a direction in 3D. */
4
+ export type Vec3 = [number, number, number];
5
+ /** A colour: red, green and blue, each from 0 to 1. */
6
+ export type Rgb = [number, number, number];
7
+ /** The keys that every node can carry. */
8
+ export interface CadStyle {
9
+ name?: string;
10
+ color?: Rgb;
11
+ }
12
+ /** A box with one corner at the origin, or centred on the origin. */
13
+ export interface CubeNode extends CadStyle {
14
+ type: "cube";
15
+ size: number | Vec3;
16
+ center?: boolean;
17
+ }
18
+ /** A cylinder or a cone along the z axis. Give `radius`, or `radius1` (bottom) and `radius2` (top). */
19
+ export interface CylinderNode extends CadStyle {
20
+ type: "cylinder";
21
+ height: number;
22
+ radius?: number;
23
+ radius1?: number;
24
+ radius2?: number;
25
+ center?: boolean;
26
+ segments?: number;
27
+ }
28
+ /** A sphere centred on the origin. */
29
+ export interface SphereNode extends CadStyle {
30
+ type: "sphere";
31
+ radius: number;
32
+ segments?: number;
33
+ }
34
+ /** A closed solid from points and faces. Each face is convex and counter-clockwise, seen from outside. */
35
+ export interface PolyhedronNode extends CadStyle {
36
+ type: "polyhedron";
37
+ points: Vec3[];
38
+ faces: number[][];
39
+ }
40
+ /** A rectangle with one corner at the origin, or centred on the origin. */
41
+ export interface RectangleNode extends CadStyle {
42
+ type: "rectangle";
43
+ size: number | Vec2;
44
+ center?: boolean;
45
+ }
46
+ /** A circle centred on the origin. */
47
+ export interface CircleNode extends CadStyle {
48
+ type: "circle";
49
+ radius: number;
50
+ segments?: number;
51
+ }
52
+ /** A simple polygon, counter-clockwise. */
53
+ export interface PolygonNode extends CadStyle {
54
+ type: "polygon";
55
+ points: Vec2[];
56
+ }
57
+ /** A 2D profile. Use a profile only as the child of extrude or revolve. */
58
+ export type ProfileNode = RectangleNode | CircleNode | PolygonNode;
59
+ /** A profile pulled along the z axis. */
60
+ export interface ExtrudeNode extends CadStyle {
61
+ type: "extrude";
62
+ height: number;
63
+ child: ProfileNode;
64
+ /** The twist of the top against the bottom, in degrees. */
65
+ twist?: number;
66
+ /** The scale of the top against the bottom. */
67
+ scale?: number | Vec2;
68
+ /** The number of extra layers between the bottom and the top. */
69
+ divisions?: number;
70
+ center?: boolean;
71
+ }
72
+ /** A profile turned around the y axis of the profile, which becomes the z axis of the solid. */
73
+ export interface RevolveNode extends CadStyle {
74
+ type: "revolve";
75
+ child: ProfileNode;
76
+ degrees?: number;
77
+ segments?: number;
78
+ }
79
+ /** A boolean operation. `difference` subtracts the second and later children from the first. */
80
+ export interface BooleanNode extends CadStyle {
81
+ type: "union" | "difference" | "intersection";
82
+ children: SolidNode[];
83
+ }
84
+ /** A move of a solid by an offset. */
85
+ export interface TranslateNode extends CadStyle {
86
+ type: "translate";
87
+ offset: Vec3;
88
+ child: SolidNode;
89
+ }
90
+ /** A rotation about x, then y, then z, in degrees. */
91
+ export interface RotateNode extends CadStyle {
92
+ type: "rotate";
93
+ angles: Vec3;
94
+ child: SolidNode;
95
+ }
96
+ /** A scale of a solid: one factor, or one factor per axis. */
97
+ export interface ScaleNode extends CadStyle {
98
+ type: "scale";
99
+ factor: number | Vec3;
100
+ child: SolidNode;
101
+ }
102
+ /** A reflection through the plane through the origin with this normal. */
103
+ export interface MirrorNode extends CadStyle {
104
+ type: "mirror";
105
+ normal: Vec3;
106
+ child: SolidNode;
107
+ }
108
+ /** A 3D node. */
109
+ export type SolidNode = CubeNode | CylinderNode | SphereNode | PolyhedronNode | ExtrudeNode | RevolveNode | BooleanNode | TranslateNode | RotateNode | ScaleNode | MirrorNode;
110
+ /** Any node of a CAD document. */
111
+ export type CadNode = SolidNode | ProfileNode;
112
+ /** A CAD document: data only. The engine executes no code from the document. */
113
+ export interface CadDocument {
114
+ version: 1;
115
+ model: SolidNode;
116
+ /** The default number of segments of a full circle. */
117
+ segments?: number;
118
+ }
119
+ /** The limits of one document. */
120
+ export interface CadLimits {
121
+ maxNodes: number;
122
+ maxFacets: number;
123
+ }
124
+ /** A checked document with its node count and its facet estimate. */
125
+ export interface CheckedCadDocument {
126
+ document: CadDocument;
127
+ nodes: number;
128
+ facetEstimate: number;
129
+ }
130
+ /** The default number of segments of a full circle. */
131
+ export declare const DEFAULT_SEGMENTS = 32;
132
+ /** The range of a segments value. */
133
+ export declare const MIN_SEGMENTS = 3;
134
+ export declare const MAX_SEGMENTS = 1024;
135
+ /** The facets of a sphere: the engine refines an octahedron, so the segments round up to a multiple of 4. */
136
+ export declare function sphereFacets(segments: number): number;
137
+ /** Checks a parsed document. The function rejects with E_INPUT on a bad value and with E_LIMIT over a limit. */
138
+ export declare function checkCadDocument(value: unknown, limits: CadLimits): CheckedCadDocument;
139
+ /** Parses and checks the JSON text of a CAD document. Text that is not JSON rejects with E_INPUT. */
140
+ export declare function parseCadDocument(text: string, limits: CadLimits): CheckedCadDocument;
@@ -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