接上一轮,按接续文件继续执行

结论:Three.js 程序预览和刀具执行显示已收口,公网 HTTP/IP 下 Save/Restore Session 已支持 memory-fallback 降级并通过 node/browser gate。
This commit is contained in:
2026-06-22 06:56:34 +08:00
parent bd11a5f8d6
commit 8321055934
9 changed files with 631 additions and 221 deletions

View File

@@ -59,6 +59,7 @@ const initialState = {
filename: DEFAULT_SESSION_FILENAME,
status: "not-saved",
path: null,
storageMode: null,
savedAt: null,
restoredAt: null,
lastError: null,
@@ -189,6 +190,7 @@ const initialState = {
pathPoints: 64,
selectedView: "iso",
fullscreen: false,
cameraRevision: 0,
},
toolPreview: {
toolNumber: 1,
@@ -629,10 +631,11 @@ export function createSimulationStore(seed = {}) {
...state.sessionPersistence,
status: "saved",
path: action.path,
storageMode: action.storageMode || null,
savedAt: action.savedAt,
lastError: null,
},
operatorMessage: `5-axis session saved ${action.path}`,
operatorMessage: `5-axis session saved ${action.path} (${action.storageMode || "unknown"})`,
});
break;
case "SESSION_RESTORE_STARTED":
@@ -664,10 +667,11 @@ export function createSimulationStore(seed = {}) {
...state.sessionPersistence,
status: "restored",
path: action.path,
storageMode: action.storageMode || null,
restoredAt: action.restoredAt,
lastError: null,
},
operatorMessage: `5-axis session restored ${action.path}`,
operatorMessage: `5-axis session restored ${action.path} (${action.storageMode || "unknown"})`,
});
}
break;
@@ -1255,7 +1259,11 @@ export function createSimulationStore(seed = {}) {
break;
case "RESET_VIEW":
setState({
preview: { ...state.preview, selectedView: "iso" },
preview: {
...state.preview,
selectedView: "iso",
cameraRevision: (state.preview.cameraRevision ?? 0) + 1,
},
operatorMessage: "preview fit to program",
});
break;
@@ -1267,7 +1275,11 @@ export function createSimulationStore(seed = {}) {
break;
case "SET_VIEW":
setState({
preview: { ...state.preview, selectedView: action.view },
preview: {
...state.preview,
selectedView: action.view,
cameraRevision: (state.preview.cameraRevision ?? 0) + 1,
},
operatorMessage: `preview view ${action.view}`,
});
break;
@@ -1395,17 +1407,19 @@ export function createSimulationStore(seed = {}) {
const sessionId = options.sessionId || state.sessionPersistence.sessionId;
const filename = options.filename || state.sessionPersistence.filename;
const payload = createFiveAxisSessionPayload(state);
const { snapshot, path } = await saveFiveAxisSessionSnapshot(sessionId, payload, {
const { snapshot, path, storageMode } = await saveFiveAxisSessionSnapshot(sessionId, payload, {
filename,
storage: options.storage,
storageMode: options.storageMode,
metadata: options.metadata,
});
dispatch({
type: "SESSION_SAVE_COMPLETE",
path,
storageMode,
savedAt: snapshot.createdAt,
});
return { snapshot, path };
return { snapshot, path, storageMode };
} catch (error) {
dispatch({ type: "SESSION_PERSISTENCE_FAILED", error: error.message });
throw error;
@@ -1417,18 +1431,20 @@ export function createSimulationStore(seed = {}) {
try {
const sessionId = options.sessionId || state.sessionPersistence.sessionId;
const filename = options.filename || state.sessionPersistence.filename;
const { snapshot, path } = await loadFiveAxisSessionSnapshot(sessionId, {
const { snapshot, path, storageMode } = await loadFiveAxisSessionSnapshot(sessionId, {
filename,
storage: options.storage,
storageMode: options.storageMode,
});
dispatch({
type: "SESSION_RESTORE_COMPLETE",
restoredState: restoreFiveAxisSessionState(snapshot),
path,
storageMode,
restoredAt: new Date().toISOString(),
});
await refreshAsyncKinematicsFrame({ operatorMessage: `5-axis session restored ${path}` });
return { snapshot, path };
return { snapshot, path, storageMode };
} catch (error) {
dispatch({ type: "SESSION_PERSISTENCE_FAILED", error: error.message });
throw error;