brepjs 18.123.0 → 18.124.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.
Files changed (81) hide show
  1. package/dist/2d.cjs +6 -6
  2. package/dist/2d.js +6 -6
  3. package/dist/{adjacencyFns-YdbeJQOQ.cjs → adjacencyFns-BJ6jcQ-N.cjs} +2 -2
  4. package/dist/{adjacencyFns-BjQlu_ta.js → adjacencyFns-CnehwLNj.js} +2 -2
  5. package/dist/{blueprint-D15K1m3D.js → blueprint-BGWbpQ-w.js} +5 -5
  6. package/dist/{blueprint-DRdJngbT.cjs → blueprint-BSfG0Uik.cjs} +5 -5
  7. package/dist/{blueprintFns-BYBj5nAC.js → blueprintFns-Bt1hKlL7.js} +2 -2
  8. package/dist/{blueprintFns-DjhpKV3P.cjs → blueprintFns-C0-nGqlW.cjs} +2 -2
  9. package/dist/{blueprintSketcher-BrqUJtEJ.js → blueprintSketcher-BTGRoQ_G.js} +9 -5
  10. package/dist/{blueprintSketcher-BwrJrjxs.cjs → blueprintSketcher-Bd5ZS9p6.cjs} +9 -5
  11. package/dist/{boolean2D-DzfMpynm.cjs → boolean2D-Cr6oLsbf.cjs} +4 -4
  12. package/dist/{boolean2D-D68EbJPa.js → boolean2D-zZ9-qR5a.js} +4 -4
  13. package/dist/brepjs.cjs +27 -27
  14. package/dist/brepjs.js +27 -27
  15. package/dist/{cameraFns-BcMH4Nmd.js → cameraFns-CGMawqfi.js} +3 -3
  16. package/dist/{cameraFns-BoJrdghV.cjs → cameraFns-j2I9G3L_.cjs} +3 -3
  17. package/dist/core.cjs +2 -2
  18. package/dist/core.js +2 -2
  19. package/dist/{cornerFinder-Cbx8rGjg.cjs → cornerFinder-CPwSLgpM.cjs} +1 -1
  20. package/dist/{cornerFinder-DG-lilYY.js → cornerFinder-CaXBdZz9.js} +1 -1
  21. package/dist/{curveFns-BuqWKNvF.cjs → curveFns-BBLaLG1U.cjs} +1 -1
  22. package/dist/{curveFns-o05jCVtr.js → curveFns-BoHbhtqX.js} +1 -1
  23. package/dist/{drawFns-q-Ooe6d4.js → drawFns-BrRbAeYB.js} +12 -12
  24. package/dist/{drawFns-BiOerjkt.cjs → drawFns-DOkSdo8E.cjs} +12 -12
  25. package/dist/{faceFns-Dgiv4Jhb.js → faceFns-Ce7Fq6j5.js} +2 -2
  26. package/dist/{faceFns-DeTAgvu_.cjs → faceFns-UozswcwP.cjs} +2 -2
  27. package/dist/{healingFns-BDfz7tDU.js → healingFns-Dn0EFSHm.js} +4 -4
  28. package/dist/{healingFns-BvB2hVj5.cjs → healingFns-mKogaVOk.cjs} +4 -4
  29. package/dist/{helpers-DEN_M6k_.js → helpers-CZsK8STz.js} +6 -6
  30. package/dist/{helpers-B6br6W9E.cjs → helpers-DuTAcGVX.cjs} +6 -6
  31. package/dist/{importFns--rKvxKFm.js → importFns-CE4byS-8.js} +2 -2
  32. package/dist/{importFns-3RGNUkR-.cjs → importFns-Ch2YwieP.cjs} +2 -2
  33. package/dist/io.cjs +2 -2
  34. package/dist/io.js +2 -2
  35. package/dist/{loftFns-Cufcyuqt.cjs → loftFns-BYiUcAxk.cjs} +1 -1
  36. package/dist/{loftFns-BVkAi4-a.js → loftFns-DQVg8qxM.js} +1 -1
  37. package/dist/{measureFns-DcgzCTfb.js → measureFns-BbLLBg5q.js} +3 -3
  38. package/dist/{measureFns-CG3O8Mzp.cjs → measureFns-Cao9gY1L.cjs} +3 -3
  39. package/dist/measurement.cjs +1 -1
  40. package/dist/measurement.js +1 -1
  41. package/dist/{meshFns-DhFraVIQ.js → meshFns-B6NveFwc.js} +3 -3
  42. package/dist/{meshFns-BLqWnKyU.cjs → meshFns-CnYIUU9b.cjs} +3 -3
  43. package/dist/operations.cjs +2 -2
  44. package/dist/operations.js +2 -2
  45. package/dist/{originTrackingFns-4c8Sw44l.js → originTrackingFns-DXcggmgf.js} +2 -2
  46. package/dist/{originTrackingFns-7tC4igk0.cjs → originTrackingFns-uz38yuMp.cjs} +2 -2
  47. package/dist/{primitiveFns-D695dXsj.js → primitiveFns-CmmTWOkO.js} +4 -4
  48. package/dist/{primitiveFns-CFibG_KT.cjs → primitiveFns-DmEPf6av.cjs} +4 -4
  49. package/dist/projection.cjs +1 -1
  50. package/dist/projection.js +1 -1
  51. package/dist/query.cjs +2 -2
  52. package/dist/query.js +2 -2
  53. package/dist/{refResolveFns-u-3Okd3D.cjs → refResolveFns-CnPEaqHw.cjs} +6 -6
  54. package/dist/{refResolveFns-BwEBGVGr.js → refResolveFns-DqY7Cd00.js} +6 -6
  55. package/dist/{shapeFns-BqmsBoBy.cjs → shapeFns-BLZ1dDSz.cjs} +2 -2
  56. package/dist/{shapeFns-BvPYFFCd.js → shapeFns-mYczuWOy.js} +2 -2
  57. package/dist/shapeRef.cjs +1 -1
  58. package/dist/shapeRef.js +1 -1
  59. package/dist/{shapeTypes-D9TjxkdO.cjs → shapeTypes-DZKuRt24.cjs} +384 -13
  60. package/dist/{shapeTypes-u60nsijI.js → shapeTypes-bHlssytH.js} +384 -13
  61. package/dist/sketching.cjs +3 -3
  62. package/dist/sketching.js +3 -3
  63. package/dist/{solidBuilders-BRrbDIpu.cjs → solidBuilders-5tA9O1SM.cjs} +5 -5
  64. package/dist/{solidBuilders-DOafY0bO.js → solidBuilders-9s-j-ZiW.js} +5 -5
  65. package/dist/{surfaceBuilders-B4Yn-xOW.cjs → surfaceBuilders-0x7j0ibk.cjs} +3 -3
  66. package/dist/{surfaceBuilders-BnkTJeD4.js → surfaceBuilders-B7UnwkQz.js} +3 -3
  67. package/dist/text.cjs +2 -2
  68. package/dist/text.js +2 -2
  69. package/dist/{textBlueprints-DPldA7fV.cjs → textBlueprints-BPbIpA4-.cjs} +7 -7
  70. package/dist/{textBlueprints-B1JdMBb0.js → textBlueprints-DE3M-E9o.js} +7 -7
  71. package/dist/{textMetrics-YfWZZTIk.js → textMetrics-D3Bly1w4.js} +1 -1
  72. package/dist/{textMetrics-19pWWvqT.cjs → textMetrics-rRuWxQG_.cjs} +1 -1
  73. package/dist/{threadFns-B2YuXmV6.js → threadFns-BAjFNk2_.js} +7 -7
  74. package/dist/{threadFns-BDMSW3Od.cjs → threadFns-BMT6ziG_.cjs} +7 -7
  75. package/dist/topology.cjs +9 -9
  76. package/dist/topology.js +9 -9
  77. package/dist/{topologyQueryFns-DiuoNPqI.js → topologyQueryFns-DVhWxBwT.js} +1 -1
  78. package/dist/{topologyQueryFns-CUbx6oRW.cjs → topologyQueryFns-DZUpJz2p.cjs} +1 -1
  79. package/dist/{validityTypes-phPr-BRp.js → validityTypes-19mfqWVv.js} +1 -1
  80. package/dist/{validityTypes-DuiGeQhe.cjs → validityTypes-CCnRq3A9.cjs} +1 -1
  81. package/package.json +1 -1
@@ -11762,7 +11762,7 @@ function meshVertices(shape) {
11762
11762
  function spinePath(spine, segments) {
11763
11763
  const shape = asShape$1(spine);
11764
11764
  const params = shape.node?.params;
11765
- const recorded = params?.["path"] ?? params?.["points"];
11765
+ const recorded = params?.["path"] ?? params?.["points"] ?? params?.["ring"];
11766
11766
  if (recorded && recorded.length >= 2) return recorded.map((p) => [
11767
11767
  p[0],
11768
11768
  p[1],
@@ -12109,12 +12109,21 @@ function makeSweepOps(module) {
12109
12109
  }),
12110
12110
  ...sweepFamilyEntries(module),
12111
12111
  draftPrism: (shape, face, _baseFace, height, angleDeg, fuse) => draftPrismOp(module, shape, face, height, angleDeg, fuse),
12112
- buildExtrusionLaw: (profile, length, endFactor) => ({
12113
- type: "extrusionLaw",
12114
- profile,
12115
- length,
12116
- endFactor
12117
- }),
12112
+ buildExtrusionLaw: (profile, length, endFactor) => {
12113
+ const law = {
12114
+ type: "extrusionLaw",
12115
+ profile,
12116
+ length,
12117
+ endFactor,
12118
+ Trim: (first, last, _tol) => ({
12119
+ ...law,
12120
+ trimFirst: first,
12121
+ trimLast: last
12122
+ }),
12123
+ delete: () => {}
12124
+ };
12125
+ return law;
12126
+ },
12118
12127
  loftBatch: () => notImplemented("loftBatch"),
12119
12128
  extrudeBatch: (entries) => entries.map((e) => extrudeOp(module, e.face, e.direction, e.length))
12120
12129
  };
@@ -14590,6 +14599,320 @@ function makeRepairOps(_module) {
14590
14599
  //#endregion
14591
14600
  //#region src/kernel/manifold/kernel2dNative.ts
14592
14601
  var CHORD_TOL = .004;
14602
+ /**
14603
+ * Closest parameter on a native curve to (x, y), in that curve's own
14604
+ * parametrization: signed distance for a line, angle for a conic, [0,1] for a
14605
+ * bezier. Exact where the geometry allows it, and a bounded golden-section
14606
+ * search where it does not (general ellipse, bezier) — both of which are
14607
+ * unimodal in distance over a single arc, so the search cannot land on a
14608
+ * spurious local minimum.
14609
+ */
14610
+ function closestParamOn(c, x, y) {
14611
+ if (c.k === "line") {
14612
+ const dx = c.p2[0] - c.p1[0];
14613
+ const dy = c.p2[1] - c.p1[1];
14614
+ const len = Math.hypot(dx, dy);
14615
+ if (len === 0) return 0;
14616
+ const t = ((x - c.p1[0]) * dx + (y - c.p1[1]) * dy) / len;
14617
+ return Math.min(Math.max(t, 0), len);
14618
+ }
14619
+ if (c.k === "conic") {
14620
+ const ru = Math.hypot(c.u[0], c.u[1]);
14621
+ const rv = Math.hypot(c.v[0], c.v[1]);
14622
+ if (Math.abs(ru - rv) < 1e-12 && Math.abs(c.u[0] * c.v[0] + c.u[1] * c.v[1]) < 1e-12) {
14623
+ const px = x - c.c[0];
14624
+ const py = y - c.c[1];
14625
+ return clampToArc(Math.atan2((px * c.v[0] + py * c.v[1]) / (rv * rv || 1), (px * c.u[0] + py * c.u[1]) / (ru * ru || 1)), c.a0, c.a1);
14626
+ }
14627
+ return bracketedMin(c.a0, c.a1, (t) => distSqAt(c, t, x, y), stepsFor(c, CHORD_TOL));
14628
+ }
14629
+ return bracketedMin(0, 1, (t) => distSqAt(c, t, x, y), stepsFor(c, CHORD_TOL));
14630
+ }
14631
+ /**
14632
+ * Global minimum of f over [lo, hi].
14633
+ *
14634
+ * Distance to an eccentric ellipse or a cubic-or-higher bezier is NOT unimodal
14635
+ * — a point inside a flat ellipse has one minimum per end, and a self-nearing
14636
+ * bezier can have several. So scan coarsely for the best sample, then refine
14637
+ * only inside the bracket around it, which is unimodal by construction.
14638
+ */
14639
+ function bracketedMin(lo, hi, f, steps) {
14640
+ const N = Math.max(8, steps);
14641
+ let bestI = 0;
14642
+ let best = Infinity;
14643
+ for (let i = 0; i <= N; i++) {
14644
+ const v = f(lo + (hi - lo) * i / N);
14645
+ if (v < best) {
14646
+ best = v;
14647
+ bestI = i;
14648
+ }
14649
+ }
14650
+ return goldenMin(lo + (hi - lo) * Math.max(0, bestI - 1) / N, lo + (hi - lo) * Math.min(N, bestI + 1) / N, f);
14651
+ }
14652
+ /** Wrap an angle into [a0, a1] where possible, else clamp to the nearer end. */
14653
+ function clampToArc(a, a0, a1) {
14654
+ if (a1 - a0 >= 2 * Math.PI - 1e-12) return a;
14655
+ let t = a;
14656
+ while (t < a0) t += 2 * Math.PI;
14657
+ while (t > a0 + 2 * Math.PI) t -= 2 * Math.PI;
14658
+ if (t <= a1) return t;
14659
+ return t - a1 < a0 + 2 * Math.PI - t ? a1 : a0;
14660
+ }
14661
+ function distSqAt(c, t, x, y) {
14662
+ const p = nativeAt(c, t);
14663
+ const dx = p[0] - x;
14664
+ const dy = p[1] - y;
14665
+ return dx * dx + dy * dy;
14666
+ }
14667
+ function nativeAt(c, t) {
14668
+ if (c.k === "line") {
14669
+ const dx = c.p2[0] - c.p1[0];
14670
+ const dy = c.p2[1] - c.p1[1];
14671
+ const len = Math.hypot(dx, dy) || 1;
14672
+ return [c.p1[0] + dx * t / len, c.p1[1] + dy * t / len];
14673
+ }
14674
+ if (c.k === "bezier") return bezierAt(c.pts, t);
14675
+ return [c.c[0] + c.u[0] * Math.cos(t) + c.v[0] * Math.sin(t), c.c[1] + c.u[1] * Math.cos(t) + c.v[1] * Math.sin(t)];
14676
+ }
14677
+ /** Golden-section minimum of a unimodal f over [lo, hi]. */
14678
+ function goldenMin(lo, hi, f) {
14679
+ const phi = (Math.sqrt(5) - 1) / 2;
14680
+ let a = lo;
14681
+ let b = hi;
14682
+ let c1 = b - phi * (b - a);
14683
+ let d1 = a + phi * (b - a);
14684
+ for (let i = 0; i < 80 && b - a > 1e-12; i++) if (f(c1) < f(d1)) {
14685
+ b = d1;
14686
+ d1 = c1;
14687
+ c1 = b - phi * (b - a);
14688
+ } else {
14689
+ a = c1;
14690
+ c1 = d1;
14691
+ d1 = a + phi * (b - a);
14692
+ }
14693
+ return (a + b) / 2;
14694
+ }
14695
+ /**
14696
+ * Curve-curve intersection over the shim's own polyline discretization.
14697
+ *
14698
+ * Manifold has no exact curve algebra, so candidate crossings come from
14699
+ * segment pairs and are then refined by alternating projection: each point is
14700
+ * projected onto the other curve until it stops moving. That converges to a
14701
+ * genuine crossing when the segments really cross, and to the closest approach
14702
+ * when they only nearly touch — which the tolerance check then rejects.
14703
+ */
14704
+ function intersectNative(a, b, tol) {
14705
+ const pa = sample(a);
14706
+ const pb = sample(b);
14707
+ const points = [];
14708
+ const params = [];
14709
+ for (let i = 0; i + 1 < pa.length; i++) for (let j = 0; j + 1 < pb.length; j++) {
14710
+ const hit = segSeg(pa[i], pa[i + 1], pb[j], pb[j + 1]);
14711
+ if (!hit) continue;
14712
+ let p = hit;
14713
+ for (let k = 0; k < 24; k++) {
14714
+ const qa = nativeAt(a, closestParamOn(a, p[0], p[1]));
14715
+ const qb = nativeAt(b, closestParamOn(b, qa[0], qa[1]));
14716
+ const moved = Math.hypot(qb[0] - p[0], qb[1] - p[1]);
14717
+ p = [(qa[0] + qb[0]) / 2, (qa[1] + qb[1]) / 2];
14718
+ if (moved < 1e-12) break;
14719
+ }
14720
+ const ta = closestParamOn(a, p[0], p[1]);
14721
+ const tb = closestParamOn(b, p[0], p[1]);
14722
+ const d = sub2(nativeAt(a, ta), nativeAt(b, tb));
14723
+ if (Math.hypot(d[0], d[1]) > Math.max(tol, 1e-7)) continue;
14724
+ if (points.some((q) => Math.hypot(q[0] - p[0], q[1] - p[1]) <= Math.max(tol, 1e-9))) continue;
14725
+ points.push(p);
14726
+ params.push(ta);
14727
+ }
14728
+ return dropOverlapPoints(points, params, contactRuns(a, b, tol, points, params), tol);
14729
+ }
14730
+ /**
14731
+ * Spans of `a` that lie on `b` within tolerance.
14732
+ *
14733
+ * Coincident spans and tangential touches never register as segment crossings —
14734
+ * collinear chords are parallel, and a tangency grazes without passing through.
14735
+ * Walking a's parameter range finds both: a run with length is a common
14736
+ * segment, an isolated dip is a tangential point (appended to `points`).
14737
+ */
14738
+ function contactRuns(a, b, tol, points, params) {
14739
+ const { first, last } = nativeBounds(a);
14740
+ const M = 192;
14741
+ const on = [];
14742
+ for (let i = 0; i <= M; i++) {
14743
+ const p = nativeAt(a, first + (last - first) * i / M);
14744
+ const tb = closestParamOn(b, p[0], p[1]);
14745
+ on.push(Math.sqrt(distSqAt(b, tb, p[0], p[1])) <= Math.max(tol, 1e-9));
14746
+ }
14747
+ const segments = [];
14748
+ let runStart = -1;
14749
+ for (let i = 0; i <= 193; i++) {
14750
+ const inside = i <= M && on[i] === true;
14751
+ if (inside && runStart < 0) runStart = i;
14752
+ if (inside || runStart < 0) continue;
14753
+ const t0 = first + (last - first) * runStart / M;
14754
+ const t1 = first + (last - first) * (i - 1) / M;
14755
+ let physical = 0;
14756
+ for (let k = runStart; k < i - 1; k++) {
14757
+ const q0 = nativeAt(a, first + (last - first) * k / M);
14758
+ const q1 = nativeAt(a, first + (last - first) * (k + 1) / M);
14759
+ physical += Math.hypot(q1[0] - q0[0], q1[1] - q0[1]);
14760
+ }
14761
+ if (physical > Math.max(tol, CHORD_TOL)) segments.push(trimNative(a, t0, t1));
14762
+ else {
14763
+ const p = nativeAt(a, t0);
14764
+ if (!points.some((q) => Math.hypot(q[0] - p[0], q[1] - p[1]) <= Math.max(tol, 1e-9))) {
14765
+ points.push(p);
14766
+ params.push(t0);
14767
+ }
14768
+ }
14769
+ runStart = -1;
14770
+ }
14771
+ return segments;
14772
+ }
14773
+ /**
14774
+ * A coincident span makes the crossing search fire at every sampled chord pair
14775
+ * along it — 79 "intersections" for two identical circles. Those points are the
14776
+ * overlap, not isolated crossings, so drop any that land on a reported segment.
14777
+ */
14778
+ function dropOverlapPoints(points, params, segments, tol) {
14779
+ if (segments.length === 0) return {
14780
+ points,
14781
+ params,
14782
+ segments
14783
+ };
14784
+ const keep = [];
14785
+ for (let i = 0; i < points.length; i++) {
14786
+ const p = points[i];
14787
+ if (!segments.some((seg) => {
14788
+ const t = closestParamOn(seg, p[0], p[1]);
14789
+ return Math.sqrt(distSqAt(seg, t, p[0], p[1])) <= Math.max(tol, CHORD_TOL);
14790
+ })) keep.push(i);
14791
+ }
14792
+ return {
14793
+ points: keep.map((i) => points[i]),
14794
+ params: keep.map((i) => params[i]),
14795
+ segments
14796
+ };
14797
+ }
14798
+ function sub2(a, b) {
14799
+ return [a[0] - b[0], a[1] - b[1]];
14800
+ }
14801
+ /** Intersection point of two segments, or null when they do not cross. */
14802
+ function segSeg(p1, p2, p3, p4) {
14803
+ const d1x = p2[0] - p1[0];
14804
+ const d1y = p2[1] - p1[1];
14805
+ const d2x = p4[0] - p3[0];
14806
+ const d2y = p4[1] - p3[1];
14807
+ const den = d1x * d2y - d1y * d2x;
14808
+ if (Math.abs(den) < 1e-15) return null;
14809
+ const t = ((p3[0] - p1[0]) * d2y - (p3[1] - p1[1]) * d2x) / den;
14810
+ const u = ((p3[0] - p1[0]) * d1y - (p3[1] - p1[1]) * d1x) / den;
14811
+ if (t < -1e-9 || t > 1.000000001 || u < -1e-9 || u > 1.000000001) return null;
14812
+ return [p1[0] + d1x * t, p1[1] + d1y * t];
14813
+ }
14814
+ /**
14815
+ * How many parameter steps resolve `c` to within `tol`.
14816
+ *
14817
+ * A fixed step count is wrong at both ends: wasteful on a short line and blind
14818
+ * to a feature narrower than one interval on a long or wiggly curve. Deriving
14819
+ * it from the curve's own extent — control-polygon length for a bezier, arc
14820
+ * length for a conic — ties the resolution to the geometry and the caller's
14821
+ * tolerance, the same way conicSegments already does for discretization.
14822
+ *
14823
+ * This bounds the miss, it does not remove it: any sampling scheme can still
14824
+ * step over a feature narrower than its own interval. Exactly resolving that
14825
+ * needs polynomial root-finding on the distance function, which is a different
14826
+ * and much larger piece of machinery than this shim carries.
14827
+ */
14828
+ function stepsFor(c, tol) {
14829
+ const t = Math.max(tol, 1e-9);
14830
+ if (c.k === "line") return 2;
14831
+ let extent;
14832
+ if (c.k === "conic") {
14833
+ const r = Math.max(Math.hypot(c.u[0], c.u[1]), Math.hypot(c.v[0], c.v[1]));
14834
+ extent = Math.abs(c.a1 - c.a0) * r;
14835
+ } else {
14836
+ extent = 0;
14837
+ for (let i = 0; i + 1 < c.pts.length; i++) {
14838
+ const a = c.pts[i];
14839
+ const b = c.pts[i + 1];
14840
+ extent += Math.hypot(b[0] - a[0], b[1] - a[1]);
14841
+ }
14842
+ }
14843
+ return Math.min(2e4, Math.max(64, Math.ceil(2 * extent / t)));
14844
+ }
14845
+ /** Parameter range of a native curve, matching getCurve2dBounds. */
14846
+ function nativeBounds(c) {
14847
+ if (c.k === "conic") return {
14848
+ first: c.a0,
14849
+ last: c.a1
14850
+ };
14851
+ if (c.k === "line") return {
14852
+ first: 0,
14853
+ last: Math.hypot(c.p2[0] - c.p1[0], c.p2[1] - c.p1[1])
14854
+ };
14855
+ return {
14856
+ first: 0,
14857
+ last: 1
14858
+ };
14859
+ }
14860
+ /** Restrict a native curve to [from, to] in its own parametrization. */
14861
+ function trimNative(c, from, to) {
14862
+ if (c.k === "conic") return {
14863
+ ...c,
14864
+ a0: from,
14865
+ a1: to
14866
+ };
14867
+ if (c.k === "line") {
14868
+ const p1 = nativeAt(c, from);
14869
+ const p2 = nativeAt(c, to);
14870
+ return {
14871
+ ...c,
14872
+ p1,
14873
+ p2
14874
+ };
14875
+ }
14876
+ const right = deCasteljauRight(c.pts, from);
14877
+ const span = 1 - from;
14878
+ const t2 = span <= 1e-15 ? 1 : (to - from) / span;
14879
+ return {
14880
+ ...c,
14881
+ pts: deCasteljauLeft(right, t2)
14882
+ };
14883
+ }
14884
+ function deCasteljauLeft(pts, t) {
14885
+ const out = [];
14886
+ let cur = pts.map((p) => [p[0], p[1]]);
14887
+ out.push(cur[0]);
14888
+ while (cur.length > 1) {
14889
+ const next = [];
14890
+ for (let i = 0; i + 1 < cur.length; i++) {
14891
+ const a = cur[i];
14892
+ const b = cur[i + 1];
14893
+ next.push([a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t]);
14894
+ }
14895
+ cur = next;
14896
+ out.push(cur[0]);
14897
+ }
14898
+ return out;
14899
+ }
14900
+ function deCasteljauRight(pts, t) {
14901
+ const out = [];
14902
+ let cur = pts.map((p) => [p[0], p[1]]);
14903
+ out.push(cur[cur.length - 1]);
14904
+ while (cur.length > 1) {
14905
+ const next = [];
14906
+ for (let i = 0; i + 1 < cur.length; i++) {
14907
+ const a = cur[i];
14908
+ const b = cur[i + 1];
14909
+ next.push([a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t]);
14910
+ }
14911
+ cur = next;
14912
+ out.push(cur[cur.length - 1]);
14913
+ }
14914
+ return out.reverse();
14915
+ }
14593
14916
  function isNative(x) {
14594
14917
  return !!x && typeof x === "object" && x.__nativeC2d === true;
14595
14918
  }
@@ -15151,14 +15474,62 @@ function makeNativeKernel2DOps(module, occt) {
15151
15474
  },
15152
15475
  makeBSpline2d: (points, options) => occtOr("makeBSpline2d").makeBSpline2d(points, options),
15153
15476
  offsetCurve2d: (c, offset) => occtOr("offsetCurve2d").offsetCurve2d(toOcct(c), offset),
15154
- intersectCurves2d: (c1, c2, tol) => occtOr("intersectCurves2d").intersectCurves2d(toOcct(c1), toOcct(c2), tol),
15155
- projectPointOnCurve2d: (c, x, y) => occtOr("projectPointOnCurve2d").projectPointOnCurve2d(toOcct(c), x, y),
15156
- distanceBetweenCurves2d: (c1, c2, s1, e1, s2, e2) => occtOr("distanceBetweenCurves2d").distanceBetweenCurves2d(toOcct(c1), toOcct(c2), s1, e1, s2, e2),
15477
+ intersectCurves2d: (c1, c2, tol) => {
15478
+ if (!isNative(c1) || !isNative(c2)) return occtOr("intersectCurves2d").intersectCurves2d(toOcct(c1), toOcct(c2), tol);
15479
+ const { points, segments } = intersectNative(asC(c1), asC(c2), tol);
15480
+ return {
15481
+ points: points.map((p) => [p[0], p[1]]),
15482
+ segments
15483
+ };
15484
+ },
15485
+ projectPointOnCurve2d: (c, x, y) => {
15486
+ if (!isNative(c)) return occtOr("projectPointOnCurve2d").projectPointOnCurve2d(toOcct(c), x, y);
15487
+ const n = asC(c);
15488
+ const param = closestParamOn(n, x, y);
15489
+ return {
15490
+ param,
15491
+ distance: Math.sqrt(distSqAt(n, param, x, y))
15492
+ };
15493
+ },
15494
+ distanceBetweenCurves2d: (c1, c2, s1, e1, s2, e2) => {
15495
+ if (!isNative(c1) || !isNative(c2)) return occtOr("distanceBetweenCurves2d").distanceBetweenCurves2d(toOcct(c1), toOcct(c2), s1, e1, s2, e2);
15496
+ const a = asC(c1);
15497
+ const b = asC(c2);
15498
+ const N = 256;
15499
+ let best = Infinity;
15500
+ for (let i = 0; i <= N; i++) {
15501
+ const p = nativeAt(a, s1 + (e1 - s1) * i / N);
15502
+ const q = closestParamOn(b, p[0], p[1]);
15503
+ best = Math.min(best, Math.sqrt(distSqAt(b, Math.min(Math.max(q, Math.min(s2, e2)), Math.max(s2, e2)), p[0], p[1])));
15504
+ }
15505
+ return best;
15506
+ },
15157
15507
  approximateCurve2dAsBSpline: (c, tol, cont, maxSeg) => occtOr("approximateCurve2dAsBSpline").approximateCurve2dAsBSpline(toOcct(c), tol, cont, maxSeg),
15158
15508
  decomposeBSpline2dToBeziers: (c) => occtOr("decomposeBSpline2dToBeziers").decomposeBSpline2dToBeziers(toOcct(c)),
15159
- serializeCurve2d: (c) => occtOr("serializeCurve2d").serializeCurve2d(toOcct(c)),
15160
- deserializeCurve2d: (data) => occtOr("deserializeCurve2d").deserializeCurve2d(data),
15161
- splitCurve2d: (c, params) => occtOr("splitCurve2d").splitCurve2d(toOcct(c), params),
15509
+ serializeCurve2d: (c) => isNative(c) ? JSON.stringify({
15510
+ __nativeC2d: 1,
15511
+ c: asC(c)
15512
+ }) : occtOr("serializeCurve2d").serializeCurve2d(toOcct(c)),
15513
+ deserializeCurve2d: (data) => {
15514
+ if (data.startsWith("{\"__nativeC2d\"")) return {
15515
+ __nativeC2d: true,
15516
+ ...JSON.parse(data).c
15517
+ };
15518
+ return occtOr("deserializeCurve2d").deserializeCurve2d(data);
15519
+ },
15520
+ splitCurve2d: (c, params) => {
15521
+ if (!isNative(c)) return occtOr("splitCurve2d").splitCurve2d(toOcct(c), params);
15522
+ const n = asC(c);
15523
+ const { first, last } = nativeBounds(n);
15524
+ const cuts = [
15525
+ first,
15526
+ ...params.filter((t) => t > first && t < last).sort((a, b) => a - b),
15527
+ last
15528
+ ];
15529
+ const out = [];
15530
+ for (let i = 0; i + 1 < cuts.length; i++) out.push(trimNative(n, cuts[i] ?? 0, cuts[i + 1] ?? 0));
15531
+ return out;
15532
+ },
15162
15533
  getCurve2dEllipseData: (c) => occtOr("getCurve2dEllipseData").getCurve2dEllipseData(toOcct(c)),
15163
15534
  getCurve2dBezierPoles: (c) => occtOr("getCurve2dBezierPoles").getCurve2dBezierPoles(toOcct(c)),
15164
15535
  getCurve2dBezierDegree: (c) => occtOr("getCurve2dBezierDegree").getCurve2dBezierDegree(toOcct(c)),
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_blueprintSketcher = require("./blueprintSketcher-BwrJrjxs.cjs");
3
- const require_drawFns = require("./drawFns-BiOerjkt.cjs");
4
- const require_textBlueprints = require("./textBlueprints-DPldA7fV.cjs");
2
+ const require_blueprintSketcher = require("./blueprintSketcher-Bd5ZS9p6.cjs");
3
+ const require_drawFns = require("./drawFns-DOkSdo8E.cjs");
4
+ const require_textBlueprints = require("./textBlueprints-BPbIpA4-.cjs");
5
5
  //#region src/sketching.ts
6
6
  /**
7
7
  * brepjs/sketching — Sketcher, Drawing, and sketch-to-shape operations.
package/dist/sketching.js CHANGED
@@ -1,6 +1,6 @@
1
- import { n as BaseSketcher2d, t as BlueprintSketcher } from "./blueprintSketcher-BrqUJtEJ.js";
2
- import { A as sketchEllipse, C as DrawingPen, D as makeBaseBox, E as deserializeDrawing, F as sketchRectangle, I as sketchRoundedRectangle, L as FaceSketcher, M as sketchHelix, N as sketchParametricFunction, O as polysideInnerRadius, P as sketchPolysides, R as Sketcher, S as drawText, T as Drawing, _ as drawPolysides, a as drawingIntersect, b as drawSingleCircle, c as rotateDrawing, d as drawFaceOutline, f as drawProjection, g as drawPointsInterpolation, h as drawParametricFunction, i as drawingFuse, j as sketchFaceOffset, k as sketchCircle, l as scaleDrawing, m as drawEllipse, n as drawingCut, o as drawingToSketchOnPlane, p as drawCircle, r as drawingFillet, s as mirrorDrawing, t as drawingChamfer, u as translateDrawing, v as drawRectangle, w as draw, x as drawSingleEllipse, y as drawRoundedRectangle } from "./drawFns-q-Ooe6d4.js";
3
- import { a as Sketch, c as compoundSketchLoft, d as sketchFace, f as sketchLoft, h as sketchWires, i as Sketches, l as compoundSketchRevolve, m as sketchSweep, o as compoundSketchExtrude, p as sketchRevolve, s as compoundSketchFace, u as sketchExtrude, v as CompoundSketch } from "./textBlueprints-B1JdMBb0.js";
1
+ import { n as BaseSketcher2d, t as BlueprintSketcher } from "./blueprintSketcher-BTGRoQ_G.js";
2
+ import { A as sketchEllipse, C as DrawingPen, D as makeBaseBox, E as deserializeDrawing, F as sketchRectangle, I as sketchRoundedRectangle, L as FaceSketcher, M as sketchHelix, N as sketchParametricFunction, O as polysideInnerRadius, P as sketchPolysides, R as Sketcher, S as drawText, T as Drawing, _ as drawPolysides, a as drawingIntersect, b as drawSingleCircle, c as rotateDrawing, d as drawFaceOutline, f as drawProjection, g as drawPointsInterpolation, h as drawParametricFunction, i as drawingFuse, j as sketchFaceOffset, k as sketchCircle, l as scaleDrawing, m as drawEllipse, n as drawingCut, o as drawingToSketchOnPlane, p as drawCircle, r as drawingFillet, s as mirrorDrawing, t as drawingChamfer, u as translateDrawing, v as drawRectangle, w as draw, x as drawSingleEllipse, y as drawRoundedRectangle } from "./drawFns-BrRbAeYB.js";
3
+ import { a as Sketch, c as compoundSketchLoft, d as sketchFace, f as sketchLoft, h as sketchWires, i as Sketches, l as compoundSketchRevolve, m as sketchSweep, o as compoundSketchExtrude, p as sketchRevolve, s as compoundSketchFace, u as sketchExtrude, v as CompoundSketch } from "./textBlueprints-DE3M-E9o.js";
4
4
  //#region src/sketching.ts
5
5
  /**
6
6
  * brepjs/sketching — Sketcher, Drawing, and sketch-to-shape operations.
@@ -1,13 +1,13 @@
1
- const require_shapeTypes = require("./shapeTypes-D9TjxkdO.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-DZKuRt24.cjs");
2
2
  const require_errors = require("./errors-RHkKO5bZ.cjs");
3
- const require_topologyQueryFns = require("./topologyQueryFns-CUbx6oRW.cjs");
3
+ const require_topologyQueryFns = require("./topologyQueryFns-DZUpJz2p.cjs");
4
4
  const require_constants = require("./constants-BOVyEYGH.cjs");
5
5
  const require_vecOps = require("./vecOps-CCnJt-yH.cjs");
6
6
  const require_planeOps = require("./planeOps-VlFxtvzY.cjs");
7
- const require_faceFns = require("./faceFns-DeTAgvu_.cjs");
8
- const require_originTrackingFns = require("./originTrackingFns-7tC4igk0.cjs");
7
+ const require_faceFns = require("./faceFns-UozswcwP.cjs");
8
+ const require_originTrackingFns = require("./originTrackingFns-uz38yuMp.cjs");
9
9
  const require_arrayAccess = require("./arrayAccess-e4H9cBfh.cjs");
10
- const require_surfaceBuilders = require("./surfaceBuilders-B4Yn-xOW.cjs");
10
+ const require_surfaceBuilders = require("./surfaceBuilders-0x7j0ibk.cjs");
11
11
  //#region src/topology/metadata/faceTagFns.ts
12
12
  var shapeTagStore = /* @__PURE__ */ new WeakMap();
13
13
  var tagMetadataStore = /* @__PURE__ */ new WeakMap();
@@ -1,13 +1,13 @@
1
- import { C as isSolid, E as getShapeKind, K as getKernel, S as isShell, W as _usingCtx, d as createSolid, f as createVertex, h as disposeResultShape, i as castShape, m as disposeDowncastSource, n as castResultShape, s as createCompound, x as isShape3D } from "./shapeTypes-u60nsijI.js";
1
+ import { C as isSolid, E as getShapeKind, K as getKernel, S as isShell, W as _usingCtx, d as createSolid, f as createVertex, h as disposeResultShape, i as castShape, m as disposeDowncastSource, n as castResultShape, s as createCompound, x as isShape3D } from "./shapeTypes-bHlssytH.js";
2
2
  import { E as ok, P as unwrap, b as isErr, d as validationError, g as err, i as kernelError, l as typeCastError, m as andThen, t as BrepErrorCode } from "./errors-MHLiNE-C.js";
3
- import { S as subShapeHashes, c as getFaces, f as getVertices, p as getWires, s as getEdges } from "./topologyQueryFns-DiuoNPqI.js";
3
+ import { S as subShapeHashes, c as getFaces, f as getVertices, p as getWires, s as getEdges } from "./topologyQueryFns-DVhWxBwT.js";
4
4
  import { n as HASH_CODE_MAX } from "./constants-ITRzCnCp.js";
5
5
  import { a as vecDot, g as vecSub, h as vecScale, t as vecAdd } from "./vecOps-SKPRvPH-.js";
6
6
  import { o as resolvePlane } from "./planeOps-CQahLrCx.js";
7
- import { _ as cast, y as downcast } from "./faceFns-Dgiv4Jhb.js";
8
- import { n as propagateOriginsByHash, r as propagateOriginsFromEvolution, t as getFaceOrigins } from "./originTrackingFns-4c8Sw44l.js";
7
+ import { _ as cast, y as downcast } from "./faceFns-Ce7Fq6j5.js";
8
+ import { n as propagateOriginsByHash, r as propagateOriginsFromEvolution, t as getFaceOrigins } from "./originTrackingFns-DXcggmgf.js";
9
9
  import { n as getAtOrThrow, t as firstOrThrow } from "./arrayAccess-DrUGPADn.js";
10
- import { r as makeFace } from "./surfaceBuilders-BnkTJeD4.js";
10
+ import { r as makeFace } from "./surfaceBuilders-B7UnwkQz.js";
11
11
  //#region src/topology/metadata/faceTagFns.ts
12
12
  var shapeTagStore = /* @__PURE__ */ new WeakMap();
13
13
  var tagMetadataStore = /* @__PURE__ */ new WeakMap();
@@ -1,7 +1,7 @@
1
- const require_shapeTypes = require("./shapeTypes-D9TjxkdO.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-DZKuRt24.cjs");
2
2
  const require_errors = require("./errors-RHkKO5bZ.cjs");
3
- const require_validityTypes = require("./validityTypes-DuiGeQhe.cjs");
4
- const require_faceFns = require("./faceFns-DeTAgvu_.cjs");
3
+ const require_validityTypes = require("./validityTypes-CCnRq3A9.cjs");
4
+ const require_faceFns = require("./faceFns-UozswcwP.cjs");
5
5
  //#region src/utils/range.ts
6
6
  /** Generate an array of integers `[0, 1, …, len - 1]`. */
7
7
  function range(len) {
@@ -1,7 +1,7 @@
1
- import { K as getKernel, M as DisposalScope, W as _usingCtx, c as createEdge, l as createFace, p as createWire, y as isFace } from "./shapeTypes-u60nsijI.js";
1
+ import { K as getKernel, M as DisposalScope, W as _usingCtx, c as createEdge, l as createFace, p as createWire, y as isFace } from "./shapeTypes-bHlssytH.js";
2
2
  import { E as ok, d as validationError, g as err, i as kernelError, m as andThen } from "./errors-MHLiNE-C.js";
3
- import { a as isPlanarFace } from "./validityTypes-phPr-BRp.js";
4
- import { _ as cast, u as outerWire } from "./faceFns-Dgiv4Jhb.js";
3
+ import { a as isPlanarFace } from "./validityTypes-19mfqWVv.js";
4
+ import { _ as cast, u as outerWire } from "./faceFns-Ce7Fq6j5.js";
5
5
  //#region src/utils/range.ts
6
6
  /** Generate an array of integers `[0, 1, …, len - 1]`. */
7
7
  function range(len) {
package/dist/text.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_textBlueprints = require("./textBlueprints-DPldA7fV.cjs");
3
- const require_textMetrics = require("./textMetrics-19pWWvqT.cjs");
2
+ const require_textBlueprints = require("./textBlueprints-BPbIpA4-.cjs");
3
+ const require_textMetrics = require("./textMetrics-rRuWxQG_.cjs");
4
4
  exports.fontMetrics = require_textMetrics.fontMetrics;
5
5
  exports.getFont = require_textBlueprints.getFont;
6
6
  exports.loadFont = require_textBlueprints.loadFont;
package/dist/text.js CHANGED
@@ -1,3 +1,3 @@
1
- import { n as getFont, r as loadFont, t as textBlueprints } from "./textBlueprints-B1JdMBb0.js";
2
- import { n as textMetrics, r as sketchText, t as fontMetrics } from "./textMetrics-YfWZZTIk.js";
1
+ import { n as getFont, r as loadFont, t as textBlueprints } from "./textBlueprints-DE3M-E9o.js";
2
+ import { n as textMetrics, r as sketchText, t as fontMetrics } from "./textMetrics-D3Bly1w4.js";
3
3
  export { fontMetrics, getFont, loadFont, sketchText, textBlueprints, textMetrics };
@@ -1,17 +1,17 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-DakpK96I.cjs");
2
- const require_shapeTypes = require("./shapeTypes-D9TjxkdO.cjs");
2
+ const require_shapeTypes = require("./shapeTypes-DZKuRt24.cjs");
3
3
  const require_bug = require("./bug-O02CsAmt.cjs");
4
4
  const require_errors = require("./errors-RHkKO5bZ.cjs");
5
5
  const require_types = require("./types-KjA8tY4Y.cjs");
6
6
  const require_vecOps = require("./vecOps-CCnJt-yH.cjs");
7
7
  const require_planeOps = require("./planeOps-VlFxtvzY.cjs");
8
- const require_faceFns = require("./faceFns-DeTAgvu_.cjs");
9
- const require_solidBuilders = require("./solidBuilders-BRrbDIpu.cjs");
10
- const require_curveFns = require("./curveFns-BuqWKNvF.cjs");
8
+ const require_faceFns = require("./faceFns-UozswcwP.cjs");
9
+ const require_solidBuilders = require("./solidBuilders-5tA9O1SM.cjs");
10
+ const require_curveFns = require("./curveFns-BBLaLG1U.cjs");
11
11
  const require_arrayAccess = require("./arrayAccess-e4H9cBfh.cjs");
12
- const require_surfaceBuilders = require("./surfaceBuilders-B4Yn-xOW.cjs");
13
- const require_blueprintSketcher = require("./blueprintSketcher-BwrJrjxs.cjs");
14
- const require_loftFns = require("./loftFns-Cufcyuqt.cjs");
12
+ const require_surfaceBuilders = require("./surfaceBuilders-0x7j0ibk.cjs");
13
+ const require_blueprintSketcher = require("./blueprintSketcher-Bd5ZS9p6.cjs");
14
+ const require_loftFns = require("./loftFns-BYiUcAxk.cjs");
15
15
  let opentype_js = require("opentype.js");
16
16
  opentype_js = require_rolldown_runtime.__toESM(opentype_js, 1);
17
17
  //#region src/operations/extrudeFns.ts
@@ -1,16 +1,16 @@
1
- import { K as getKernel, d as createSolid, h as disposeResultShape, l as createFace, m as disposeDowncastSource, n as castResultShape, p as createWire, x as isShape3D } from "./shapeTypes-u60nsijI.js";
1
+ import { K as getKernel, d as createSolid, h as disposeResultShape, l as createFace, m as disposeDowncastSource, n as castResultShape, p as createWire, x as isShape3D } from "./shapeTypes-bHlssytH.js";
2
2
  import { n as bug } from "./bug-BdOHwn_e.js";
3
3
  import { E as ok, P as unwrap, d as validationError, g as err, i as kernelError, l as typeCastError, r as ioError, t as BrepErrorCode } from "./errors-MHLiNE-C.js";
4
4
  import { r as toVec3 } from "./types-D24Y27N0.js";
5
5
  import { c as vecLength, d as vecNormalize, h as vecScale, r as vecCross } from "./vecOps-SKPRvPH-.js";
6
6
  import { n as createPlane } from "./planeOps-CQahLrCx.js";
7
- import { v as copyShape } from "./faceFns-Dgiv4Jhb.js";
8
- import { o as makeSolid, p as cutAll, t as makeCompound } from "./solidBuilders-DOafY0bO.js";
9
- import { l as curveStartPoint, u as curveTangentAt } from "./curveFns-o05jCVtr.js";
7
+ import { v as copyShape } from "./faceFns-Ce7Fq6j5.js";
8
+ import { o as makeSolid, p as cutAll, t as makeCompound } from "./solidBuilders-9s-j-ZiW.js";
9
+ import { l as curveStartPoint, u as curveTangentAt } from "./curveFns-BoHbhtqX.js";
10
10
  import { n as getAtOrThrow, t as firstOrThrow } from "./arrayAccess-DrUGPADn.js";
11
- import { i as makeNewFaceWithinFace, r as makeFace, t as addHolesInFace } from "./surfaceBuilders-BnkTJeD4.js";
12
- import { r as organiseBlueprints, t as BlueprintSketcher } from "./blueprintSketcher-BrqUJtEJ.js";
13
- import { c as twistExtrude, r as complexExtrude, s as sweep, t as loft } from "./loftFns-BVkAi4-a.js";
11
+ import { i as makeNewFaceWithinFace, r as makeFace, t as addHolesInFace } from "./surfaceBuilders-B7UnwkQz.js";
12
+ import { r as organiseBlueprints, t as BlueprintSketcher } from "./blueprintSketcher-BTGRoQ_G.js";
13
+ import { c as twistExtrude, r as complexExtrude, s as sweep, t as loft } from "./loftFns-DQVg8qxM.js";
14
14
  import opentype from "opentype.js";
15
15
  //#region src/operations/extrudeFns.ts
16
16
  /**
@@ -1,5 +1,5 @@
1
1
  import { E as ok, d as validationError, g as err, t as BrepErrorCode } from "./errors-MHLiNE-C.js";
2
- import { g as wrapSketchData, i as Sketches, n as getFont, t as textBlueprints, v as CompoundSketch } from "./textBlueprints-B1JdMBb0.js";
2
+ import { g as wrapSketchData, i as Sketches, n as getFont, t as textBlueprints, v as CompoundSketch } from "./textBlueprints-DE3M-E9o.js";
3
3
  //#region src/text/sketchText.ts
4
4
  /**
5
5
  * Render text as 3D sketch outlines on a plane.
@@ -1,5 +1,5 @@
1
1
  const require_errors = require("./errors-RHkKO5bZ.cjs");
2
- const require_textBlueprints = require("./textBlueprints-DPldA7fV.cjs");
2
+ const require_textBlueprints = require("./textBlueprints-BPbIpA4-.cjs");
3
3
  //#region src/text/sketchText.ts
4
4
  /**
5
5
  * Render text as 3D sketch outlines on a plane.
@@ -1,12 +1,12 @@
1
- import { K as getKernel, M as DisposalScope, P as createKernelHandle, W as _usingCtx, n as castResultShape, x as isShape3D } from "./shapeTypes-u60nsijI.js";
1
+ import { K as getKernel, M as DisposalScope, P as createKernelHandle, W as _usingCtx, n as castResultShape, x as isShape3D } from "./shapeTypes-bHlssytH.js";
2
2
  import { E as ok, d as validationError, g as err, n as computationError, r as ioError, t as BrepErrorCode, x as isOk } from "./errors-MHLiNE-C.js";
3
3
  import { d as vecNormalize, s as vecIsZero } from "./vecOps-SKPRvPH-.js";
4
- import { b as fromBREP } from "./faceFns-Dgiv4Jhb.js";
5
- import { h as fuseAll } from "./solidBuilders-DOafY0bO.js";
6
- import { E as wire, h as line } from "./primitiveFns-D695dXsj.js";
7
- import { s as toBREP } from "./shapeFns-BvPYFFCd.js";
8
- import { t as loft } from "./loftFns-BVkAi4-a.js";
9
- import { c as resolveRefParams } from "./refResolveFns-BwEBGVGr.js";
4
+ import { b as fromBREP } from "./faceFns-Ce7Fq6j5.js";
5
+ import { h as fuseAll } from "./solidBuilders-9s-j-ZiW.js";
6
+ import { E as wire, h as line } from "./primitiveFns-CmmTWOkO.js";
7
+ import { s as toBREP } from "./shapeFns-mYczuWOy.js";
8
+ import { t as loft } from "./loftFns-DQVg8qxM.js";
9
+ import { c as resolveRefParams } from "./refResolveFns-DqY7Cd00.js";
10
10
  //#region src/utils/uuid.ts
11
11
  /** Generate a v4-style UUID string using `crypto.getRandomValues`. */
12
12
  function uuidv() {
@@ -1,12 +1,12 @@
1
- const require_shapeTypes = require("./shapeTypes-D9TjxkdO.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-DZKuRt24.cjs");
2
2
  const require_errors = require("./errors-RHkKO5bZ.cjs");
3
3
  const require_vecOps = require("./vecOps-CCnJt-yH.cjs");
4
- const require_faceFns = require("./faceFns-DeTAgvu_.cjs");
5
- const require_solidBuilders = require("./solidBuilders-BRrbDIpu.cjs");
6
- const require_primitiveFns = require("./primitiveFns-CFibG_KT.cjs");
7
- const require_shapeFns = require("./shapeFns-BqmsBoBy.cjs");
8
- const require_loftFns = require("./loftFns-Cufcyuqt.cjs");
9
- const require_refResolveFns = require("./refResolveFns-u-3Okd3D.cjs");
4
+ const require_faceFns = require("./faceFns-UozswcwP.cjs");
5
+ const require_solidBuilders = require("./solidBuilders-5tA9O1SM.cjs");
6
+ const require_primitiveFns = require("./primitiveFns-DmEPf6av.cjs");
7
+ const require_shapeFns = require("./shapeFns-BLZ1dDSz.cjs");
8
+ const require_loftFns = require("./loftFns-BYiUcAxk.cjs");
9
+ const require_refResolveFns = require("./refResolveFns-CnPEaqHw.cjs");
10
10
  //#region src/utils/uuid.ts
11
11
  /** Generate a v4-style UUID string using `crypto.getRandomValues`. */
12
12
  function uuidv() {