brepjs 18.76.0 → 18.77.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/{blueprint-BHyTsY5E.cjs → blueprint-BE93BNYE.cjs} +5 -5
  4. package/dist/{blueprint-DuT3LJGx.js → blueprint-BVe9JU-L.js} +5 -5
  5. package/dist/{blueprintFns-dPHJgrqC.cjs → blueprintFns-B_7kKwEZ.cjs} +2 -2
  6. package/dist/{blueprintFns-qaEV4X2R.js → blueprintFns-DWinspVK.js} +2 -2
  7. package/dist/{blueprintSketcher-Th4H1tao.cjs → blueprintSketcher-D75tuXkF.cjs} +3 -3
  8. package/dist/{blueprintSketcher-IY1gJ613.js → blueprintSketcher-DL-wgnVs.js} +3 -3
  9. package/dist/{boolean2D-BGK18W_l.cjs → boolean2D-C4Txi8U1.cjs} +4 -4
  10. package/dist/{boolean2D-DUDg_dMv.js → boolean2D-OtHT7POp.js} +4 -4
  11. package/dist/{booleanFns-DxnTjP19.cjs → booleanFns-CFa3bgbG.cjs} +4 -4
  12. package/dist/{booleanFns-Cu-J1THp.js → booleanFns-D7Xgt-Og.js} +4 -4
  13. package/dist/brepjs.cjs +25 -25
  14. package/dist/brepjs.js +25 -25
  15. package/dist/{cameraFns-Ctxe8ev-.js → cameraFns-DCXqzH_m.js} +2 -2
  16. package/dist/{cameraFns-G2lc5c9M.cjs → cameraFns-DfSRnD1k.cjs} +2 -2
  17. package/dist/core.cjs +1 -1
  18. package/dist/core.js +1 -1
  19. package/dist/{cornerFinder-DamaTij5.js → cornerFinder-DPkLU1Of.js} +1 -1
  20. package/dist/{cornerFinder-CxqA_AYe.cjs → cornerFinder-KuLU-4pQ.cjs} +1 -1
  21. package/dist/{curveFns-CwOY58kC.js → curveFns-B4KEYU1M.js} +1 -1
  22. package/dist/{curveFns-B8UdENpg.cjs → curveFns-C0oCmjV2.cjs} +1 -1
  23. package/dist/{drawFns-CcR9_01X.js → drawFns-BBoTkSta.js} +12 -12
  24. package/dist/{drawFns-BwfhGs8Z.cjs → drawFns-DNokXs9U.cjs} +12 -12
  25. package/dist/{extrudeFns-b7JHaMsv.cjs → extrudeFns-BJSW3EaV.cjs} +1 -1
  26. package/dist/{extrudeFns-msxcCUm2.js → extrudeFns-CSWqlW-n.js} +1 -1
  27. package/dist/{faceFns-BJ0mbRh5.js → faceFns-BJ2hzXJp.js} +2 -2
  28. package/dist/{faceFns-CZvemlPW.cjs → faceFns-p0lyVuyw.cjs} +2 -2
  29. package/dist/{helpers-DsaGpuUh.js → helpers-C78MY-s6.js} +6 -6
  30. package/dist/{helpers-90SKWHEY.cjs → helpers-DTBDjbdR.cjs} +6 -6
  31. package/dist/{historyFns-xUNAdUYV.cjs → historyFns-4ggYGJB2.cjs} +4 -4
  32. package/dist/{historyFns-BV5sQxft.js → historyFns-Ck2tXVAL.js} +4 -4
  33. package/dist/{importFns-CXH2OmJ6.cjs → importFns-CUAiLgt_.cjs} +2 -2
  34. package/dist/{importFns-B02-HKco.js → importFns-Rv22QSn6.js} +2 -2
  35. package/dist/io.cjs +2 -2
  36. package/dist/io.js +2 -2
  37. package/dist/kernel/occt/geometryQueryOps.d.ts +5 -1
  38. package/dist/kernel/occtWasm/occtWasmAdapter.cjs +1 -1
  39. package/dist/kernel/occtWasm/occtWasmAdapter.js +1 -1
  40. package/dist/kernel/occtWasm/surfaceOps.d.ts +5 -1
  41. package/dist/{measureFns-DYeTPyHr.js → measureFns-C8c6xRUE.js} +3 -3
  42. package/dist/{measureFns-CRS3U8gj.cjs → measureFns-DnxobCbD.cjs} +3 -3
  43. package/dist/measurement.cjs +1 -1
  44. package/dist/measurement.js +1 -1
  45. package/dist/{meshFns-CvmTzMPL.cjs → meshFns-BawS1xNA.cjs} +3 -3
  46. package/dist/{meshFns-CLQL2D95.js → meshFns-CuYzpojl.js} +3 -3
  47. package/dist/{occtWasmAdapter-m4Nua92H.js → occtWasmAdapter-BrTkhQYK.js} +83 -6
  48. package/dist/{occtWasmAdapter-DdghAlnN.cjs → occtWasmAdapter-W86SRBpi.cjs} +83 -6
  49. package/dist/operations.cjs +2 -2
  50. package/dist/operations.js +2 -2
  51. package/dist/{primitiveFns-B6Q6lx9-.js → primitiveFns-DWIzRvTY.js} +7 -7
  52. package/dist/{primitiveFns-FudrSXrp.cjs → primitiveFns-ItlGYe3M.cjs} +7 -7
  53. package/dist/projection.cjs +1 -1
  54. package/dist/projection.js +1 -1
  55. package/dist/query.cjs +2 -2
  56. package/dist/query.js +2 -2
  57. package/dist/{shapeFns-CQmd2W5F.cjs → shapeFns-D5WNrq3s.cjs} +2 -2
  58. package/dist/{shapeFns-CQRGTifg.js → shapeFns-DZ6poxP7.js} +2 -2
  59. package/dist/shapeRef.cjs +1 -1
  60. package/dist/shapeRef.js +1 -1
  61. package/dist/{shapeRefFns-DoPplxoN.cjs → shapeRefFns-BOWP8n4j.cjs} +4 -4
  62. package/dist/{shapeRefFns-DvIvS0do.js → shapeRefFns-ClsyeZp4.js} +4 -4
  63. package/dist/{shapeTypes-C4cMKLoj.cjs → shapeTypes-CxSqNvHA.cjs} +55 -26
  64. package/dist/{shapeTypes-VCBsDI43.js → shapeTypes-CyTY0prh.js} +55 -26
  65. package/dist/sketching.cjs +3 -3
  66. package/dist/sketching.js +3 -3
  67. package/dist/{solidBuilders-DBsHetmI.js → solidBuilders-BtEFUFQ9.js} +2 -2
  68. package/dist/{solidBuilders-B0Hzin8a.cjs → solidBuilders-diw2zyyN.cjs} +2 -2
  69. package/dist/{surfaceBuilders-QK_Cnn_u.cjs → surfaceBuilders-CPHOXRLE.cjs} +2 -2
  70. package/dist/{surfaceBuilders-DllH3kXs.js → surfaceBuilders-Do0rypyD.js} +2 -2
  71. package/dist/text.cjs +2 -2
  72. package/dist/text.js +2 -2
  73. package/dist/{textBlueprints-C_ThSDVg.js → textBlueprints-CYc0xi6l.js} +7 -7
  74. package/dist/{textBlueprints-8lNMcsUv.cjs → textBlueprints-D31dKTZS.cjs} +7 -7
  75. package/dist/{textMetrics-Bn5VPcTV.cjs → textMetrics-CjbXCzpg.cjs} +1 -1
  76. package/dist/{textMetrics-CxdhimFF.js → textMetrics-DfxB-y9A.js} +1 -1
  77. package/dist/topology.cjs +7 -7
  78. package/dist/topology.js +7 -7
  79. package/dist/{topologyQueryFns-BtfhAVY2.js → topologyQueryFns-BomrmBie.js} +1 -1
  80. package/dist/{topologyQueryFns-Bj5wpC75.cjs → topologyQueryFns-Dzxrwn-E.cjs} +1 -1
  81. package/package.json +1 -1
@@ -1,9 +1,9 @@
1
- const require_shapeTypes = require("./shapeTypes-C4cMKLoj.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-CxSqNvHA.cjs");
2
2
  const require_errors = require("./errors-CXJtc4I7.cjs");
3
3
  const require_vecOps = require("./vecOps-CCnJt-yH.cjs");
4
- const require_faceFns = require("./faceFns-CZvemlPW.cjs");
5
- const require_shapeFns = require("./shapeFns-CQmd2W5F.cjs");
6
- const require_booleanFns = require("./booleanFns-DxnTjP19.cjs");
4
+ const require_faceFns = require("./faceFns-p0lyVuyw.cjs");
5
+ const require_shapeFns = require("./shapeFns-D5WNrq3s.cjs");
6
+ const require_booleanFns = require("./booleanFns-CFa3bgbG.cjs");
7
7
  //#region src/utils/uuid.ts
8
8
  /** Generate a v4-style UUID string using `crypto.getRandomValues`. */
9
9
  function uuidv() {
@@ -1,9 +1,9 @@
1
- import { B as createKernelHandle, Z as getKernel, t as castShape } from "./shapeTypes-VCBsDI43.js";
1
+ import { B as createKernelHandle, Z as getKernel, t as castShape } from "./shapeTypes-CyTY0prh.js";
2
2
  import { A as ok, b as err, d as validationError, n as computationError, r as ioError } from "./errors-DNWJsfVU.js";
3
3
  import { d as vecNormalize, s as vecIsZero } from "./vecOps-SKPRvPH-.js";
4
- import { y as fromBREP } from "./faceFns-BJ0mbRh5.js";
5
- import { s as toBREP } from "./shapeFns-CQRGTifg.js";
6
- import { a as fuseAll } from "./booleanFns-Cu-J1THp.js";
4
+ import { y as fromBREP } from "./faceFns-BJ2hzXJp.js";
5
+ import { s as toBREP } from "./shapeFns-DZ6poxP7.js";
6
+ import { a as fuseAll } from "./booleanFns-D7Xgt-Og.js";
7
7
  //#region src/utils/uuid.ts
8
8
  /** Generate a v4-style UUID string using `crypto.getRandomValues`. */
9
9
  function uuidv() {
@@ -1,8 +1,8 @@
1
- const require_shapeTypes = require("./shapeTypes-C4cMKLoj.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-CxSqNvHA.cjs");
2
2
  const require_vec3 = require("./vec3-CFwOI0ZI.cjs");
3
3
  const require_errors = require("./errors-CXJtc4I7.cjs");
4
4
  const require_arrayAccess = require("./arrayAccess-e4H9cBfh.cjs");
5
- const require_blueprint = require("./blueprint-BHyTsY5E.cjs");
5
+ const require_blueprint = require("./blueprint-BE93BNYE.cjs");
6
6
  //#region src/io/objExportFns.ts
7
7
  /** Read a vec3 from a typed array at the given vertex index. */
8
8
  function vec3At(arr, i) {
@@ -1,8 +1,8 @@
1
- import { Z as getKernel, t as castShape } from "./shapeTypes-VCBsDI43.js";
1
+ import { Z as getKernel, t as castShape } from "./shapeTypes-CyTY0prh.js";
2
2
  import { n as wasmIndex, t as vec3At$1 } from "./vec3-Dpha8d5k.js";
3
3
  import { A as ok, b as err, r as ioError, t as BrepErrorCode } from "./errors-DNWJsfVU.js";
4
4
  import { n as getAtOrThrow } from "./arrayAccess-DrUGPADn.js";
5
- import { f as make2dSegmentCurve, m as make2dThreePointArc, s as make2dBezierCurve, t as Blueprint } from "./blueprint-DuT3LJGx.js";
5
+ import { f as make2dSegmentCurve, m as make2dThreePointArc, s as make2dBezierCurve, t as Blueprint } from "./blueprint-BVe9JU-L.js";
6
6
  //#region src/io/objExportFns.ts
7
7
  /** Read a vec3 from a typed array at the given vertex index. */
8
8
  function vec3At(arr, i) {
package/dist/io.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_meshFns = require("./meshFns-CvmTzMPL.cjs");
3
- const require_importFns = require("./importFns-CXH2OmJ6.cjs");
2
+ const require_meshFns = require("./meshFns-BawS1xNA.cjs");
3
+ const require_importFns = require("./importFns-CUAiLgt_.cjs");
4
4
  exports.blueprintToDXF = require_importFns.blueprintToDXF;
5
5
  exports.exportDXF = require_importFns.exportDXF;
6
6
  exports.exportGlb = require_importFns.exportGlb;
package/dist/io.js CHANGED
@@ -1,3 +1,3 @@
1
- import { n as exportSTEP, r as exportSTL, t as exportIGES } from "./meshFns-CLQL2D95.js";
2
- import { a as importSVG, c as blueprintToDXF, d as exportGltf, f as exportOBJ, i as exportSTEPConfigured, l as exportDXF, n as importSTEP, o as importSVGPathD, r as importSTL, s as exportThreeMF, t as importIGES, u as exportGlb } from "./importFns-B02-HKco.js";
1
+ import { n as exportSTEP, r as exportSTL, t as exportIGES } from "./meshFns-CuYzpojl.js";
2
+ import { a as importSVG, c as blueprintToDXF, d as exportGltf, f as exportOBJ, i as exportSTEPConfigured, l as exportDXF, n as importSTEP, o as importSVGPathD, r as importSTL, s as exportThreeMF, t as importIGES, u as exportGlb } from "./importFns-Rv22QSn6.js";
3
3
  export { blueprintToDXF, exportDXF, exportGlb, exportGltf, exportIGES, exportOBJ, exportSTEP, exportSTEPConfigured, exportSTL, exportThreeMF, importIGES, importSTEP, importSTL, importSVG, importSVGPathD };
@@ -69,7 +69,11 @@ export declare function getSurfaceCylinderData(oc: KernelInstance, surface: Kern
69
69
  radius: number;
70
70
  isDirect: boolean;
71
71
  } | null;
72
- /** Get a cylindrical face's axis (point on axis + unit direction). Null otherwise. */
72
+ /**
73
+ * Get the axis of symmetry (point on axis + unit direction) for an analytic
74
+ * face that has one: cylinder, cone, torus, or surface of revolution. Null
75
+ * otherwise (plane, sphere, free-form).
76
+ */
73
77
  export declare function getSurfaceAxis(oc: KernelInstance, face: KernelShape): {
74
78
  origin: [number, number, number];
75
79
  direction: [number, number, number];
@@ -1,3 +1,3 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_occtWasmAdapter = require("../../occtWasmAdapter-DdghAlnN.cjs");
2
+ const require_occtWasmAdapter = require("../../occtWasmAdapter-W86SRBpi.cjs");
3
3
  exports.OcctWasmAdapter = require_occtWasmAdapter.OcctWasmAdapter;
@@ -1,2 +1,2 @@
1
- import { t as OcctWasmAdapter } from "../../occtWasmAdapter-m4Nua92H.js";
1
+ import { t as OcctWasmAdapter } from "../../occtWasmAdapter-BrTkhQYK.js";
2
2
  export { OcctWasmAdapter };
@@ -12,7 +12,11 @@ export declare function outerWire(k: OcctKernelWasm, face: KernelShape): KernelS
12
12
  export declare function surfaceNormal(k: OcctKernelWasm, face: KernelShape, u: number, v: number): [number, number, number];
13
13
  export declare function pointOnSurface(k: OcctKernelWasm, face: KernelShape, u: number, v: number): [number, number, number];
14
14
  type V3 = [number, number, number];
15
- /** Cylindrical face axis (point on axis + unit direction). Null for non-cylinders. */
15
+ /**
16
+ * Axis of symmetry (point on axis + unit direction) for an analytic face that
17
+ * has one. Cylinders use the exact normal-cross derivation; cones, tori, and
18
+ * surfaces of revolution fall back to circle-center sampling. Null otherwise.
19
+ */
16
20
  export declare function getSurfaceAxis(k: OcctKernelWasm, face: KernelShape): {
17
21
  origin: V3;
18
22
  direction: V3;
@@ -1,7 +1,7 @@
1
- import { Z as getKernel } from "./shapeTypes-VCBsDI43.js";
1
+ import { Z as getKernel } from "./shapeTypes-CyTY0prh.js";
2
2
  import { A as ok, b as err, d as validationError, t as BrepErrorCode } from "./errors-DNWJsfVU.js";
3
- import { w as kernelCallRaw } from "./topologyQueryFns-BtfhAVY2.js";
4
- import { m as uvBounds } from "./faceFns-BJ0mbRh5.js";
3
+ import { w as kernelCallRaw } from "./topologyQueryFns-BomrmBie.js";
4
+ import { m as uvBounds } from "./faceFns-BJ2hzXJp.js";
5
5
  //#region src/measurement/measureCache.ts
6
6
  var cache = /* @__PURE__ */ new WeakMap();
7
7
  function getCachedMeasurement(shape, key) {
@@ -1,7 +1,7 @@
1
- const require_shapeTypes = require("./shapeTypes-C4cMKLoj.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-CxSqNvHA.cjs");
2
2
  const require_errors = require("./errors-CXJtc4I7.cjs");
3
- const require_topologyQueryFns = require("./topologyQueryFns-Bj5wpC75.cjs");
4
- const require_faceFns = require("./faceFns-CZvemlPW.cjs");
3
+ const require_topologyQueryFns = require("./topologyQueryFns-Dzxrwn-E.cjs");
4
+ const require_faceFns = require("./faceFns-p0lyVuyw.cjs");
5
5
  //#region src/measurement/measureCache.ts
6
6
  var cache = /* @__PURE__ */ new WeakMap();
7
7
  function getCachedMeasurement(shape, key) {
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_measureFns = require("./measureFns-CRS3U8gj.cjs");
2
+ const require_measureFns = require("./measureFns-DnxobCbD.cjs");
3
3
  exports.createDistanceQuery = require_measureFns.createDistanceQuery;
4
4
  exports.measureArea = require_measureFns.measureArea;
5
5
  exports.measureDistance = require_measureFns.measureDistance;
@@ -1,2 +1,2 @@
1
- import { a as measureDistance, c as measureLinearProps, d as measureVolumeProps, l as measureSurfaceProps, n as measureArea, o as measureDistanceProps, s as measureLength, t as createDistanceQuery, u as measureVolume } from "./measureFns-DYeTPyHr.js";
1
+ import { a as measureDistance, c as measureLinearProps, d as measureVolumeProps, l as measureSurfaceProps, n as measureArea, o as measureDistanceProps, s as measureLength, t as createDistanceQuery, u as measureVolume } from "./measureFns-C8c6xRUE.js";
2
2
  export { createDistanceQuery, measureArea, measureDistance, measureDistanceProps, measureLength, measureLinearProps, measureSurfaceProps, measureVolume, measureVolumeProps };
@@ -1,7 +1,7 @@
1
- const require_shapeTypes = require("./shapeTypes-C4cMKLoj.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-CxSqNvHA.cjs");
2
2
  const require_errors = require("./errors-CXJtc4I7.cjs");
3
- const require_topologyQueryFns = require("./topologyQueryFns-Bj5wpC75.cjs");
4
- const require_shapeFns = require("./shapeFns-CQmd2W5F.cjs");
3
+ const require_topologyQueryFns = require("./topologyQueryFns-Dzxrwn-E.cjs");
4
+ const require_shapeFns = require("./shapeFns-D5WNrq3s.cjs");
5
5
  //#region src/topology/meshCache.ts
6
6
  /**
7
7
  * Build a parameter key for the inner cache map (excludes shape identity).
@@ -1,7 +1,7 @@
1
- import { Z as getKernel, gt as qualityDeflection } from "./shapeTypes-VCBsDI43.js";
1
+ import { Z as getKernel, gt as qualityDeflection } from "./shapeTypes-CyTY0prh.js";
2
2
  import { A as ok, b as err, r as ioError } from "./errors-DNWJsfVU.js";
3
- import { d as getSolids, n as getBounds } from "./topologyQueryFns-BtfhAVY2.js";
4
- import { O as getFaceOrigins } from "./shapeFns-CQRGTifg.js";
3
+ import { d as getSolids, n as getBounds } from "./topologyQueryFns-BomrmBie.js";
4
+ import { O as getFaceOrigins } from "./shapeFns-DZ6poxP7.js";
5
5
  //#region src/topology/meshCache.ts
6
6
  /**
7
7
  * Build a parameter key for the inner cache map (excludes shape identity).
@@ -1842,13 +1842,90 @@ function deriveCylinder(k, face) {
1842
1842
  isDirect: (shapeOrientation(k, face) === "reversed" ? -1 : 1) * dotV(n1, subV(p1, origin)) > 0
1843
1843
  };
1844
1844
  }
1845
- /** Cylindrical face axis (point on axis + unit direction). Null for non-cylinders. */
1845
+ /** Circumcenter of three points (the center of the unique circle through them). */
1846
+ function circumcenter(a, p, q) {
1847
+ const ab = subV(p, a);
1848
+ const ac = subV(q, a);
1849
+ const m = crossV(ab, ac);
1850
+ const mSq = dotV(m, m);
1851
+ if (mSq < 1e-18) return null;
1852
+ const abSq = dotV(ab, ab);
1853
+ const acSq = dotV(ac, ac);
1854
+ const dxm = crossV([
1855
+ abSq * ac[0] - acSq * ab[0],
1856
+ abSq * ac[1] - acSq * ab[1],
1857
+ abSq * ac[2] - acSq * ab[2]
1858
+ ], m);
1859
+ const inv = 1 / (2 * mSq);
1860
+ return [
1861
+ a[0] + dxm[0] * inv,
1862
+ a[1] + dxm[1] * inv,
1863
+ a[2] + dxm[2] * inv
1864
+ ];
1865
+ }
1866
+ /** Center of the iso-v circle at height v (three u-samples → circumcenter). */
1867
+ function isoCircleCenter(k, face, uMin, uMax, v) {
1868
+ return circumcenter(pointOnSurface(k, face, uMin + .1 * (uMax - uMin), v), pointOnSurface(k, face, uMin + .45 * (uMax - uMin), v), pointOnSurface(k, face, uMin + .8 * (uMax - uMin), v));
1869
+ }
1870
+ /**
1871
+ * Axis of a surface of revolution (cone, torus, general revolution) by sampling.
1872
+ * occt-wasm exposes no analytic accessor for these. Their U parameter is the
1873
+ * angle of revolution, so the iso-v curve at a fixed v is a circle centered on
1874
+ * the axis; two such centers at different heights span the axis.
1875
+ *
1876
+ * Samples three v-levels and uses the farthest-apart pair of centers. Two levels
1877
+ * suffice for a cone or general revolution (v is monotonic along the axis), but
1878
+ * a torus parameterizes v as the tube angle: on a v-symmetric partial torus (a
1879
+ * half-torus, v in [0, pi]) two symmetric samples land at equal heights and
1880
+ * their centers coincide. A third level breaks that symmetry. Avoids the v
1881
+ * extremes so a cone apex (a degenerate zero-radius circle) is not sampled.
1882
+ */
1883
+ function deriveAxisBySampling(k, face) {
1884
+ const b = uvBounds(k, face);
1885
+ const centers = [
1886
+ .2,
1887
+ .5,
1888
+ .8
1889
+ ].map((f) => isoCircleCenter(k, face, b.uMin, b.uMax, b.vMin + f * (b.vMax - b.vMin))).filter((c) => c !== null);
1890
+ if (centers.length < 2) return null;
1891
+ let best = null;
1892
+ let bestLen = 1e-9;
1893
+ for (let i = 0; i < centers.length; i++) for (let j = i + 1; j < centers.length; j++) {
1894
+ const ci = centers[i];
1895
+ const cj = centers[j];
1896
+ if (!ci || !cj) continue;
1897
+ const d = subV(cj, ci);
1898
+ const len = lenV(d);
1899
+ if (len > bestLen) {
1900
+ bestLen = len;
1901
+ best = {
1902
+ origin: ci,
1903
+ direction: [
1904
+ d[0] / len,
1905
+ d[1] / len,
1906
+ d[2] / len
1907
+ ]
1908
+ };
1909
+ }
1910
+ }
1911
+ return best;
1912
+ }
1913
+ /**
1914
+ * Axis of symmetry (point on axis + unit direction) for an analytic face that
1915
+ * has one. Cylinders use the exact normal-cross derivation; cones, tori, and
1916
+ * surfaces of revolution fall back to circle-center sampling. Null otherwise.
1917
+ */
1846
1918
  function getSurfaceAxis(k, face) {
1847
- const cyl = deriveCylinder(k, face);
1848
- return cyl ? {
1849
- origin: cyl.origin,
1850
- direction: cyl.direction
1851
- } : null;
1919
+ const type = surfaceType(k, face);
1920
+ if (type === "cylinder") {
1921
+ const cyl = deriveCylinder(k, face);
1922
+ return cyl ? {
1923
+ origin: cyl.origin,
1924
+ direction: cyl.direction
1925
+ } : null;
1926
+ }
1927
+ if (type === "cone" || type === "torus" || type === "revolution") return deriveAxisBySampling(k, face);
1928
+ return null;
1852
1929
  }
1853
1930
  /** Cylinder radius + handedness for a cylindrical surface. Null for non-cylinders. */
1854
1931
  function getSurfaceCylinderData(k, surface) {
@@ -1842,13 +1842,90 @@ function deriveCylinder(k, face) {
1842
1842
  isDirect: (shapeOrientation(k, face) === "reversed" ? -1 : 1) * dotV(n1, subV(p1, origin)) > 0
1843
1843
  };
1844
1844
  }
1845
- /** Cylindrical face axis (point on axis + unit direction). Null for non-cylinders. */
1845
+ /** Circumcenter of three points (the center of the unique circle through them). */
1846
+ function circumcenter(a, p, q) {
1847
+ const ab = subV(p, a);
1848
+ const ac = subV(q, a);
1849
+ const m = crossV(ab, ac);
1850
+ const mSq = dotV(m, m);
1851
+ if (mSq < 1e-18) return null;
1852
+ const abSq = dotV(ab, ab);
1853
+ const acSq = dotV(ac, ac);
1854
+ const dxm = crossV([
1855
+ abSq * ac[0] - acSq * ab[0],
1856
+ abSq * ac[1] - acSq * ab[1],
1857
+ abSq * ac[2] - acSq * ab[2]
1858
+ ], m);
1859
+ const inv = 1 / (2 * mSq);
1860
+ return [
1861
+ a[0] + dxm[0] * inv,
1862
+ a[1] + dxm[1] * inv,
1863
+ a[2] + dxm[2] * inv
1864
+ ];
1865
+ }
1866
+ /** Center of the iso-v circle at height v (three u-samples → circumcenter). */
1867
+ function isoCircleCenter(k, face, uMin, uMax, v) {
1868
+ return circumcenter(pointOnSurface(k, face, uMin + .1 * (uMax - uMin), v), pointOnSurface(k, face, uMin + .45 * (uMax - uMin), v), pointOnSurface(k, face, uMin + .8 * (uMax - uMin), v));
1869
+ }
1870
+ /**
1871
+ * Axis of a surface of revolution (cone, torus, general revolution) by sampling.
1872
+ * occt-wasm exposes no analytic accessor for these. Their U parameter is the
1873
+ * angle of revolution, so the iso-v curve at a fixed v is a circle centered on
1874
+ * the axis; two such centers at different heights span the axis.
1875
+ *
1876
+ * Samples three v-levels and uses the farthest-apart pair of centers. Two levels
1877
+ * suffice for a cone or general revolution (v is monotonic along the axis), but
1878
+ * a torus parameterizes v as the tube angle: on a v-symmetric partial torus (a
1879
+ * half-torus, v in [0, pi]) two symmetric samples land at equal heights and
1880
+ * their centers coincide. A third level breaks that symmetry. Avoids the v
1881
+ * extremes so a cone apex (a degenerate zero-radius circle) is not sampled.
1882
+ */
1883
+ function deriveAxisBySampling(k, face) {
1884
+ const b = uvBounds(k, face);
1885
+ const centers = [
1886
+ .2,
1887
+ .5,
1888
+ .8
1889
+ ].map((f) => isoCircleCenter(k, face, b.uMin, b.uMax, b.vMin + f * (b.vMax - b.vMin))).filter((c) => c !== null);
1890
+ if (centers.length < 2) return null;
1891
+ let best = null;
1892
+ let bestLen = 1e-9;
1893
+ for (let i = 0; i < centers.length; i++) for (let j = i + 1; j < centers.length; j++) {
1894
+ const ci = centers[i];
1895
+ const cj = centers[j];
1896
+ if (!ci || !cj) continue;
1897
+ const d = subV(cj, ci);
1898
+ const len = lenV(d);
1899
+ if (len > bestLen) {
1900
+ bestLen = len;
1901
+ best = {
1902
+ origin: ci,
1903
+ direction: [
1904
+ d[0] / len,
1905
+ d[1] / len,
1906
+ d[2] / len
1907
+ ]
1908
+ };
1909
+ }
1910
+ }
1911
+ return best;
1912
+ }
1913
+ /**
1914
+ * Axis of symmetry (point on axis + unit direction) for an analytic face that
1915
+ * has one. Cylinders use the exact normal-cross derivation; cones, tori, and
1916
+ * surfaces of revolution fall back to circle-center sampling. Null otherwise.
1917
+ */
1846
1918
  function getSurfaceAxis(k, face) {
1847
- const cyl = deriveCylinder(k, face);
1848
- return cyl ? {
1849
- origin: cyl.origin,
1850
- direction: cyl.direction
1851
- } : null;
1919
+ const type = surfaceType(k, face);
1920
+ if (type === "cylinder") {
1921
+ const cyl = deriveCylinder(k, face);
1922
+ return cyl ? {
1923
+ origin: cyl.origin,
1924
+ direction: cyl.direction
1925
+ } : null;
1926
+ }
1927
+ if (type === "cone" || type === "torus" || type === "revolution") return deriveAxisBySampling(k, face);
1928
+ return null;
1852
1929
  }
1853
1930
  /** Cylinder radius + handedness for a cylindrical surface. Null for non-cylinders. */
1854
1931
  function getSurfaceCylinderData(k, surface) {
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_historyFns = require("./historyFns-xUNAdUYV.cjs");
3
- const require_extrudeFns = require("./extrudeFns-b7JHaMsv.cjs");
2
+ const require_historyFns = require("./historyFns-4ggYGJB2.cjs");
3
+ const require_extrudeFns = require("./extrudeFns-BJSW3EaV.cjs");
4
4
  exports.addChild = require_historyFns.addChild;
5
5
  exports.addStep = require_historyFns.addStep;
6
6
  exports.circularPattern = require_historyFns.circularPattern;
@@ -1,3 +1,3 @@
1
- import { C as walkAssembly, D as exportAssemblySTEP, E as linearPattern, O as createAssembly, S as updateNode, T as gridPattern, _ as collectShapes, a as findStep, b as findNode, c as registerOperation, d as replayHistory, g as addChild, h as undoLast, l as registerShape, m as stepsFrom, n as createHistory, o as getShape, p as stepCount, r as createRegistry, s as modifyStep, t as addStep, u as replayFrom, v as countNodes, w as circularPattern, x as removeChild, y as createAssemblyNode } from "./historyFns-BV5sQxft.js";
2
- import { c as sweep, i as complexExtrude, l as twistExtrude, s as supportExtrude } from "./extrudeFns-msxcCUm2.js";
1
+ import { C as walkAssembly, D as exportAssemblySTEP, E as linearPattern, O as createAssembly, S as updateNode, T as gridPattern, _ as collectShapes, a as findStep, b as findNode, c as registerOperation, d as replayHistory, g as addChild, h as undoLast, l as registerShape, m as stepsFrom, n as createHistory, o as getShape, p as stepCount, r as createRegistry, s as modifyStep, t as addStep, u as replayFrom, v as countNodes, w as circularPattern, x as removeChild, y as createAssemblyNode } from "./historyFns-Ck2tXVAL.js";
2
+ import { c as sweep, i as complexExtrude, l as twistExtrude, s as supportExtrude } from "./extrudeFns-CSWqlW-n.js";
3
3
  export { addChild, addStep, circularPattern, collectShapes, complexExtrude, countNodes, createAssembly, createAssemblyNode, createHistory, createRegistry, exportAssemblySTEP, findNode, findStep, getShape as getHistoryShape, gridPattern, linearPattern, modifyStep, registerOperation, registerShape, removeChild, replayFrom, replayHistory, stepCount, stepsFrom, supportExtrude, sweep, twistExtrude, undoLast, updateNode, walkAssembly };
@@ -1,13 +1,13 @@
1
- import { Z as getKernel, _ as isSolid, c as createSolid, h as isShape3D, p as isFace, r as castShapeWithKnownType, t as castShape, x as isClosedWire, y as isWire } from "./shapeTypes-VCBsDI43.js";
1
+ import { Z as getKernel, _ as isSolid, c as createSolid, h as isShape3D, p as isFace, r as castShapeWithKnownType, t as castShape, x as isClosedWire, y as isWire } from "./shapeTypes-CyTY0prh.js";
2
2
  import { A as ok, T as isOk, b as err, d as validationError, i as kernelError, l as typeCastError, t as BrepErrorCode, v as andThen, w as isErr } from "./errors-DNWJsfVU.js";
3
- import { c as getFaces, i as getCachedIsValid, l as getOrCreateCache, m as invalidateShapeCache, p as getWires, s as getEdges } from "./topologyQueryFns-BtfhAVY2.js";
3
+ import { c as getFaces, i as getCachedIsValid, l as getOrCreateCache, m as invalidateShapeCache, p as getWires, s as getEdges } from "./topologyQueryFns-BomrmBie.js";
4
4
  import { n as HASH_CODE_MAX, t as DEG2RAD } from "./constants-ITRzCnCp.js";
5
- import { v as downcast } from "./faceFns-BJ0mbRh5.js";
6
- import { _ as propagateAllMetadata, g as collectInputFaceHashes, h as translate } from "./shapeFns-CQRGTifg.js";
5
+ import { v as downcast } from "./faceFns-BJ2hzXJp.js";
6
+ import { _ as propagateAllMetadata, g as collectInputFaceHashes, h as translate } from "./shapeFns-DZ6poxP7.js";
7
7
  import { t as firstOrThrow } from "./arrayAccess-DrUGPADn.js";
8
- import { _ as makeThreePointArc, a as makeNonPlanarFace, c as makeBSplineApproximation, d as makeCircle, f as makeEllipse, g as makeTangentArc, h as makeLine, i as makeNewFaceWithinFace, m as makeHelix, o as makePolygon, p as makeEllipseArc, r as makeFace, s as assembleWire, t as addHolesInFace, u as makeBezierCurve } from "./surfaceBuilders-DllH3kXs.js";
9
- import { a as fuseAll, i as fuse, n as cut, r as cutAll } from "./booleanFns-Cu-J1THp.js";
10
- import { a as makeOffset, c as makeTorus, i as makeEllipsoid, l as makeVertex, n as makeCone, o as makeSolid, r as makeCylinder, s as makeSphere, t as makeCompound, u as weldShellsAndFaces } from "./solidBuilders-DBsHetmI.js";
8
+ import { _ as makeThreePointArc, a as makeNonPlanarFace, c as makeBSplineApproximation, d as makeCircle, f as makeEllipse, g as makeTangentArc, h as makeLine, i as makeNewFaceWithinFace, m as makeHelix, o as makePolygon, p as makeEllipseArc, r as makeFace, s as assembleWire, t as addHolesInFace, u as makeBezierCurve } from "./surfaceBuilders-Do0rypyD.js";
9
+ import { a as fuseAll, i as fuse, n as cut, r as cutAll } from "./booleanFns-D7Xgt-Og.js";
10
+ import { a as makeOffset, c as makeTorus, i as makeEllipsoid, l as makeVertex, n as makeCone, o as makeSolid, r as makeCylinder, s as makeSphere, t as makeCompound, u as weldShellsAndFaces } from "./solidBuilders-BtEFUFQ9.js";
11
11
  //#region src/topology/threeHelpers.ts
12
12
  /**
13
13
  * Convert a ShapeMesh into BufferGeometry-compatible typed arrays.
@@ -1,13 +1,13 @@
1
- const require_shapeTypes = require("./shapeTypes-C4cMKLoj.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-CxSqNvHA.cjs");
2
2
  const require_errors = require("./errors-CXJtc4I7.cjs");
3
- const require_topologyQueryFns = require("./topologyQueryFns-Bj5wpC75.cjs");
3
+ const require_topologyQueryFns = require("./topologyQueryFns-Dzxrwn-E.cjs");
4
4
  const require_constants = require("./constants-BOVyEYGH.cjs");
5
- const require_faceFns = require("./faceFns-CZvemlPW.cjs");
6
- const require_shapeFns = require("./shapeFns-CQmd2W5F.cjs");
5
+ const require_faceFns = require("./faceFns-p0lyVuyw.cjs");
6
+ const require_shapeFns = require("./shapeFns-D5WNrq3s.cjs");
7
7
  const require_arrayAccess = require("./arrayAccess-e4H9cBfh.cjs");
8
- const require_surfaceBuilders = require("./surfaceBuilders-QK_Cnn_u.cjs");
9
- const require_booleanFns = require("./booleanFns-DxnTjP19.cjs");
10
- const require_solidBuilders = require("./solidBuilders-B0Hzin8a.cjs");
8
+ const require_surfaceBuilders = require("./surfaceBuilders-CPHOXRLE.cjs");
9
+ const require_booleanFns = require("./booleanFns-CFa3bgbG.cjs");
10
+ const require_solidBuilders = require("./solidBuilders-diw2zyyN.cjs");
11
11
  //#region src/topology/threeHelpers.ts
12
12
  /**
13
13
  * Convert a ShapeMesh into BufferGeometry-compatible typed arrays.
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_cameraFns = require("./cameraFns-G2lc5c9M.cjs");
2
+ const require_cameraFns = require("./cameraFns-DfSRnD1k.cjs");
3
3
  exports.PROJECTION_PLANES = require_cameraFns.PROJECTION_PLANES;
4
4
  exports.cameraFromPlane = require_cameraFns.cameraFromPlane;
5
5
  exports.cameraLookAt = require_cameraFns.cameraLookAt;
@@ -1,2 +1,2 @@
1
- import { a as makeProjectedEdges, i as projectEdges, n as cameraLookAt, o as PROJECTION_PLANES, r as createCamera, s as isProjectionPlane, t as cameraFromPlane } from "./cameraFns-Ctxe8ev-.js";
1
+ import { a as makeProjectedEdges, i as projectEdges, n as cameraLookAt, o as PROJECTION_PLANES, r as createCamera, s as isProjectionPlane, t as cameraFromPlane } from "./cameraFns-DCXqzH_m.js";
2
2
  export { PROJECTION_PLANES, cameraFromPlane, cameraLookAt, createCamera, isProjectionPlane, makeProjectedEdges, projectEdges };
package/dist/query.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_helpers = require("./helpers-90SKWHEY.cjs");
3
- const require_cornerFinder = require("./cornerFinder-CxqA_AYe.cjs");
2
+ const require_helpers = require("./helpers-DTBDjbdR.cjs");
3
+ const require_cornerFinder = require("./cornerFinder-KuLU-4pQ.cjs");
4
4
  exports.cornerFinder = require_cornerFinder.cornerFinder;
5
5
  exports.edgeFinder = require_helpers.edgeFinder;
6
6
  exports.faceFinder = require_helpers.faceFinder;
package/dist/query.js CHANGED
@@ -1,3 +1,3 @@
1
- import { n as edgeFinder, r as faceFinder, t as getSingleFace } from "./helpers-DsaGpuUh.js";
2
- import { t as cornerFinder } from "./cornerFinder-DamaTij5.js";
1
+ import { n as edgeFinder, r as faceFinder, t as getSingleFace } from "./helpers-C78MY-s6.js";
2
+ import { t as cornerFinder } from "./cornerFinder-DPkLU1Of.js";
3
3
  export { cornerFinder, edgeFinder, faceFinder, getSingleFace };
@@ -1,6 +1,6 @@
1
- const require_shapeTypes = require("./shapeTypes-C4cMKLoj.cjs");
1
+ const require_shapeTypes = require("./shapeTypes-CxSqNvHA.cjs");
2
2
  const require_errors = require("./errors-CXJtc4I7.cjs");
3
- const require_topologyQueryFns = require("./topologyQueryFns-Bj5wpC75.cjs");
3
+ const require_topologyQueryFns = require("./topologyQueryFns-Dzxrwn-E.cjs");
4
4
  const require_constants = require("./constants-BOVyEYGH.cjs");
5
5
  //#region src/topology/metadata/originTrackingFns.ts
6
6
  /**
@@ -1,6 +1,6 @@
1
- import { Z as getKernel, t as castShape } from "./shapeTypes-VCBsDI43.js";
1
+ import { Z as getKernel, t as castShape } from "./shapeTypes-CyTY0prh.js";
2
2
  import { A as ok, b as err, d as validationError, t as BrepErrorCode } from "./errors-DNWJsfVU.js";
3
- import { C as kernelCall, c as getFaces, l as getOrCreateCache, r as getCacheEntry, w as kernelCallRaw } from "./topologyQueryFns-BtfhAVY2.js";
3
+ import { C as kernelCall, c as getFaces, l as getOrCreateCache, r as getCacheEntry, w as kernelCallRaw } from "./topologyQueryFns-BomrmBie.js";
4
4
  import { n as HASH_CODE_MAX, t as DEG2RAD } from "./constants-ITRzCnCp.js";
5
5
  //#region src/topology/metadata/originTrackingFns.ts
6
6
  /**
package/dist/shapeRef.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_shapeRefFns = require("./shapeRefFns-DoPplxoN.cjs");
2
+ const require_shapeRefFns = require("./shapeRefFns-BOWP8n4j.cjs");
3
3
  exports.assignRoles = require_shapeRefFns.assignRoles;
4
4
  exports.captureHint = require_shapeRefFns.captureHint;
5
5
  exports.createRef = require_shapeRefFns.createRef;
package/dist/shapeRef.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as updateRoles, i as resolveRef, n as captureHint, o as defaultScorer, r as createRef, t as assignRoles } from "./shapeRefFns-DvIvS0do.js";
1
+ import { a as updateRoles, i as resolveRef, n as captureHint, o as defaultScorer, r as createRef, t as assignRoles } from "./shapeRefFns-ClsyeZp4.js";
2
2
  export { assignRoles, captureHint, createRef, defaultScorer, resolveRef, updateRoles };
@@ -1,8 +1,8 @@
1
1
  const require_vec3 = require("./vec3-CFwOI0ZI.cjs");
2
- const require_topologyQueryFns = require("./topologyQueryFns-Bj5wpC75.cjs");
3
- const require_faceFns = require("./faceFns-CZvemlPW.cjs");
4
- const require_shapeFns = require("./shapeFns-CQmd2W5F.cjs");
5
- const require_measureFns = require("./measureFns-CRS3U8gj.cjs");
2
+ const require_topologyQueryFns = require("./topologyQueryFns-Dzxrwn-E.cjs");
3
+ const require_faceFns = require("./faceFns-p0lyVuyw.cjs");
4
+ const require_shapeFns = require("./shapeFns-D5WNrq3s.cjs");
5
+ const require_measureFns = require("./measureFns-DnxobCbD.cjs");
6
6
  //#region src/topology/shapeRef/scoring.ts
7
7
  /**
8
8
  * Default face scorer combining surface type, normal alignment, centroid proximity,
@@ -1,8 +1,8 @@
1
1
  import { n as wasmIndex } from "./vec3-Dpha8d5k.js";
2
- import { c as getFaces } from "./topologyQueryFns-BtfhAVY2.js";
3
- import { i as faceGeomType, l as normalAt, r as faceCenter } from "./faceFns-BJ0mbRh5.js";
4
- import { n as getHashCode } from "./shapeFns-CQRGTifg.js";
5
- import { n as measureArea } from "./measureFns-DYeTPyHr.js";
2
+ import { c as getFaces } from "./topologyQueryFns-BomrmBie.js";
3
+ import { i as faceGeomType, l as normalAt, r as faceCenter } from "./faceFns-BJ2hzXJp.js";
4
+ import { n as getHashCode } from "./shapeFns-DZ6poxP7.js";
5
+ import { n as measureArea } from "./measureFns-C8c6xRUE.js";
6
6
  //#region src/topology/shapeRef/scoring.ts
7
7
  /**
8
8
  * Default face scorer combining surface type, normal alignment, centroid proximity,