Clear live trace when replacing G-code program
This commit is contained in:
@@ -218,6 +218,27 @@ export function XyzacToolPreview({ visual, view = "p", zoom = 1, rotateMode = fa
|
||||
}
|
||||
clearLines(pathGroup);
|
||||
clearLines(liveGroup);
|
||||
// A new PROGRAM_LOAD, including the transient empty snapshot while
|
||||
// loading, starts a new live-trace epoch. Clear internal playback and
|
||||
// history buffers as well as rendered geometry so the previous
|
||||
// program's yellow/orange path cannot be painted again.
|
||||
liveTrace = [];
|
||||
playbackQueue = [];
|
||||
playbackStart = 0;
|
||||
queuedLastTick = -1;
|
||||
renderedTick = state.tick;
|
||||
renderedPose = state.livePose;
|
||||
renderedJoints = state.joints;
|
||||
renderedActiveSegment = state.activeSegmentId ?? 0;
|
||||
renderedProgress = state.activeProgress;
|
||||
paintedTick = renderedTick;
|
||||
paintedPose = renderedPose;
|
||||
paintedJoints = renderedJoints;
|
||||
paintedActiveSegment = renderedActiveSegment;
|
||||
paintedProgress = renderedProgress;
|
||||
// Seed the new epoch without adding a visible history point. The
|
||||
// first post-load motion delta will create the first live segment.
|
||||
liveTick = renderedTick;
|
||||
bounds = fit(segments);
|
||||
// Long programs can contain thousands of linear blocks. Batch their
|
||||
// vertices so preview loading does not block the UI on one WebGL
|
||||
|
||||
@@ -16,6 +16,8 @@ assert.deepEqual(visual.pose, { x: 11, y: -4, z: 19, a: 31, b: 0, c: 44, u: 0, v
|
||||
assert.deepEqual(visual.livePose, visual.pose);
|
||||
assert.equal(visual.activeProgress, 0.375);
|
||||
assert.equal(visual.activeSegmentId, 3);
|
||||
for (const token of ["liveTrace = []", "playbackQueue = []", "queuedLastTick = -1", "liveTick = -1"]) assert.ok(source.includes(token), token);
|
||||
for (const token of ["renderedTick = state.tick", "paintedTick = renderedTick", "A new PROGRAM_LOAD"]) assert.ok(source.includes(token), token);
|
||||
for (const token of ["xyzac-tool-preview", "xyzac-preview-toolpath", "xyzac-preview-live-toolpath", "xyzac-preview-tool", "xyzac-preview-tool-shaft", "xyzac-preview-tool-tip", "xyzac-origin-coordinate-system", "xyzac-origin-axis-${axis.label.toLowerCase()}", "xyzac-origin-label-${axis.label.toLowerCase()}", "OrbitControls", "enablePan", "enableRotate", "zoomIn", "panRight", "data-xyzac-controller=\"orbit\"", "data-xyzac-origin=\"0,0,0\"", "sourcePoint", "toolGroup.position.copy(pose)", "toolGroup.rotation.set(-Number(renderedPose.a ?? 0) * DEG, -Number(renderedPose.c ?? 0) * DEG, 0)", "const segments = state.toolpath as Segment[]", "activeSegment.samples.map(sourcePoint)", "segmentCandidatesBySourceLine", "candidates.length === 1", "state.activeProgress", "state.livePose", "motionTrace", "playbackQueue", "data-xyzac-preview=\"toolpath\"", "data-xyzac-helix-count", "data-xyzac-sample-count", "data-xyzac-samples-source", "data-xyzac-live-source", "data-xyzac-live-pose", "preserveDrawingBuffer: true", "authoritative tool preview"]) assert.ok(source.includes(token), token);
|
||||
for (const forbidden of [/arcPoints/, /Math\.atan2/, /Quaternion/, /cross\(/]) assert.equal(forbidden.test(source), false, String(forbidden));
|
||||
for (const forbidden of [/xyzac-machine/, /table-x/, /saddle-y/, /spindle-z/, /accept\s*\(/, /postMessage\s*\(/, /_sim_/, /_malloc/, /navigator\.storage/]) assert.equal(forbidden.test(source), false, String(forbidden));
|
||||
|
||||
Reference in New Issue
Block a user