@constructorfleet/sketchforge-engine 1.12.0 → 1.14.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 (66) hide show
  1. package/dist/domain/sketchforge.d.ts +36 -3
  2. package/dist/domain/sketchforge.d.ts.map +1 -1
  3. package/dist/engine.d.ts.map +1 -1
  4. package/dist/engine.js +27 -1
  5. package/dist/engine.js.map +1 -1
  6. package/dist/projectMeshes.d.ts.map +1 -1
  7. package/dist/projectMeshes.js +4 -1
  8. package/dist/projectMeshes.js.map +1 -1
  9. package/dist/serverCadOperations.d.ts +3 -1
  10. package/dist/serverCadOperations.d.ts.map +1 -1
  11. package/dist/serverCadOperations.js +80 -5
  12. package/dist/serverCadOperations.js.map +1 -1
  13. package/dist/serverCadShell.d.ts +2 -0
  14. package/dist/serverCadShell.d.ts.map +1 -1
  15. package/dist/serverCadShell.js +5 -4
  16. package/dist/serverCadShell.js.map +1 -1
  17. package/dist/serverStepExplode.d.ts.map +1 -1
  18. package/dist/serverStepExplode.js +2 -47
  19. package/dist/serverStepExplode.js.map +1 -1
  20. package/dist/shapeRequests.d.ts.map +1 -1
  21. package/dist/shapeRequests.js +18 -2
  22. package/dist/shapeRequests.js.map +1 -1
  23. package/dist/sketchSweepFrames.d.ts +13 -0
  24. package/dist/sketchSweepFrames.d.ts.map +1 -0
  25. package/dist/sketchSweepFrames.js +46 -0
  26. package/dist/sketchSweepFrames.js.map +1 -0
  27. package/dist/skfProject.d.ts.map +1 -1
  28. package/dist/skfProject.js +45 -8
  29. package/dist/skfProject.js.map +1 -1
  30. package/dist/stepComponentMetadata.d.ts +10 -0
  31. package/dist/stepComponentMetadata.d.ts.map +1 -0
  32. package/dist/stepComponentMetadata.js +73 -0
  33. package/dist/stepComponentMetadata.js.map +1 -0
  34. package/dist/stepGlbColors.d.ts +7 -0
  35. package/dist/stepGlbColors.d.ts.map +1 -0
  36. package/dist/stepGlbColors.js +71 -0
  37. package/dist/stepGlbColors.js.map +1 -0
  38. package/dist/stepImport.d.ts +1 -0
  39. package/dist/stepImport.d.ts.map +1 -1
  40. package/dist/stepImport.js +6 -76
  41. package/dist/stepImport.js.map +1 -1
  42. package/dist/stepImportCommon.d.ts +11 -0
  43. package/dist/stepImportCommon.d.ts.map +1 -0
  44. package/dist/stepImportCommon.js +121 -0
  45. package/dist/stepImportCommon.js.map +1 -0
  46. package/dist/stepImportKernel.d.ts +2 -13
  47. package/dist/stepImportKernel.d.ts.map +1 -1
  48. package/dist/stepImportKernel.js +4 -142
  49. package/dist/stepImportKernel.js.map +1 -1
  50. package/dist/support/cadModifierTypes.d.ts +19 -0
  51. package/dist/support/cadModifierTypes.d.ts.map +1 -1
  52. package/dist/support/i18n/locales/en/messages.json +6 -1
  53. package/dist/support/lib/brepKernel.d.ts +4 -0
  54. package/dist/support/lib/brepKernel.d.ts.map +1 -1
  55. package/dist/support/lib/brepKernel.js +22 -10
  56. package/dist/support/lib/brepKernel.js.map +1 -1
  57. package/dist/support/lib/operator-configuration.json +124 -0
  58. package/dist/support/lib/operatorConfiguration.d.ts +14 -0
  59. package/dist/support/lib/operatorConfiguration.d.ts.map +1 -0
  60. package/dist/support/lib/operatorConfiguration.js +6 -0
  61. package/dist/support/lib/operatorConfiguration.js.map +1 -0
  62. package/dist/support/lib/serverProjectStore.d.ts +1 -1
  63. package/dist/support/lib/serverProjectStore.d.ts.map +1 -1
  64. package/dist/support/lib/serverProjectStore.js +2 -1
  65. package/dist/support/lib/serverProjectStore.js.map +1 -1
  66. package/package.json +1 -1
@@ -0,0 +1,71 @@
1
+ function colorHex(color) {
2
+ return `#${color.slice(0, 3).map((channel) => Math.round(Math.max(0, Math.min(1, channel)) * 255).toString(16).padStart(2, "0")).join("")}`;
3
+ }
4
+ /** Return only unambiguous, uniformly colored GLB node/mesh names. */
5
+ export function componentColorsFromGlb(glb) {
6
+ const candidates = new Map();
7
+ const empty = () => new Map();
8
+ if (glb.byteLength < 20)
9
+ return empty();
10
+ const view = new DataView(glb.buffer, glb.byteOffset, glb.byteLength);
11
+ if (view.getUint32(0, true) !== 0x46546c67 || view.getUint32(4, true) !== 2)
12
+ return empty();
13
+ let json = null;
14
+ let offset = 12;
15
+ while (offset + 8 <= glb.byteLength) {
16
+ const length = view.getUint32(offset, true);
17
+ const type = view.getUint32(offset + 4, true);
18
+ const start = offset + 8;
19
+ const end = start + length;
20
+ if (end > glb.byteLength)
21
+ return empty();
22
+ if (type === 0x4e4f534a) {
23
+ try {
24
+ json = JSON.parse(new TextDecoder().decode(glb.subarray(start, end)).trim());
25
+ }
26
+ catch {
27
+ return empty();
28
+ }
29
+ break;
30
+ }
31
+ offset = end;
32
+ }
33
+ if (!json)
34
+ return empty();
35
+ for (const node of json.nodes ?? []) {
36
+ const mesh = typeof node.mesh === "number" ? json.meshes?.[node.mesh] : undefined;
37
+ const nodeName = node.name?.trim();
38
+ const meshName = mesh?.name?.trim();
39
+ const names = new Set([nodeName, meshName].filter((name) => Boolean(name)));
40
+ if (!names.size || !mesh?.primitives?.length)
41
+ continue;
42
+ const colors = new Set();
43
+ let completeColor = !nodeName || !meshName || nodeName === meshName;
44
+ for (const primitive of mesh.primitives) {
45
+ const factor = typeof primitive.material === "number"
46
+ ? json.materials?.[primitive.material]?.pbrMetallicRoughness?.baseColorFactor
47
+ : undefined;
48
+ if (!factor || factor.length < 3 || !factor.slice(0, 3).every(Number.isFinite)) {
49
+ completeColor = false;
50
+ break;
51
+ }
52
+ colors.add(colorHex(factor));
53
+ }
54
+ for (const name of names) {
55
+ const candidate = candidates.get(name) ?? { count: 0, colors: new Set() };
56
+ candidate.count += 1;
57
+ if (completeColor && colors.size === 1)
58
+ candidate.colors.add([...colors][0]);
59
+ else
60
+ candidate.colors.add("");
61
+ candidates.set(name, candidate);
62
+ }
63
+ }
64
+ return new Map([...candidates].map(([name, candidate]) => [name, {
65
+ count: candidate.count,
66
+ ...(candidate.count === 1 && candidate.colors.size === 1 && !candidate.colors.has("")
67
+ ? { color: [...candidate.colors][0] }
68
+ : {}),
69
+ }]));
70
+ }
71
+ //# sourceMappingURL=stepGlbColors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepGlbColors.js","sourceRoot":"","sources":["../src/stepGlbColors.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { WorkplaneShape } from "./domain/sketchforge.js";
2
2
  export declare function isStepFile(fileName: string): boolean;
3
+ /** Import STEP geometry in the browser kernel and keep available component colors. */
3
4
  export declare function importedShapeFromStep(fileName: string, buffer: ArrayBuffer): Promise<WorkplaneShape>;
4
5
  //# sourceMappingURL=stepImport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stepImport.d.ts","sourceRoot":"","sources":["../src/stepImport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQ9D,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CA2E1G"}
1
+ {"version":3,"file":"stepImport.d.ts","sourceRoot":"","sources":["../src/stepImport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM9D,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,sFAAsF;AACtF,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAI1G"}
@@ -1,83 +1,13 @@
1
- import { getFaces, getHashCode } from "brepjs";
2
- import { LocalizedError } from "./support/i18n/LocalizedError.js";
3
- import { importedShapeFromTriangleSoup } from "./stlImport.js";
4
- import { loadBrepWithOcct } from "./support/lib/brepKernel.js";
1
+ import { loadOcctKernel } from "./support/lib/brepKernel.js";
2
+ import { importedShapeFromStepWithKernel } from "./stepImportCommon.js";
5
3
  const STEP_EXTENSIONS = new Set(["step", "stp"]);
6
4
  export function isStepFile(fileName) {
7
5
  return STEP_EXTENSIONS.has(fileName.split(".").pop()?.toLowerCase() ?? "");
8
6
  }
7
+ /** Import STEP geometry in the browser kernel and keep available component colors. */
9
8
  export async function importedShapeFromStep(fileName, buffer) {
10
- const brep = await loadBrepWithOcct();
11
- const imported = await brep.importSTEP(new Blob([buffer]));
12
- if (!imported.ok) {
13
- throw new LocalizedError("errors.step.readFailed", { detail: String(imported.error.message ?? imported.error) });
14
- }
15
- // STEP/CAD space is Z-up; SketchForge is Y-up. Rotating −90° about X maps CAD
16
- // +Z (up) to SketchForge +Y — the inverse of the exporter's +90°·X. Rigid
17
- // kernel ops (rotate/translate) are used throughout normalization because they
18
- // preserve the exact geometry; a matrix transform here corrupts later export.
19
- const flipped = brep.rotate(imported.value, -90, { axis: [1, 0, 0] });
20
- // brepjs's mesher gives up on a real assembly where the kernel underneath it
21
- // does not: a 74 MB FreeCAD export of 45,689 faces reads and rotates here in
22
- // 22s and then dies with "memory access out of bounds", while the kernel's
23
- // own `tessellate` meshes the identical shape in 5s. It is not a heap
24
- // ceiling -- the module grows to 4 GB and coarsening the deflection does not
25
- // move it. So say what happened instead of surfacing a WebAssembly trap:
26
- // `stepImportKernel.ts` is the path that can do it, and it needs a server.
27
- let tess;
28
- try {
29
- tess = brep.mesh(flipped);
30
- }
31
- catch (error) {
32
- throw new LocalizedError("errors.step.meshFailed", {
33
- detail: error instanceof Error ? error.message : String(error),
34
- });
35
- }
36
- if (tess.vertices.length < 9) {
37
- throw new LocalizedError("errors.step.noSolidGeometry");
38
- }
39
- const positions = [];
40
- const normals = [];
41
- const hasNormals = tess.normals.length === tess.vertices.length;
42
- const faceIndexByHash = new Map(getFaces(flipped).map((face, index) => [getHashCode(face), index]));
43
- const faceGroups = [];
44
- for (const group of tess.faceGroups) {
45
- const index = faceIndexByHash.get(group.faceId);
46
- if (index !== undefined)
47
- faceGroups.push(group.start, group.count, index);
48
- }
49
- for (let i = 0; i < tess.triangles.length; i += 1) {
50
- const v = tess.triangles[i] * 3;
51
- positions.push(tess.vertices[v], tess.vertices[v + 1], tess.vertices[v + 2]);
52
- if (hasNormals) {
53
- normals.push(tess.normals[v], tess.normals[v + 1], tess.normals[v + 2]);
54
- }
55
- }
56
- // importedShapeFromTriangleSoup recenters the mesh to x/z-centered, bottom at
57
- // y=0. Recenter the stored B-Rep by the same offset so the exact geometry and
58
- // the displayed mesh share one local frame, and the editor's transforms apply
59
- // identically to both.
60
- let minX = Infinity;
61
- let minY = Infinity;
62
- let minZ = Infinity;
63
- let maxX = -Infinity;
64
- let maxZ = -Infinity;
65
- for (let i = 0; i < positions.length; i += 3) {
66
- minX = Math.min(minX, positions[i]);
67
- maxX = Math.max(maxX, positions[i]);
68
- minY = Math.min(minY, positions[i + 1]);
69
- minZ = Math.min(minZ, positions[i + 2]);
70
- maxZ = Math.max(maxZ, positions[i + 2]);
71
- }
72
- const normalized = brep.translate(flipped, [-(minX + maxX) / 2, -minY, -(minZ + maxZ) / 2]);
73
- const exported = brep.exportSTEP(normalized);
74
- const stepText = exported.ok ? await exported.value.text() : undefined;
75
- const shape = importedShapeFromTriangleSoup(fileName, positions, hasNormals ? normals : undefined, "step");
76
- if (shape.importedMesh && faceGroups.length)
77
- shape.importedMesh.faceGroups = faceGroups;
78
- if (shape.importedMesh && stepText) {
79
- shape.importedMesh.brepStep = stepText;
80
- }
81
- return shape;
9
+ const stepText = new TextDecoder().decode(buffer);
10
+ const kernel = await loadOcctKernel();
11
+ return (await importedShapeFromStepWithKernel(kernel, fileName, stepText)).shape;
82
12
  }
83
13
  //# sourceMappingURL=stepImport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stepImport.js","sourceRoot":"","sources":["../src/stepImport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stepImport.js","sourceRoot":"","sources":["../src/stepImport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAExE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAEjD,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB,EAAE,MAAmB;IAC/E,MAAM,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IACtC,OAAO,CAAC,MAAM,+BAA+B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;AACnF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { OcctKernel } from "occt-wasm";
2
+ import type { WorkplaneShape } from "./domain/sketchforge.js";
3
+ export type StepImportSummary = {
4
+ shape: WorkplaneShape;
5
+ solids: number;
6
+ triangles: number;
7
+ exactGeometry: boolean;
8
+ };
9
+ /** Import STEP geometry and available XCAF component colors through one kernel seam. */
10
+ export declare function importedShapeFromStepWithKernel(cad: OcctKernel, fileName: string, stepText: string): Promise<StepImportSummary>;
11
+ //# sourceMappingURL=stepImportCommon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepImportCommon.d.ts","sourceRoot":"","sources":["../src/stepImportCommon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,WAAW,CAAC;AAKzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAK9D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAmDF,wFAAwF;AACxF,wBAAsB,+BAA+B,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6DrI"}
@@ -0,0 +1,121 @@
1
+ import { createLocalId } from "./localIds.js";
2
+ import { LocalizedError } from "./support/i18n/LocalizedError.js";
3
+ import { importedShapeFromTriangleSoup } from "./stlImport.js";
4
+ import { stepComponentMetadata, stepShapeKey } from "./stepComponentMetadata.js";
5
+ const IMPORT_TESSELLATION = { linearDeflection: 0.1, angularDeflection: 0.5 };
6
+ const EXACT_GEOMETRY_LIMITS = { solids: 200, sourceBytes: 8 * 1024 * 1024 };
7
+ function messageOf(error) {
8
+ if (error instanceof Error && error.message)
9
+ return error.message;
10
+ const described = String(error);
11
+ return described === "[object WebAssembly.Exception]" ? "the CAD kernel refused the file" : described;
12
+ }
13
+ function meshBounds(positions) {
14
+ if (positions.length < 9)
15
+ return null;
16
+ let minX = Infinity, minY = Infinity, minZ = Infinity, maxX = -Infinity, maxZ = -Infinity;
17
+ for (let index = 0; index < positions.length; index += 3) {
18
+ minX = Math.min(minX, positions[index]);
19
+ maxX = Math.max(maxX, positions[index]);
20
+ minY = Math.min(minY, positions[index + 1]);
21
+ minZ = Math.min(minZ, positions[index + 2]);
22
+ maxZ = Math.max(maxZ, positions[index + 2]);
23
+ }
24
+ return { minX, minY, minZ, maxX, maxZ };
25
+ }
26
+ function componentColorsByFace(cad, stepText, solids, faces) {
27
+ // XCAF import and its GLB fallback are intentionally bounded. The regular
28
+ // mesh import still accepts larger files, where building a second colored
29
+ // representation can multiply the tessellation cost substantially.
30
+ if (solids.length > EXACT_GEOMETRY_LIMITS.solids || new TextEncoder().encode(stepText).byteLength > EXACT_GEOMETRY_LIMITS.sourceBytes) {
31
+ return new Map();
32
+ }
33
+ const metadataBySolid = stepComponentMetadata(cad, stepText);
34
+ const colorsBySolid = new Map();
35
+ for (const [key, candidates] of metadataBySolid) {
36
+ const colors = [...new Set(candidates.map(({ color }) => color).filter((color) => Boolean(color)))];
37
+ // Identical solids with conflicting labels cannot be associated by bounds
38
+ // and volume alone, so leave those faces at the ordinary shape color.
39
+ if (colors.length === 1 && candidates.every(({ color }) => color === colors[0]))
40
+ colorsBySolid.set(key, colors[0]);
41
+ }
42
+ const faceIndexByHash = new Map(faces.map((face, index) => [cad.hashCode(face, 2_147_483_647), index]));
43
+ const colorsByFace = new Map();
44
+ for (const solid of solids) {
45
+ const color = colorsBySolid.get(stepShapeKey(cad, solid));
46
+ if (!color)
47
+ continue;
48
+ for (const face of cad.getSubShapes(solid, "face")) {
49
+ const faceIndex = faceIndexByHash.get(cad.hashCode(face, 2_147_483_647));
50
+ if (faceIndex !== undefined)
51
+ colorsByFace.set(faceIndex, color);
52
+ }
53
+ }
54
+ return colorsByFace;
55
+ }
56
+ /** Import STEP geometry and available XCAF component colors through one kernel seam. */
57
+ export async function importedShapeFromStepWithKernel(cad, fileName, stepText) {
58
+ if (!stepText.trim())
59
+ throw new LocalizedError("errors.step.readFailed", { detail: "the file was empty" });
60
+ let imported;
61
+ try {
62
+ imported = cad.importStep(stepText);
63
+ }
64
+ catch (error) {
65
+ throw new LocalizedError("errors.step.readFailed", { detail: messageOf(error) });
66
+ }
67
+ const solids = cad.getSubShapes(imported, "solid");
68
+ let mesh;
69
+ try {
70
+ mesh = cad.meshShape(imported, IMPORT_TESSELLATION);
71
+ }
72
+ catch (error) {
73
+ throw new LocalizedError("errors.step.meshFailed", { detail: messageOf(error) });
74
+ }
75
+ if (mesh.triangleCount < 1)
76
+ throw new LocalizedError("errors.step.noSolidGeometry");
77
+ const positions = [];
78
+ const normals = [];
79
+ const faceGroups = [];
80
+ const faces = cad.getSubShapes(imported, "face");
81
+ const faceIndexByHash = new Map(faces.map((face, index) => [cad.hashCode(face, 2_147_483_647), index]));
82
+ for (let group = 0; group + 2 < (mesh.faceGroups?.length ?? 0); group += 3) {
83
+ const start = mesh.faceGroups[group];
84
+ const count = mesh.faceGroups[group + 1];
85
+ const index = faceIndexByHash.get(mesh.faceGroups[group + 2]);
86
+ // `meshShape` reports triangle ranges in index units, while the stored
87
+ // non-indexed mesh and viewport face groups count triangles.
88
+ if (index !== undefined)
89
+ faceGroups.push(start / 3, count / 3, index);
90
+ }
91
+ const hasNormals = mesh.normals.length === mesh.positions.length;
92
+ for (let index = 0; index < mesh.indices.length; index += 1) {
93
+ const vertex = mesh.indices[index] * 3;
94
+ positions.push(mesh.positions[vertex], mesh.positions[vertex + 2], -mesh.positions[vertex + 1]);
95
+ if (hasNormals)
96
+ normals.push(mesh.normals[vertex], mesh.normals[vertex + 2], -mesh.normals[vertex + 1]);
97
+ }
98
+ const shape = importedShapeFromTriangleSoup(fileName, positions, hasNormals ? normals : undefined, "step");
99
+ if (shape.importedMesh && faceGroups.length)
100
+ shape.importedMesh.faceGroups = faceGroups;
101
+ const colorsByFace = componentColorsByFace(cad, stepText, solids, faces);
102
+ if (colorsByFace.size) {
103
+ shape.faceIds = faces.map((_, index) => `face_${createLocalId(`${shape.id}-face-${index}`)}`);
104
+ shape.faceColors = Object.fromEntries([...colorsByFace].map(([index, color]) => [shape.faceIds[index], color]));
105
+ }
106
+ const bounds = meshBounds(positions);
107
+ const worthKeepingExact = solids.length <= EXACT_GEOMETRY_LIMITS.solids
108
+ && new TextEncoder().encode(stepText).byteLength <= EXACT_GEOMETRY_LIMITS.sourceBytes;
109
+ if (shape.importedMesh && bounds && worthKeepingExact) {
110
+ try {
111
+ const turned = cad.rotate(imported, { point: { x: 0, y: 0, z: 0 }, direction: { x: 1, y: 0, z: 0 } }, -Math.PI / 2);
112
+ const centred = cad.translate(turned, -(bounds.minX + bounds.maxX) / 2, -bounds.minY, -(bounds.minZ + bounds.maxZ) / 2);
113
+ shape.importedMesh.brepStep = cad.exportStep(centred);
114
+ }
115
+ catch {
116
+ // Exact geometry is optional; the correctly framed mesh remains importable.
117
+ }
118
+ }
119
+ return { shape, solids: solids.length, triangles: mesh.triangleCount, exactGeometry: Boolean(shape.importedMesh?.brepStep) };
120
+ }
121
+ //# sourceMappingURL=stepImportCommon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepImportCommon.js","sourceRoot":"","sources":["../src/stepImportCommon.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,4 @@
1
- import type { WorkplaneShape } from "./domain/sketchforge.js";
2
- export type StepImportSummary = {
3
- shape: WorkplaneShape;
4
- /** How many separate solids the file held, which is what makes it an assembly. */
5
- solids: number;
6
- triangles: number;
7
- /**
8
- * Whether the exact B-rep was kept alongside the mesh. False for an assembly
9
- * past `EXACT_GEOMETRY_LIMITS`, so a caller can say why a later fillet or
10
- * STEP export of this shape works from triangles.
11
- */
12
- exactGeometry: boolean;
13
- };
1
+ import type { StepImportSummary } from "./stepImportCommon.js";
2
+ export type { StepImportSummary } from "./stepImportCommon.js";
14
3
  export declare function importedShapeFromStepOnKernel(fileName: string, stepText: string): Promise<StepImportSummary>;
15
4
  //# sourceMappingURL=stepImportKernel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stepImportKernel.d.ts","sourceRoot":"","sources":["../src/stepImportKernel.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAsB9D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,cAAc,CAAC;IACtB,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,wBAAsB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuFlH"}
1
+ {"version":3,"file":"stepImportKernel.d.ts","sourceRoot":"","sources":["../src/stepImportKernel.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAE5G"}
@@ -1,145 +1,7 @@
1
- /**
2
- * STEP import on the OCCT kernel directly, rather than through brepjs.
3
- *
4
- * `stepImport.ts` reads a STEP file with brepjs: `importSTEP`, `rotate`, then
5
- * `mesh`. That works for the files anyone had tried, and fails on a real
6
- * assembly. Measured on a 74 MB FreeCAD AP214 export of a Raspberry Pi 5 board
7
- * (45,689 faces, 2,689 solids):
8
- *
9
- * | step | brepjs | this kernel path |
10
- * | ---------------------------------- | ----------------------------- | ---------------- |
11
- * | read the file | ok, 20.5s | ok, 20.5s |
12
- * | rotate Z-up to Y-up | ok, 1.6s | ok |
13
- * | tessellate | **memory access out of bounds** | ok, 5.0s, 674,520 triangles |
14
- *
15
- * It is not a memory ceiling: the module grows to 4 GB, the failure is the same
16
- * under Node as in a browser, and coarsening `linearDeflection` from 0.1 to 1.0
17
- * does not move it -- a heap that was merely full would have. The kernel's own
18
- * `tessellate` meshes the identical shape, whole or per solid. So the mesher
19
- * above the kernel is the thing that cannot do it, and this module skips it.
20
- *
21
- * Node-only, because it uses the server kernel. The browser keeps the brepjs
22
- * path, which is all a static export has.
23
- */
24
- import { LocalizedError } from "./support/i18n/LocalizedError.js";
1
+ /** STEP import on the OCCT kernel directly, rather than through brepjs. */
25
2
  import { withCadKernel } from "./serverCadKernel.js";
26
- import { importedShapeFromTriangleSoup } from "./stlImport.js";
27
- /** Tessellation fine enough for a board, coarse enough for an assembly. */
28
- const IMPORT_TESSELLATION = { linearDeflection: 0.1, angularDeflection: 0.5 };
29
- /**
30
- * Above this, the exact geometry is left out and only the mesh is kept.
31
- *
32
- * Re-exporting the model to STEP text is what fills `importedMesh.brepStep`,
33
- * and the text is far larger than the file it came from: the 74 MB Raspberry Pi
34
- * assembly comes back as **202.7 MB**. That string would be stored in the
35
- * project, which autosave writes on every edit -- a measured 48 ms for a small
36
- * project, and that is before adding 200 MB of text to it. An assembly this
37
- * size is imported as a mesh, and keeping the exact geometry for one is a
38
- * separate piece of work: the right answer is to store the *source* text with
39
- * the frame it was placed into, rather than a fresh export, and that changes
40
- * what the consumers of `brepStep` have to understand.
41
- */
42
- const EXACT_GEOMETRY_LIMITS = { solids: 200, sourceBytes: 8 * 1024 * 1024 };
43
- const X_AXIS = { point: { x: 0, y: 0, z: 0 }, direction: { x: 1, y: 0, z: 0 } };
44
- export async function importedShapeFromStepOnKernel(fileName, stepText) {
45
- if (!stepText.trim())
46
- throw new LocalizedError("errors.step.readFailed", { detail: "the file was empty" });
47
- return withCadKernel(async (cad) => {
48
- let imported;
49
- try {
50
- imported = cad.importStep(stepText);
51
- }
52
- catch (error) {
53
- throw new LocalizedError("errors.step.readFailed", { detail: messageOf(error) });
54
- }
55
- const solids = cad.getSubShapes(imported, "solid");
56
- // Tessellated *before* any kernel transform, and deliberately. `rotate`
57
- // copies the whole B-rep, so rotating first means two 74 MB models in the
58
- // kernel at once -- and that is what exhausts it: the same file tessellates
59
- // in 5s when nothing has been copied, and dies with "memory access out of
60
- // bounds" when the rotation went first. Both the old brepjs path and my own
61
- // first attempt rotated first, and both failed here.
62
- let mesh;
63
- try {
64
- mesh = cad.meshShape(imported, IMPORT_TESSELLATION);
65
- }
66
- catch (error) {
67
- throw new LocalizedError("errors.step.meshFailed", { detail: messageOf(error) });
68
- }
69
- if (mesh.triangleCount < 1)
70
- throw new LocalizedError("errors.step.noSolidGeometry");
71
- // The kernel hands back indexed triangles; the shape builder takes a soup.
72
- // STEP/CAD space is Z-up and SketchForge is Y-up, so the triangles are
73
- // turned here rather than the solid: (x, y, z) -> (x, z, -y) is exactly the
74
- // -90 degrees about X that the solid would have been given, and it costs a
75
- // multiply-free swap per vertex instead of a copy of the model.
76
- const positions = [];
77
- const normals = [];
78
- const faceGroups = [];
79
- const hasNormals = mesh.normals.length === mesh.positions.length;
80
- const faceIndexByHash = new Map(cad.getSubShapes(imported, "face").map((face, index) => [cad.hashCode(face, 2_147_483_647), index]));
81
- for (let group = 0; group + 2 < (mesh.faceGroups?.length ?? 0); group += 3) {
82
- const start = mesh.faceGroups[group];
83
- const count = mesh.faceGroups[group + 1];
84
- const index = faceIndexByHash.get(mesh.faceGroups[group + 2]);
85
- if (index !== undefined)
86
- faceGroups.push(start, count, index);
87
- }
88
- for (let index = 0; index < mesh.indices.length; index += 1) {
89
- const vertex = mesh.indices[index] * 3;
90
- positions.push(mesh.positions[vertex], mesh.positions[vertex + 2], -mesh.positions[vertex + 1]);
91
- if (hasNormals)
92
- normals.push(mesh.normals[vertex], mesh.normals[vertex + 2], -mesh.normals[vertex + 1]);
93
- }
94
- const shape = importedShapeFromTriangleSoup(fileName, positions, hasNormals ? normals : undefined, "step");
95
- if (shape.importedMesh && faceGroups.length)
96
- shape.importedMesh.faceGroups = faceGroups;
97
- // `importedShapeFromTriangleSoup` recentres the mesh on x/z and rests it on
98
- // y = 0, so the stored exact geometry has to move by the same offset or the
99
- // two frames disagree -- the mismatch #53 found and fixed for treatments.
100
- const bounds = meshBounds(positions);
101
- const worthKeepingExact = solids.length <= EXACT_GEOMETRY_LIMITS.solids
102
- && stepText.length <= EXACT_GEOMETRY_LIMITS.sourceBytes;
103
- if (shape.importedMesh && bounds && worthKeepingExact) {
104
- try {
105
- // Only now is the solid turned and moved, to match the frame the mesh
106
- // was recentred into. This is the step that can exhaust the kernel on a
107
- // large assembly, so it comes last and its failure costs only the exact
108
- // geometry: a project that cannot be imported at all is worse than one
109
- // whose imported mesh has no B-rep behind it.
110
- const turned = cad.rotate(imported, X_AXIS, -Math.PI / 2);
111
- const centred = cad.translate(turned, -(bounds.minX + bounds.maxX) / 2, -bounds.minY, -(bounds.minZ + bounds.maxZ) / 2);
112
- shape.importedMesh.brepStep = cad.exportStep(centred);
113
- }
114
- catch {
115
- // Left without exact geometry on purpose. The mesh is still correct.
116
- }
117
- }
118
- return {
119
- shape,
120
- solids: solids.length,
121
- triangles: mesh.triangleCount,
122
- exactGeometry: Boolean(shape.importedMesh?.brepStep),
123
- };
124
- });
125
- }
126
- function messageOf(error) {
127
- if (error instanceof Error && error.message)
128
- return error.message;
129
- const described = String(error);
130
- return described === "[object WebAssembly.Exception]" ? "the CAD kernel refused the file" : described;
131
- }
132
- function meshBounds(positions) {
133
- if (positions.length < 9)
134
- return null;
135
- let minX = Infinity, minY = Infinity, minZ = Infinity, maxX = -Infinity, maxZ = -Infinity;
136
- for (let index = 0; index < positions.length; index += 3) {
137
- minX = Math.min(minX, positions[index]);
138
- maxX = Math.max(maxX, positions[index]);
139
- minY = Math.min(minY, positions[index + 1]);
140
- minZ = Math.min(minZ, positions[index + 2]);
141
- maxZ = Math.max(maxZ, positions[index + 2]);
142
- }
143
- return { minX, minY, minZ, maxX, maxZ };
3
+ import { importedShapeFromStepWithKernel } from "./stepImportCommon.js";
4
+ export function importedShapeFromStepOnKernel(fileName, stepText) {
5
+ return withCadKernel((cad) => importedShapeFromStepWithKernel(cad, fileName, stepText));
144
6
  }
145
7
  //# sourceMappingURL=stepImportKernel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stepImportKernel.js","sourceRoot":"","sources":["../src/stepImportKernel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stepImportKernel.js","sourceRoot":"","sources":["../src/stepImportKernel.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAKxE,MAAM,UAAU,6BAA6B,CAAC,QAAgB,EAAE,QAAgB;IAC9E,OAAO,aAAa,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,+BAA+B,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC1F,CAAC"}
@@ -77,6 +77,15 @@ export type CadModifierWorkerRequest = {
77
77
  profile: SketchProfile;
78
78
  height: number;
79
79
  angle: number;
80
+ } | {
81
+ type: "draft-face";
82
+ requestId: number;
83
+ brep: string;
84
+ faceIds: string[];
85
+ faceId: string;
86
+ angle: number;
87
+ pullDirection: "x" | "y" | "z";
88
+ brepTransform?: number[];
80
89
  } | {
81
90
  type: "dispose";
82
91
  requestId: number;
@@ -115,6 +124,16 @@ export type CadModifierWorkerResponse = {
115
124
  indices: Uint32Array;
116
125
  triangleCount: number;
117
126
  brep: string;
127
+ } | {
128
+ type: "draft-face";
129
+ requestId: number;
130
+ positions: Float32Array;
131
+ normals: Float32Array;
132
+ indices: Uint32Array;
133
+ triangleCount: number;
134
+ faceCount: number;
135
+ volume: number;
136
+ brep: string;
118
137
  } | {
119
138
  type: "disposed";
120
139
  requestId: number;
@@ -1 +1 @@
1
- {"version":3,"file":"cadModifierTypes.d.ts","sourceRoot":"","sources":["../../src/support/cadModifierTypes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cadModifierTypes.d.ts","sourceRoot":"","sources":["../../src/support/cadModifierTypes.ts"],"names":[],"mappings":"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"}
@@ -1268,6 +1268,9 @@
1268
1268
  "notPrepared": "Prepare an object before previewing the modifier",
1269
1269
  "noEdgesSelected": "Select at least one highlighted edge",
1270
1270
  "invalidResult": "The chosen size creates invalid or overlapping edge geometry",
1271
+ "draftFaceInvalid": "The face draft could not produce a valid solid. Check the face index and draft angle.",
1272
+ "draftFaceNotFound": "The selected face is no longer available on this solid. Choose another face index.",
1273
+ "draftFaceIncompatible": "The selected face cannot be drafted along that local CAD axis at this angle. Try another axis, face, or angle.",
1271
1274
  "filletTooLarge": "The selected edges cannot be filleted together at this size. Reduce the size or select fewer connected edges.",
1272
1275
  "chamferTooLarge": "The selected edges cannot be chamfered together at this size. Reduce the size or select fewer connected edges.",
1273
1276
  "edgeTreatmentFailed": "The CAD kernel could not complete this edge treatment",
@@ -1302,9 +1305,11 @@
1302
1305
  },
1303
1306
  "sketch": {
1304
1307
  "allPathsOpen": "All profile paths are open. Close at least one loop before finishing the sketch.",
1308
+ "sweepNeedsSectionAndSpine": "A planar sweep needs exactly one closed section loop and one open spine.",
1305
1309
  "noClosedProfile": "No closed profile found. Draw at least one closed loop and ensure it has no degenerate (zero-area) geometry.",
1306
1310
  "invalidTopology": "OpenCascade produced invalid sketch topology",
1307
- "buildFailed": "The CAD kernel could not build this sketch"
1311
+ "buildFailed": "The CAD kernel could not build this sketch",
1312
+ "sweepSpineDirection": "The first spine segment must follow screen-right, perpendicular to the section plane. Redraw that first segment."
1308
1313
  },
1309
1314
  "skf": {
1310
1315
  "fileEmpty": ".skf file is empty",
@@ -1,4 +1,8 @@
1
1
  export type Brep = typeof import("brepjs");
2
2
  export type BrepSolid = ReturnType<Brep["box"]>;
3
+ type OcctKernel = import("occt-wasm").OcctKernel;
4
+ /** Load the registered OCCT instance for operations that need its XCAF API. */
5
+ export declare function loadOcctKernel(): Promise<OcctKernel>;
3
6
  export declare function loadBrepWithOcct(): Promise<Brep>;
7
+ export {};
4
8
  //# sourceMappingURL=brepKernel.d.ts.map