@constructorfleet/sketchforge-engine 1.18.0 → 1.20.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/README.md +3 -3
- package/dist/domain/sketchforge.d.ts +39 -0
- package/dist/domain/sketchforge.d.ts.map +1 -1
- package/dist/engine.d.ts +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +364 -21
- package/dist/engine.js.map +1 -1
- package/dist/faceLineage.d.ts +10 -0
- package/dist/faceLineage.d.ts.map +1 -0
- package/dist/faceLineage.js +84 -0
- package/dist/faceLineage.js.map +1 -0
- package/dist/parametricRecompute.d.ts +2 -0
- package/dist/parametricRecompute.d.ts.map +1 -1
- package/dist/parametricRecompute.js +85 -0
- package/dist/parametricRecompute.js.map +1 -1
- package/dist/revolveRequests.d.ts +10 -0
- package/dist/revolveRequests.d.ts.map +1 -1
- package/dist/serverCadOperations.d.ts +54 -3
- package/dist/serverCadOperations.d.ts.map +1 -1
- package/dist/serverCadOperations.js +224 -6
- package/dist/serverCadOperations.js.map +1 -1
- package/dist/serverCadShell.d.ts +3 -1
- package/dist/serverCadShell.d.ts.map +1 -1
- package/dist/serverCadShell.js +15 -5
- package/dist/serverCadShell.js.map +1 -1
- package/dist/sketchExtrusionRequest.d.ts +4 -0
- package/dist/sketchExtrusionRequest.d.ts.map +1 -0
- package/dist/sketchExtrusionRequest.js +92 -0
- package/dist/sketchExtrusionRequest.js.map +1 -0
- package/dist/skfProject.d.ts.map +1 -1
- package/dist/skfProject.js +85 -8
- package/dist/skfProject.js.map +1 -1
- package/dist/stepComponentMetadata.d.ts.map +1 -1
- package/dist/stepComponentMetadata.js +55 -2
- package/dist/stepComponentMetadata.js.map +1 -1
- package/dist/stepExport.d.ts.map +1 -1
- package/dist/stepExport.js +54 -8
- package/dist/stepExport.js.map +1 -1
- package/dist/stepGlbColors.d.ts.map +1 -1
- package/dist/stepGlbColors.js +10 -2
- package/dist/stepGlbColors.js.map +1 -1
- package/dist/support/lib/operator-configuration.json +78 -2
- package/dist/support/lib/operatorConfiguration.d.ts +26 -2
- package/dist/support/lib/operatorConfiguration.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { createLocalId } from "./localIds.js";
|
|
2
|
+
import { withCadKernel } from "./serverCadKernel.js";
|
|
3
|
+
import { cadSketchRegions } from "./sketchCadProfile.js";
|
|
4
|
+
import { canonicalizeShape, cleanNearZero } from "./workplaneShapes.js";
|
|
5
|
+
function pathWire(cad, path) {
|
|
6
|
+
return cad.makeWire(path.steps.map(({ segment, from, to }) => {
|
|
7
|
+
const forward = segment.startId === from.id;
|
|
8
|
+
const first = forward ? from.handleOut : from.handleIn;
|
|
9
|
+
const second = forward ? to.handleIn : to.handleOut;
|
|
10
|
+
if (segment.kind !== "line" && first && second) {
|
|
11
|
+
return cad.makeBezierEdge([
|
|
12
|
+
{ x: from.x, y: 0, z: from.z }, { x: first.x, y: 0, z: first.z },
|
|
13
|
+
{ x: second.x, y: 0, z: second.z }, { x: to.x, y: 0, z: to.z },
|
|
14
|
+
]);
|
|
15
|
+
}
|
|
16
|
+
return cad.makeLineEdge({ x: from.x, y: 0, z: from.z }, { x: to.x, y: 0, z: to.z });
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
/** Rebuild a retained sketch extrusion as exact OCCT geometry. */
|
|
20
|
+
export async function sketchExtrusionShapeFromRequest(request) {
|
|
21
|
+
const profile = request.profile;
|
|
22
|
+
const height = request.height;
|
|
23
|
+
if (typeof height !== "number" || !Number.isFinite(height) || height <= 0 || height > 10000) {
|
|
24
|
+
throw new Error("A sketch extrusion height must be finite and greater than zero.");
|
|
25
|
+
}
|
|
26
|
+
return withCadKernel((cad) => {
|
|
27
|
+
const regions = cadSketchRegions(profile);
|
|
28
|
+
if (regions.length === 0)
|
|
29
|
+
throw new Error("A sketch extrusion requires a closed profile.");
|
|
30
|
+
const solids = regions.map((region) => {
|
|
31
|
+
let face = cad.makeFace(pathWire(cad, region.outer));
|
|
32
|
+
if (region.holes.length)
|
|
33
|
+
face = cad.addHolesInFace(face, region.holes.map((hole) => pathWire(cad, hole)));
|
|
34
|
+
return cad.extrude(face, 0, height, 0);
|
|
35
|
+
});
|
|
36
|
+
const solid = solids.length === 1 ? solids[0] : cad.makeCompound(solids);
|
|
37
|
+
if (!cad.isValid(solid))
|
|
38
|
+
throw new Error("The sketch extrusion produced invalid geometry.");
|
|
39
|
+
const mesh = cad.tessellate(solid, { linearDeflection: 0.05, angularDeflection: 0.16 });
|
|
40
|
+
if (mesh.positions.length < 9 || mesh.indices.length < 3)
|
|
41
|
+
throw new Error("The sketch extrusion produced no solid geometry.");
|
|
42
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
43
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
44
|
+
for (let i = 0; i < mesh.positions.length; i += 3) {
|
|
45
|
+
minX = Math.min(minX, mesh.positions[i]);
|
|
46
|
+
maxX = Math.max(maxX, mesh.positions[i]);
|
|
47
|
+
minY = Math.min(minY, mesh.positions[i + 1]);
|
|
48
|
+
maxY = Math.max(maxY, mesh.positions[i + 1]);
|
|
49
|
+
minZ = Math.min(minZ, mesh.positions[i + 2]);
|
|
50
|
+
maxZ = Math.max(maxZ, mesh.positions[i + 2]);
|
|
51
|
+
}
|
|
52
|
+
const centerX = (minX + maxX) / 2;
|
|
53
|
+
const centerZ = (minZ + maxZ) / 2;
|
|
54
|
+
const positions = [];
|
|
55
|
+
const normals = [];
|
|
56
|
+
for (const index of mesh.indices) {
|
|
57
|
+
const vertex = index * 3;
|
|
58
|
+
positions.push(mesh.positions[vertex] - centerX, mesh.positions[vertex + 1] - minY, mesh.positions[vertex + 2] - centerZ);
|
|
59
|
+
if (mesh.normals.length >= vertex + 3)
|
|
60
|
+
normals.push(mesh.normals[vertex], mesh.normals[vertex + 1], mesh.normals[vertex + 2]);
|
|
61
|
+
}
|
|
62
|
+
const width = Math.max(0.01, maxX - minX);
|
|
63
|
+
const depth = Math.max(0.01, maxZ - minZ);
|
|
64
|
+
const builtHeight = Math.max(0.01, maxY - minY);
|
|
65
|
+
const id = typeof request.id === "string" ? request.id : createLocalId("sketch-extrusion");
|
|
66
|
+
return canonicalizeShape({
|
|
67
|
+
id,
|
|
68
|
+
name: typeof request.name === "string" && request.name.trim() ? request.name.trim() : "Sketch extrusion",
|
|
69
|
+
kind: "mesh",
|
|
70
|
+
color: typeof request.color === "string" ? request.color : "#d41721",
|
|
71
|
+
x: cleanNearZero(centerX, 0.0005) + (typeof request.x === "number" ? request.x : 0),
|
|
72
|
+
z: cleanNearZero(centerZ, 0.0005) + (typeof request.z === "number" ? request.z : 0),
|
|
73
|
+
elevation: cleanNearZero(minY, 0.0005) + (typeof request.elevation === "number" ? request.elevation : 0),
|
|
74
|
+
width, depth, height: builtHeight, size: Math.max(width, depth),
|
|
75
|
+
rotation: typeof request.rotation === "number" ? request.rotation : 0,
|
|
76
|
+
rotationX: typeof request.rotationX === "number" ? request.rotationX : 0,
|
|
77
|
+
rotationZ: typeof request.rotationZ === "number" ? request.rotationZ : 0,
|
|
78
|
+
hole: request.hole === true,
|
|
79
|
+
sketchProfile: structuredClone(profile), sketchOperation: "extrude",
|
|
80
|
+
sketchSourceId: typeof request.sketchSourceId === "string" ? request.sketchSourceId : `sketch/${id}`,
|
|
81
|
+
importedMesh: {
|
|
82
|
+
positions, normals: normals.length === positions.length ? normals : undefined,
|
|
83
|
+
baseWidth: width, baseDepth: depth, baseHeight: builtHeight,
|
|
84
|
+
triangleCount: Math.floor(mesh.indices.length / 3), sourceFormat: "json",
|
|
85
|
+
},
|
|
86
|
+
cadBrep: cad.toBREP(solid),
|
|
87
|
+
faceIds: cad.getSubShapes(solid, "face").map((_, index) => `face_${createLocalId(`${id}-face-${index}`)}`),
|
|
88
|
+
cadBrepFrame: { x: centerX, z: centerZ, elevation: minY, width, depth, height: builtHeight },
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=sketchExtrusionRequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sketchExtrusionRequest.js","sourceRoot":"","sources":["../src/sketchExtrusionRequest.ts"],"names":[],"mappings":"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"}
|
package/dist/skfProject.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skfProject.d.ts","sourceRoot":"","sources":["../src/skfProject.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACpI,OAAO,EAAyD,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"skfProject.d.ts","sourceRoot":"","sources":["../src/skfProject.ts"],"names":[],"mappings":"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"}
|
package/dist/skfProject.js
CHANGED
|
@@ -8,6 +8,7 @@ import { canonicalizeShape } from "./workplaneShapes.js";
|
|
|
8
8
|
import { importedShapeFromStl } from "./stlImport.js";
|
|
9
9
|
import { importedShapeFromSvg } from "./svgImport.js";
|
|
10
10
|
import { normalizeSnapGrid, normalizeWorkspaceSettings } from "./workplaneSettings.js";
|
|
11
|
+
import { cadSketchRegions } from "./sketchCadProfile.js";
|
|
11
12
|
export const SKF_SCHEMA_ID = "com.sketchforge.project";
|
|
12
13
|
export const SKF_FORMAT_VERSION = 2;
|
|
13
14
|
export const SKF_MINIMUM_READER_VERSION = 2;
|
|
@@ -30,7 +31,7 @@ const SHAPE_KINDS = new Set([
|
|
|
30
31
|
]);
|
|
31
32
|
const LOFT_PROFILE_SHAPES = new Set(["Oval", "Rectangle", "Triangle", "Pentagon", "Hexagon"]);
|
|
32
33
|
const FEATURE_TYPES = new Set([
|
|
33
|
-
"group", "boolean-subtraction", "boolean-intersection", "mirror", "sketch-extrusion", "sketch-revolve", "sketch-sweep", "fillet", "chamfer",
|
|
34
|
+
"group", "boolean-subtraction", "boolean-intersection", "mirror", "sketch-extrusion", "sketch-revolve", "sketch-sweep", "fillet", "chamfer", "face-draft",
|
|
34
35
|
]);
|
|
35
36
|
function exactArrayBuffer(bytes) {
|
|
36
37
|
return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
|
|
@@ -438,6 +439,8 @@ async function serializeShapeNode(shape, nodeId, nodes, builder, sourceAssetsByA
|
|
|
438
439
|
sketchRevolve: undefined,
|
|
439
440
|
sketchSourceId: undefined,
|
|
440
441
|
sketchSourceNodeId: undefined,
|
|
442
|
+
faceDraft: undefined,
|
|
443
|
+
faceDraftSourceFrame: undefined,
|
|
441
444
|
sketchSourceOfObjectId: shape.id,
|
|
442
445
|
},
|
|
443
446
|
});
|
|
@@ -590,6 +593,19 @@ function activeProjectIndexes(state) {
|
|
|
590
593
|
});
|
|
591
594
|
previous = featureId;
|
|
592
595
|
});
|
|
596
|
+
const faceDraft = node.definition.faceDraft;
|
|
597
|
+
if (faceDraft) {
|
|
598
|
+
const featureId = `feature/${safeNodeToken(node.nodeId)}/face-draft`;
|
|
599
|
+
features.push({
|
|
600
|
+
id: featureId,
|
|
601
|
+
type: "face-draft",
|
|
602
|
+
outputObjectId: node.objectId,
|
|
603
|
+
inputObjectIds: [node.objectId],
|
|
604
|
+
dependsOnFeatureIds: previous ? [previous] : [],
|
|
605
|
+
parameters: { ...faceDraft },
|
|
606
|
+
});
|
|
607
|
+
previous = featureId;
|
|
608
|
+
}
|
|
593
609
|
if (node.definition.mirrorX || node.definition.mirrorY || node.definition.mirrorZ) {
|
|
594
610
|
const featureId = `feature/${safeNodeToken(node.nodeId)}/mirror`;
|
|
595
611
|
features.push({
|
|
@@ -866,12 +882,19 @@ function validateSketchProfile(value, label) {
|
|
|
866
882
|
throw new LocalizedError("errors.skf.fieldInvalid", { label: `${constraintLabel}.id` });
|
|
867
883
|
constraintIds.add(id);
|
|
868
884
|
const kind = stringValue(constraint.kind, `${constraintLabel}.kind`);
|
|
869
|
-
if (kind === "
|
|
885
|
+
if (kind === "fixed") {
|
|
886
|
+
const pointId = stringValue(constraint.pointId, `${constraintLabel}.pointId`);
|
|
887
|
+
if (!pointIds.has(pointId))
|
|
888
|
+
throw new LocalizedError("errors.skf.fieldInvalid", { label: `${constraintLabel}.pointId` });
|
|
889
|
+
finiteNumber(constraint.xMm, `${constraintLabel}.xMm`);
|
|
890
|
+
finiteNumber(constraint.zMm, `${constraintLabel}.zMm`);
|
|
891
|
+
}
|
|
892
|
+
else if (kind === "horizontal" || kind === "vertical") {
|
|
870
893
|
if (!segmentIds.has(stringValue(constraint.segmentId, `${constraintLabel}.segmentId`))) {
|
|
871
894
|
throw new LocalizedError("errors.skf.fieldInvalid", { label: `${constraintLabel}.segmentId` });
|
|
872
895
|
}
|
|
873
896
|
}
|
|
874
|
-
else if (kind === "perpendicular") {
|
|
897
|
+
else if (kind === "perpendicular" || kind === "parallel") {
|
|
875
898
|
if (!Array.isArray(constraint.segmentIds) || constraint.segmentIds.length !== 2 || constraint.segmentIds[0] === constraint.segmentIds[1] || !constraint.segmentIds.every((segmentId) => typeof segmentId === "string" && segmentIds.has(segmentId))) {
|
|
876
899
|
throw new LocalizedError("errors.skf.fieldInvalid", { label: `${constraintLabel}.segmentIds` });
|
|
877
900
|
}
|
|
@@ -890,7 +913,7 @@ function validateSketchProfile(value, label) {
|
|
|
890
913
|
});
|
|
891
914
|
}
|
|
892
915
|
}
|
|
893
|
-
function validateShapeDefinition(definition, label) {
|
|
916
|
+
function validateShapeDefinition(definition, label, options = {}) {
|
|
894
917
|
const id = stringValue(definition.id, `${label}.id`);
|
|
895
918
|
stringValue(definition.name, `${label}.name`);
|
|
896
919
|
const kind = stringValue(definition.kind, `${label}.kind`);
|
|
@@ -919,13 +942,13 @@ function validateShapeDefinition(definition, label) {
|
|
|
919
942
|
if (definition.faceColors !== undefined) {
|
|
920
943
|
const colors = objectRecord(definition.faceColors, `${label}.faceColors`);
|
|
921
944
|
for (const [faceId, color] of Object.entries(colors)) {
|
|
922
|
-
if (!(
|
|
945
|
+
if (!faceId.trim() || typeof color !== "string" || !/^#[0-9a-fA-F]{6}(?:[0-9a-fA-F]{2})?$/.test(color)) {
|
|
923
946
|
throw new LocalizedError("errors.skf.fieldInvalid", { label: `${label}.faceColors.${faceId}` });
|
|
924
947
|
}
|
|
925
948
|
}
|
|
926
949
|
}
|
|
927
950
|
if (definition.faceIds !== undefined && (!Array.isArray(definition.faceIds)
|
|
928
|
-
|| definition.faceIds.some((faceId) => typeof faceId !== "string" || !faceId.
|
|
951
|
+
|| definition.faceIds.some((faceId) => typeof faceId !== "string" || !faceId.trim())
|
|
929
952
|
|| new Set(definition.faceIds).size !== definition.faceIds.length)) {
|
|
930
953
|
throw new LocalizedError("errors.skf.fieldInvalid", { label: `${label}.faceIds` });
|
|
931
954
|
}
|
|
@@ -960,6 +983,56 @@ function validateShapeDefinition(definition, label) {
|
|
|
960
983
|
finiteNumber(settings[field], `${label}.sketchRevolve.${field}`);
|
|
961
984
|
});
|
|
962
985
|
}
|
|
986
|
+
if (definition.faceDraft !== undefined) {
|
|
987
|
+
const draft = objectRecord(definition.faceDraft, `${label}.faceDraft`);
|
|
988
|
+
const revolveSettings = definition.sketchRevolve && typeof definition.sketchRevolve === "object" && !Array.isArray(definition.sketchRevolve)
|
|
989
|
+
? definition.sketchRevolve
|
|
990
|
+
: undefined;
|
|
991
|
+
const plainFullTurnRevolve = definition.sketchOperation === "revolve" && revolveSettings
|
|
992
|
+
&& typeof revolveSettings.sweepAngle === "number"
|
|
993
|
+
&& Math.abs(Math.abs(revolveSettings.sweepAngle) - 360) <= 1e-6
|
|
994
|
+
&& (revolveSettings.pitch === undefined || revolveSettings.pitch === 0)
|
|
995
|
+
&& (revolveSettings.coreRadius === undefined || revolveSettings.coreRadius === 0);
|
|
996
|
+
if (kind !== "mesh"
|
|
997
|
+
|| (definition.sketchOperation !== "extrude" && definition.sketchOperation !== "sweep" && !plainFullTurnRevolve)
|
|
998
|
+
|| definition.sketchProfile === undefined
|
|
999
|
+
|| plainFullTurnRevolve && cadSketchRegions(definition.sketchProfile).length !== 1
|
|
1000
|
+
|| definition.sketchSourceId === undefined
|
|
1001
|
+
|| definition.draftPrismAngle !== undefined
|
|
1002
|
+
|| (Array.isArray(definition.edgeTreatments) && definition.edgeTreatments.length > 0)
|
|
1003
|
+
|| options.hasEdgeTreatmentHistory) {
|
|
1004
|
+
throw new LocalizedError("errors.skf.fieldInvalid", { label: `${label}.faceDraft` });
|
|
1005
|
+
}
|
|
1006
|
+
const sourceFaceId = stringValue(draft.sourceFaceId, `${label}.faceDraft.sourceFaceId`);
|
|
1007
|
+
if (!sourceFaceId.trim())
|
|
1008
|
+
throw new LocalizedError("errors.skf.fieldInvalid", { label: `${label}.faceDraft.sourceFaceId` });
|
|
1009
|
+
const angle = finiteNumber(draft.angle, `${label}.faceDraft.angle`);
|
|
1010
|
+
if (angle === 0 || Math.abs(angle) >= 45)
|
|
1011
|
+
throw new LocalizedError("errors.skf.outOfRange", { label: `${label}.faceDraft.angle` });
|
|
1012
|
+
if (!["x", "y", "z", "-x", "-y", "-z"].includes(draft.pullDirection)) {
|
|
1013
|
+
throw new LocalizedError("errors.skf.fieldInvalid", { label: `${label}.faceDraft.pullDirection` });
|
|
1014
|
+
}
|
|
1015
|
+
const normal = objectRecord(draft.sourceFaceNormal, `${label}.faceDraft.sourceFaceNormal`);
|
|
1016
|
+
const coordinates = ["x", "y", "z"].map((axis) => finiteNumber(normal[axis], `${label}.faceDraft.sourceFaceNormal.${axis}`));
|
|
1017
|
+
const magnitude = Math.hypot(...coordinates);
|
|
1018
|
+
if (Math.abs(magnitude - 1) > 1e-4)
|
|
1019
|
+
throw new LocalizedError("errors.skf.fieldInvalid", { label: `${label}.faceDraft.sourceFaceNormal` });
|
|
1020
|
+
}
|
|
1021
|
+
if (definition.faceDraftSourceFrame !== undefined) {
|
|
1022
|
+
const frame = objectRecord(definition.faceDraftSourceFrame, `${label}.faceDraftSourceFrame`);
|
|
1023
|
+
["x", "z", "elevation", "width", "depth", "height"].forEach((field) => finiteNumber(frame[field], `${label}.faceDraftSourceFrame.${field}`));
|
|
1024
|
+
if (["width", "depth", "height"].some((field) => frame[field] <= 0)) {
|
|
1025
|
+
throw new LocalizedError("errors.skf.nonPositiveDimensions", { label: `${label}.faceDraftSourceFrame` });
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
if (definition.faceDraftSourceScale !== undefined) {
|
|
1029
|
+
const scale = objectRecord(definition.faceDraftSourceScale, `${label}.faceDraftSourceScale`);
|
|
1030
|
+
["width", "depth", "height"].forEach((field) => {
|
|
1031
|
+
if (finiteNumber(scale[field], `${label}.faceDraftSourceScale.${field}`) <= 0) {
|
|
1032
|
+
throw new LocalizedError("errors.skf.fieldInvalid", { label: `${label}.faceDraftSourceScale.${field}` });
|
|
1033
|
+
}
|
|
1034
|
+
});
|
|
1035
|
+
}
|
|
963
1036
|
if (kind === "gear") {
|
|
964
1037
|
const teeth = finiteNumber(definition.teeth, `${label}.teeth`);
|
|
965
1038
|
if (!Number.isInteger(teeth) || teeth < 6 || teeth > 64)
|
|
@@ -1128,7 +1201,9 @@ async function validateDocumentAndAssets(raw, files) {
|
|
|
1128
1201
|
if (nodeById.has(nodeId))
|
|
1129
1202
|
throw new LocalizedError("errors.skf.stateDuplicateNodeId", { state: stateId, id: nodeId });
|
|
1130
1203
|
const definition = objectRecord(node.definition, `node '${nodeId}'.definition`);
|
|
1131
|
-
const objectId = validateShapeDefinition(definition, `node '${nodeId}'
|
|
1204
|
+
const objectId = validateShapeDefinition(definition, `node '${nodeId}'`, {
|
|
1205
|
+
hasEdgeTreatmentHistory: Boolean(node.edgeTreatmentHistory?.length),
|
|
1206
|
+
});
|
|
1132
1207
|
if (node.objectId !== objectId)
|
|
1133
1208
|
throw new LocalizedError("errors.skf.nodeObjectIdMismatch", { id: nodeId });
|
|
1134
1209
|
if (node.importedMesh) {
|
|
@@ -1461,7 +1536,9 @@ function validateLegacyRuntimeShape(shape, label) {
|
|
|
1461
1536
|
delete definition.groupedShapes;
|
|
1462
1537
|
delete definition.edgeTreatmentHistory;
|
|
1463
1538
|
delete definition.cadBrep;
|
|
1464
|
-
validateShapeDefinition(definition, label
|
|
1539
|
+
validateShapeDefinition(definition, label, {
|
|
1540
|
+
hasEdgeTreatmentHistory: Array.isArray(edgeHistory) && edgeHistory.length > 0,
|
|
1541
|
+
});
|
|
1465
1542
|
if (importedMesh) {
|
|
1466
1543
|
const mesh = objectRecord(importedMesh, `${label}.importedMesh`);
|
|
1467
1544
|
if (!Array.isArray(mesh.positions) || mesh.positions.length > SKF_LIMITS.meshNumbers || mesh.positions.some((value) => typeof value !== "number" || !Number.isFinite(value))) {
|