@code3d/core 0.0.1-alpha.0 → 0.0.1-alpha.2

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 (128) hide show
  1. package/README.md +223 -786
  2. package/THIRD_PARTY.md +40 -0
  3. package/bld/THIRD_PARTY_NOTICES.txt +182 -0
  4. package/bld/chunks/chunk-5E6VXJU2.js +30 -0
  5. package/bld/chunks/chunk-5E6VXJU2.js.map +7 -0
  6. package/bld/chunks/chunk-63ZUQWQ2.js +19 -0
  7. package/bld/chunks/chunk-63ZUQWQ2.js.map +7 -0
  8. package/bld/chunks/chunk-AWYI64EE.js +31 -0
  9. package/bld/chunks/chunk-AWYI64EE.js.map +7 -0
  10. package/bld/chunks/chunk-F53RTQPT.js +24787 -0
  11. package/bld/chunks/chunk-F53RTQPT.js.map +7 -0
  12. package/bld/chunks/chunk-TJIN6S4R.js +1 -0
  13. package/bld/chunks/chunk-TJIN6S4R.js.map +7 -0
  14. package/bld/library/cached.d.ts +33 -0
  15. package/bld/library/cached.d.ts.map +1 -0
  16. package/bld/library/font.d.ts +39 -0
  17. package/bld/library/font.d.ts.map +1 -0
  18. package/bld/library/google-font.d.ts +14 -0
  19. package/bld/library/google-font.d.ts.map +1 -0
  20. package/bld/library/index.d.ts +8 -2
  21. package/bld/library/index.d.ts.map +1 -1
  22. package/bld/library/index.js +60 -3
  23. package/bld/library/index.js.map +7 -1
  24. package/bld/library/kernel-artifact-codec.d.ts.map +1 -1
  25. package/bld/library/kernel-cache.d.ts +17 -6
  26. package/bld/library/kernel-cache.d.ts.map +1 -1
  27. package/bld/library/material.d.ts +1 -1
  28. package/bld/library/material.d.ts.map +1 -1
  29. package/bld/library/open-cascade.d.ts +4 -0
  30. package/bld/library/open-cascade.d.ts.map +1 -0
  31. package/bld/library/replicad.d.ts +3 -2
  32. package/bld/library/replicad.d.ts.map +1 -1
  33. package/bld/library/replicad.js +10 -24
  34. package/bld/library/replicad.js.map +7 -1
  35. package/bld/library/retained-memory.d.ts.map +1 -1
  36. package/bld/library/runtime.d.ts +144 -80
  37. package/bld/library/runtime.d.ts.map +1 -1
  38. package/bld/library/sketch-solver.d.ts +1 -1
  39. package/bld/library/sketch-solver.d.ts.map +1 -1
  40. package/bld/library/sketch.d.ts +9 -1
  41. package/bld/library/sketch.d.ts.map +1 -1
  42. package/bld/library/text.d.ts +53 -0
  43. package/bld/library/text.d.ts.map +1 -0
  44. package/bld/library/three.js +3 -3
  45. package/bld/library/three.js.map +7 -1
  46. package/bld/node/index.d.ts.map +1 -1
  47. package/bld/node/index.js +62 -14
  48. package/bld/node/index.js.map +7 -1
  49. package/bld/node/replicad.js +13 -3
  50. package/bld/node/replicad.js.map +7 -1
  51. package/bld/tooling/index.d.ts +17 -15
  52. package/bld/tooling/index.d.ts.map +1 -1
  53. package/bld/tooling/index.js +147 -19
  54. package/bld/tooling/index.js.map +7 -1
  55. package/package.json +18 -6
  56. package/src/library/cached.ts +132 -0
  57. package/src/library/font.ts +186 -0
  58. package/src/library/google-font.ts +97 -0
  59. package/src/library/index.ts +8 -3
  60. package/src/library/kernel-artifact-codec.ts +129 -20
  61. package/src/library/kernel-cache.ts +111 -33
  62. package/src/library/material.ts +3 -4
  63. package/src/library/open-cascade.ts +13 -0
  64. package/src/library/replicad.ts +5 -5
  65. package/src/library/retained-memory.ts +6 -1
  66. package/src/library/runtime.ts +2049 -1728
  67. package/src/library/sketch-solver.ts +3 -1
  68. package/src/library/sketch.ts +81 -13
  69. package/src/library/text.ts +477 -0
  70. package/src/library/tsconfig.json +2 -1
  71. package/src/node/index.ts +14 -3
  72. package/src/node/tsconfig.json +2 -1
  73. package/src/tooling/index.ts +48 -46
  74. package/src/tooling/tsconfig.json +2 -1
  75. package/bld/library/alignment-geometry.js +0 -322
  76. package/bld/library/alignment-geometry.js.map +0 -1
  77. package/bld/library/bound-solver.js +0 -252
  78. package/bld/library/bound-solver.js.map +0 -1
  79. package/bld/library/extrude.js +0 -28
  80. package/bld/library/extrude.js.map +0 -1
  81. package/bld/library/kernel-artifact-codec.js +0 -148
  82. package/bld/library/kernel-artifact-codec.js.map +0 -1
  83. package/bld/library/kernel-cache.js +0 -245
  84. package/bld/library/kernel-cache.js.map +0 -1
  85. package/bld/library/kernel-shapes.js +0 -108
  86. package/bld/library/kernel-shapes.js.map +0 -1
  87. package/bld/library/loft.js +0 -161
  88. package/bld/library/loft.js.map +0 -1
  89. package/bld/library/material.js +0 -176
  90. package/bld/library/material.js.map +0 -1
  91. package/bld/library/model-color.js +0 -36
  92. package/bld/library/model-color.js.map +0 -1
  93. package/bld/library/open-cascade-error.js +0 -22
  94. package/bld/library/open-cascade-error.js.map +0 -1
  95. package/bld/library/relation-solver.js +0 -258
  96. package/bld/library/relation-solver.js.map +0 -1
  97. package/bld/library/retained-memory.js +0 -27
  98. package/bld/library/retained-memory.js.map +0 -1
  99. package/bld/library/runtime.js +0 -2954
  100. package/bld/library/runtime.js.map +0 -1
  101. package/bld/library/shell.js +0 -221
  102. package/bld/library/shell.js.map +0 -1
  103. package/bld/library/sketch-curve-intersections.js +0 -117
  104. package/bld/library/sketch-curve-intersections.js.map +0 -1
  105. package/bld/library/sketch-curves.js +0 -89
  106. package/bld/library/sketch-curves.js.map +0 -1
  107. package/bld/library/sketch-drag-rules.js +0 -522
  108. package/bld/library/sketch-drag-rules.js.map +0 -1
  109. package/bld/library/sketch-face.js +0 -72
  110. package/bld/library/sketch-face.js.map +0 -1
  111. package/bld/library/sketch-incidence.js +0 -114
  112. package/bld/library/sketch-incidence.js.map +0 -1
  113. package/bld/library/sketch-precision.js +0 -55
  114. package/bld/library/sketch-precision.js.map +0 -1
  115. package/bld/library/sketch-regions.js +0 -193
  116. package/bld/library/sketch-regions.js.map +0 -1
  117. package/bld/library/sketch-solver.js +0 -578
  118. package/bld/library/sketch-solver.js.map +0 -1
  119. package/bld/library/sketch.js +0 -650
  120. package/bld/library/sketch.js.map +0 -1
  121. package/bld/library/spatial.js +0 -195
  122. package/bld/library/spatial.js.map +0 -1
  123. package/bld/library/topology-id.js +0 -67
  124. package/bld/library/topology-id.js.map +0 -1
  125. package/bld/library/topology-inspection.js +0 -267
  126. package/bld/library/topology-inspection.js.map +0 -1
  127. package/bld/library/topology.js +0 -455
  128. package/bld/library/topology.js.map +0 -1
package/src/node/index.ts CHANGED
@@ -1,12 +1,23 @@
1
- import {fileURLToPath} from 'node:url';
2
1
  import initOpenCascade from '@code3d/opencascade';
3
- import {setOC} from 'replicad';
4
2
  import {init_planegcs_module as initializeSketchSolver} from '@salusoft89/planegcs';
3
+ import * as fontEngine from 'harfbuzzjs';
4
+ import {readFileSync} from 'node:fs';
5
+ import {fileURLToPath} from 'node:url';
6
+ import {
7
+ installFontEngine,
8
+ installModelResourceReader,
9
+ } from '../library/font.js';
10
+ import {installOpenCascade} from '../library/open-cascade.js';
5
11
  import {installSketchSolver} from '../library/sketch-solver.js';
6
12
 
13
+ installModelResourceReader(url =>
14
+ url.protocol === 'file:' ? readFileSync(url) : undefined,
15
+ );
16
+ installFontEngine(fontEngine);
17
+
7
18
  const wasmPath = fileURLToPath(import.meta.resolve('@code3d/opencascade/wasm'));
8
19
  const openCascade = await initOpenCascade({locateFile: () => wasmPath});
9
- setOC(openCascade);
20
+ installOpenCascade(openCascade);
10
21
  installSketchSolver(
11
22
  await initializeSketchSolver({
12
23
  locateFile: () =>
@@ -6,7 +6,8 @@
6
6
  "rootDir": ".",
7
7
  "outDir": "../../bld/node",
8
8
  "tsBuildInfoFile": "../../.cache/node.tsbuildinfo",
9
- "declarationMap": true
9
+ "declarationMap": true,
10
+ "emitDeclarationOnly": true
10
11
  },
11
12
  "references": [
12
13
  {
@@ -1,70 +1,76 @@
1
- import {setOC} from 'replicad';
2
- import type {OpenCascadeInstance} from '@code3d/opencascade';
3
- import {clearKernelOperationCache} from '../library/kernel-cache.js';
1
+ export {identifyCachedFunction} from '../library/cached.js';
2
+ export {
3
+ installFontEngine,
4
+ installModelResourceReader,
5
+ } from '../library/font.js';
6
+ export {googleFontSources, googleFontUrl} from '../library/google-font.js';
7
+ export {installOpenCascade} from '../library/open-cascade.js';
4
8
 
5
9
  export {
10
+ clearKernelOperationCache,
11
+ kernelOperationCacheStats,
6
12
  setKernelArtifactStore,
7
13
  setKernelExternalBytes,
8
- kernelOperationCacheStats,
9
- clearKernelOperationCache,
10
14
  } from '../library/kernel-cache.js';
11
15
  export type {KernelArtifactStore} from '../library/kernel-cache.js';
12
16
 
13
17
  export {
18
+ SketchConstraintError,
19
+ installSketchSolver,
20
+ } from '../library/sketch-solver.js';
21
+ export {
22
+ assertSketchDragConnections,
14
23
  isSketch,
15
24
  sketchDefinition,
16
- snapshotSketch,
17
- solveSketchSnapshot,
18
25
  sketchDragRequiresSolver,
19
- assertSketchDragConnections,
20
- sketchPointResolver,
21
26
  sketchEntityParameters,
27
+ sketchFrame,
28
+ sketchPointResolver,
29
+ sketchSource,
30
+ snapshotSketch,
31
+ solveSketchSnapshot,
22
32
  withSketchEntityParameters,
23
33
  } from '../library/sketch.js';
24
- export {
25
- installSketchSolver,
26
- SketchConstraintError,
27
- } from '../library/sketch-solver.js';
28
34
  export type {
29
35
  Sketch,
30
- SketchEntry,
36
+ SketchArcDirection,
37
+ SketchArcSnapshot,
38
+ SketchCircleSnapshot,
31
39
  SketchConstraint,
40
+ SketchEntitySnapshot,
41
+ SketchEntry,
42
+ SketchLineSnapshot,
32
43
  SketchOptions,
33
- SketchPosition,
34
44
  SketchPointAddress,
35
45
  SketchPointSnapshot,
36
- SketchLineSnapshot,
37
- SketchCircleSnapshot,
38
- SketchArcSnapshot,
39
- SketchArcDirection,
40
- SketchEntitySnapshot,
46
+ SketchPosition,
41
47
  SketchSnapshot,
42
48
  } from '../library/sketch.js';
43
49
 
50
+ export {sketchCurveIntersections} from '../library/sketch-curve-intersections.js';
51
+ export type {SketchCurveIntersection} from '../library/sketch-curve-intersections.js';
44
52
  export {
45
53
  sketchArcGeometry,
54
+ sketchCurveBounds,
55
+ sketchCurveClosestParameter,
46
56
  sketchCurveGeometry,
47
57
  sketchCurvePosition,
48
- sketchCurveClosestParameter,
49
- sketchCurveBounds,
50
58
  sketchCurveTolerance,
51
59
  sketchPositiveAngle,
52
60
  } from '../library/sketch-curves.js';
53
61
  export type {SketchCurve} from '../library/sketch-curves.js';
54
62
  export {sketchRegions} from '../library/sketch-regions.js';
55
63
  export type {SketchRegion} from '../library/sketch-regions.js';
56
- export {sketchCurveIntersections} from '../library/sketch-curve-intersections.js';
57
- export type {SketchCurveIntersection} from '../library/sketch-curve-intersections.js';
58
64
 
65
+ export {describeOpenCascadeException} from '../library/open-cascade-error.js';
59
66
  export {
60
67
  authoringApi,
61
68
  beginModelEvaluation,
62
- constraintTraceReference,
63
69
  constraintPreview,
70
+ constraintTraceReference,
64
71
  createModelSnapshotter,
65
- planModelSnapshotQueries,
66
- executeSnapshotQueryBatch,
67
72
  disposeModelObjects,
73
+ executeSnapshotQueryBatch,
68
74
  instrumentConstraint,
69
75
  instrumentModelOperation,
70
76
  isConstraint,
@@ -72,18 +78,19 @@ export {
72
78
  isModelObject,
73
79
  modelElementReference,
74
80
  modelObjectRuntimeInfo,
75
- modelTopologyReference,
76
81
  modelTopologyIds,
82
+ modelTopologyReference,
83
+ planModelSnapshotQueries,
77
84
  relatedModelObjects,
78
85
  retainModelGeometry,
79
86
  } from '../library/runtime.js';
80
87
  export type {
81
88
  Constraint,
89
+ ConstraintAnchorSnapshot,
82
90
  ConstraintExpression,
83
- ConstraintSpatialReference,
84
91
  ConstraintPreview,
85
- ConstraintAnchorSnapshot,
86
92
  ConstraintSnapshot,
93
+ ConstraintSpatialReference,
87
94
  ConstraintTraceReference,
88
95
  ElementKind,
89
96
  ElementSnapshot,
@@ -91,25 +98,26 @@ export type {
91
98
  ModelGeometryKind,
92
99
  ModelGeometrySnapshot,
93
100
  ModelKind,
101
+ ModelObject,
102
+ ModelObjectRuntimeInfo,
94
103
  ModelOperationInputRole,
95
104
  ModelOperationInstrumentation,
96
105
  ModelOperationKind,
97
106
  ModelOperationRegionSnapshot,
98
107
  ModelOperationSelectionSnapshot,
99
108
  ModelOperationSnapshot,
100
- ModelObject,
101
- ModelObjectRuntimeInfo,
109
+ ModelParameterDimension,
102
110
  ModelSnapshotObject,
103
- SnapshotQuery,
104
- SnapshotQueryResult,
105
- SnapshotQueryBatch,
106
111
  ModelSpatialOperation,
107
- ModelParameterDimension,
108
112
  ModelTopologyReference,
109
113
  ParameterKind,
110
114
  ParameterTarget,
111
115
  ParameterUsage,
116
+ RelationObject,
112
117
  RenderMesh,
118
+ SnapshotQuery,
119
+ SnapshotQueryBatch,
120
+ SnapshotQueryResult,
113
121
  SourceRef,
114
122
  Transform,
115
123
  } from '../library/runtime.js';
@@ -121,15 +129,15 @@ export {
121
129
  relativeTransform,
122
130
  rotateVector,
123
131
  rotationAround,
124
- xyzRotation,
125
132
  transformsAreEquivalent,
133
+ xyzRotation,
126
134
  } from '../library/spatial.js';
127
135
  export type {Quaternion, RigidTransform, Vec3} from '../library/spatial.js';
128
136
  export type {
129
- TopologyInspectionOptions,
137
+ TopologyGeometry,
130
138
  TopologyInspection,
131
139
  TopologyInspectionItem,
132
- TopologyGeometry,
140
+ TopologyInspectionOptions,
133
141
  } from '../library/topology-inspection.js';
134
142
  export type {
135
143
  EdgeId,
@@ -138,20 +146,14 @@ export type {
138
146
  TopologyKind,
139
147
  VertexId,
140
148
  } from '../library/topology.js';
141
- export {describeOpenCascadeException} from '../library/open-cascade-error.js';
142
-
143
- export function installOpenCascade(openCascade: OpenCascadeInstance): void {
144
- clearKernelOperationCache();
145
- setOC(openCascade);
146
- }
147
149
 
148
150
  export {
151
+ TopologyIdSet,
149
152
  compareTopologyIds,
150
153
  formatTopologyId,
151
154
  isTopologyId,
152
155
  sameTopologyId,
153
156
  topologyIdKey,
154
- TopologyIdSet,
155
157
  } from '../library/topology-id.js';
156
158
 
157
159
  export {captureModelMaterial, modelMaterialColor} from '../library/material.js';
@@ -5,7 +5,8 @@
5
5
  "rootDir": ".",
6
6
  "outDir": "../../bld/tooling",
7
7
  "tsBuildInfoFile": "../../.cache/tooling.tsbuildinfo",
8
- "declarationMap": true
8
+ "declarationMap": true,
9
+ "emitDeclarationOnly": true
9
10
  },
10
11
  "references": [
11
12
  {
@@ -1,322 +0,0 @@
1
- import { getOC } from 'replicad';
2
- import { addVectors, composeTransforms, rotateVector, translation, } from './spatial.js';
3
- export const dot = (a, b) => a.reduce((sum, v, i) => sum + v * b[i], 0);
4
- export const scale = (a, s) => [
5
- a[0] * s,
6
- a[1] * s,
7
- a[2] * s,
8
- ];
9
- export const subtract = (a, b) => addVectors(a, scale(b, -1));
10
- export const cross = (a, b) => [
11
- a[1] * b[2] - a[2] * b[1],
12
- a[2] * b[0] - a[0] * b[2],
13
- a[0] * b[1] - a[1] * b[0],
14
- ];
15
- export const unit = (v) => scale(v, 1 / Math.hypot(...v));
16
- export const reject = (v, normal) => subtract(v, scale(normal, dot(v, normal)));
17
- export const perpendicular = (v) => unit(reject(Math.abs(v[0]) < 0.8 ? [1, 0, 0] : [0, 1, 0], v));
18
- function coordinates(value) {
19
- try {
20
- return [value.X(), value.Y(), value.Z()];
21
- }
22
- finally {
23
- value.delete();
24
- }
25
- }
26
- /** Read complete analytic loci, independent of edge/face trimming and parametrization. */
27
- export function edgeGeometry(edge, direction) {
28
- const oc = getOC();
29
- const adaptor = new oc.BRepAdaptor_Curve(edge.wrapped);
30
- try {
31
- if (edge.geomType === 'LINE') {
32
- const point = edge.pointAt(0), tangent = edge.tangentAt(0);
33
- try {
34
- const axis = scale(tangent.toTuple(), direction);
35
- return {
36
- kind: 'line',
37
- point: reject(point.toTuple(), axis),
38
- direction: axis,
39
- };
40
- }
41
- finally {
42
- point.delete();
43
- tangent.delete();
44
- }
45
- }
46
- if (edge.geomType === 'CIRCLE' || edge.geomType === 'ELLIPSE') {
47
- const curve = edge.geomType === 'CIRCLE' ? adaptor.Circle() : adaptor.Ellipse();
48
- const frame = curve.Position();
49
- try {
50
- const radius = 'Radius' in curve ? curve.Radius() : curve.MajorRadius();
51
- const minorRadius = 'Radius' in curve ? radius : curve.MinorRadius();
52
- return {
53
- kind: Math.abs(radius - minorRadius) < 1e-10 ? 'circle' : 'ellipse',
54
- point: coordinates(curve.Location()),
55
- normal: scale(coordinates(frame.Direction()), direction),
56
- major: coordinates(frame.XDirection()),
57
- radius,
58
- minorRadius,
59
- };
60
- }
61
- finally {
62
- frame.delete();
63
- curve.delete();
64
- }
65
- }
66
- throw new Error(`align() does not yet support underlying ${edge.geomType} curves. Select a point on the curve for further positioning.`);
67
- }
68
- finally {
69
- adaptor.delete();
70
- }
71
- }
72
- export function faceGeometry(face, facing) {
73
- const adaptor = new (getOC().BRepAdaptor_Surface)(face.wrapped, false);
74
- try {
75
- if (face.geomType === 'PLANE') {
76
- const plane = adaptor.Plane(), axis = plane.Axis();
77
- try {
78
- const normal = scale(coordinates(axis.Direction()), facing * (face.orientation === 'forward' ? 1 : -1));
79
- return {
80
- kind: 'plane',
81
- point: scale(normal, dot(coordinates(plane.Location()), normal)),
82
- normal,
83
- };
84
- }
85
- finally {
86
- axis.delete();
87
- plane.delete();
88
- }
89
- }
90
- if (face.geomType === 'CYLINDRE' || face.geomType === 'SPHERE') {
91
- const surface = face.geomType === 'SPHERE' ? adaptor.Sphere() : adaptor.Cylinder();
92
- try {
93
- const point = coordinates(surface.Location());
94
- const sense = facing *
95
- (face.orientation === 'forward' ? 1 : -1) *
96
- (surface.Direct() ? 1 : -1);
97
- if (face.geomType === 'SPHERE')
98
- return {
99
- kind: 'sphere',
100
- point,
101
- radius: surface.Radius(),
102
- facing: sense,
103
- };
104
- const axis = surface.Axis();
105
- try {
106
- const direction = coordinates(axis.Direction());
107
- return {
108
- kind: 'cylinder',
109
- point: reject(point, direction),
110
- direction,
111
- radius: surface.Radius(),
112
- facing: sense,
113
- };
114
- }
115
- finally {
116
- axis.delete();
117
- }
118
- }
119
- finally {
120
- surface.delete();
121
- }
122
- }
123
- throw new Error(`align() does not yet support underlying ${face.geomType} surfaces.`);
124
- }
125
- finally {
126
- adaptor.delete();
127
- }
128
- }
129
- export function transformGeometry(geometry, pose) {
130
- const point = composeTransforms(pose, translation(geometry.point)).position;
131
- if ('direction' in geometry) {
132
- const direction = rotateVector(geometry.direction, pose.quaternion);
133
- return { ...geometry, point: reject(point, direction), direction };
134
- }
135
- if ('normal' in geometry) {
136
- const normal = rotateVector(geometry.normal, pose.quaternion);
137
- return 'major' in geometry
138
- ? {
139
- ...geometry,
140
- point,
141
- normal,
142
- major: rotateVector(geometry.major, pose.quaternion),
143
- }
144
- : { ...geometry, point: scale(normal, dot(point, normal)), normal };
145
- }
146
- return { ...geometry, point };
147
- }
148
- const rank = (g) => g.kind === 'point'
149
- ? 0
150
- : ['line', 'circle', 'ellipse'].includes(g.kind)
151
- ? 1
152
- : 2;
153
- export function orderedGeometry(a, b) {
154
- return rank(a) <= rank(b) ? [a, b] : [b, a];
155
- }
156
- /** Reject only proven incompatibilities; unsupported pairs and iteration failures have distinct errors. */
157
- export function validateAlignment(first, second) {
158
- const [a, b] = orderedGeometry(first, second);
159
- const incompatible = (reason) => {
160
- throw new Error(`Geometrically incompatible align(): ${reason}`);
161
- };
162
- const sameSize = (a, b) => Math.abs(a - b) <= 1e-7 * Math.max(1, a, b);
163
- if (a.kind === 'point')
164
- return;
165
- if (rank(a) === rank(b)) {
166
- if (a.kind !== b.kind)
167
- incompatible(`${a.kind} and ${b.kind} cannot coincide under a rigid transform.`);
168
- if ('radius' in a && 'radius' in b && !sameSize(a.radius, b.radius))
169
- incompatible('radii differ.');
170
- if ('minorRadius' in a &&
171
- 'minorRadius' in b &&
172
- !sameSize(a.minorRadius, b.minorRadius))
173
- incompatible('minor radii differ.');
174
- if ('facing' in a && 'facing' in b && a.facing !== b.facing)
175
- incompatible('closed surface normal senses differ; use flip() to select matching facing.');
176
- return;
177
- }
178
- if (b.kind === 'plane')
179
- return;
180
- if (a.kind === 'line' && b.kind === 'cylinder')
181
- return;
182
- if (a.kind === 'line' && b.kind === 'sphere')
183
- incompatible('a whole straight line cannot lie on a sphere.');
184
- if (a.kind === 'circle' && b.kind === 'cylinder') {
185
- if (!sameSize(a.radius, b.radius))
186
- incompatible('a circle on a cylinder must have its radius.');
187
- return;
188
- }
189
- if (a.kind === 'circle' && b.kind === 'sphere') {
190
- if (a.radius > b.radius + 1e-7)
191
- incompatible('the circle is larger than the sphere.');
192
- return;
193
- }
194
- if (a.kind === 'ellipse' && b.kind === 'sphere')
195
- incompatible('a non-circular ellipse cannot lie on a sphere.');
196
- if (a.kind === 'ellipse' && b.kind === 'cylinder') {
197
- if (!sameSize(a.minorRadius, b.radius))
198
- incompatible('an elliptic cylinder section must have the cylinder radius as its minor radius.');
199
- return;
200
- }
201
- throw new Error(`align() does not yet support ${a.kind}–${b.kind} relations.`);
202
- }
203
- /** All residuals describe complete analytic loci; no trim endpoints or sampled tangent frames. */
204
- export function alignmentResidual(first, second) {
205
- const [a, b] = orderedGeometry(first, second), delta = subtract(a.point, b.point);
206
- if (a.kind === 'point') {
207
- switch (b.kind) {
208
- case 'point':
209
- return [...delta];
210
- case 'line':
211
- return [...reject(delta, b.direction)];
212
- case 'plane':
213
- return [dot(delta, b.normal)];
214
- case 'sphere':
215
- return [Math.hypot(...delta) - b.radius];
216
- case 'cylinder':
217
- return [Math.hypot(...reject(delta, b.direction)) - b.radius];
218
- case 'circle':
219
- return [
220
- dot(delta, b.normal),
221
- Math.hypot(...reject(delta, b.normal)) - b.radius,
222
- ];
223
- case 'ellipse': {
224
- const x = dot(delta, b.major) / b.radius, y = dot(delta, cross(b.normal, b.major)) / b.minorRadius;
225
- return [dot(delta, b.normal), (Math.hypot(x, y) - 1) * b.minorRadius];
226
- }
227
- }
228
- }
229
- if (a.kind === 'line') {
230
- if (b.kind === 'line')
231
- return [
232
- ...reject(delta, b.direction),
233
- ...subtract(a.direction, b.direction),
234
- ];
235
- if (b.kind === 'plane')
236
- return [dot(delta, b.normal), dot(a.direction, b.normal)];
237
- if (b.kind === 'cylinder')
238
- return [
239
- ...cross(a.direction, b.direction),
240
- Math.hypot(...reject(delta, b.direction)) - b.radius,
241
- ];
242
- }
243
- if (a.kind === 'circle' || a.kind === 'ellipse') {
244
- if (b.kind === 'circle' || b.kind === 'ellipse')
245
- return [
246
- ...delta,
247
- ...subtract(a.normal, b.normal),
248
- ...(a.kind === 'ellipse' ? cross(a.major, b.major) : []),
249
- ];
250
- if (b.kind === 'plane')
251
- return [dot(delta, b.normal), ...cross(a.normal, b.normal)];
252
- if (b.kind === 'sphere')
253
- return [
254
- ...reject(delta, a.normal),
255
- dot(delta, delta) + a.radius * a.radius - b.radius * b.radius,
256
- ];
257
- if (b.kind === 'cylinder') {
258
- // Fourier coefficients of squared distance to the cylinder axis. Their
259
- // vanishing is equivalent to membership of the complete ellipse/circle.
260
- const c = reject(delta, b.direction), x = reject(scale(a.major, a.radius), b.direction), y = reject(scale(cross(a.normal, a.major), a.minorRadius), b.direction);
261
- return [
262
- dot(c, c) + (dot(x, x) + dot(y, y)) / 2 - b.radius * b.radius,
263
- dot(c, x),
264
- dot(c, y),
265
- dot(x, x) - dot(y, y),
266
- dot(x, y),
267
- ];
268
- }
269
- }
270
- if (a.kind === 'plane' && b.kind === 'plane')
271
- return [dot(delta, b.normal), ...subtract(a.normal, b.normal)];
272
- if (a.kind === 'cylinder' && b.kind === 'cylinder')
273
- return [...reject(delta, b.direction), ...cross(a.direction, b.direction)];
274
- if (a.kind === 'sphere' && b.kind === 'sphere')
275
- return [...delta];
276
- throw new Error(`Unsupported alignment residual: ${a.kind}–${b.kind}.`);
277
- }
278
- export function nearestPoint(point, geometry) {
279
- const delta = subtract(point, geometry.point);
280
- const radial = (v, radius, fallback) => scale(Math.hypot(...v) > 1e-12 ? unit(v) : fallback, radius);
281
- switch (geometry.kind) {
282
- case 'point':
283
- return geometry.point;
284
- case 'line':
285
- return addVectors(geometry.point, scale(geometry.direction, dot(delta, geometry.direction)));
286
- case 'plane':
287
- return subtract(point, scale(geometry.normal, dot(delta, geometry.normal)));
288
- case 'sphere':
289
- return addVectors(geometry.point, radial(delta, geometry.radius, [1, 0, 0]));
290
- case 'cylinder':
291
- return addVectors(addVectors(geometry.point, scale(geometry.direction, dot(delta, geometry.direction))), radial(reject(delta, geometry.direction), geometry.radius, perpendicular(geometry.direction)));
292
- case 'circle':
293
- return addVectors(geometry.point, radial(reject(delta, geometry.normal), geometry.radius, geometry.major));
294
- case 'ellipse': {
295
- const y = cross(geometry.normal, geometry.major);
296
- const x0 = dot(delta, geometry.major), y0 = dot(delta, y);
297
- const distance = (angle) => (geometry.radius * Math.cos(angle) - x0) ** 2 +
298
- (geometry.minorRadius * Math.sin(angle) - y0) ** 2;
299
- // Bracket all minima of distance on the ellipse, then refine them. This
300
- // chooses a nearby free parameter; membership still uses the exact locus.
301
- const step = Math.PI / 16, candidates = [];
302
- for (let i = 0; i < 32; i++) {
303
- const angle = i * step;
304
- if (distance(angle) > distance(angle - step) ||
305
- distance(angle) > distance(angle + step))
306
- continue;
307
- let lower = angle - step, upper = angle + step;
308
- for (let iteration = 0; iteration < 64; iteration++) {
309
- const a = lower + (upper - lower) * 0.3819660112501051, b = upper - (upper - lower) * 0.3819660112501051;
310
- if (distance(a) < distance(b))
311
- upper = b;
312
- else
313
- lower = a;
314
- }
315
- candidates.push((lower + upper) / 2);
316
- }
317
- const angle = candidates.reduce((best, angle) => (distance(angle) < distance(best) ? angle : best), candidates[0]);
318
- return addVectors(geometry.point, addVectors(scale(geometry.major, geometry.radius * Math.cos(angle)), scale(y, geometry.minorRadius * Math.sin(angle))));
319
- }
320
- }
321
- }
322
- //# sourceMappingURL=alignment-geometry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"alignment-geometry.js","sourceRoot":"","sources":["../../src/library/alignment-geometry.ts"],"names":[],"mappings":"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"}