@constructorfleet/sketchforge-engine 1.13.0 → 1.15.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 (77) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +61 -3
  3. package/dist/domain/sketchforge.d.ts +13 -0
  4. package/dist/domain/sketchforge.d.ts.map +1 -1
  5. package/dist/engine.d.ts.map +1 -1
  6. package/dist/engine.js +94 -3
  7. package/dist/engine.js.map +1 -1
  8. package/dist/projectMeshes.d.ts.map +1 -1
  9. package/dist/projectMeshes.js +4 -2
  10. package/dist/projectMeshes.js.map +1 -1
  11. package/dist/serverStepExplode.d.ts.map +1 -1
  12. package/dist/serverStepExplode.js +2 -75
  13. package/dist/serverStepExplode.js.map +1 -1
  14. package/dist/shapeRequests.d.ts +1 -1
  15. package/dist/shapeRequests.d.ts.map +1 -1
  16. package/dist/shapeRequests.js +1 -1
  17. package/dist/shapeRequests.js.map +1 -1
  18. package/dist/sketchCadProfile.d.ts +23 -0
  19. package/dist/sketchCadProfile.d.ts.map +1 -0
  20. package/dist/sketchCadProfile.js +166 -0
  21. package/dist/sketchCadProfile.js.map +1 -0
  22. package/dist/sketchCadSweep.d.ts +4 -0
  23. package/dist/sketchCadSweep.d.ts.map +1 -0
  24. package/dist/sketchCadSweep.js +95 -0
  25. package/dist/sketchCadSweep.js.map +1 -0
  26. package/dist/sketchSweepRequest.d.ts +5 -0
  27. package/dist/sketchSweepRequest.d.ts.map +1 -0
  28. package/dist/sketchSweepRequest.js +105 -0
  29. package/dist/sketchSweepRequest.js.map +1 -0
  30. package/dist/skfProject.d.ts +2 -0
  31. package/dist/skfProject.d.ts.map +1 -1
  32. package/dist/skfProject.js +89 -3
  33. package/dist/skfProject.js.map +1 -1
  34. package/dist/stepAssemblyHierarchy.d.ts +13 -0
  35. package/dist/stepAssemblyHierarchy.d.ts.map +1 -0
  36. package/dist/stepAssemblyHierarchy.js +170 -0
  37. package/dist/stepAssemblyHierarchy.js.map +1 -0
  38. package/dist/stepComponentMetadata.d.ts +18 -0
  39. package/dist/stepComponentMetadata.d.ts.map +1 -0
  40. package/dist/stepComponentMetadata.js +77 -0
  41. package/dist/stepComponentMetadata.js.map +1 -0
  42. package/dist/stepGlbColors.d.ts.map +1 -1
  43. package/dist/stepGlbColors.js +2 -25
  44. package/dist/stepGlbColors.js.map +1 -1
  45. package/dist/stepGlbDocument.d.ts +25 -0
  46. package/dist/stepGlbDocument.d.ts.map +1 -0
  47. package/dist/stepGlbDocument.js +27 -0
  48. package/dist/stepGlbDocument.js.map +1 -0
  49. package/dist/stepImport.d.ts +1 -0
  50. package/dist/stepImport.d.ts.map +1 -1
  51. package/dist/stepImport.js +6 -76
  52. package/dist/stepImport.js.map +1 -1
  53. package/dist/stepImportCommon.d.ts +11 -0
  54. package/dist/stepImportCommon.d.ts.map +1 -0
  55. package/dist/stepImportCommon.js +121 -0
  56. package/dist/stepImportCommon.js.map +1 -0
  57. package/dist/stepImportKernel.d.ts +2 -13
  58. package/dist/stepImportKernel.d.ts.map +1 -1
  59. package/dist/stepImportKernel.js +4 -142
  60. package/dist/stepImportKernel.js.map +1 -1
  61. package/dist/support/cadModifierTypes.d.ts +19 -0
  62. package/dist/support/cadModifierTypes.d.ts.map +1 -1
  63. package/dist/support/i18n/locales/en/messages.json +3 -0
  64. package/dist/support/lib/brepKernel.d.ts +4 -0
  65. package/dist/support/lib/brepKernel.d.ts.map +1 -1
  66. package/dist/support/lib/brepKernel.js +22 -10
  67. package/dist/support/lib/brepKernel.js.map +1 -1
  68. package/dist/support/lib/operator-configuration.json +124 -0
  69. package/dist/support/lib/operatorConfiguration.d.ts +14 -0
  70. package/dist/support/lib/operatorConfiguration.d.ts.map +1 -0
  71. package/dist/support/lib/operatorConfiguration.js +6 -0
  72. package/dist/support/lib/operatorConfiguration.js.map +1 -0
  73. package/dist/support/lib/serverProjectStore.d.ts +1 -1
  74. package/dist/support/lib/serverProjectStore.d.ts.map +1 -1
  75. package/dist/support/lib/serverProjectStore.js +2 -1
  76. package/dist/support/lib/serverProjectStore.js.map +1 -1
  77. package/package.json +1 -1
@@ -0,0 +1,170 @@
1
+ /** Bounded product-tree metadata recovered from an XCAF GLB and STEP labels. */
2
+ import { readGlbSceneDocument } from "./stepGlbDocument.js";
3
+ const MAX_HIERARCHY_NODES = 2_000;
4
+ const MAX_HIERARCHY_DEPTH = 32;
5
+ function entities(step) {
6
+ const records = [];
7
+ let start = 0;
8
+ let quoted = false;
9
+ for (let index = 0; index < step.length; index += 1) {
10
+ const char = step[index];
11
+ if (char === "'") {
12
+ if (quoted && step[index + 1] === "'") {
13
+ index += 1;
14
+ }
15
+ else {
16
+ quoted = !quoted;
17
+ }
18
+ }
19
+ else if (!quoted && char === ";") {
20
+ records.push(step.slice(start, index));
21
+ start = index + 1;
22
+ }
23
+ }
24
+ const result = [];
25
+ for (const record of records) {
26
+ const match = /^\s*#(\d+)\s*=\s*([A-Z][A-Z0-9_]*)\s*\(([\s\S]*)\)\s*$/i.exec(record);
27
+ if (!match)
28
+ continue;
29
+ const args = [];
30
+ let argStart = 0;
31
+ let depth = 0;
32
+ quoted = false;
33
+ const body = match[3];
34
+ for (let index = 0; index < body.length; index += 1) {
35
+ const char = body[index];
36
+ if (char === "'") {
37
+ if (quoted && body[index + 1] === "'")
38
+ index += 1;
39
+ else
40
+ quoted = !quoted;
41
+ }
42
+ else if (!quoted && char === "(")
43
+ depth += 1;
44
+ else if (!quoted && char === ")")
45
+ depth -= 1;
46
+ else if (!quoted && depth === 0 && char === ",") {
47
+ args.push(body.slice(argStart, index).trim());
48
+ argStart = index + 1;
49
+ }
50
+ }
51
+ args.push(body.slice(argStart).trim());
52
+ result.push({ id: Number(match[1]), type: match[2].toUpperCase(), args });
53
+ }
54
+ return result;
55
+ }
56
+ function reference(value) {
57
+ const match = /^#(\d+)$/.exec(value?.trim() ?? "");
58
+ return match ? Number(match[1]) : undefined;
59
+ }
60
+ function stepString(value) {
61
+ const match = /^'((?:[^']|'')*)'$/.exec(value?.trim() ?? "");
62
+ return match?.[1]?.replaceAll("''", "'").trim() ?? "";
63
+ }
64
+ function componentNamesByOccurrence(step) {
65
+ const records = entities(step);
66
+ const productNameById = new Map();
67
+ const productByFormationId = new Map();
68
+ const productByDefinitionId = new Map();
69
+ for (const entity of records) {
70
+ if (entity.type === "PRODUCT")
71
+ productNameById.set(entity.id, stepString(entity.args[0]));
72
+ }
73
+ for (const entity of records) {
74
+ if (entity.type !== "PRODUCT_DEFINITION_FORMATION")
75
+ continue;
76
+ const productId = reference(entity.args[2]);
77
+ if (productId !== undefined)
78
+ productByFormationId.set(entity.id, productNameById.get(productId) ?? "");
79
+ }
80
+ for (const entity of records) {
81
+ if (entity.type !== "PRODUCT_DEFINITION")
82
+ continue;
83
+ const formationId = reference(entity.args[2]);
84
+ if (formationId !== undefined)
85
+ productByDefinitionId.set(entity.id, productByFormationId.get(formationId) ?? "");
86
+ }
87
+ const names = new Map();
88
+ const ambiguous = new Set();
89
+ for (const entity of records) {
90
+ if (entity.type !== "NEXT_ASSEMBLY_USAGE_OCCURRENCE")
91
+ continue;
92
+ const occurrenceId = stepString(entity.args[0]);
93
+ const childDefinitionId = reference(entity.args[4]);
94
+ if (!occurrenceId || childDefinitionId === undefined)
95
+ continue;
96
+ const explicitName = stepString(entity.args[1]);
97
+ const name = explicitName && !/^\d+$/.test(explicitName)
98
+ ? explicitName
99
+ : productByDefinitionId.get(childDefinitionId) ?? "";
100
+ if (!name)
101
+ continue;
102
+ const existing = names.get(occurrenceId);
103
+ if (existing && existing !== name)
104
+ ambiguous.add(occurrenceId);
105
+ else
106
+ names.set(occurrenceId, name);
107
+ }
108
+ for (const id of ambiguous)
109
+ names.delete(id);
110
+ return names;
111
+ }
112
+ /**
113
+ * Read a display tree from OCCT's XCAF glTF export. Product names are taken
114
+ * from STEP occurrence records because OCCT's glTF exporter names occurrence
115
+ * nodes with the STEP relationship id. Geometry-only mesh nodes are folded
116
+ * into their component occurrence. Files outside the importer metadata budget
117
+ * never reach this helper.
118
+ */
119
+ export function stepAssemblyHierarchyFromGlb(glb, step) {
120
+ const document = readGlbSceneDocument(glb);
121
+ const nodes = document?.nodes;
122
+ if (!nodes?.length || nodes.length > MAX_HIERARCHY_NODES)
123
+ return undefined;
124
+ const namesByOccurrence = componentNamesByOccurrence(step);
125
+ if (!namesByOccurrence.size)
126
+ return undefined;
127
+ const sceneNodes = document?.scenes?.[document.scene ?? 0]?.nodes;
128
+ const hasChild = new Set((nodes ?? []).flatMap((node) => node.children ?? []));
129
+ const roots = sceneNodes?.length ? sceneNodes : nodes.flatMap((_, index) => hasChild.has(index) ? [] : [index]);
130
+ let visited = 0;
131
+ let mapped = 0;
132
+ let invalid = false;
133
+ const visit = (index, depth, path) => {
134
+ if (depth > MAX_HIERARCHY_DEPTH || index < 0 || index >= nodes.length || path.has(index)) {
135
+ invalid = true;
136
+ return null;
137
+ }
138
+ visited += 1;
139
+ if (visited > MAX_HIERARCHY_NODES) {
140
+ invalid = true;
141
+ return null;
142
+ }
143
+ const node = nodes[index];
144
+ const nextPath = new Set(path).add(index);
145
+ const children = (node.children ?? []).map((child) => visit(child, depth + 1, nextPath)).filter((child) => child !== null);
146
+ // XCAF exports a separate mesh node under a component occurrence. That
147
+ // node describes the same product's B-Rep representation, not a product
148
+ // relationship, so it is intentionally omitted from the display tree.
149
+ if (typeof node.mesh === "number" && children.length === 0)
150
+ return null;
151
+ const rawName = node.name?.trim() ?? "";
152
+ const occurrenceName = namesByOccurrence.get(rawName);
153
+ if (occurrenceName)
154
+ mapped += 1;
155
+ const name = occurrenceName ?? rawName;
156
+ if (!name)
157
+ return children.length === 1 ? children[0] : null;
158
+ return { name, children };
159
+ };
160
+ let result = roots.map((root) => visit(root, 0, new Set())).filter((node) => node !== null);
161
+ if (invalid || mapped === 0)
162
+ return undefined;
163
+ // Some writers emit a scene wrapper and a product node with the same label.
164
+ // Removing only this one-child duplicate keeps the product tree intact.
165
+ while (result.length === 1 && result[0].children.length === 1 && result[0].name === result[0].children[0].name) {
166
+ result = result[0].children;
167
+ }
168
+ return result.some((root) => root.children.length > 0) ? result : undefined;
169
+ }
170
+ //# sourceMappingURL=stepAssemblyHierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepAssemblyHierarchy.js","sourceRoot":"","sources":["../src/stepAssemblyHierarchy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /** Component labels and colors shared by regular STEP import and assembly explosion. */
2
+ import type { OcctKernel, ShapeHandle } from "occt-wasm";
3
+ import { type StepAssemblyNode } from "./stepAssemblyHierarchy.js";
4
+ export type StepComponentMetadata = {
5
+ name?: string;
6
+ color?: string;
7
+ };
8
+ export type StepComponentMetadataResult = {
9
+ bySolid: Map<string, StepComponentMetadata[]>;
10
+ assembly?: StepAssemblyNode[];
11
+ };
12
+ export declare function stepShapeKey(cad: OcctKernel, shape: ShapeHandle): string;
13
+ /** Read XCAF instance labels and associate leaf component metadata with exact solids. */
14
+ export declare function stepComponentMetadata(cad: OcctKernel, step: string): {
15
+ assembly?: StepAssemblyNode[] | undefined;
16
+ bySolid: Map<string, StepComponentMetadata[]>;
17
+ };
18
+ //# sourceMappingURL=stepComponentMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepComponentMetadata.d.ts","sourceRoot":"","sources":["../src/stepComponentMetadata.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,OAAO,KAAK,EAAY,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEnE,OAAO,EAAgC,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEjG,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACtE,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC/B,CAAC;AAEF,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,UAK/D;AAMD,yFAAyF;AACzF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM;;;EA0DlE"}
@@ -0,0 +1,77 @@
1
+ import { componentColorsFromGlb } from "./stepGlbColors.js";
2
+ import { stepAssemblyHierarchyFromGlb } from "./stepAssemblyHierarchy.js";
3
+ export function stepShapeKey(cad, shape) {
4
+ const bounds = cad.getBoundingBox(shape, false);
5
+ return [cad.getVolume(shape), bounds.xmin, bounds.ymin, bounds.zmin, bounds.xmax, bounds.ymax, bounds.zmax]
6
+ .map((value) => value.toFixed(5))
7
+ .join(":");
8
+ }
9
+ function colorHex(color) {
10
+ return `#${color.map((channel) => Math.round(Math.max(0, Math.min(1, channel)) * 255).toString(16).padStart(2, "0")).join("")}`;
11
+ }
12
+ /** Read XCAF instance labels and associate leaf component metadata with exact solids. */
13
+ export function stepComponentMetadata(cad, step) {
14
+ const metadataBySolid = new Map();
15
+ const document = cad.importXCAFFromSTEP(step);
16
+ let assembly;
17
+ try {
18
+ let colorsByName = new Map();
19
+ try {
20
+ const glb = document.exportGLTF();
21
+ colorsByName = componentColorsFromGlb(glb);
22
+ assembly = stepAssemblyHierarchyFromGlb(glb, step);
23
+ }
24
+ catch {
25
+ // XCAF label data remains usable when the optional color view cannot be exported.
26
+ }
27
+ const leaves = [];
28
+ const visit = (label, inheritedColor) => {
29
+ const info = document.getLabelInfo(label);
30
+ const labelColor = info.hasColor ? colorHex(info.color) : undefined;
31
+ const children = document.getChildren(label);
32
+ const inherited = labelColor ?? inheritedColor;
33
+ if (children.length) {
34
+ for (const child of children)
35
+ visit(child, inherited);
36
+ return;
37
+ }
38
+ if (info.isAssembly || !info.shapeHandle)
39
+ return;
40
+ const solids = cad.getSubShapes(info.shapeHandle, "solid");
41
+ const name = info.name.trim();
42
+ leaves.push({
43
+ name,
44
+ ...(name && !/^\d+$/.test(name) ? { nameForOutput: name } : {}),
45
+ ...(inherited ? { color: inherited } : {}),
46
+ solids,
47
+ });
48
+ };
49
+ for (const root of document.getRoots())
50
+ visit(root);
51
+ const leafCountByName = new Map();
52
+ for (const leaf of leaves) {
53
+ if (leaf.name)
54
+ leafCountByName.set(leaf.name, (leafCountByName.get(leaf.name) ?? 0) + 1);
55
+ }
56
+ for (const leaf of leaves) {
57
+ const glbCandidate = colorsByName.get(leaf.name);
58
+ const color = leaf.color ?? (leaf.name && leafCountByName.get(leaf.name) === 1 && glbCandidate?.count === 1
59
+ ? glbCandidate.color
60
+ : undefined);
61
+ for (const solid of leaf.solids) {
62
+ const key = stepShapeKey(cad, solid);
63
+ const metadata = metadataBySolid.get(key) ?? [];
64
+ metadata.push({
65
+ ...(leaf.nameForOutput ? { name: leaf.nameForOutput } : {}),
66
+ ...(color ? { color } : {}),
67
+ });
68
+ metadataBySolid.set(key, metadata);
69
+ }
70
+ }
71
+ }
72
+ finally {
73
+ document.close();
74
+ }
75
+ return { bySolid: metadataBySolid, ...(assembly ? { assembly } : {}) };
76
+ }
77
+ //# sourceMappingURL=stepComponentMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepComponentMetadata.js","sourceRoot":"","sources":["../src/stepComponentMetadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAyB,MAAM,4BAA4B,CAAC;AAQjG,MAAM,UAAU,YAAY,CAAC,GAAe,EAAE,KAAkB;IAC9D,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;SACxG,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAChC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAA+B;IAC/C,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AAClI,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,qBAAqB,CAAC,GAAe,EAAE,IAAY;IACjE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAmC,CAAC;IACnE,MAAM,QAAQ,GAAG,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,QAAwC,CAAC;IAC7C,IAAI,CAAC;QACH,IAAI,YAAY,GAAG,IAAI,GAAG,EAA6C,CAAC;QACxE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;YAClC,YAAY,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;YAC3C,QAAQ,GAAG,4BAA4B,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,kFAAkF;QACpF,CAAC;QACD,MAAM,MAAM,GAAsF,EAAE,CAAC;QACrG,MAAM,KAAK,GAAG,CAAC,KAAe,EAAE,cAAuB,EAAE,EAAE;YACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpE,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,UAAU,IAAI,cAAc,CAAC;YAC/C,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpB,KAAK,MAAM,KAAK,IAAI,QAAQ;oBAAE,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,OAAO;YACjD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,MAAM;aACP,CAAC,CAAC;QACL,CAAC,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAEpD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;QAClD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,IAAI;gBAAE,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3F,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,YAAY,EAAE,KAAK,KAAK,CAAC;gBACzG,CAAC,CAAC,YAAY,CAAC,KAAK;gBACpB,CAAC,CAAC,SAAS,CAAC,CAAC;YACf,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACrC,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAChD,QAAQ,CAAC,IAAI,CAAC;oBACZ,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3D,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5B,CAAC,CAAC;gBACH,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAwC,CAAC;AAC/G,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"stepGlbColors.d.ts","sourceRoot":"","sources":["../src/stepGlbColors.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAM9D,sEAAsE;AACtE,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CA8DlF"}
1
+ {"version":3,"file":"stepGlbColors.d.ts","sourceRoot":"","sources":["../src/stepGlbColors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAM9D,sEAAsE;AACtE,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAyClF"}
@@ -1,3 +1,4 @@
1
+ import { readGlbSceneDocument } from "./stepGlbDocument.js";
1
2
  function colorHex(color) {
2
3
  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
  }
@@ -5,31 +6,7 @@ function colorHex(color) {
5
6
  export function componentColorsFromGlb(glb) {
6
7
  const candidates = new Map();
7
8
  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
- }
9
+ const json = readGlbSceneDocument(glb);
33
10
  if (!json)
34
11
  return empty();
35
12
  for (const node of json.nodes ?? []) {
@@ -1 +1 @@
1
- {"version":3,"file":"stepGlbColors.js","sourceRoot":"","sources":["../src/stepGlbColors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stepGlbColors.js","sourceRoot":"","sources":["../src/stepGlbColors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /** Small, defensive reader for the JSON chunk of a binary glTF document. */
2
+ export type GlbSceneDocument = {
3
+ scene?: number;
4
+ scenes?: Array<{
5
+ nodes?: number[];
6
+ }>;
7
+ nodes?: Array<{
8
+ name?: string;
9
+ mesh?: number;
10
+ children?: number[];
11
+ }>;
12
+ meshes?: Array<{
13
+ name?: string;
14
+ primitives?: Array<{
15
+ material?: number;
16
+ }>;
17
+ }>;
18
+ materials?: Array<{
19
+ pbrMetallicRoughness?: {
20
+ baseColorFactor?: number[];
21
+ };
22
+ }>;
23
+ };
24
+ export declare function readGlbSceneDocument(glb: Uint8Array): GlbSceneDocument | null;
25
+ //# sourceMappingURL=stepGlbDocument.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepGlbDocument.d.ts","sourceRoot":"","sources":["../src/stepGlbDocument.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACrC,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACrE,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,KAAK,CAAC;YAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IAC7E,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,oBAAoB,CAAC,EAAE;YAAE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;CAC9E,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,gBAAgB,GAAG,IAAI,CAsB7E"}
@@ -0,0 +1,27 @@
1
+ export function readGlbSceneDocument(glb) {
2
+ if (glb.byteLength < 20)
3
+ return null;
4
+ const view = new DataView(glb.buffer, glb.byteOffset, glb.byteLength);
5
+ if (view.getUint32(0, true) !== 0x46546c67 || view.getUint32(4, true) !== 2)
6
+ return null;
7
+ let offset = 12;
8
+ while (offset + 8 <= glb.byteLength) {
9
+ const length = view.getUint32(offset, true);
10
+ const type = view.getUint32(offset + 4, true);
11
+ const start = offset + 8;
12
+ const end = start + length;
13
+ if (end > glb.byteLength)
14
+ return null;
15
+ if (type === 0x4e4f534a) {
16
+ try {
17
+ return JSON.parse(new TextDecoder().decode(glb.subarray(start, end)).trim());
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ offset = end;
24
+ }
25
+ return null;
26
+ }
27
+ //# sourceMappingURL=stepGlbDocument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepGlbDocument.js","sourceRoot":"","sources":["../src/stepGlbDocument.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,oBAAoB,CAAC,GAAe;IAClD,IAAI,GAAG,CAAC,UAAU,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IACtE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzF,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC;QAC3B,IAAI,GAAG,GAAG,GAAG,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAqB,CAAC;YACnG,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,MAAM,GAAG,GAAG,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -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;AA2CF,wFAAwF;AACxF,wBAAsB,+BAA+B,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmErI"}