@constructorfleet/sketchforge-engine 1.25.0 → 1.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cadAnalysis.d.ts +94 -0
- package/dist/cadAnalysis.d.ts.map +1 -0
- package/dist/cadAnalysis.js +143 -0
- package/dist/cadAnalysis.js.map +1 -0
- package/dist/cadShell.d.ts +143 -0
- package/dist/cadShell.d.ts.map +1 -0
- package/dist/cadShell.js +306 -0
- package/dist/cadShell.js.map +1 -0
- package/dist/cadSolids.d.ts +32 -0
- package/dist/cadSolids.d.ts.map +1 -1
- package/dist/cadSolids.js +45 -12
- package/dist/cadSolids.js.map +1 -1
- package/dist/domain/sketchforge.d.ts +1 -1
- package/dist/domain/sketchforge.d.ts.map +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +70 -79
- package/dist/engine.js.map +1 -1
- package/dist/faceDraftSegmentLineage.d.ts +2 -37
- package/dist/faceDraftSegmentLineage.d.ts.map +1 -1
- package/dist/faceDraftSegmentLineage.js +6 -190
- package/dist/faceDraftSegmentLineage.js.map +1 -1
- package/dist/parametricRecompute.d.ts.map +1 -1
- package/dist/parametricRecompute.js +7 -4
- package/dist/parametricRecompute.js.map +1 -1
- package/dist/revolveRequests.d.ts.map +1 -1
- package/dist/serverCadInterference.d.ts +8 -45
- package/dist/serverCadInterference.d.ts.map +1 -1
- package/dist/serverCadInterference.js +13 -42
- package/dist/serverCadInterference.js.map +1 -1
- package/dist/serverCadMeasure.d.ts.map +1 -1
- package/dist/serverCadMeasure.js +33 -2
- package/dist/serverCadMeasure.js.map +1 -1
- package/dist/serverCadOperations.d.ts +14 -43
- package/dist/serverCadOperations.d.ts.map +1 -1
- package/dist/serverCadOperations.js +117 -160
- package/dist/serverCadOperations.js.map +1 -1
- package/dist/serverCadShell.d.ts +7 -94
- package/dist/serverCadShell.d.ts.map +1 -1
- package/dist/serverCadShell.js +25 -269
- package/dist/serverCadShell.js.map +1 -1
- package/dist/serverCadThickness.d.ts +8 -8
- package/dist/serverCadThickness.d.ts.map +1 -1
- package/dist/serverCadThickness.js +15 -42
- package/dist/serverCadThickness.js.map +1 -1
- package/dist/serverShapeBooleans.js +1 -1
- package/dist/serverShapeBooleans.js.map +1 -1
- package/dist/serverStepExplode.d.ts +1 -2
- package/dist/serverStepExplode.d.ts.map +1 -1
- package/dist/serverStepExplode.js +15 -148
- package/dist/serverStepExplode.js.map +1 -1
- package/dist/sketchExtrusionRequest.d.ts.map +1 -1
- package/dist/sketchExtrusionRequest.js +2 -25
- package/dist/sketchExtrusionRequest.js.map +1 -1
- package/dist/sketchExtrusionSolid.d.ts +4 -0
- package/dist/sketchExtrusionSolid.d.ts.map +1 -0
- package/dist/sketchExtrusionSolid.js +36 -0
- package/dist/sketchExtrusionSolid.js.map +1 -0
- package/dist/sketchFaceDraftKernel.d.ts +248 -0
- package/dist/sketchFaceDraftKernel.d.ts.map +1 -0
- package/dist/sketchFaceDraftKernel.js +575 -0
- package/dist/sketchFaceDraftKernel.js.map +1 -0
- package/dist/stepAssemblyExplode.d.ts +45 -0
- package/dist/stepAssemblyExplode.d.ts.map +1 -0
- package/dist/stepAssemblyExplode.js +195 -0
- package/dist/stepAssemblyExplode.js.map +1 -0
- package/dist/support/cadModifierTypes.d.ts +82 -0
- package/dist/support/cadModifierTypes.d.ts.map +1 -1
- package/dist/support/i18n/locales/en/messages.json +15 -1
- package/dist/support/lib/operator-configuration.json +11 -0
- package/dist/workplaneShapes.d.ts.map +1 -1
- package/dist/workplaneShapes.js +5 -0
- package/dist/workplaneShapes.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The retained face and prism drafts of a sketch extrusion, on a kernel the
|
|
3
|
+
* caller supplies.
|
|
4
|
+
*
|
|
5
|
+
* Browser-safe: nothing here loads a kernel, so the editor's CAD worker runs
|
|
6
|
+
* these on its own OCCT instance and the server runs the same functions inside
|
|
7
|
+
* `withCadKernel`. A draft the editor makes must be the same feature, with the
|
|
8
|
+
* same record and placement, that `PATCH faceDraft` or `POST /draft-prism`
|
|
9
|
+
* makes, and the way to keep two callers from drifting is for both to call one
|
|
10
|
+
* implementation. Shared here, and called by both: which face a draft names
|
|
11
|
+
* (`resolveRetainedFaceDraft`, legacy segment inference included), the draft
|
|
12
|
+
* itself (`draftSketchFace`), result face IDs, the records, and where the
|
|
13
|
+
* drafted part is placed (`retainedDraftSourcePlacement`).
|
|
14
|
+
*
|
|
15
|
+
* Errors carry the messages the REST API has always returned; each caller
|
|
16
|
+
* wraps them in its own error type.
|
|
17
|
+
*/
|
|
18
|
+
import * as THREE from "three";
|
|
19
|
+
import { cadSketchRegions } from "./sketchCadProfile.js";
|
|
20
|
+
import { createLocalId } from "./localIds.js";
|
|
21
|
+
import { sketchExtrusionSolid } from "./sketchExtrusionSolid.js";
|
|
22
|
+
const MATCH_TOLERANCE = 1e-6;
|
|
23
|
+
/** How far apart two unit normals may be and still name the same face. */
|
|
24
|
+
const NORMAL_MATCH_TOLERANCE = 1e-5;
|
|
25
|
+
export const SKETCH_FACE_DRAFT_PULL_AXES = {
|
|
26
|
+
x: { x: 1, y: 0, z: 0 }, y: { x: 0, y: 1, z: 0 }, z: { x: 0, y: 0, z: 1 },
|
|
27
|
+
"-x": { x: -1, y: 0, z: 0 }, "-y": { x: 0, y: -1, z: 0 }, "-z": { x: 0, y: 0, z: -1 },
|
|
28
|
+
};
|
|
29
|
+
function segmentEndpoints(profile) {
|
|
30
|
+
let regions;
|
|
31
|
+
try {
|
|
32
|
+
regions = cadSketchRegions(profile);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
if (regions.length !== 1 || regions[0]?.holes.length !== 0 || !profile.segments.length
|
|
38
|
+
|| regions[0].outer.steps.length !== profile.segments.length)
|
|
39
|
+
return null;
|
|
40
|
+
if (profile.segments.some((segment) => segment.kind !== undefined && segment.kind !== "line"))
|
|
41
|
+
return null;
|
|
42
|
+
const pointsById = new Map();
|
|
43
|
+
for (const point of profile.points) {
|
|
44
|
+
if (!point.id || pointsById.has(point.id))
|
|
45
|
+
return null;
|
|
46
|
+
pointsById.set(point.id, point);
|
|
47
|
+
}
|
|
48
|
+
const segmentIds = new Set();
|
|
49
|
+
const endpoints = [];
|
|
50
|
+
for (const segment of profile.segments) {
|
|
51
|
+
if (!segment.id || segmentIds.has(segment.id))
|
|
52
|
+
return null;
|
|
53
|
+
segmentIds.add(segment.id);
|
|
54
|
+
const start = pointsById.get(segment.startId);
|
|
55
|
+
const end = pointsById.get(segment.endId);
|
|
56
|
+
if (!start || !end)
|
|
57
|
+
return null;
|
|
58
|
+
if (segment.kind === undefined
|
|
59
|
+
&& ((start.handleOut && end.handleIn) || (start.handleIn && end.handleOut)))
|
|
60
|
+
return null;
|
|
61
|
+
endpoints.push({ id: segment.id, start: { x: start.x, z: start.z }, end: { x: end.x, z: end.z } });
|
|
62
|
+
}
|
|
63
|
+
return endpoints;
|
|
64
|
+
}
|
|
65
|
+
function close(left, right) {
|
|
66
|
+
return Math.abs(left - right) <= MATCH_TOLERANCE;
|
|
67
|
+
}
|
|
68
|
+
function edgeMatchesSegmentAtY(vertices, y, segment) {
|
|
69
|
+
if (vertices.length !== 2)
|
|
70
|
+
return false;
|
|
71
|
+
const [first, second] = vertices;
|
|
72
|
+
if (!first || !second || !close(first.y, y) || !close(second.y, y))
|
|
73
|
+
return false;
|
|
74
|
+
const direct = close(first.x, segment.start.x) && close(first.z, segment.start.z)
|
|
75
|
+
&& close(second.x, segment.end.x) && close(second.z, segment.end.z);
|
|
76
|
+
const reversed = close(first.x, segment.end.x) && close(first.z, segment.end.z)
|
|
77
|
+
&& close(second.x, segment.start.x) && close(second.z, segment.start.z);
|
|
78
|
+
return direct || reversed;
|
|
79
|
+
}
|
|
80
|
+
export function uniqueSketchSegmentForSideBoundary(boundary, segments, height) {
|
|
81
|
+
if (boundary.length < 4 || boundary.some((edge) => edge.curveType !== "line" || edge.vertices.length !== 2)) {
|
|
82
|
+
return { status: "missing" };
|
|
83
|
+
}
|
|
84
|
+
const matched = segments.filter((segment) => {
|
|
85
|
+
const bottom = boundary.filter((edge) => edgeMatchesSegmentAtY(edge.vertices, 0, segment)).length;
|
|
86
|
+
const top = boundary.filter((edge) => edgeMatchesSegmentAtY(edge.vertices, height, segment)).length;
|
|
87
|
+
return bottom === 1 && top === 1;
|
|
88
|
+
});
|
|
89
|
+
if (matched.length === 1)
|
|
90
|
+
return { status: "matched", segmentId: matched[0].id };
|
|
91
|
+
return { status: matched.length === 0 ? "missing" : "ambiguous" };
|
|
92
|
+
}
|
|
93
|
+
function sideFaceSegmentMatch(cad, face, segments, height) {
|
|
94
|
+
const edges = cad.getSubShapes(face, "edge");
|
|
95
|
+
const boundary = edges.map((edge) => ({
|
|
96
|
+
curveType: cad.curveType(edge),
|
|
97
|
+
vertices: cad.getSubShapes(edge, "vertex").map((vertex) => cad.vertexPosition(vertex)),
|
|
98
|
+
}));
|
|
99
|
+
return uniqueSketchSegmentForSideBoundary(boundary, segments, height);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* A face's outward normal at the middle of its parameter range, or null.
|
|
103
|
+
*
|
|
104
|
+
* The same sample the REST face listing reports, so a normal recorded here
|
|
105
|
+
* compares equal to one a script read from `GET /faces`.
|
|
106
|
+
*/
|
|
107
|
+
export function sketchFaceNormal(cad, face) {
|
|
108
|
+
try {
|
|
109
|
+
const bounds = cad.uvBounds(face);
|
|
110
|
+
const normal = cad.surfaceNormal(face, (bounds.uMin + bounds.uMax) / 2, (bounds.vMin + bounds.vMax) / 2);
|
|
111
|
+
return [normal.x, normal.y, normal.z].every(Number.isFinite) ? normal : null;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Map a selected source face to its exact sketch line segment, when supported. */
|
|
118
|
+
export function sketchSegmentForDraftFaceOnKernel(cad, shape, faceId) {
|
|
119
|
+
if (shape.sketchOperation !== "extrude" || !shape.sketchProfile || !shape.cadBrep)
|
|
120
|
+
return { status: "unsupported" };
|
|
121
|
+
const segments = segmentEndpoints(shape.sketchProfile);
|
|
122
|
+
if (!segments)
|
|
123
|
+
return { status: "unsupported" };
|
|
124
|
+
const faceIndexes = shape.faceIds?.flatMap((id, index) => id === faceId ? [index] : []) ?? [];
|
|
125
|
+
if (faceIndexes.length !== 1)
|
|
126
|
+
return { status: "missing" };
|
|
127
|
+
let solid;
|
|
128
|
+
try {
|
|
129
|
+
solid = cad.fromBREP(shape.cadBrep);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return { status: "missing" };
|
|
133
|
+
}
|
|
134
|
+
const faces = cad.getSubShapes(solid, "face");
|
|
135
|
+
if (faces.length !== shape.faceIds?.length)
|
|
136
|
+
return { status: "missing" };
|
|
137
|
+
const face = faces[faceIndexes[0]];
|
|
138
|
+
if (!face || cad.surfaceType(face) !== "plane")
|
|
139
|
+
return { status: "unsupported" };
|
|
140
|
+
const normal = sketchFaceNormal(cad, face);
|
|
141
|
+
if (!normal)
|
|
142
|
+
return { status: "missing" };
|
|
143
|
+
if (Math.abs(normal.y) > 1 - MATCH_TOLERANCE)
|
|
144
|
+
return { status: "cap" };
|
|
145
|
+
const height = shape.cadBrepFrame?.height ?? shape.height;
|
|
146
|
+
const faceMatch = sideFaceSegmentMatch(cad, face, segments, height);
|
|
147
|
+
if (faceMatch.status !== "matched")
|
|
148
|
+
return faceMatch;
|
|
149
|
+
const segmentId = faceMatch.segmentId;
|
|
150
|
+
const segment = segments.find((candidate) => candidate.id === segmentId);
|
|
151
|
+
const matchingFaces = faces.filter((candidate) => sideFaceSegmentMatch(cad, candidate, [segment], height).status === "matched");
|
|
152
|
+
if (matchingFaces.length !== 1)
|
|
153
|
+
return { status: "ambiguous" };
|
|
154
|
+
return { status: "matched", segmentId, faceId, normal };
|
|
155
|
+
}
|
|
156
|
+
/** Find the unique source face corresponding to a retained sketch segment. */
|
|
157
|
+
export function draftFaceForSketchSegmentOnKernel(cad, shape, segmentId) {
|
|
158
|
+
if (shape.sketchOperation !== "extrude" || !shape.sketchProfile || !shape.cadBrep)
|
|
159
|
+
return { status: "unsupported" };
|
|
160
|
+
const segments = segmentEndpoints(shape.sketchProfile);
|
|
161
|
+
if (!segments)
|
|
162
|
+
return { status: "unsupported" };
|
|
163
|
+
const segmentMatches = segments.filter((segment) => segment.id === segmentId);
|
|
164
|
+
if (segmentMatches.length !== 1)
|
|
165
|
+
return { status: "missing" };
|
|
166
|
+
let solid;
|
|
167
|
+
try {
|
|
168
|
+
solid = cad.fromBREP(shape.cadBrep);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return { status: "missing" };
|
|
172
|
+
}
|
|
173
|
+
const faces = cad.getSubShapes(solid, "face");
|
|
174
|
+
if (faces.length !== shape.faceIds?.length)
|
|
175
|
+
return { status: "missing" };
|
|
176
|
+
const height = shape.cadBrepFrame?.height ?? shape.height;
|
|
177
|
+
const matchingFaces = faces.flatMap((face, index) => sideFaceSegmentMatch(cad, face, segmentMatches, height).status === "matched" && shape.faceIds?.[index]
|
|
178
|
+
? [{ face, faceId: shape.faceIds[index] }]
|
|
179
|
+
: []);
|
|
180
|
+
if (matchingFaces.length !== 1)
|
|
181
|
+
return { status: matchingFaces.length === 0 ? "missing" : "ambiguous" };
|
|
182
|
+
const normal = sketchFaceNormal(cad, matchingFaces[0].face);
|
|
183
|
+
return normal
|
|
184
|
+
? { status: "matched", segmentId, faceId: matchingFaces[0].faceId, normal }
|
|
185
|
+
: { status: "missing" };
|
|
186
|
+
}
|
|
187
|
+
function canonicalDraftRotation(direction) {
|
|
188
|
+
switch (direction) {
|
|
189
|
+
case "x": return { axis: { point: { x: 0, y: 0, z: 0 }, direction: { x: 0, y: 1, z: 0 } }, angle: -Math.PI / 2 };
|
|
190
|
+
case "-x": return { axis: { point: { x: 0, y: 0, z: 0 }, direction: { x: 0, y: 1, z: 0 } }, angle: Math.PI / 2 };
|
|
191
|
+
case "y": return { axis: { point: { x: 0, y: 0, z: 0 }, direction: { x: 1, y: 0, z: 0 } }, angle: Math.PI / 2 };
|
|
192
|
+
case "-y": return { axis: { point: { x: 0, y: 0, z: 0 }, direction: { x: 1, y: 0, z: 0 } }, angle: -Math.PI / 2 };
|
|
193
|
+
case "z": return null;
|
|
194
|
+
case "-z": return { axis: { point: { x: 0, y: 0, z: 0 }, direction: { x: 0, y: 1, z: 0 } }, angle: Math.PI };
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function rotateVector(vector, axis, angle) {
|
|
198
|
+
const cosine = Math.cos(angle), sine = Math.sin(angle);
|
|
199
|
+
const dot = axis.x * vector.x + axis.y * vector.y + axis.z * vector.z;
|
|
200
|
+
const cross = { x: axis.y * vector.z - axis.z * vector.y, y: axis.z * vector.x - axis.x * vector.z, z: axis.x * vector.y - axis.y * vector.x };
|
|
201
|
+
return {
|
|
202
|
+
x: vector.x * cosine + cross.x * sine + axis.x * dot * (1 - cosine),
|
|
203
|
+
y: vector.y * cosine + cross.y * sine + axis.y * dot * (1 - cosine),
|
|
204
|
+
z: vector.z * cosine + cross.z * sine + axis.z * dot * (1 - cosine),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Draft one face of a solid about a signed local pull axis, or null when the
|
|
209
|
+
* kernel cannot.
|
|
210
|
+
*
|
|
211
|
+
* OCCT's draft only reliably takes +Z as the pull direction, so when the
|
|
212
|
+
* direct call refuses, the solid is turned until the requested axis is +Z, the
|
|
213
|
+
* face found again on the turned solid by its normal and centre, drafted, and
|
|
214
|
+
* turned back.
|
|
215
|
+
*/
|
|
216
|
+
export function draftSketchFace(cad, solid, face, request) {
|
|
217
|
+
const direction = SKETCH_FACE_DRAFT_PULL_AXES[request.pullDirection];
|
|
218
|
+
const angle = request.angle * Math.PI / 180;
|
|
219
|
+
try {
|
|
220
|
+
return cad.draft(solid, face, angle, direction);
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
const rotation = canonicalDraftRotation(request.pullDirection);
|
|
224
|
+
try {
|
|
225
|
+
if (!rotation)
|
|
226
|
+
throw new Error("No canonical rotation for the selected pull axis.");
|
|
227
|
+
const rotatedSolid = cad.rotate(solid, rotation.axis, rotation.angle);
|
|
228
|
+
const oldNormal = sketchFaceNormal(cad, face);
|
|
229
|
+
if (!oldNormal)
|
|
230
|
+
throw new Error("The selected face has no usable normal.");
|
|
231
|
+
const targetNormal = rotateVector(oldNormal, rotation.axis.direction, rotation.angle);
|
|
232
|
+
const targetCenter = rotateVector(cad.getSurfaceCenterOfMass(face), rotation.axis.direction, rotation.angle);
|
|
233
|
+
const bounds = cad.getBoundingBox(solid, false);
|
|
234
|
+
const scale = Math.max(1, Math.hypot(bounds.xmax - bounds.xmin, bounds.ymax - bounds.ymin, bounds.zmax - bounds.zmin));
|
|
235
|
+
const matches = cad.getSubShapes(rotatedSolid, "face").filter((candidate) => {
|
|
236
|
+
const normal = sketchFaceNormal(cad, candidate);
|
|
237
|
+
const center = cad.getSurfaceCenterOfMass(candidate);
|
|
238
|
+
return normal && Math.hypot(normal.x - targetNormal.x, normal.y - targetNormal.y, normal.z - targetNormal.z) <= 1e-7
|
|
239
|
+
&& Math.hypot(center.x - targetCenter.x, center.y - targetCenter.y, center.z - targetCenter.z) <= scale * 1e-8;
|
|
240
|
+
});
|
|
241
|
+
if (matches.length !== 1)
|
|
242
|
+
throw new Error("Could not uniquely identify the selected face after rotating the solid.");
|
|
243
|
+
const canonicalDraft = cad.draft(rotatedSolid, matches[0], angle, { x: 0, y: 0, z: 1 });
|
|
244
|
+
return cad.rotate(canonicalDraft, rotation.axis, -rotation.angle);
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Face IDs for a result, inherited from the source where a face is plainly
|
|
253
|
+
* the same one.
|
|
254
|
+
*
|
|
255
|
+
* Keep an ID only when an exact face BREP or a unique planar support surface
|
|
256
|
+
* occurs on each side. OCCT face ordering and hash codes are kernel details,
|
|
257
|
+
* so an unmatched or ambiguous face receives a new application ID.
|
|
258
|
+
*/
|
|
259
|
+
export function faceIdsForCadResult(cad, source, resultFaces, sourceSolid) {
|
|
260
|
+
const sourceFaces = cad.getSubShapes(sourceSolid, "face");
|
|
261
|
+
const fingerprint = (face) => {
|
|
262
|
+
const brep = cad.toBREP(face);
|
|
263
|
+
try {
|
|
264
|
+
if (cad.surfaceType(face) !== "plane")
|
|
265
|
+
return `brep:${brep}`;
|
|
266
|
+
const bounds = cad.uvBounds(face);
|
|
267
|
+
const normal = cad.surfaceNormal(face, (bounds.uMin + bounds.uMax) / 2, (bounds.vMin + bounds.vMax) / 2);
|
|
268
|
+
const center = cad.getSurfaceCenterOfMass(face);
|
|
269
|
+
const round = (value) => Math.round(value * 1e6) / 1e6;
|
|
270
|
+
const n = [round(normal.x), round(normal.y), round(normal.z)];
|
|
271
|
+
const offset = round(center.x * normal.x + center.y * normal.y + center.z * normal.z);
|
|
272
|
+
return `plane:${n.join(",")}:${offset}`;
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
return `brep:${brep}`;
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
const sourceByBrep = new Map();
|
|
279
|
+
sourceFaces.forEach((face, index) => {
|
|
280
|
+
const key = fingerprint(face);
|
|
281
|
+
sourceByBrep.set(key, [...(sourceByBrep.get(key) ?? []), index]);
|
|
282
|
+
});
|
|
283
|
+
const resultCounts = new Map();
|
|
284
|
+
const resultBreps = resultFaces.map((face) => {
|
|
285
|
+
const key = fingerprint(face);
|
|
286
|
+
resultCounts.set(key, (resultCounts.get(key) ?? 0) + 1);
|
|
287
|
+
return key;
|
|
288
|
+
});
|
|
289
|
+
const used = new Set();
|
|
290
|
+
return resultBreps.map((brep, index) => {
|
|
291
|
+
const matches = sourceByBrep.get(brep) ?? [];
|
|
292
|
+
const sourceIndex = matches.length === 1 && resultCounts.get(brep) === 1 ? matches[0] : undefined;
|
|
293
|
+
const inherited = sourceIndex === undefined
|
|
294
|
+
? undefined
|
|
295
|
+
: source.faceIds?.[sourceIndex] ?? `face_${encodeURIComponent(source.id)}_${sourceIndex}`;
|
|
296
|
+
if (inherited && !used.has(inherited)) {
|
|
297
|
+
used.add(inherited);
|
|
298
|
+
return inherited;
|
|
299
|
+
}
|
|
300
|
+
const fresh = createLocalId(`${source.id}-face-${index}`);
|
|
301
|
+
used.add(fresh);
|
|
302
|
+
return fresh.startsWith("face_") ? fresh : `face_${fresh}`;
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Why a retained face draft could not be made, for a caller that words it
|
|
307
|
+
* itself: the face it names cannot be found (`unresolved`), the angle is out of
|
|
308
|
+
* range, the kernel refuses that face, axis and angle (`incompatible`), or the
|
|
309
|
+
* result is not a valid solid. The message is the REST API's.
|
|
310
|
+
*/
|
|
311
|
+
export class SketchFaceDraftError extends Error {
|
|
312
|
+
reason;
|
|
313
|
+
constructor(message, reason) {
|
|
314
|
+
super(message);
|
|
315
|
+
this.name = "SketchFaceDraftError";
|
|
316
|
+
this.reason = reason;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
function unresolved(message) {
|
|
320
|
+
throw new SketchFaceDraftError(message, "unresolved");
|
|
321
|
+
}
|
|
322
|
+
/** The single solid a stored B-rep describes, healed the way the server reads one. */
|
|
323
|
+
export function solidFromBrepOnKernel(cad, brep) {
|
|
324
|
+
let exact = cad.fromBREP(brep);
|
|
325
|
+
const isValidSolid = (shape) => {
|
|
326
|
+
try {
|
|
327
|
+
return Boolean(cad.isValid(shape)) && cad.isSolid(shape);
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
const solids = cad.getSubShapes(exact, "solid");
|
|
334
|
+
if (isValidSolid(exact) || solids.length > 0)
|
|
335
|
+
return solids.length === 1 ? solids[0] : exact;
|
|
336
|
+
exact = cad.fixShape(exact);
|
|
337
|
+
exact = cad.fixFaceOrientations(exact);
|
|
338
|
+
const healed = cad.getSubShapes(exact, "solid");
|
|
339
|
+
if (isValidSolid(exact) || healed.length > 0)
|
|
340
|
+
return healed.length === 1 ? healed[0] : exact;
|
|
341
|
+
throw new Error("The stored exact geometry for that shape could not be read.");
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* A solid's faces with the IDs `GET /faces` gives them: the shape's own when it
|
|
345
|
+
* has one per face, otherwise `face_<shape id>_<index>`.
|
|
346
|
+
*/
|
|
347
|
+
function listedFaces(cad, solid, shape) {
|
|
348
|
+
const faces = cad.getSubShapes(solid, "face");
|
|
349
|
+
const stored = shape.faceIds?.length === faces.length ? shape.faceIds : undefined;
|
|
350
|
+
return faces.map((face, index) => {
|
|
351
|
+
let surfaceType = "unknown";
|
|
352
|
+
try {
|
|
353
|
+
surfaceType = cad.surfaceType(face);
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
// Not every surface reports a type.
|
|
357
|
+
}
|
|
358
|
+
return {
|
|
359
|
+
id: stored?.[index] ?? `face_${encodeURIComponent(shape.id)}_${index}`,
|
|
360
|
+
index,
|
|
361
|
+
surfaceType,
|
|
362
|
+
normal: sketchFaceNormal(cad, face),
|
|
363
|
+
};
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
function normalsMatch(left, right) {
|
|
367
|
+
return Math.hypot(left.x - right.x, left.y - right.y, left.z - right.z) <= NORMAL_MATCH_TOLERANCE;
|
|
368
|
+
}
|
|
369
|
+
const storedSolid = (cad, shape) => {
|
|
370
|
+
if (!shape.cadBrep)
|
|
371
|
+
throw new Error("The shape has no exact geometry.");
|
|
372
|
+
return solidFromBrepOnKernel(cad, shape.cadBrep);
|
|
373
|
+
};
|
|
374
|
+
/**
|
|
375
|
+
* Infer the sketch segment of a draft saved before segments were recorded,
|
|
376
|
+
* from its saved source face ID or, failing that, its normal on the extrusion
|
|
377
|
+
* rebuilt from its sketch.
|
|
378
|
+
*/
|
|
379
|
+
export function legacyDraftSegmentOnKernel(cad, shape) {
|
|
380
|
+
if (shape.sketchOperation !== "extrude" || !shape.sketchProfile || !shape.faceDraft)
|
|
381
|
+
return { status: "unsupported" };
|
|
382
|
+
const frame = shape.faceDraftSourceFrame ?? shape.cadBrepFrame;
|
|
383
|
+
const height = frame?.height ?? shape.height;
|
|
384
|
+
const solid = sketchExtrusionSolid(cad, shape.sketchProfile, height);
|
|
385
|
+
const faces = cad.getSubShapes(solid, "face");
|
|
386
|
+
const faceIds = shape.faceDraftSourceFaceIds?.length === faces.length
|
|
387
|
+
? [...shape.faceDraftSourceFaceIds]
|
|
388
|
+
: faces.map((_, index) => `face_${createLocalId(`${shape.id}-face-${index}`)}`);
|
|
389
|
+
const source = {
|
|
390
|
+
id: shape.id,
|
|
391
|
+
sketchOperation: "extrude",
|
|
392
|
+
sketchProfile: shape.sketchProfile,
|
|
393
|
+
cadBrep: cad.toBREP(solid),
|
|
394
|
+
faceIds,
|
|
395
|
+
cadBrepFrame: { x: 0, z: 0, elevation: 0, width: 1, depth: 1, height },
|
|
396
|
+
height,
|
|
397
|
+
};
|
|
398
|
+
const listing = listedFaces(cad, solid, source);
|
|
399
|
+
let selected = listing.find((face) => face.id === shape.faceDraft.sourceFaceId);
|
|
400
|
+
const savedNormal = shape.faceDraft.sourceFaceNormal;
|
|
401
|
+
if (!selected && savedNormal) {
|
|
402
|
+
const matches = listing.filter((face) => face.surfaceType === "plane" && face.normal && normalsMatch(face.normal, savedNormal));
|
|
403
|
+
if (matches.length > 1)
|
|
404
|
+
return { status: "ambiguous" };
|
|
405
|
+
selected = matches[0];
|
|
406
|
+
}
|
|
407
|
+
if (!selected)
|
|
408
|
+
return { status: "missing" };
|
|
409
|
+
return sketchSegmentForDraftFaceOnKernel(cad, source, selected.id);
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Resolve which face of the undrafted source a retained face draft acts on.
|
|
413
|
+
*
|
|
414
|
+
* The one implementation behind both `PATCH faceDraft` on a sketch extrusion
|
|
415
|
+
* and the editor's draft, edit and replay. In order: a draft already on the
|
|
416
|
+
* same face keeps its recorded normal; a new face is looked up by ID, on the
|
|
417
|
+
* rebuilt source when the sketch is unchanged and on the prior shape
|
|
418
|
+
* otherwise; after a profile edit the recorded sketch segment, or the one a
|
|
419
|
+
* legacy draft's saved face implies, must still bound exactly one side face;
|
|
420
|
+
* failing an ID, exactly one flat face must carry the normal. Whatever face is
|
|
421
|
+
* chosen must not match two segments, nor be a side no segment bounds. Each
|
|
422
|
+
* refusal carries the message the API returns for it.
|
|
423
|
+
*/
|
|
424
|
+
export function resolveRetainedFaceDraft(cad, { existing, source, request, profileChanged }, solidOf = storedSolid) {
|
|
425
|
+
const sourceFaces = () => listedFaces(cad, solidOf(cad, source), source);
|
|
426
|
+
const priorReference = existing.faceDraft?.sourceFaceId === request.sourceFaceId
|
|
427
|
+
? existing.faceDraft.sourceFaceNormal
|
|
428
|
+
: undefined;
|
|
429
|
+
const selectedOnPrior = priorReference ? undefined
|
|
430
|
+
: listedFaces(cad, solidOf(cad, existing), existing).find((face) => face.id === request.sourceFaceId);
|
|
431
|
+
const isReselection = existing.faceDraft !== undefined && request.sourceFaceId !== existing.faceDraft.sourceFaceId;
|
|
432
|
+
const exactReselectedSourceFace = isReselection
|
|
433
|
+
? sourceFaces().find((face) => face.id === request.sourceFaceId)
|
|
434
|
+
: undefined;
|
|
435
|
+
const exactSelectedSourceFace = !profileChanged && !existing.faceDraft
|
|
436
|
+
? sourceFaces().find((face) => face.id === request.sourceFaceId)
|
|
437
|
+
: undefined;
|
|
438
|
+
const legacySegmentMatch = profileChanged && existing.faceDraft && !existing.faceDraftSourceSegmentId
|
|
439
|
+
? legacyDraftSegmentOnKernel(cad, existing)
|
|
440
|
+
: undefined;
|
|
441
|
+
if (legacySegmentMatch?.status === "ambiguous")
|
|
442
|
+
unresolved("The saved face draft does not identify one source sketch segment.");
|
|
443
|
+
const retainedSourceSegmentId = existing.faceDraftSourceSegmentId
|
|
444
|
+
?? (legacySegmentMatch?.status === "matched" ? legacySegmentMatch.segmentId : undefined);
|
|
445
|
+
const retainedSegmentFace = profileChanged && retainedSourceSegmentId
|
|
446
|
+
? draftFaceForSketchSegmentOnKernel(cad, source, retainedSourceSegmentId)
|
|
447
|
+
: undefined;
|
|
448
|
+
if (retainedSegmentFace && retainedSegmentFace.status !== "matched") {
|
|
449
|
+
unresolved("The selected sketch segment no longer maps to exactly one extrusion side face.");
|
|
450
|
+
}
|
|
451
|
+
let faceId = retainedSegmentFace?.status === "matched"
|
|
452
|
+
? retainedSegmentFace.faceId
|
|
453
|
+
: exactReselectedSourceFace?.surfaceType === "plane" ? exactReselectedSourceFace.id
|
|
454
|
+
: exactSelectedSourceFace?.surfaceType === "plane" ? exactSelectedSourceFace.id : undefined;
|
|
455
|
+
const normal = retainedSegmentFace?.status === "matched"
|
|
456
|
+
? retainedSegmentFace.normal
|
|
457
|
+
: exactReselectedSourceFace?.normal ?? exactSelectedSourceFace?.normal ?? priorReference ?? selectedOnPrior?.normal;
|
|
458
|
+
if (!normal || selectedOnPrior && selectedOnPrior.surfaceType !== "plane") {
|
|
459
|
+
unresolved("The selected source face has no stable planar reference.");
|
|
460
|
+
}
|
|
461
|
+
if (!faceId) {
|
|
462
|
+
const matches = sourceFaces().filter((face) => face.surfaceType === "plane" && face.normal && normalsMatch(face.normal, normal));
|
|
463
|
+
faceId = matches.length === 1 ? matches[0].id : undefined;
|
|
464
|
+
}
|
|
465
|
+
if (!faceId)
|
|
466
|
+
unresolved("The selected source face is missing or ambiguous after the sketch edit.");
|
|
467
|
+
const segmentMatch = retainedSegmentFace?.status === "matched"
|
|
468
|
+
? retainedSegmentFace
|
|
469
|
+
: sketchSegmentForDraftFaceOnKernel(cad, source, faceId);
|
|
470
|
+
if (segmentMatch.status === "ambiguous")
|
|
471
|
+
unresolved("The selected lateral face matches multiple sketch segments.");
|
|
472
|
+
if (segmentMatch.status === "missing")
|
|
473
|
+
unresolved("The selected extrusion side face has no exact sketch-segment boundary match.");
|
|
474
|
+
return { faceId, normal, segmentMatch };
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* The record of a retained face draft.
|
|
478
|
+
*
|
|
479
|
+
* `sourceFaceIds` are the IDs of the undrafted source it was resolved on, and
|
|
480
|
+
* `frameSource` the shape the draft was asked of: its earlier source frame is
|
|
481
|
+
* kept through every replay, so a sketch edit never loses where it started.
|
|
482
|
+
*/
|
|
483
|
+
export function retainedFaceDraftFields(sourceFaceIds, frameSource, resolved, request) {
|
|
484
|
+
return {
|
|
485
|
+
faceDraft: {
|
|
486
|
+
sourceFaceId: resolved.faceId,
|
|
487
|
+
angle: request.angle,
|
|
488
|
+
pullDirection: request.pullDirection,
|
|
489
|
+
sourceFaceNormal: resolved.normal,
|
|
490
|
+
},
|
|
491
|
+
faceDraftSourceFaceIds: sourceFaceIds,
|
|
492
|
+
faceDraftSourceSegmentId: resolved.segmentMatch.status === "matched" ? resolved.segmentMatch.segmentId : undefined,
|
|
493
|
+
faceDraftSourceFrame: frameSource.faceDraftSourceFrame ?? frameSource.cadBrepFrame,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Resolve and draft a retained face draft on the undrafted source.
|
|
498
|
+
*
|
|
499
|
+
* The editor's CAD worker runs this. The drafted solid is in the source
|
|
500
|
+
* B-rep's own frame; `sourceFaceIds` are the source's listed IDs and
|
|
501
|
+
* `resultFaceIds` inherit them for faces the draft left alone.
|
|
502
|
+
*/
|
|
503
|
+
export function retainedSketchFaceDraft(cad, resolution) {
|
|
504
|
+
const { source, request } = resolution;
|
|
505
|
+
if (!Number.isFinite(request.angle) || request.angle === 0 || Math.abs(request.angle) >= 45) {
|
|
506
|
+
throw new SketchFaceDraftError("The face draft angle must be non-zero and between -45 and 45 degrees.", "angle");
|
|
507
|
+
}
|
|
508
|
+
if (source.sketchOperation !== "extrude" || !source.sketchProfile || !source.cadBrep) {
|
|
509
|
+
unresolved("Face drafts require an exact retained sketch extrusion, sweep, or plain full-turn revolve.");
|
|
510
|
+
}
|
|
511
|
+
const resolved = resolveRetainedFaceDraft(cad, resolution);
|
|
512
|
+
const solid = solidFromBrepOnKernel(cad, source.cadBrep);
|
|
513
|
+
const sourceFaceIds = listedFaces(cad, solid, source).map((face) => face.id);
|
|
514
|
+
if (new Set(sourceFaceIds).size !== sourceFaceIds.length)
|
|
515
|
+
unresolved("Face drafting requires a complete, unique stable face ID list.");
|
|
516
|
+
const face = cad.getSubShapes(solid, "face")[sourceFaceIds.indexOf(resolved.faceId)];
|
|
517
|
+
if (!face)
|
|
518
|
+
unresolved("The selected source face is no longer available.");
|
|
519
|
+
const drafted = draftSketchFace(cad, solid, face, request);
|
|
520
|
+
if (!drafted) {
|
|
521
|
+
throw new SketchFaceDraftError("The selected source face cannot be drafted along that local pull axis and angle.", "incompatible");
|
|
522
|
+
}
|
|
523
|
+
if (!cad.isValid(drafted) || !cad.isSolid(drafted)) {
|
|
524
|
+
throw new SketchFaceDraftError("The face draft did not produce a valid solid.", "invalid-result");
|
|
525
|
+
}
|
|
526
|
+
const identified = { id: source.id, faceIds: sourceFaceIds };
|
|
527
|
+
return {
|
|
528
|
+
solid: drafted,
|
|
529
|
+
resolved,
|
|
530
|
+
sourceFaceIds,
|
|
531
|
+
resultFaceIds: faceIdsForCadResult(cad, identified, cad.getSubShapes(drafted, "face"), solid),
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
/** The fields a retained prism draft adds to its shape. */
|
|
535
|
+
export function retainedPrismDraftFields(shape, angle) {
|
|
536
|
+
const sourceFrame = shape.draftPrismSourceFrame ?? shape.cadBrepFrame;
|
|
537
|
+
return {
|
|
538
|
+
draftPrismAngle: angle,
|
|
539
|
+
draftPrismSourceHeight: shape.draftPrismSourceHeight ?? shape.height,
|
|
540
|
+
...(sourceFrame ? { draftPrismSourceFrame: sourceFrame } : {}),
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* The centre of a profile's bounds: where a prism draft's B-rep is centred,
|
|
545
|
+
* and where a straight extrusion of it has its frame.
|
|
546
|
+
*/
|
|
547
|
+
export function draftPrismProfileOffset(profile) {
|
|
548
|
+
const xs = profile.points.map(({ x }) => x);
|
|
549
|
+
const zs = profile.points.map(({ z }) => z);
|
|
550
|
+
return {
|
|
551
|
+
x: (Math.min(...xs) + Math.max(...xs)) / 2,
|
|
552
|
+
y: 0,
|
|
553
|
+
z: (Math.min(...zs) + Math.max(...zs)) / 2,
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Where the REST API places the undrafted extrusion a retained draft is
|
|
558
|
+
* rebuilt on, and so the drafted result, which keeps it.
|
|
559
|
+
*
|
|
560
|
+
* The shape's position is moved by however far the rebuilt extrusion's frame
|
|
561
|
+
* is from the source frame the draft first started from. Frame offsets are in
|
|
562
|
+
* sketch coordinates, so rotate them by the shape's placement before adding
|
|
563
|
+
* them to its world position. The editor and REST use this same rule so one
|
|
564
|
+
* record means one placement whichever side wrote it (#384, #435).
|
|
565
|
+
*/
|
|
566
|
+
export function retainedDraftSourcePlacement(existing, rebuiltFrame, sourceFrameOverride) {
|
|
567
|
+
const sourceFrame = sourceFrameOverride ?? existing.faceDraftSourceFrame ?? existing.draftPrismSourceFrame ?? existing.cadBrepFrame;
|
|
568
|
+
const offset = new THREE.Vector3((rebuiltFrame.x - (sourceFrame?.x ?? 0)) * (existing.mirrorX ? -1 : 1), (rebuiltFrame.elevation - (sourceFrame?.elevation ?? 0)) * (existing.mirrorY ? -1 : 1), (rebuiltFrame.z - (sourceFrame?.z ?? 0)) * (existing.mirrorZ ? -1 : 1)).applyEuler(new THREE.Euler(THREE.MathUtils.degToRad(existing.rotationX ?? 0), THREE.MathUtils.degToRad(existing.rotation ?? 0), THREE.MathUtils.degToRad(existing.rotationZ ?? 0), "XYZ"));
|
|
569
|
+
return {
|
|
570
|
+
x: existing.x + offset.x,
|
|
571
|
+
z: existing.z + offset.z,
|
|
572
|
+
elevation: (existing.elevation ?? 0) + offset.y,
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
//# sourceMappingURL=sketchFaceDraftKernel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sketchFaceDraftKernel.js","sourceRoot":"","sources":["../src/sketchFaceDraftKernel.ts"],"names":[],"mappings":"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"}
|