From 479a39d8802bc13970fe35fd184d0482a1a0db9d Mon Sep 17 00:00:00 2001
From: admin <572701190@qq.com>
Date: Sun, 3 May 2026 00:17:30 +0800
Subject: [PATCH] add per-state DICOM zip downloads
---
WebSite/src/App.tsx | 10 ++++++++++
web_backend.py | 35 ++++++++++++++++++++++++++++-------
2 files changed, 38 insertions(+), 7 deletions(-)
diff --git a/WebSite/src/App.tsx b/WebSite/src/App.tsx
index c663b42..871ef86 100644
--- a/WebSite/src/App.tsx
+++ b/WebSite/src/App.tsx
@@ -815,6 +815,7 @@ export default function App() {
].map(t => {
const screenshotDir = deformationJob?.result?.previews?.screenshots;
const imagePath = screenshotDir ? `${screenshotDir}/${t.key}.png` : '';
+ const stateZip = deformationJob?.result?.stateZips?.[t.key];
return (
@@ -831,6 +832,15 @@ export default function App() {
)}
+ {stateZip?.path && (
+
+ 下载本状态 DICOM ZIP
+
+ )}
);
})}
diff --git a/web_backend.py b/web_backend.py
index 9e9fa22..32a5d1a 100644
--- a/web_backend.py
+++ b/web_backend.py
@@ -467,18 +467,27 @@ def make_preview(input_dir, angle_degrees):
}
-def serialize_outputs(output_paths, preview_paths, zip_path=None):
+def zip_metadata(zip_path):
+ zip_path = Path(zip_path).resolve()
+ return {
+ "path": str(zip_path),
+ "name": zip_path.name,
+ "size": zip_path.stat().st_size,
+ }
+
+
+def serialize_outputs(output_paths, preview_paths, zip_path=None, state_zips=None):
return {
"outputs": {key: str(Path(value).resolve()) for key, value in output_paths.items()},
"previews": {
"comparison": str(Path(preview_paths["comparison"]).resolve()),
"screenshots": str(Path(preview_paths["screenshots"]).resolve()),
},
- "zip": {
- "path": str(Path(zip_path).resolve()),
- "name": Path(zip_path).name,
- "size": Path(zip_path).stat().st_size,
- } if zip_path else None,
+ "zip": zip_metadata(zip_path) if zip_path else None,
+ "stateZips": {
+ key: zip_metadata(value)
+ for key, value in (state_zips or {}).items()
+ },
}
@@ -591,12 +600,24 @@ class Handler(BaseHTTPRequestHandler):
transition_width,
progress,
)
+ set_job(job_id, message="正在打包各状态 DICOM ZIP...")
+ state_zips = {}
+ for state_key in [
+ "original",
+ "hard_boundary",
+ "gaussian_smooth",
+ "soft_transition",
+ ]:
+ state_zips[state_key] = zip_folder(
+ output_paths[state_key],
+ job_root / f"{state_key}_{job_id}.zip",
+ )
set_job(job_id, message="正在打包四状态输出 ZIP...")
zip_path = zip_folder(
output_dir,
job_root / f"head_ct_morph_{job_id}.zip",
)
- return serialize_outputs(output_paths, preview_paths, zip_path)
+ return serialize_outputs(output_paths, preview_paths, zip_path, state_zips)
self.send_json(start_job("deformation", worker), status=202)
return