{ "generatedAt": "2026-06-22T22:09:28.057Z", "targetUrl": "http://127.0.0.1:45757/web-rtcp-5axis-sim-plan/app/index.html", "projectPath": "/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/index.html", "chromePath": "/usr/bin/google-chrome", "screenshots": { "01-home-toolpath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/01-home-toolpath.png", "02-operator-demo-toolpath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/02-operator-demo-toolpath.png", "03-arc-demo-toolpath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/03-arc-demo-toolpath.png", "04-clear-preview-reference": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/04-clear-preview-reference.png", "05-vendored-impeller-toolpath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/05-vendored-impeller-toolpath.png", "09-g20-g21-mixed-units-preview": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/09-g20-g21-mixed-units-preview.png", "06-running-rtcp-toolpath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/06-running-rtcp-toolpath.png" }, "cases": [ { "name": "01-home-toolpath", "summary": "默认首屏预览:机床参考模型、TCP 球、刀轴线、fixture 路径和执行轨迹可见", "status": "PASS", "checks": [ { "name": "canvas ready", "pass": true, "detail": "threeReady=true" }, { "name": "WebGL renderer", "pass": true, "detail": "renderer=webgl" }, { "name": "机床参考模型", "pass": true, "detail": "scope=machine-reference-and-toolpath, model=webgl-five-axis-reference" }, { "name": "TCP 球标记", "pass": true, "detail": "tcp=sphere, marker=true" }, { "name": "刀轴线", "pass": true, "detail": "toolAxisMarker=line" }, { "name": "场景对象数量", "pass": true, "detail": "sceneObjects=20" }, { "name": "无 G-code 语义生成", "pass": true, "detail": "semanticGuard=ok" }, { "name": "刀路预览点", "pass": true, "detail": "pathPoints=2" }, { "name": "执行轨迹点", "pass": true, "detail": "executed=1" } ], "pixelStats": { "width": 803, "height": 874, "averageLuminance": 68.18, "nonBlackRatio": 0.8681 }, "dataset": { "fiveAxisCanvas": "true", "engine": "three.js r183", "threeReady": "true", "threeRevision": "183", "threePathPoints": "2", "threeExecutedPathPoints": "1", "threeSceneObjects": "20", "threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}", "threeSceneUnits": "m", "threeLinearUnits": "mm", "threeLinearUnitScaleToMeters": "0.001", "threeToolAxis": "{\"x\":0,\"y\":0,\"z\":1}", "threeTcpPose": "{\"x\":0,\"y\":0,\"z\":0,\"a\":0,\"c\":0}", "threeRtcpState": "on", "threeSelectedView": "iso", "threeFrameApi": "web-rtcp-5axis-motion-frame", "threeRenderer": "webgl", "threeSceneMode": "program-preview-and-tool-execution", "threePreviewScope": "machine-reference-and-toolpath", "threeMachineReferenceModel": "webgl-five-axis-reference", "threeCameraControls": "orbit-pan-zoom", "threeProgramPreviewSource": "linuxcnc-interpreter-wasm", "threeToolExecutionMarker": "true", "threeTcpMarker": "sphere", "threeToolAxisMarker": "line", "threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion", "threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback", "threePathFitBounds": "ok", "threePathBoundsMeters": "{\"center\":{\"x\":0,\"y\":0,\"z\":0.002},\"size\":{\"x\":0,\"y\":0,\"z\":0.005},\"maxSpan\":0.005}", "threeCurrentSegmentHighlight": "ok", "threeRapidFeedVisualDistinction": "ok", "threeNoGcodeSemanticsGeneration": "ok", "threeRapidPathPoints": "2", "threeFeedPathPoints": "0", "threeArcPathPoints": "0", "threeCurrentSegmentPoints": "2", "threeCurrentSegmentType": "STRAIGHT_TRAVERSE" }, "state": { "activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc", "activeLine": 1, "programSource": "linuxcnc-vendored-5axis-gcode", "programExecutionSourceMode": "linuxcnc-interpreter-wasm", "programExecutionSummary": { "ready": true, "programLineCount": 1868, "canonicalEventCount": 29, "motionEventCount": 2, "motionTypes": [ "STRAIGHT_TRAVERSE" ], "finalAxes": { "x": 0, "y": 0, "z": 5, "a": 0, "b": 0, "c": 0, "u": 0, "v": 0, "w": 0 }, "switchkinsEventCount": 2, "switchkinsCodes": [ "M428", "M429" ], "switchkinsRemapBoundary": "linuxcnc_switchkins_remap_mcode_preserved_web_runtime_applied", "remapRuntimeReady": false, "plannerRuntimeReady": true, "plannerSemanticBoundary": "linuxcnc_tp_queue_runtime_timing_from_canonical_motion", "machineFileExecutionReady": false, "fullLinuxCncProgramExecutionReady": false }, "runState": "idle", "rtcpState": "on", "kinsType": "tcp-xyzac", "programExecutionMotionIndex": 0, "programExecutionSampleIndex": 0, "programRuntimeFeedbackSource": "linuxcnc-task-motion-hal-wasm" } }, { "name": "02-operator-demo-toolpath", "summary": "本地矩形 G-code:验证 LinuxCNC interpreter canonical motion、rapid/feed 区分、执行轨迹和 TCP 标记", "status": "PASS", "checks": [ { "name": "canvas ready", "pass": true, "detail": "threeReady=true" }, { "name": "WebGL renderer", "pass": true, "detail": "renderer=webgl" }, { "name": "机床参考模型", "pass": true, "detail": "scope=machine-reference-and-toolpath, model=webgl-five-axis-reference" }, { "name": "TCP 球标记", "pass": true, "detail": "tcp=sphere, marker=true" }, { "name": "刀轴线", "pass": true, "detail": "toolAxisMarker=line" }, { "name": "场景对象数量", "pass": true, "detail": "sceneObjects=20" }, { "name": "无 G-code 语义生成", "pass": true, "detail": "semanticGuard=ok" }, { "name": "刀路预览点", "pass": true, "detail": "pathPoints=6" }, { "name": "执行轨迹点", "pass": true, "detail": "executed=1" }, { "name": "rapid/feed 区分", "pass": true, "detail": "rapid=2, feed=4" } ], "pixelStats": { "width": 803, "height": 874, "averageLuminance": 66.03, "nonBlackRatio": 0.854 }, "dataset": { "fiveAxisCanvas": "true", "engine": "three.js r183", "threeReady": "true", "threeRevision": "183", "threePathPoints": "6", "threeExecutedPathPoints": "1", "threeSceneObjects": "20", "threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}", "threeSceneUnits": "m", "threeLinearUnits": "mm", "threeLinearUnitScaleToMeters": "0.001", "threeToolAxis": "{\"x\":0,\"y\":0,\"z\":1}", "threeTcpPose": "{\"x\":0,\"y\":0,\"z\":0,\"a\":0,\"c\":0}", "threeRtcpState": "on", "threeSelectedView": "iso", "threeFrameApi": "web-rtcp-5axis-motion-frame", "threeRenderer": "webgl", "threeSceneMode": "program-preview-and-tool-execution", "threePreviewScope": "machine-reference-and-toolpath", "threeMachineReferenceModel": "webgl-five-axis-reference", "threeCameraControls": "orbit-pan-zoom", "threeProgramPreviewSource": "linuxcnc-interpreter-wasm", "threeToolExecutionMarker": "true", "threeTcpMarker": "sphere", "threeToolAxisMarker": "line", "threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion", "threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback", "threePathFitBounds": "ok", "threePathBoundsMeters": "{\"center\":{\"x\":0.005,\"y\":0.005,\"z\":0.002},\"size\":{\"x\":0.01,\"y\":0.01,\"z\":0.005},\"maxSpan\":0.01}", "threeCurrentSegmentHighlight": "ok", "threeRapidFeedVisualDistinction": "ok", "threeNoGcodeSemanticsGeneration": "ok", "threeRapidPathPoints": "2", "threeFeedPathPoints": "4", "threeArcPathPoints": "0", "threeCurrentSegmentPoints": "2", "threeCurrentSegmentType": "STRAIGHT_FEED" }, "state": { "activeProgram": "operator-demo.ngc", "activeLine": 2, "programSource": "operator-file", "programExecutionSourceMode": "linuxcnc-interpreter-wasm", "programExecutionSummary": { "ready": true, "programLineCount": 9, "canonicalEventCount": 37, "motionEventCount": 6, "motionTypes": [ "STRAIGHT_TRAVERSE", "STRAIGHT_FEED" ], "finalAxes": { "x": 0, "y": 0, "z": 5, "a": 0, "b": 0, "c": 0, "u": 0, "v": 0, "w": 0 }, "switchkinsEventCount": 0, "switchkinsCodes": [], "switchkinsRemapBoundary": null, "remapRuntimeReady": false, "plannerRuntimeReady": true, "plannerSemanticBoundary": "linuxcnc_tp_queue_runtime_timing_from_canonical_motion", "machineFileExecutionReady": false, "fullLinuxCncProgramExecutionReady": false }, "runState": "idle", "rtcpState": "on", "kinsType": "tcp-xyzac", "programExecutionMotionIndex": 0, "programExecutionSampleIndex": 0, "programRuntimeFeedbackSource": "linuxcnc-tp-runtime-sample" } }, { "name": "03-arc-demo-toolpath", "summary": "圆弧 G-code:验证 ARC_FEED 进入弧线轨迹图层并保留执行轨迹", "status": "PASS", "checks": [ { "name": "canvas ready", "pass": true, "detail": "threeReady=true" }, { "name": "WebGL renderer", "pass": true, "detail": "renderer=webgl" }, { "name": "机床参考模型", "pass": true, "detail": "scope=machine-reference-and-toolpath, model=webgl-five-axis-reference" }, { "name": "TCP 球标记", "pass": true, "detail": "tcp=sphere, marker=true" }, { "name": "刀轴线", "pass": true, "detail": "toolAxisMarker=line" }, { "name": "场景对象数量", "pass": true, "detail": "sceneObjects=20" }, { "name": "无 G-code 语义生成", "pass": true, "detail": "semanticGuard=ok" }, { "name": "刀路预览点", "pass": true, "detail": "pathPoints=2" }, { "name": "执行轨迹点", "pass": true, "detail": "executed=1" }, { "name": "圆弧轨迹点", "pass": true, "detail": "arc=1" } ], "pixelStats": { "width": 803, "height": 874, "averageLuminance": 67.56, "nonBlackRatio": 0.8687 }, "dataset": { "fiveAxisCanvas": "true", "engine": "three.js r183", "threeReady": "true", "threeRevision": "183", "threePathPoints": "2", "threeExecutedPathPoints": "1", "threeSceneObjects": "20", "threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}", "threeSceneUnits": "m", "threeLinearUnits": "mm", "threeLinearUnitScaleToMeters": "0.001", "threeToolAxis": "{\"x\":0,\"y\":0,\"z\":1}", "threeTcpPose": "{\"x\":1,\"y\":0,\"z\":0,\"a\":0,\"c\":0}", "threeRtcpState": "on", "threeSelectedView": "iso", "threeFrameApi": "web-rtcp-5axis-motion-frame", "threeRenderer": "webgl", "threeSceneMode": "program-preview-and-tool-execution", "threePreviewScope": "machine-reference-and-toolpath", "threeMachineReferenceModel": "webgl-five-axis-reference", "threeCameraControls": "orbit-pan-zoom", "threeProgramPreviewSource": "linuxcnc-interpreter-wasm", "threeToolExecutionMarker": "true", "threeTcpMarker": "sphere", "threeToolAxisMarker": "line", "threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion", "threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback", "threePathFitBounds": "ok", "threePathBoundsMeters": "{\"center\":{\"x\":0.001,\"y\":0.001,\"z\":0},\"size\":{\"x\":0.001,\"y\":0.001,\"z\":0},\"maxSpan\":0.001}", "threeCurrentSegmentHighlight": "ok", "threeRapidFeedVisualDistinction": "ok", "threeNoGcodeSemanticsGeneration": "ok", "threeRapidPathPoints": "1", "threeFeedPathPoints": "0", "threeArcPathPoints": "1", "threeCurrentSegmentPoints": "1", "threeCurrentSegmentType": "STRAIGHT_TRAVERSE" }, "state": { "activeProgram": "operator-arc-demo.ngc", "activeLine": 2, "programSource": "operator-file", "programExecutionSourceMode": "linuxcnc-interpreter-wasm", "programExecutionSummary": { "ready": true, "programLineCount": 4, "canonicalEventCount": 19, "motionEventCount": 2, "motionTypes": [ "STRAIGHT_TRAVERSE", "ARC_FEED" ], "finalAxes": { "x": 0, "y": 1, "z": 0, "a": 0, "b": 0, "c": 0, "u": 0, "v": 0, "w": 0, "arc": { "plane": 170, "firstAxis": "x", "secondAxis": "y", "thirdAxis": "z", "firstEnd": 0, "secondEnd": 1, "centerFirst": 0, "centerSecond": 0, "rotation": -1, "axisEndPoint": 0 } }, "switchkinsEventCount": 0, "switchkinsCodes": [], "switchkinsRemapBoundary": null, "remapRuntimeReady": false, "plannerRuntimeReady": true, "plannerSemanticBoundary": "linuxcnc_tp_queue_runtime_timing_from_canonical_motion", "machineFileExecutionReady": false, "fullLinuxCncProgramExecutionReady": false }, "runState": "idle", "rtcpState": "on", "kinsType": "tcp-xyzac", "programExecutionMotionIndex": 0, "programExecutionSampleIndex": 0, "programRuntimeFeedbackSource": "linuxcnc-tp-runtime-sample" } }, { "name": "04-clear-preview-reference", "summary": "清空刀路后:路径点为 0,但机床参考模型、TCP 球和刀轴线仍应可见", "status": "PASS", "checks": [ { "name": "canvas ready", "pass": true, "detail": "threeReady=true" }, { "name": "WebGL renderer", "pass": true, "detail": "renderer=webgl" }, { "name": "机床参考模型", "pass": true, "detail": "scope=machine-reference-and-toolpath, model=webgl-five-axis-reference" }, { "name": "TCP 球标记", "pass": true, "detail": "tcp=sphere, marker=true" }, { "name": "刀轴线", "pass": true, "detail": "toolAxisMarker=line" }, { "name": "场景对象数量", "pass": true, "detail": "sceneObjects=20" }, { "name": "无 G-code 语义生成", "pass": true, "detail": "semanticGuard=ok" }, { "name": "路径点期望", "pass": true, "detail": "pathPoints=0, expected=0" } ], "pixelStats": { "width": 803, "height": 874, "averageLuminance": 67.78, "nonBlackRatio": 0.8701 }, "dataset": { "fiveAxisCanvas": "true", "engine": "three.js r183", "threeReady": "true", "threeRevision": "183", "threePathPoints": "0", "threeExecutedPathPoints": "0", "threeSceneObjects": "20", "threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}", "threeSceneUnits": "m", "threeLinearUnits": "mm", "threeLinearUnitScaleToMeters": "0.001", "threeToolAxis": "{\"x\":0,\"y\":0,\"z\":1}", "threeTcpPose": "{\"x\":1,\"y\":0,\"z\":0,\"a\":0,\"c\":0}", "threeRtcpState": "on", "threeSelectedView": "iso", "threeFrameApi": "web-rtcp-5axis-motion-frame", "threeRenderer": "webgl", "threeSceneMode": "program-preview-and-tool-execution", "threePreviewScope": "machine-reference-and-toolpath", "threeMachineReferenceModel": "webgl-five-axis-reference", "threeCameraControls": "orbit-pan-zoom", "threeProgramPreviewSource": "linuxcnc-interpreter-wasm", "threeToolExecutionMarker": "true", "threeTcpMarker": "sphere", "threeToolAxisMarker": "line", "threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion", "threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback", "threePathFitBounds": "ok", "threePathBoundsMeters": "null", "threeCurrentSegmentHighlight": "pending", "threeRapidFeedVisualDistinction": "pending", "threeNoGcodeSemanticsGeneration": "ok", "threeRapidPathPoints": "0", "threeFeedPathPoints": "0", "threeArcPathPoints": "0", "threeCurrentSegmentPoints": "0", "threeCurrentSegmentType": "STRAIGHT_TRAVERSE" }, "state": { "activeProgram": "operator-arc-demo.ngc", "activeLine": 2, "programSource": "operator-file", "programExecutionSourceMode": "linuxcnc-interpreter-wasm", "programExecutionSummary": { "ready": true, "programLineCount": 4, "canonicalEventCount": 19, "motionEventCount": 2, "motionTypes": [ "STRAIGHT_TRAVERSE", "ARC_FEED" ], "finalAxes": { "x": 0, "y": 1, "z": 0, "a": 0, "b": 0, "c": 0, "u": 0, "v": 0, "w": 0, "arc": { "plane": 170, "firstAxis": "x", "secondAxis": "y", "thirdAxis": "z", "firstEnd": 0, "secondEnd": 1, "centerFirst": 0, "centerSecond": 0, "rotation": -1, "axisEndPoint": 0 } }, "switchkinsEventCount": 0, "switchkinsCodes": [], "switchkinsRemapBoundary": null, "remapRuntimeReady": false, "plannerRuntimeReady": true, "plannerSemanticBoundary": "linuxcnc_tp_queue_runtime_timing_from_canonical_motion", "machineFileExecutionReady": false, "fullLinuxCncProgramExecutionReady": false }, "runState": "idle", "rtcpState": "on", "kinsType": "tcp-xyzac", "programExecutionMotionIndex": 0, "programExecutionSampleIndex": 0, "programRuntimeFeedbackSource": "linuxcnc-tp-runtime-sample" } }, { "name": "05-vendored-impeller-toolpath", "summary": "LinuxCNC vendored 五轴 impeller 程序:验证长路径、switchkins/RTCP 状态、rapid/feed 图层和 TCP 执行轨迹", "status": "PASS", "checks": [ { "name": "canvas ready", "pass": true, "detail": "threeReady=true" }, { "name": "WebGL renderer", "pass": true, "detail": "renderer=webgl" }, { "name": "机床参考模型", "pass": true, "detail": "scope=machine-reference-and-toolpath, model=webgl-five-axis-reference" }, { "name": "TCP 球标记", "pass": true, "detail": "tcp=sphere, marker=true" }, { "name": "刀轴线", "pass": true, "detail": "toolAxisMarker=line" }, { "name": "场景对象数量", "pass": true, "detail": "sceneObjects=20" }, { "name": "无 G-code 语义生成", "pass": true, "detail": "semanticGuard=ok" }, { "name": "刀路预览点", "pass": true, "detail": "pathPoints=1498" }, { "name": "执行轨迹点", "pass": true, "detail": "executed=1" }, { "name": "rapid/feed 区分", "pass": true, "detail": "rapid=186, feed=1436" }, { "name": "RTCP 状态", "pass": true, "detail": "rtcp=on" } ], "pixelStats": { "width": 803, "height": 874, "averageLuminance": 65.18, "nonBlackRatio": 0.8173 }, "dataset": { "fiveAxisCanvas": "true", "engine": "three.js r183", "threeReady": "true", "threeRevision": "183", "threePathPoints": "1498", "threeExecutedPathPoints": "1", "threeSceneObjects": "20", "threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}", "threeSceneUnits": "m", "threeLinearUnits": "mm", "threeLinearUnitScaleToMeters": "0.001", "threeToolAxis": "{\"x\":0.558,\"y\":0.769,\"z\":0.312}", "threeTcpPose": "{\"x\":36.474,\"y\":-22.486,\"z\":-13.749,\"a\":-71.841,\"c\":-35.93}", "threeRtcpState": "on", "threeSelectedView": "iso", "threeFrameApi": "web-rtcp-5axis-motion-frame", "threeRenderer": "webgl", "threeSceneMode": "program-preview-and-tool-execution", "threePreviewScope": "machine-reference-and-toolpath", "threeMachineReferenceModel": "webgl-five-axis-reference", "threeCameraControls": "orbit-pan-zoom", "threeProgramPreviewSource": "linuxcnc-interpreter-wasm", "threeToolExecutionMarker": "true", "threeTcpMarker": "sphere", "threeToolAxisMarker": "line", "threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion", "threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback", "threePathFitBounds": "ok", "threePathBoundsMeters": "{\"center\":{\"x\":-0.001,\"y\":0,\"z\":0.019},\"size\":{\"x\":0.088,\"y\":0.089,\"z\":0.043},\"maxSpan\":0.089211}", "threeCurrentSegmentHighlight": "ok", "threeRapidFeedVisualDistinction": "ok", "threeNoGcodeSemanticsGeneration": "ok", "threeRapidPathPoints": "186", "threeFeedPathPoints": "1436", "threeArcPathPoints": "0", "threeCurrentSegmentPoints": "1", "threeCurrentSegmentType": "STRAIGHT_TRAVERSE" }, "state": { "activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc", "activeLine": 8, "programSource": "linuxcnc-vendored-5axis-gcode", "programExecutionSourceMode": "linuxcnc-interpreter-wasm", "programExecutionSummary": { "ready": true, "programLineCount": 4507, "canonicalEventCount": 22313, "motionEventCount": 4492, "motionTypes": [ "STRAIGHT_TRAVERSE", "STRAIGHT_FEED" ], "finalAxes": { "x": 0, "y": 0, "z": 40, "a": 0, "b": 0, "c": 0, "u": 0, "v": 0, "w": 0 }, "switchkinsEventCount": 2, "switchkinsCodes": [ "M428", "M429" ], "switchkinsRemapBoundary": "linuxcnc_switchkins_remap_mcode_preserved_web_runtime_applied", "remapRuntimeReady": false, "plannerRuntimeReady": true, "plannerSemanticBoundary": "linuxcnc_tp_queue_runtime_timing_from_canonical_motion", "machineFileExecutionReady": false, "fullLinuxCncProgramExecutionReady": false }, "runState": "idle", "rtcpState": "on", "kinsType": "tcp-xyzac", "programExecutionMotionIndex": 0, "programExecutionSampleIndex": 0, "programRuntimeFeedbackSource": "linuxcnc-tp-runtime-sample" } }, { "name": "08-meter-scene-desktop-mobile", "summary": "浏览器米尺度 Three.js 证据:desktop/mobile canvas 非空、路径 bounds 为米、预览稳定居中", "status": "PASS", "screenshotDir": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/meter-scene-evidence", "output": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/meter-scene-evidence.json", "sampleCount": 2 }, { "name": "09-g20-g21-mixed-units-preview", "summary": "G20/G21 混合单位程序:验证 canonical motion 保留 inch/mm,Three.js 统一按米绘制", "status": "PASS", "checks": [ { "name": "canvas ready", "pass": true, "detail": "threeReady=true" }, { "name": "WebGL renderer", "pass": true, "detail": "renderer=webgl" }, { "name": "机床参考模型", "pass": true, "detail": "scope=machine-reference-and-toolpath, model=webgl-five-axis-reference" }, { "name": "TCP 球标记", "pass": true, "detail": "tcp=sphere, marker=true" }, { "name": "刀轴线", "pass": true, "detail": "toolAxisMarker=line" }, { "name": "场景对象数量", "pass": true, "detail": "sceneObjects=20" }, { "name": "无 G-code 语义生成", "pass": true, "detail": "semanticGuard=ok" }, { "name": "刀路预览点", "pass": true, "detail": "pathPoints=2" }, { "name": "执行轨迹点", "pass": true, "detail": "executed=1" }, { "name": "G20/G21 motion units", "pass": true, "detail": "units=inch,mm" }, { "name": "scene units are meters", "pass": true, "detail": "sceneUnits=m" }, { "name": "mixed unit path visible", "pass": true, "detail": "pathPoints=2" }, { "name": "1 inch equals 25.4 mm in scene", "pass": true, "detail": "xMeters=0.0254,0.0254" }, { "name": "no unit fallback in canonical motion", "pass": true, "detail": "source=linuxcnc-interpreter-wasm" } ], "pixelStats": { "width": 803, "height": 874, "averageLuminance": 64.71, "nonBlackRatio": 0.849 }, "dataset": { "fiveAxisCanvas": "true", "engine": "three.js r183", "threeReady": "true", "threeRevision": "183", "threePathPoints": "2", "threeExecutedPathPoints": "1", "threeSceneObjects": "20", "threeToolhead": "{\"x\":0,\"y\":0,\"z\":0}", "threeSceneUnits": "m", "threeLinearUnits": "mm", "threeLinearUnitScaleToMeters": "0.001", "threeToolAxis": "{\"x\":0,\"y\":0,\"z\":1}", "threeTcpPose": "{\"x\":43,\"y\":-32.15,\"z\":-11.306,\"a\":0,\"c\":0}", "threeRtcpState": "on", "threeSelectedView": "iso", "threeFrameApi": "web-rtcp-5axis-motion-frame", "threeRenderer": "webgl", "threeSceneMode": "program-preview-and-tool-execution", "threePreviewScope": "machine-reference-and-toolpath", "threeMachineReferenceModel": "webgl-five-axis-reference", "threeCameraControls": "orbit-pan-zoom", "threeProgramPreviewSource": "linuxcnc-interpreter-wasm", "threeToolExecutionMarker": "true", "threeTcpMarker": "sphere", "threeToolAxisMarker": "line", "threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion", "threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback", "threePathFitBounds": "ok", "threePathBoundsMeters": "{\"center\":{\"x\":0.013,\"y\":0.013,\"z\":0},\"size\":{\"x\":0.025,\"y\":0.025,\"z\":0},\"maxSpan\":0.0254}", "threeCurrentSegmentHighlight": "ok", "threeRapidFeedVisualDistinction": "ok", "threeNoGcodeSemanticsGeneration": "ok", "threeRapidPathPoints": "0", "threeFeedPathPoints": "2", "threeArcPathPoints": "0", "threeCurrentSegmentPoints": "1", "threeCurrentSegmentType": "STRAIGHT_FEED" }, "state": { "activeProgram": "operator-g20-g21-mixed-units.ngc", "activeLine": 2, "programSource": "operator-file", "programExecutionSourceMode": "linuxcnc-interpreter-wasm", "programExecutionSummary": { "ready": true, "programLineCount": 5, "canonicalEventCount": 22, "motionEventCount": 2, "motionTypes": [ "STRAIGHT_FEED" ], "finalAxes": { "x": 25.4, "y": 25.4, "z": 0, "a": 0, "b": 0, "c": 0, "u": 0, "v": 0, "w": 0 }, "switchkinsEventCount": 0, "switchkinsCodes": [], "switchkinsRemapBoundary": null, "remapRuntimeReady": false, "plannerRuntimeReady": true, "plannerSemanticBoundary": "linuxcnc_tp_queue_runtime_timing_from_canonical_motion", "machineFileExecutionReady": false, "fullLinuxCncProgramExecutionReady": false }, "runState": "idle", "rtcpState": "on", "kinsType": "tcp-xyzac", "programExecutionMotionIndex": 0, "programExecutionSampleIndex": 0, "programRuntimeFeedbackSource": "linuxcnc-tp-runtime-sample" } }, { "name": "06-running-rtcp-toolpath", "summary": "G-code 运行态:验证 task/HAL runtime feedback 驱动执行轨迹、当前段高亮、TCP 球和刀轴线跟随", "status": "PASS", "checks": [ { "name": "canvas ready", "pass": true, "detail": "threeReady=true" }, { "name": "WebGL renderer", "pass": true, "detail": "renderer=webgl" }, { "name": "机床参考模型", "pass": true, "detail": "scope=machine-reference-and-toolpath, model=webgl-five-axis-reference" }, { "name": "TCP 球标记", "pass": true, "detail": "tcp=sphere, marker=true" }, { "name": "刀轴线", "pass": true, "detail": "toolAxisMarker=line" }, { "name": "场景对象数量", "pass": true, "detail": "sceneObjects=20" }, { "name": "无 G-code 语义生成", "pass": true, "detail": "semanticGuard=ok" }, { "name": "刀路预览点", "pass": true, "detail": "pathPoints=1498" }, { "name": "执行轨迹点", "pass": true, "detail": "executed=1" }, { "name": "rapid/feed 区分", "pass": true, "detail": "rapid=186, feed=1436" }, { "name": "RTCP 状态", "pass": true, "detail": "rtcp=on" } ], "pixelStats": { "width": 803, "height": 874, "averageLuminance": 65.86, "nonBlackRatio": 0.8173 }, "dataset": { "fiveAxisCanvas": "true", "engine": "three.js r183", "threeReady": "true", "threeRevision": "183", "threePathPoints": "1498", "threeExecutedPathPoints": "1", "threeSceneObjects": "20", "threeToolhead": "{\"x\":-0.023,\"y\":-0.033,\"z\":0.001}", "threeSceneUnits": "m", "threeLinearUnits": "mm", "threeLinearUnitScaleToMeters": "0.001", "threeToolAxis": "{\"x\":0.621,\"y\":0.503,\"z\":0.601}", "threeTcpPose": "{\"x\":-75.066,\"y\":-75.473,\"z\":-49.344,\"a\":-53.043,\"c\":-50.969}", "threeRtcpState": "on", "threeSelectedView": "iso", "threeFrameApi": "web-rtcp-5axis-motion-frame", "threeRenderer": "webgl", "threeSceneMode": "program-preview-and-tool-execution", "threePreviewScope": "machine-reference-and-toolpath", "threeMachineReferenceModel": "webgl-five-axis-reference", "threeCameraControls": "orbit-pan-zoom", "threeProgramPreviewSource": "linuxcnc-interpreter-wasm", "threeToolExecutionMarker": "true", "threeTcpMarker": "sphere", "threeToolAxisMarker": "line", "threeToolpathPreviewSource": "linuxcnc_interpreter_canonical_motion", "threeToolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback", "threePathFitBounds": "ok", "threePathBoundsMeters": "{\"center\":{\"x\":-0.001,\"y\":0,\"z\":0.019},\"size\":{\"x\":0.088,\"y\":0.089,\"z\":0.043},\"maxSpan\":0.089211}", "threeCurrentSegmentHighlight": "ok", "threeRapidFeedVisualDistinction": "ok", "threeNoGcodeSemanticsGeneration": "ok", "threeRapidPathPoints": "186", "threeFeedPathPoints": "1436", "threeArcPathPoints": "0", "threeCurrentSegmentPoints": "1", "threeCurrentSegmentType": "STRAIGHT_TRAVERSE" }, "state": { "activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc", "activeLine": 65, "programSource": "linuxcnc-vendored-5axis-gcode", "programExecutionSourceMode": "linuxcnc-interpreter-wasm", "programExecutionSummary": { "ready": true, "programLineCount": 4507, "canonicalEventCount": 22313, "motionEventCount": 4492, "motionTypes": [ "STRAIGHT_TRAVERSE", "STRAIGHT_FEED" ], "finalAxes": { "x": 0, "y": 0, "z": 40, "a": 0, "b": 0, "c": 0, "u": 0, "v": 0, "w": 0 }, "switchkinsEventCount": 2, "switchkinsCodes": [ "M428", "M429" ], "switchkinsRemapBoundary": "linuxcnc_switchkins_remap_mcode_preserved_web_runtime_applied", "remapRuntimeReady": false, "plannerRuntimeReady": true, "plannerSemanticBoundary": "linuxcnc_tp_queue_runtime_timing_from_canonical_motion", "machineFileExecutionReady": false, "fullLinuxCncProgramExecutionReady": false }, "runState": "running", "rtcpState": "on", "kinsType": "tcp-xyzac", "programExecutionMotionIndex": 0, "programExecutionSampleIndex": 0, "programRuntimeFeedbackSource": "linuxcnc-task-motion-hal-wasm" } }, { "name": "07-run-preconditions-and-feedback", "summary": "浏览器 RUN 证据:INI/profile/kinematics/task-HAL 同一上下文,taskHalStatusLoop 持续推进,UI 消费 task/HAL/motion feedback", "status": "PASS", "checks": [ { "name": "INI ready", "pass": true, "detail": "iniReady=true,true,true,true,true" }, { "name": "selected LinuxCNC G-code", "pass": true, "detail": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc" }, { "name": "task/HAL session opened selected G-code", "pass": true, "detail": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc" }, { "name": "taskHalStatusLoop 新 RUN sequence", "pass": true, "detail": "baselineSequence=1, sequences=2,2,2,2,2" }, { "name": "taskHalStatusLoop 本次 RUN tickCount", "pass": true, "detail": "ticks=4,4,4,4,4" }, { "name": "programRuntimeFeedbackHistory 本次 RUN 采样", "pass": true, "detail": "history=5,5,5,5,5" }, { "name": "feedback sourceMode 来自 task/HAL", "pass": true, "detail": "sourceModes=linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm" }, { "name": "无 fixture-line-playback feedback", "pass": true, "detail": "sourceModes=linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm" }, { "name": "semantic boundary", "pass": true, "detail": "linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime" }, { "name": "activeLine 等于 UI 高亮行", "pass": true, "detail": "active=29/29,29/29,29/29,29/29,29/29" }, { "name": "DRO 等于 runtime feedback axisPose", "pass": true, "detail": "droMatchesFeedback=true for all samples" }, { "name": "RTCP canvas 与 state 一致", "pass": true, "detail": "off/off,off/off,off/off,off/off,off/off" }, { "name": "runtime cycle 可见", "pass": true, "detail": "33/330,33/330,33/330,33/330,33/330" }, { "name": "canvas 执行轨迹", "pass": true, "detail": "true/1/ok,true/1/ok,true/1/ok,true/1/ok,true/1/ok" } ], "screenshotDir": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback", "output": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/run-preconditions-feedback.json", "sampleCount": 5 } ], "consoleErrors": [ "Failed to load resource: the server responded with a status of 404 (Not Found)", "Failed to load resource: the server responded with a status of 404 (Not Found)" ] }