brepjs 20.1.4 → 20.2.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.
- package/dist/2d.cjs +7 -7
- package/dist/2d.js +7 -7
- package/dist/{adjacencyFns-C_ZNyZRx.cjs → adjacencyFns-DZsPfYIq.cjs} +2 -2
- package/dist/{adjacencyFns-A1SikG3N.js → adjacencyFns-k4GWh4n7.js} +2 -2
- package/dist/{blueprint-BsaJ4TJW.cjs → blueprint-CJuRunkd.cjs} +7 -7
- package/dist/{blueprint-CAg8eRRu.js → blueprint-Dsp4t2ul.js} +7 -7
- package/dist/{blueprintFns-CCVf2Yat.cjs → blueprintFns-BRceCeZp.cjs} +3 -3
- package/dist/{blueprintFns-BRXgJCA2.js → blueprintFns-DNyUtopT.js} +3 -3
- package/dist/{blueprintSketcher-DobJgYX3.cjs → blueprintSketcher-DRXOTYuD.cjs} +4 -4
- package/dist/{blueprintSketcher-CNbOLihr.js → blueprintSketcher-kV7aFwRS.js} +4 -4
- package/dist/{boolean2D-CB3xwM21.cjs → boolean2D-DmPqFj_V.cjs} +5 -5
- package/dist/{boolean2D-C-TdmZUJ.js → boolean2D-TdJfMS8F.js} +5 -5
- package/dist/brepjs.cjs +300 -79
- package/dist/brepjs.js +300 -79
- package/dist/{cameraFns-BSHErz3i.cjs → cameraFns-B8Ai6b3Q.cjs} +4 -4
- package/dist/{cameraFns-CdtviYur.js → cameraFns-u08iOn7p.js} +4 -4
- package/dist/core/errors.d.ts +1 -0
- package/dist/core.cjs +4 -4
- package/dist/core.js +4 -4
- package/dist/{cornerFinder-BdK6e9T-.cjs → cornerFinder-BVUuCBX-.cjs} +1 -1
- package/dist/{cornerFinder-DCXsZzIe.js → cornerFinder-DfoRecV-.js} +1 -1
- package/dist/csg/builders.d.ts +13 -1
- package/dist/csg/evaluate.d.ts +10 -1
- package/dist/csg/evaluators/context.d.ts +2 -1
- package/dist/csg/evaluators/extension.d.ts +5 -0
- package/dist/csg/hash.d.ts +1 -0
- package/dist/csg/index.d.ts +2 -2
- package/dist/csg/jsonData.d.ts +8 -0
- package/dist/csg/serialize.d.ts +1 -1
- package/dist/csg/types.d.ts +50 -1
- package/dist/{curveFns-D_xfC1HQ.js → curveFns-D5V4jm7S.js} +2 -2
- package/dist/{curveFns-BXGE1xHa.cjs → curveFns-DciWOppG.cjs} +2 -2
- package/dist/{drawFns-CIfCWrWw.js → drawFns-BzuxoLHh.js} +14 -14
- package/dist/{drawFns-B9JThnjT.cjs → drawFns-DeUXFpjR.cjs} +14 -14
- package/dist/{errors-CTn8i3lY.js → errors-CDSezF9z.js} +1 -0
- package/dist/{errors-DWezb9DI.cjs → errors-gG-7hA7k.cjs} +1 -0
- package/dist/{faceFns-CGXvMjno.cjs → faceFns-DaXVpMr5.cjs} +3 -3
- package/dist/{faceFns-CwweiLRC.js → faceFns-DhdweJGk.js} +3 -3
- package/dist/{healingFns-D8_IZ8LC.cjs → healingFns-C_f03IV6.cjs} +5 -5
- package/dist/{healingFns-DVH0JBpC.js → healingFns-HekFOO_s.js} +5 -5
- package/dist/{helpers-jV94RJf1.js → helpers-BWNXoJz0.js} +7 -7
- package/dist/{helpers-BjKe6-M-.cjs → helpers-Dh4qTGcQ.cjs} +7 -7
- package/dist/{importFns-C0WKTbbQ.cjs → importFns-CKfKRdiq.cjs} +3 -3
- package/dist/{importFns-8OY0H66Q.js → importFns-DGnmgb9G.js} +3 -3
- package/dist/io.cjs +2 -2
- package/dist/io.js +2 -2
- package/dist/{loftFns-B3aEz87L.cjs → loftFns-CI8uJc1D.cjs} +2 -2
- package/dist/{loftFns-CS0JYNr4.js → loftFns-DE1GYW9g.js} +2 -2
- package/dist/{measureFns-CyU-fOaZ.cjs → measureFns-B8Yj_BMz.cjs} +4 -4
- package/dist/{measureFns-LkW9r9Dm.js → measureFns-BoA-Fmwy.js} +4 -4
- package/dist/measurement.cjs +1 -1
- package/dist/measurement.js +1 -1
- package/dist/{meshFns-vO9xsIlB.cjs → meshFns-BT7W4b1c.cjs} +4 -4
- package/dist/{meshFns-BI_fEj-T.js → meshFns-o9MnZeir.js} +4 -4
- package/dist/operations.cjs +2 -2
- package/dist/operations.js +2 -2
- package/dist/{originTrackingFns-CuCeiMNZ.cjs → originTrackingFns-B3-1bBED.cjs} +2 -2
- package/dist/{originTrackingFns-BTBemULp.js → originTrackingFns-BFmhk_Up.js} +2 -2
- package/dist/{planeOps-CkpMeheg.js → planeOps-BO6nvRja.js} +1 -1
- package/dist/{planeOps-CpupTCRM.cjs → planeOps-DqGSxcMr.cjs} +1 -1
- package/dist/{primitiveFns-CfxGT0nf.js → primitiveFns-DfhjU_X9.js} +5 -5
- package/dist/{primitiveFns-DSUL72Md.cjs → primitiveFns-Ke-n8Bib.cjs} +5 -5
- package/dist/projection.cjs +1 -1
- package/dist/projection.js +1 -1
- package/dist/query.cjs +2 -2
- package/dist/query.js +2 -2
- package/dist/{refResolveFns-BleIGUVN.cjs → refResolveFns-BPqbBoxy.cjs} +6 -6
- package/dist/{refResolveFns-BuS72b11.js → refResolveFns-C-6Xa_8k.js} +6 -6
- package/dist/result.cjs +1 -1
- package/dist/result.js +1 -1
- package/dist/{shapeFns-DTZ96dTc.js → shapeFns-CUTM2ZDR.js} +3 -3
- package/dist/{shapeFns-BsuUPJR3.cjs → shapeFns-CmJNoPsh.cjs} +3 -3
- package/dist/shapeRef.cjs +1 -1
- package/dist/shapeRef.js +1 -1
- package/dist/{shapeTypes-CACpB7r3.cjs → shapeTypes-BWsKDxzf.cjs} +7 -5
- package/dist/{shapeTypes-CEFHrXNb.js → shapeTypes-DVpJHhgk.js} +7 -5
- package/dist/sketching.cjs +3 -3
- package/dist/sketching.js +3 -3
- package/dist/{solidBuilders-BdKU5bQ9.cjs → solidBuilders-B8t5h68e.cjs} +7 -7
- package/dist/{solidBuilders-De11-Gp-.js → solidBuilders-p_ppeTkc.js} +7 -7
- package/dist/{surfaceBuilders-BaVNAtRf.cjs → surfaceBuilders-Bn-c9xVR.cjs} +4 -4
- package/dist/{surfaceBuilders-QGhgel6X.js → surfaceBuilders-Dccm2kQX.js} +4 -4
- package/dist/text.cjs +2 -2
- package/dist/text.js +2 -2
- package/dist/{textBlueprints-BHOADZSh.cjs → textBlueprints-DQi920gG.cjs} +9 -9
- package/dist/{textBlueprints-B_yfJn3S.js → textBlueprints-bFsyNLkO.js} +9 -9
- package/dist/{textMetrics-C4I5t9jZ.js → textMetrics-CvTwh4tR.js} +2 -2
- package/dist/{textMetrics-DHWYuTUK.cjs → textMetrics-DhysRMr7.cjs} +2 -2
- package/dist/{threadFns-P682L-Kg.cjs → threadFns-DAKMitvE.cjs} +8 -8
- package/dist/{threadFns-BVwQUwRJ.js → threadFns-DlGXBSK7.js} +8 -8
- package/dist/topology.cjs +9 -9
- package/dist/topology.js +9 -9
- package/dist/{topologyQueryFns-Cp390rTF.cjs → topologyQueryFns-CI4j3NTE.cjs} +2 -2
- package/dist/{topologyQueryFns-CFfTw0pA.js → topologyQueryFns-fNWsM4Lr.js} +2 -2
- package/dist/{validityTypes-Biiyb5lR.js → validityTypes-2DNKAPEw.js} +2 -2
- package/dist/{validityTypes-DtfxKjGs.cjs → validityTypes-D9oxhu4U.cjs} +2 -2
- package/dist/vectors.cjs +1 -1
- package/dist/vectors.js +1 -1
- package/package.json +1 -1
package/dist/brepjs.cjs
CHANGED
|
@@ -1,41 +1,41 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
|
|
3
|
-
const require_shapeTypes = require("./shapeTypes-
|
|
3
|
+
const require_shapeTypes = require("./shapeTypes-BWsKDxzf.cjs");
|
|
4
4
|
const require_occtWasmAdapter = require("./occtWasmAdapter-wCKnmevS.cjs");
|
|
5
5
|
const require_bug = require("./bug-O02CsAmt.cjs");
|
|
6
|
-
const require_errors = require("./errors-
|
|
7
|
-
const require_topologyQueryFns = require("./topologyQueryFns-
|
|
8
|
-
const require_validityTypes = require("./validityTypes-
|
|
6
|
+
const require_errors = require("./errors-gG-7hA7k.cjs");
|
|
7
|
+
const require_topologyQueryFns = require("./topologyQueryFns-CI4j3NTE.cjs");
|
|
8
|
+
const require_validityTypes = require("./validityTypes-D9oxhu4U.cjs");
|
|
9
9
|
const require_constants = require("./constants-BOVyEYGH.cjs");
|
|
10
10
|
const require_types = require("./types-KjA8tY4Y.cjs");
|
|
11
11
|
const require_vecOps = require("./vecOps-CCnJt-yH.cjs");
|
|
12
|
-
const require_planeOps = require("./planeOps-
|
|
13
|
-
const require_faceFns = require("./faceFns-
|
|
14
|
-
const require_originTrackingFns = require("./originTrackingFns-
|
|
15
|
-
const require_solidBuilders = require("./solidBuilders-
|
|
16
|
-
const require_primitiveFns = require("./primitiveFns-
|
|
17
|
-
const require_shapeFns = require("./shapeFns-
|
|
18
|
-
const require_curveFns = require("./curveFns-
|
|
19
|
-
const require_meshFns = require("./meshFns-
|
|
12
|
+
const require_planeOps = require("./planeOps-DqGSxcMr.cjs");
|
|
13
|
+
const require_faceFns = require("./faceFns-DaXVpMr5.cjs");
|
|
14
|
+
const require_originTrackingFns = require("./originTrackingFns-B3-1bBED.cjs");
|
|
15
|
+
const require_solidBuilders = require("./solidBuilders-B8t5h68e.cjs");
|
|
16
|
+
const require_primitiveFns = require("./primitiveFns-Ke-n8Bib.cjs");
|
|
17
|
+
const require_shapeFns = require("./shapeFns-CmJNoPsh.cjs");
|
|
18
|
+
const require_curveFns = require("./curveFns-DciWOppG.cjs");
|
|
19
|
+
const require_meshFns = require("./meshFns-BT7W4b1c.cjs");
|
|
20
20
|
const require_arrayAccess = require("./arrayAccess-e4H9cBfh.cjs");
|
|
21
|
-
const require_surfaceBuilders = require("./surfaceBuilders-
|
|
22
|
-
const require_healingFns = require("./healingFns-
|
|
23
|
-
const require_threadFns = require("./threadFns-
|
|
24
|
-
const require_blueprintSketcher = require("./blueprintSketcher-
|
|
25
|
-
const require_helpers = require("./helpers-
|
|
26
|
-
const require_blueprint = require("./blueprint-
|
|
27
|
-
const require_drawFns = require("./drawFns-
|
|
28
|
-
const require_measureFns = require("./measureFns-
|
|
29
|
-
const require_cornerFinder = require("./cornerFinder-
|
|
30
|
-
const require_boolean2D = require("./boolean2D-
|
|
31
|
-
const require_blueprintFns = require("./blueprintFns-
|
|
32
|
-
const require_importFns = require("./importFns-
|
|
33
|
-
const require_loftFns = require("./loftFns-
|
|
34
|
-
const require_textBlueprints = require("./textBlueprints-
|
|
35
|
-
const require_refResolveFns = require("./refResolveFns-
|
|
36
|
-
const require_adjacencyFns = require("./adjacencyFns-
|
|
37
|
-
const require_cameraFns = require("./cameraFns-
|
|
38
|
-
const require_textMetrics = require("./textMetrics-
|
|
21
|
+
const require_surfaceBuilders = require("./surfaceBuilders-Bn-c9xVR.cjs");
|
|
22
|
+
const require_healingFns = require("./healingFns-C_f03IV6.cjs");
|
|
23
|
+
const require_threadFns = require("./threadFns-DAKMitvE.cjs");
|
|
24
|
+
const require_blueprintSketcher = require("./blueprintSketcher-DRXOTYuD.cjs");
|
|
25
|
+
const require_helpers = require("./helpers-Dh4qTGcQ.cjs");
|
|
26
|
+
const require_blueprint = require("./blueprint-CJuRunkd.cjs");
|
|
27
|
+
const require_drawFns = require("./drawFns-DeUXFpjR.cjs");
|
|
28
|
+
const require_measureFns = require("./measureFns-B8Yj_BMz.cjs");
|
|
29
|
+
const require_cornerFinder = require("./cornerFinder-BVUuCBX-.cjs");
|
|
30
|
+
const require_boolean2D = require("./boolean2D-DmPqFj_V.cjs");
|
|
31
|
+
const require_blueprintFns = require("./blueprintFns-BRceCeZp.cjs");
|
|
32
|
+
const require_importFns = require("./importFns-CKfKRdiq.cjs");
|
|
33
|
+
const require_loftFns = require("./loftFns-CI8uJc1D.cjs");
|
|
34
|
+
const require_textBlueprints = require("./textBlueprints-DQi920gG.cjs");
|
|
35
|
+
const require_refResolveFns = require("./refResolveFns-BPqbBoxy.cjs");
|
|
36
|
+
const require_adjacencyFns = require("./adjacencyFns-DZsPfYIq.cjs");
|
|
37
|
+
const require_cameraFns = require("./cameraFns-B8Ai6b3Q.cjs");
|
|
38
|
+
const require_textMetrics = require("./textMetrics-DhysRMr7.cjs");
|
|
39
39
|
const require_workerPool = require("./workerPool-D30NsiIW.cjs");
|
|
40
40
|
//#region src/kernel/types.ts
|
|
41
41
|
/** Check if the kernel supports hidden-line-removal projection. */
|
|
@@ -1174,6 +1174,14 @@ function fnvMixInt32(h, n) {
|
|
|
1174
1174
|
}
|
|
1175
1175
|
return r;
|
|
1176
1176
|
}
|
|
1177
|
+
function fnvMixText(h, s) {
|
|
1178
|
+
let r = fnvMixInt32(h, s.length);
|
|
1179
|
+
for (let i = 0; i < s.length; i++) {
|
|
1180
|
+
const c = s.charCodeAt(i);
|
|
1181
|
+
r = fnvMixByte(fnvMixByte(r, c), c >>> 8);
|
|
1182
|
+
}
|
|
1183
|
+
return r;
|
|
1184
|
+
}
|
|
1177
1185
|
function fnvMixBool(h, b) {
|
|
1178
1186
|
return fnvMixByte(h, b ? 1 : 0);
|
|
1179
1187
|
}
|
|
@@ -1522,6 +1530,130 @@ function foldSegment(s, foldExpr) {
|
|
|
1522
1530
|
}
|
|
1523
1531
|
}
|
|
1524
1532
|
//#endregion
|
|
1533
|
+
//#region src/csg/jsonData.ts
|
|
1534
|
+
/** Validate `value` as JSON-safe and return its canonical frozen copy, or a
|
|
1535
|
+
* message naming the first offending path (rooted at `path`). */
|
|
1536
|
+
function canonicalJson(value, path) {
|
|
1537
|
+
return copyJson(value, path, /* @__PURE__ */ new Set());
|
|
1538
|
+
}
|
|
1539
|
+
function copyJson(v, path, ancestors) {
|
|
1540
|
+
if (v === null || typeof v === "boolean" || typeof v === "string") return require_errors.ok(v);
|
|
1541
|
+
if (typeof v === "number") {
|
|
1542
|
+
if (!Number.isFinite(v)) return require_errors.err(`${path}: ${String(v)} is not JSON-safe`);
|
|
1543
|
+
return require_errors.ok(v === 0 ? 0 : v);
|
|
1544
|
+
}
|
|
1545
|
+
if (typeof v !== "object") return require_errors.err(`${path}: ${typeof v} is not JSON-safe`);
|
|
1546
|
+
if (ancestors.has(v)) return require_errors.err(`${path}: circular reference is not JSON-safe`);
|
|
1547
|
+
ancestors.add(v);
|
|
1548
|
+
const out = Array.isArray(v) ? copyArray(v, path, ancestors) : copyObject(v, path, ancestors);
|
|
1549
|
+
ancestors.delete(v);
|
|
1550
|
+
return out;
|
|
1551
|
+
}
|
|
1552
|
+
function copyArray(v, path, ancestors) {
|
|
1553
|
+
const out = [];
|
|
1554
|
+
for (let i = 0; i < v.length; i++) {
|
|
1555
|
+
const r = copyJson(v[i], `${path}[${i}]`, ancestors);
|
|
1556
|
+
if (!r.ok) return r;
|
|
1557
|
+
out.push(r.value);
|
|
1558
|
+
}
|
|
1559
|
+
return require_errors.ok(Object.freeze(out));
|
|
1560
|
+
}
|
|
1561
|
+
function copyObject(v, path, ancestors) {
|
|
1562
|
+
const proto = Object.getPrototypeOf(v);
|
|
1563
|
+
if (proto !== Object.prototype && proto !== null) {
|
|
1564
|
+
const ctor = v.constructor;
|
|
1565
|
+
const what = typeof ctor === "function" && ctor.name ? `${ctor.name} instance` : "object";
|
|
1566
|
+
return require_errors.err(`${path}: ${what} is not JSON-safe (use a plain object)`);
|
|
1567
|
+
}
|
|
1568
|
+
const record = v;
|
|
1569
|
+
const entries = [];
|
|
1570
|
+
for (const key of Object.keys(record).sort()) {
|
|
1571
|
+
const r = copyJson(record[key], `${path}.${key}`, ancestors);
|
|
1572
|
+
if (!r.ok) return r;
|
|
1573
|
+
entries.push([key, r.value]);
|
|
1574
|
+
}
|
|
1575
|
+
return require_errors.ok(Object.freeze(Object.fromEntries(entries)));
|
|
1576
|
+
}
|
|
1577
|
+
var TAG_NULL = 0;
|
|
1578
|
+
var TAG_FALSE = 1;
|
|
1579
|
+
var TAG_TRUE = 2;
|
|
1580
|
+
var TAG_NUMBER = 3;
|
|
1581
|
+
var TAG_STRING = 4;
|
|
1582
|
+
var TAG_ARRAY = 5;
|
|
1583
|
+
var TAG_OBJECT = 6;
|
|
1584
|
+
/** Type-tagged, length-prefixed Merkle mix of a JSON value; object keys are
|
|
1585
|
+
* hashed in sorted order, so key order never changes the result. */
|
|
1586
|
+
function hashJson(h, v) {
|
|
1587
|
+
if (v === null) return fnvMixByte(h, TAG_NULL);
|
|
1588
|
+
if (typeof v === "boolean") return fnvMixByte(h, v ? TAG_TRUE : TAG_FALSE);
|
|
1589
|
+
if (typeof v === "number") return fnvMixNumber(fnvMixByte(h, TAG_NUMBER), v);
|
|
1590
|
+
if (typeof v === "string") return fnvMixText(fnvMixByte(h, TAG_STRING), v);
|
|
1591
|
+
if (isJsonArray(v)) {
|
|
1592
|
+
let r = fnvMixInt32(fnvMixByte(h, TAG_ARRAY), v.length);
|
|
1593
|
+
for (const item of v) r = hashJson(r, item);
|
|
1594
|
+
return r;
|
|
1595
|
+
}
|
|
1596
|
+
const keys = Object.keys(v).sort();
|
|
1597
|
+
let r = fnvMixInt32(fnvMixByte(h, TAG_OBJECT), keys.length);
|
|
1598
|
+
for (const key of keys) {
|
|
1599
|
+
r = fnvMixText(r, key);
|
|
1600
|
+
r = hashJson(r, v[key] ?? null);
|
|
1601
|
+
}
|
|
1602
|
+
return r;
|
|
1603
|
+
}
|
|
1604
|
+
function isJsonArray(v) {
|
|
1605
|
+
return Array.isArray(v);
|
|
1606
|
+
}
|
|
1607
|
+
//#endregion
|
|
1608
|
+
//#region src/csg/types.ts
|
|
1609
|
+
var OUTPUT_KINDS = {
|
|
1610
|
+
Solid: true,
|
|
1611
|
+
Face: true,
|
|
1612
|
+
Wire: true,
|
|
1613
|
+
Edge: true,
|
|
1614
|
+
Vertex: true,
|
|
1615
|
+
Compound: true
|
|
1616
|
+
};
|
|
1617
|
+
function isOutputKind(v) {
|
|
1618
|
+
return typeof v === "string" && Object.hasOwn(OUTPUT_KINDS, v);
|
|
1619
|
+
}
|
|
1620
|
+
function outputKindOf(node) {
|
|
1621
|
+
switch (node.kind) {
|
|
1622
|
+
case "Box":
|
|
1623
|
+
case "Sphere":
|
|
1624
|
+
case "Cylinder":
|
|
1625
|
+
case "Cone":
|
|
1626
|
+
case "Torus": return "Solid";
|
|
1627
|
+
case "Polygon": return "Face";
|
|
1628
|
+
case "Circle":
|
|
1629
|
+
case "Line": return "Edge";
|
|
1630
|
+
case "Vertex": return "Vertex";
|
|
1631
|
+
case "Empty": return node.output;
|
|
1632
|
+
case "Fuse":
|
|
1633
|
+
case "Cut":
|
|
1634
|
+
case "Intersect": return outputKindOf(node.a);
|
|
1635
|
+
case "FuseAll": return node.shapes[0] ? outputKindOf(node.shapes[0]) : "Solid";
|
|
1636
|
+
case "CutAll": return outputKindOf(node.base);
|
|
1637
|
+
case "Translate":
|
|
1638
|
+
case "Rotate":
|
|
1639
|
+
case "Scale":
|
|
1640
|
+
case "Mirror":
|
|
1641
|
+
case "Color": return outputKindOf(node.target);
|
|
1642
|
+
case "Extrude":
|
|
1643
|
+
case "Revolve":
|
|
1644
|
+
case "Loft":
|
|
1645
|
+
case "Sweep":
|
|
1646
|
+
case "Fillet":
|
|
1647
|
+
case "Chamfer":
|
|
1648
|
+
case "Shell": return "Solid";
|
|
1649
|
+
case "Profile": return "Face";
|
|
1650
|
+
case "Path": return "Wire";
|
|
1651
|
+
case "Compound": return "Compound";
|
|
1652
|
+
case "Instance": return node.fuse ? "Solid" : "Compound";
|
|
1653
|
+
case "Extension": return node.output;
|
|
1654
|
+
}
|
|
1655
|
+
}
|
|
1656
|
+
//#endregion
|
|
1525
1657
|
//#region src/csg/builders.ts
|
|
1526
1658
|
var EMPTY_DEPS = /* @__PURE__ */ new Set();
|
|
1527
1659
|
function startHash(tag) {
|
|
@@ -2025,42 +2157,47 @@ function instance$1(source, placements, fuse = false) {
|
|
|
2025
2157
|
freeParams: depsOf(source)
|
|
2026
2158
|
};
|
|
2027
2159
|
}
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2160
|
+
function isExpr(v) {
|
|
2161
|
+
return typeof v === "object" && v !== null && typeof v.structuralHash === "bigint";
|
|
2162
|
+
}
|
|
2163
|
+
function extensionParams(name, input) {
|
|
2164
|
+
const entries = [];
|
|
2165
|
+
for (const key of Object.keys(input).sort()) {
|
|
2166
|
+
const v = input[key];
|
|
2167
|
+
if (typeof v !== "number" && !isExpr(v)) throw new TypeError(`csg.extension(${name}): params.${key} must be a number or an Expr`);
|
|
2168
|
+
entries.push([key, asScalarExpr(v)]);
|
|
2169
|
+
}
|
|
2170
|
+
return entries;
|
|
2171
|
+
}
|
|
2172
|
+
/** A caller-defined operation, materialized at evaluation by the
|
|
2173
|
+
* `ExtensionEvaluator` registered under `name` in
|
|
2174
|
+
* `EvaluatorOptions.extensions`. Unlike the other builders this one validates
|
|
2175
|
+
* eagerly and throws a TypeError: a node whose data cannot be hashed
|
|
2176
|
+
* canonically has no content address. */
|
|
2177
|
+
function extension(name, output, options) {
|
|
2178
|
+
if (typeof name !== "string" || name.length === 0) throw new TypeError("csg.extension: name must be a non-empty string");
|
|
2179
|
+
if (!isOutputKind(output)) throw new TypeError(`csg.extension(${name}): unknown output kind ${String(output)}`);
|
|
2180
|
+
const data = canonicalJson(options?.data ?? null, "data");
|
|
2181
|
+
if (!data.ok) throw new TypeError(`csg.extension(${name}): ${data.error}`);
|
|
2182
|
+
const children = [...options?.children ?? []];
|
|
2183
|
+
const params = extensionParams(name, options?.params ?? {});
|
|
2184
|
+
let h = fnvMixText(startHash("Extension"), name);
|
|
2185
|
+
h = fnvMixText(h, output);
|
|
2186
|
+
h = fnvMixInt32(h, children.length);
|
|
2187
|
+
for (const c of children) h = mix(h, c);
|
|
2188
|
+
h = fnvMixInt32(h, params.length);
|
|
2189
|
+
for (const [key, e] of params) h = mix(fnvMixText(h, key), e);
|
|
2190
|
+
h = hashJson(h, data.value);
|
|
2191
|
+
return {
|
|
2192
|
+
kind: "Extension",
|
|
2193
|
+
name,
|
|
2194
|
+
output,
|
|
2195
|
+
children,
|
|
2196
|
+
params: Object.fromEntries(params),
|
|
2197
|
+
data: data.value,
|
|
2198
|
+
structuralHash: h,
|
|
2199
|
+
freeParams: depsOf(...children, ...params.map(([, e]) => e))
|
|
2200
|
+
};
|
|
2064
2201
|
}
|
|
2065
2202
|
//#endregion
|
|
2066
2203
|
//#region src/csg/profiles.ts
|
|
@@ -3115,6 +3252,29 @@ function evalShell(node, ctx) {
|
|
|
3115
3252
|
return require_healingFns.shell(solid.value, faces, thickness.value);
|
|
3116
3253
|
}
|
|
3117
3254
|
//#endregion
|
|
3255
|
+
//#region src/csg/evaluators/extension.ts
|
|
3256
|
+
function evalExtension(node, ctx) {
|
|
3257
|
+
const evaluator = ctx.extensions.get(node.name);
|
|
3258
|
+
if (evaluator === void 0) return require_errors.err(require_errors.validationError(require_errors.BrepErrorCode.CSG_EXTENSION_UNKNOWN, `Extension: no evaluator registered for '${node.name}'`, void 0, { name: node.name }, `Register one with new csg.Evaluator({ extensions: { '${node.name}': fn } })`));
|
|
3259
|
+
const params = [];
|
|
3260
|
+
for (const [key, expr] of Object.entries(node.params)) {
|
|
3261
|
+
const v = evalScalar(expr, ctx.env, `Extension(${node.name}).params.${key}`);
|
|
3262
|
+
if (!v.ok) return v;
|
|
3263
|
+
params.push([key, v.value]);
|
|
3264
|
+
}
|
|
3265
|
+
const children = [];
|
|
3266
|
+
for (const child of node.children) {
|
|
3267
|
+
const r = ctx.evalNode(child);
|
|
3268
|
+
if (!r.ok) return r;
|
|
3269
|
+
children.push(r.value);
|
|
3270
|
+
}
|
|
3271
|
+
return evaluator({
|
|
3272
|
+
params: Object.fromEntries(params),
|
|
3273
|
+
data: node.data,
|
|
3274
|
+
children
|
|
3275
|
+
});
|
|
3276
|
+
}
|
|
3277
|
+
//#endregion
|
|
3118
3278
|
//#region src/csg/evaluate.ts
|
|
3119
3279
|
function dispatch(node, ctx) {
|
|
3120
3280
|
switch (node.kind) {
|
|
@@ -3139,6 +3299,7 @@ function dispatch(node, ctx) {
|
|
|
3139
3299
|
case "Mirror": return evalMirror(node, ctx);
|
|
3140
3300
|
case "Compound": return evalCompound(node, ctx);
|
|
3141
3301
|
case "Instance": return evalInstance(node, ctx);
|
|
3302
|
+
case "Extension": return evalExtension(node, ctx);
|
|
3142
3303
|
case "Extrude":
|
|
3143
3304
|
case "Revolve":
|
|
3144
3305
|
case "Loft":
|
|
@@ -3366,6 +3527,7 @@ var Evaluator = class {
|
|
|
3366
3527
|
maxMeshCacheEntries;
|
|
3367
3528
|
meshCache = /* @__PURE__ */ new Map();
|
|
3368
3529
|
onStep;
|
|
3530
|
+
extensions;
|
|
3369
3531
|
hits = 0;
|
|
3370
3532
|
misses = 0;
|
|
3371
3533
|
evictions = 0;
|
|
@@ -3379,6 +3541,9 @@ var Evaluator = class {
|
|
|
3379
3541
|
const meshMax = options.maxMeshCacheEntries;
|
|
3380
3542
|
if (meshMax !== void 0 && (!Number.isInteger(meshMax) || meshMax < 1)) throw new RangeError(`Evaluator: maxMeshCacheEntries must be a positive integer, got ${String(meshMax)}`);
|
|
3381
3543
|
this.maxMeshCacheEntries = meshMax;
|
|
3544
|
+
const extensions = new Map(Object.entries(options.extensions ?? {}));
|
|
3545
|
+
for (const [name, fn] of extensions) if (typeof fn !== "function") throw new TypeError(`Evaluator: extensions['${name}'] must be a function`);
|
|
3546
|
+
this.extensions = extensions;
|
|
3382
3547
|
}
|
|
3383
3548
|
/**
|
|
3384
3549
|
* Materialize a CSG IR tree against the given parameter environment.
|
|
@@ -3507,7 +3672,8 @@ var Evaluator = class {
|
|
|
3507
3672
|
const result = dispatch(node, {
|
|
3508
3673
|
env,
|
|
3509
3674
|
tolerance: this.defaultTolerance,
|
|
3510
|
-
evalNode: (child) => this.evaluateInner(child, env)
|
|
3675
|
+
evalNode: (child) => this.evaluateInner(child, env),
|
|
3676
|
+
extensions: this.extensions
|
|
3511
3677
|
});
|
|
3512
3678
|
if (!result.ok) return result;
|
|
3513
3679
|
const shape = result.value;
|
|
@@ -3635,6 +3801,11 @@ function rebuildChildren(n, pred, repl, memo) {
|
|
|
3635
3801
|
});
|
|
3636
3802
|
case "Compound": return compound$1(n.children.map((c) => walk(c, pred, repl, memo)));
|
|
3637
3803
|
case "Instance": return instance$1(walk(n.source, pred, repl, memo), n.placements, n.fuse);
|
|
3804
|
+
case "Extension": return extension(n.name, n.output, {
|
|
3805
|
+
children: n.children.map((c) => walk(c, pred, repl, memo)),
|
|
3806
|
+
params: n.params,
|
|
3807
|
+
data: n.data
|
|
3808
|
+
});
|
|
3638
3809
|
case "Extrude":
|
|
3639
3810
|
case "Revolve":
|
|
3640
3811
|
case "Loft":
|
|
@@ -3699,7 +3870,8 @@ function childrenOf(n) {
|
|
|
3699
3870
|
case "Fillet":
|
|
3700
3871
|
case "Chamfer":
|
|
3701
3872
|
case "Shell": return [n.target];
|
|
3702
|
-
case "Compound":
|
|
3873
|
+
case "Compound":
|
|
3874
|
+
case "Extension": return n.children;
|
|
3703
3875
|
case "Instance": return [n.source];
|
|
3704
3876
|
case "Extrude":
|
|
3705
3877
|
case "Revolve": return [n.profile];
|
|
@@ -3723,11 +3895,11 @@ function toJSON(node) {
|
|
|
3723
3895
|
};
|
|
3724
3896
|
const root = emitNode(node, ctx);
|
|
3725
3897
|
return ctx.defs.length > 0 ? {
|
|
3726
|
-
csgVersion:
|
|
3898
|
+
csgVersion: 9,
|
|
3727
3899
|
defs: ctx.defs,
|
|
3728
3900
|
root
|
|
3729
3901
|
} : {
|
|
3730
|
-
csgVersion:
|
|
3902
|
+
csgVersion: 9,
|
|
3731
3903
|
root
|
|
3732
3904
|
};
|
|
3733
3905
|
}
|
|
@@ -4000,7 +4172,18 @@ function featureToJson(n, ctx) {
|
|
|
4000
4172
|
default: return;
|
|
4001
4173
|
}
|
|
4002
4174
|
}
|
|
4175
|
+
function extensionToJson(n, ctx) {
|
|
4176
|
+
return {
|
|
4177
|
+
kind: "Extension",
|
|
4178
|
+
name: n.name,
|
|
4179
|
+
output: n.output,
|
|
4180
|
+
children: n.children.map((c) => emitNode(c, ctx)),
|
|
4181
|
+
params: Object.fromEntries(Object.entries(n.params).map(([k, e]) => [k, exprToJson(e)])),
|
|
4182
|
+
data: n.data
|
|
4183
|
+
};
|
|
4184
|
+
}
|
|
4003
4185
|
function nodeToJson(n, ctx) {
|
|
4186
|
+
if (n.kind === "Extension") return extensionToJson(n, ctx);
|
|
4004
4187
|
if (n.kind === "Color") return {
|
|
4005
4188
|
kind: "Color",
|
|
4006
4189
|
target: emitNode(n.target, ctx),
|
|
@@ -4067,7 +4250,7 @@ function readVec2(v, where) {
|
|
|
4067
4250
|
function fromJSON(envelope) {
|
|
4068
4251
|
if (!isObj(envelope)) return bad("input is not an object");
|
|
4069
4252
|
const v = envelope["csgVersion"];
|
|
4070
|
-
if (typeof v !== "number" || !Number.isInteger(v) || v < MIN_CSG_VERSION || v >
|
|
4253
|
+
if (typeof v !== "number" || !Number.isInteger(v) || v < MIN_CSG_VERSION || v > 9) return bad(`unsupported csgVersion ${String(v)} (expected ${MIN_CSG_VERSION}..9)`);
|
|
4071
4254
|
const rawDefs = envelope["defs"];
|
|
4072
4255
|
const defs = [];
|
|
4073
4256
|
if (rawDefs !== void 0) {
|
|
@@ -4159,15 +4342,15 @@ function readOptTolerance(j) {
|
|
|
4159
4342
|
if (t === void 0 || t === null) return require_errors.ok(void 0);
|
|
4160
4343
|
return isNumber$1(t) ? require_errors.ok(t) : bad("tolerance: not a finite number");
|
|
4161
4344
|
}
|
|
4345
|
+
function readRef(ref, defs) {
|
|
4346
|
+
if (!isNumber$1(ref) || !Number.isInteger(ref) || ref < 0) return bad("$ref: expected a non-negative integer def index");
|
|
4347
|
+
const node = defs[ref];
|
|
4348
|
+
if (node === void 0) return bad(`$ref: ${ref} is out of range (forward refs are rejected)`);
|
|
4349
|
+
return require_errors.ok(node);
|
|
4350
|
+
}
|
|
4162
4351
|
function readNode(j, defs) {
|
|
4163
4352
|
if (!isObj(j)) return bad("node: not an object");
|
|
4164
|
-
|
|
4165
|
-
if (ref !== void 0) {
|
|
4166
|
-
if (!isNumber$1(ref) || !Number.isInteger(ref) || ref < 0) return bad("$ref: expected a non-negative integer def index");
|
|
4167
|
-
const node = defs[ref];
|
|
4168
|
-
if (node === void 0) return bad(`$ref: ${ref} is out of range (forward refs are rejected)`);
|
|
4169
|
-
return require_errors.ok(node);
|
|
4170
|
-
}
|
|
4353
|
+
if (j["$ref"] !== void 0) return readRef(j["$ref"], defs);
|
|
4171
4354
|
const kind = j["kind"];
|
|
4172
4355
|
switch (kind) {
|
|
4173
4356
|
case "Box":
|
|
@@ -4201,6 +4384,7 @@ function readNode(j, defs) {
|
|
|
4201
4384
|
case "Fillet": return readFillet(j, defs);
|
|
4202
4385
|
case "Chamfer": return readChamfer(j, defs);
|
|
4203
4386
|
case "Shell": return readShell(j, defs);
|
|
4387
|
+
case "Extension": return readExtension(j, defs);
|
|
4204
4388
|
default: return bad(`unknown node kind: ${String(kind)}`);
|
|
4205
4389
|
}
|
|
4206
4390
|
}
|
|
@@ -4612,6 +4796,34 @@ function readCompound(j, defs) {
|
|
|
4612
4796
|
function isMatrix4x4(v) {
|
|
4613
4797
|
return Array.isArray(v) && v.length === 4 && v.every((row) => Array.isArray(row) && row.length === 4 && row.every(isNumber$1));
|
|
4614
4798
|
}
|
|
4799
|
+
function readExtensionParams(j) {
|
|
4800
|
+
if (j === void 0) return require_errors.ok({});
|
|
4801
|
+
if (!isObj(j)) return bad("Extension.params: not an object");
|
|
4802
|
+
const entries = [];
|
|
4803
|
+
for (const [key, raw] of Object.entries(j)) {
|
|
4804
|
+
const e = readExpr(raw);
|
|
4805
|
+
if (!e.ok) return e;
|
|
4806
|
+
entries.push([key, e.value]);
|
|
4807
|
+
}
|
|
4808
|
+
return require_errors.ok(Object.fromEntries(entries));
|
|
4809
|
+
}
|
|
4810
|
+
function readExtension(j, defs) {
|
|
4811
|
+
const name = j["name"];
|
|
4812
|
+
if (!isString(name) || name.length === 0) return bad("Extension.name: expected a non-empty string");
|
|
4813
|
+
const output = j["output"];
|
|
4814
|
+
if (!isOutputKind(output)) return bad(`Extension.output: ${String(output)}`);
|
|
4815
|
+
const children = j["children"] === void 0 ? require_errors.ok([]) : readNodeArray(j["children"], "Extension.children", defs);
|
|
4816
|
+
if (!children.ok) return children;
|
|
4817
|
+
const params = readExtensionParams(j["params"]);
|
|
4818
|
+
if (!params.ok) return params;
|
|
4819
|
+
const data = canonicalJson(j["data"] ?? null, "Extension.data");
|
|
4820
|
+
if (!data.ok) return bad(data.error);
|
|
4821
|
+
return require_errors.ok(extension(name, output, {
|
|
4822
|
+
children: children.value,
|
|
4823
|
+
params: params.value,
|
|
4824
|
+
data: data.value
|
|
4825
|
+
}));
|
|
4826
|
+
}
|
|
4615
4827
|
function readInstance(j, defs) {
|
|
4616
4828
|
const source = readNode(j["source"], defs);
|
|
4617
4829
|
if (!source.ok) return source;
|
|
@@ -4718,6 +4930,7 @@ function rewriteNode(n) {
|
|
|
4718
4930
|
case "Mirror": return optimizeTransform(n);
|
|
4719
4931
|
case "Compound": return compound$1(n.children.map(optimizeNode).filter((c) => c.kind !== "Empty"));
|
|
4720
4932
|
case "Instance": return instance$1(optimizeNode(n.source), n.placements, n.fuse);
|
|
4933
|
+
case "Extension": return optimizeExtension(n);
|
|
4721
4934
|
case "Extrude":
|
|
4722
4935
|
case "Revolve":
|
|
4723
4936
|
case "Loft":
|
|
@@ -4747,6 +4960,13 @@ function optimizeFeature(n) {
|
|
|
4747
4960
|
case "Shell": return shell$1(optimizeNode(n.target), n.refs, foldExpr(n.thickness));
|
|
4748
4961
|
}
|
|
4749
4962
|
}
|
|
4963
|
+
function optimizeExtension(n) {
|
|
4964
|
+
return extension(n.name, n.output, {
|
|
4965
|
+
children: n.children.map(optimizeNode),
|
|
4966
|
+
params: Object.fromEntries(Object.entries(n.params).map(([k, e]) => [k, foldExpr(e)])),
|
|
4967
|
+
data: n.data
|
|
4968
|
+
});
|
|
4969
|
+
}
|
|
4750
4970
|
function optimizeTransform(n) {
|
|
4751
4971
|
switch (n.kind) {
|
|
4752
4972
|
case "Rotate": return rotate$1(optimizeNode(n.target), foldExpr(n.angle), {
|
|
@@ -8770,7 +8990,7 @@ var patterns_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
|
|
|
8770
8990
|
//#endregion
|
|
8771
8991
|
//#region src/ns/csg.ts
|
|
8772
8992
|
var csg_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
|
|
8773
|
-
CSG_VERSION: () =>
|
|
8993
|
+
CSG_VERSION: () => 9,
|
|
8774
8994
|
Evaluator: () => Evaluator,
|
|
8775
8995
|
add: () => add$1,
|
|
8776
8996
|
arbitraryClosedProfile: () => arbitraryClosedProfile,
|
|
@@ -8802,6 +9022,7 @@ var csg_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
|
|
|
8802
9022
|
emptyFace: () => emptyFace,
|
|
8803
9023
|
emptySolid: () => emptySolid,
|
|
8804
9024
|
emptyWire: () => emptyWire,
|
|
9025
|
+
extension: () => extension,
|
|
8805
9026
|
extrude: () => extrude$1,
|
|
8806
9027
|
fillet: () => fillet$1,
|
|
8807
9028
|
foldExpr: () => foldExpr,
|