diff --git a/WebSite/server.ts b/WebSite/server.ts index 73f67be..198d6e3 100644 --- a/WebSite/server.ts +++ b/WebSite/server.ts @@ -117,15 +117,6 @@ const defaultModelPose: ModelPoseValue = { translateZ: 0, scale: 1, }; -const headCtBestPose: ModelPoseValue = { - rotateX: -180, - rotateY: 0, - rotateZ: 1, - translateX: -0.03, - translateY: -0.155, - translateZ: 0.005, - scale: 1, -}; interface DicomAttributes { patientName: string; @@ -236,7 +227,6 @@ function buildModuleStyles( function defaultModelPoses(): ModelPoseRecord[] { return [ { id: 'default', name: '默认', pose: { ...defaultModelPose } }, - { id: 'best', name: '最佳位姿', pose: { ...headCtBestPose } }, { id: 'top', name: '俯视', pose: { ...defaultModelPose, rotateX: 0, rotateY: 0, rotateZ: 0 } }, { id: 'side', name: '侧视', pose: { ...defaultModelPose, rotateX: 0, rotateY: 90, rotateZ: 0 } }, ]; @@ -281,6 +271,7 @@ function normalizeModelPoses(existing?: Partial[]) { name: `位姿${index + 1}`, pose: defaultModelPose, })) + .filter((record) => record.id !== 'best' && record.name !== '最佳位姿') .filter((record) => record.id) : []; const incomingById = new Map(incoming.map((record) => [record.id, record])); diff --git a/WebSite/src/components/ReverseWorkspace.tsx b/WebSite/src/components/ReverseWorkspace.tsx index 259aeaa..4724afd 100644 --- a/WebSite/src/components/ReverseWorkspace.tsx +++ b/WebSite/src/components/ReverseWorkspace.tsx @@ -72,19 +72,9 @@ const defaultModelPose: ModelPose = { translateZ: 0, scale: 1, }; -const headCtBestPose: ModelPose = { - rotateX: -180, - rotateY: 0, - rotateZ: 1, - translateX: -0.03, - translateY: -0.155, - translateZ: 0.005, - scale: 1, -}; const defaultSavedPoses: SavedModelPose[] = [ { id: 'default', name: '默认', pose: defaultModelPose }, - { id: 'best', name: '最佳位姿', pose: headCtBestPose }, { id: 'top', name: '俯视', pose: { ...defaultModelPose, rotateX: 0, rotateY: 0, rotateZ: 0 } }, { id: 'side', name: '侧视', pose: { ...defaultModelPose, rotateX: 0, rotateY: 90, rotateZ: 0 } }, ]; @@ -2077,18 +2067,15 @@ export default function ReverseWorkspace({ projectId }: { projectId: string }) { setSliceEnd(maxIndex); setMappingSlice(maxIndex); const nextPoses = item.modelPoses?.length ? item.modelPoses : defaultSavedPoses; - const preferredPose = nextPoses.find((pose) => pose.id === 'best') - ?? nextPoses.find((pose) => pose.name.includes('最佳')) - ?? nextPoses.find((pose) => pose.name === '位姿2') - ?? nextPoses[0]; - setModelPose(preferredPose?.pose ?? headCtBestPose); + const preferredPose = nextPoses.find((pose) => pose.id === 'default') ?? nextPoses[0]; + setModelPose(preferredPose?.pose ?? defaultModelPose); const nextStyles: Record = {}; (item.stlFiles ?? []).forEach((fileName, index) => { nextStyles[fileName] = makeDefaultModuleStyle(index, item.moduleStyles?.[fileName]); }); setModuleStyles(nextStyles); setSavedPoses(nextPoses); - setSelectedPoseId(preferredPose?.id ?? 'best'); + setSelectedPoseId(preferredPose?.id ?? 'default'); }).catch(() => { setProject(null); setFusionVolume(null); diff --git a/工程分析/实现方案-2026-05-20-11-07-27.md b/工程分析/实现方案-2026-05-20-11-07-27.md new file mode 100644 index 0000000..8a8e297 --- /dev/null +++ b/工程分析/实现方案-2026-05-20-11-07-27.md @@ -0,0 +1,52 @@ +# 实现方案:取消最佳位姿与软著材料生成 + +实现方案文档路径:`工程分析/实现方案-2026-05-20-11-07-27.md` + +## 修改目标 + +修正产品逻辑,取消“最佳位姿”的默认位姿和优先加载行为;按 `※撰写Agent.md` 流程生成软著材料到 `新撰写软著文档/`,且软著材料不提交到 Gitea。 + +## 涉及路径 + +- `WebSite/server.ts` +- `WebSite/src/components/ReverseWorkspace.tsx` +- `新撰写软著文档/` +- `工程分析/需求分析-2026-05-20-11-07-27.md` +- `工程分析/实现方案-2026-05-20-11-07-27.md` +- `工程分析/测试方案-2026-05-20-11-07-27.md` +- `工程分析/经验记录.md` + +## 技术路线 + +1. 后端 `defaultModelPoses()` 移除 `best/最佳位姿` 默认项。 +2. 前端 `ReverseWorkspace` 移除 `headCtBestPose` 与 `defaultSavedPoses` 中的最佳位姿,并取消加载项目时优先选择最佳位姿/位姿2的逻辑,恢复默认位姿优先。 +3. 读取 `参考软著构建模板/` 三份样例,学习章节结构、登记表字段和代码汇总格式。 +4. 分析 README、前后端入口、核心页面、导出与体素化逻辑,整理软著说明书、登记表和代码汇总。 +5. 创建 `新撰写软著文档/`,写入三份 Markdown、系统使用视频脚本/分镜、素材清单。 +6. 优先使用 Pandoc 生成 docx;若 Pandoc 不存在,则尝试使用 `python-docx` 或 LibreOffice 可行方案。 +7. 运行 lint、build、部署验证。 +8. 工程分析和代码修正提交到 Git/Gitea;软著输出目录不暂存、不提交。 + +## 兼容性与回滚方案 + +- 取消最佳位姿不影响用户已保存的自定义位姿。 +- 如用户后续需要导入 `head-ct-demo-pose-data.json`,仍可通过位姿导入入口使用。 +- 回滚代码提交可恢复最佳位姿逻辑,但与用户当前要求相反。 + +## 预计文件变更 + +- 修改: + - `WebSite/server.ts` + - `WebSite/src/components/ReverseWorkspace.tsx` + - `工程分析/经验记录.md` +- 新增: + - 本次工程分析三份文档。 + - `新撰写软著文档/` 下软著交付材料(不提交)。 + +## 提交与部署策略 + +- Git 仅暂存代码修正和工程分析文档。 +- 不暂存 `新撰写软著文档/`、`head-ct-demo-pose-data.json`、`※撰写Agent.md` 等软著素材。 +- commit message 包含 `2026-05-20-11-07-27` 和简要描述。 +- 推送 Gitea 若网络不可达,记录失败原因并保留本地 commit。 +- 重新部署项目并验证服务。 diff --git a/工程分析/测试方案-2026-05-20-11-07-27.md b/工程分析/测试方案-2026-05-20-11-07-27.md new file mode 100644 index 0000000..e022b37 --- /dev/null +++ b/工程分析/测试方案-2026-05-20-11-07-27.md @@ -0,0 +1,60 @@ +# 测试方案:取消最佳位姿与软著交付检查 + +测试方案文档路径:`工程分析/测试方案-2026-05-20-11-07-27.md` + +## 静态检查 + +- 运行 `npm run lint`,确认 TypeScript 类型检查通过。 +- 运行 `git diff --check`,确认无空白错误。 + +## 构建检查 + +- 在 `WebSite/` 执行 `npm run build`,确认生产构建通过。 + +## 关键业务场景验证 + +- 检查 `/api/projects/head-ct-demo` 返回的 `modelPoses` 中不再包含 `best` 或 `最佳位姿` 默认项。 +- 检查逆向工作区加载逻辑不再优先选用 `head-ct-demo-pose-data.json` 或 `位姿2`。 +- 保留位姿导入功能,确保 JSON 仍可作为用户手动导入素材。 + +## 软著材料验证 + +- 确认 `新撰写软著文档/` 存在。 +- 确认包含: + - `1. 软著说明书.md` + - `2. 软著登记表.md` + - `3. 代码汇总.md` + - `系统使用视频/` + - `功能验证与素材清单.md` +- 若生成 docx,使用 `unzip -t` 验证 docx 文件结构。 +- 确认登记表中不确定的主体/联系人/日期字段写“待确认”。 +- 确认软著目录未被 Git 暂存。 + +## 部署验证 + +- 重新部署后验证: + - `http://127.0.0.1:4000/api/health` + - `http://127.0.0.1:4000/` + +## Git/Gitea 备份验证 + +- 本次代码和工程分析文档 commit message 包含 `2026-05-20-11-07-27`。 +- 尝试推送 Gitea;如仍网络不可达,记录错误。 + +## 风险与回归关注点 + +- 软著材料不进入 Gitea,不应被 `git add`。 +- 不应删除用户本地 `head-ct-demo-pose-data.json`。 +- 不应提交已有历史文档删除状态或其它无关未跟踪文件。 + +## 实际验证记录 + +- `npm run lint`:通过,TypeScript 类型检查无错误。 +- `git diff --check`:通过,无空白错误。 +- `npm run build`:通过,Vite 生产构建完成;仍存在单 chunk 大小提示,不影响本次功能。 +- docx 结构校验:`1. 软著说明书.docx`、`2. 软著登记表.docx`、`3. 代码汇总.docx` 均通过 `unzip -t`。 +- 重新部署:已重启 `tmux` 会话 `revoxelseg-dicom`,服务监听 `http://0.0.0.0:4000/`。 +- 服务健康检查:`http://127.0.0.1:4000/api/health` 返回 `{"ok":true,"service":"revoxelseg-dicom"}`。 +- 首页检查:`http://127.0.0.1:4000/` 返回 `HTTP/1.1 200 OK`。 +- 项目位姿检查:`/api/projects/head-ct-demo` 返回 `modelPoses` 共 5 条,`ids=["default","top","side","pose-1779215077341","pose-1779215304943"]`,`hasBest=false`。 +- 软著目录检查:`新撰写软著文档/` 保持未暂存、未纳入 Git/Gitea。 diff --git a/工程分析/经验记录.md b/工程分析/经验记录.md index 5a3607c..421d231 100644 --- a/工程分析/经验记录.md +++ b/工程分析/经验记录.md @@ -1153,3 +1153,21 @@ C. 解决问题方案 D. 后续如何避免问题 凡是“保存至项目库”“保存结果”“复核后导出”类功能,都必须明确保存的是结果本体还是生成结果所需的上下文。医学导出相关记录至少要包含位姿、分割范围、标签样式和生成时间;新增导出目标时也要同步检查逆向工作区和项目库两个入口是否一致。 + +## 2026-05-20-11-07-27 软著素材位姿不能成为产品默认最佳参数 + +A. 具体问题 + +`head-ct-demo-pose-data.json` 只是软著和专利撰写时用于展示的素材,不应被产品标注为“最佳位姿”,也不应在用户进入项目时被默认优先加载。 + +B. 产生问题原因 + +早前为了演示效果,将示例位姿固化到前后端默认位姿列表,并在逆向工作区加载时优先选择“最佳位姿/位姿2”。这会把文档素材和产品运行时状态混在一起,导致用户误以为该位姿经过业务确认。 + +C. 解决问题方案 + +后端移除 `best/最佳位姿` 默认记录,并在归一化历史数据时过滤旧 `best` 项;前端移除 `headCtBestPose` 和默认保存位姿中的最佳项,项目加载时恢复优先选择 `default`,保留用户手动导入位姿 JSON 的能力。软著材料输出到 `新撰写软著文档/`,并明确不纳入 Git/Gitea 暂存。 + +D. 后续如何避免问题 + +示例素材、专利素材、软著素材只能作为文档或手动导入资源使用,不能命名为“最佳”“推荐”等产品级默认值。今后新增默认位姿或默认参数时,应同时检查前端默认列表、后端状态归一化和项目加载优先级,避免文档素材污染运行时逻辑。 diff --git a/工程分析/需求分析-2026-05-20-11-07-27.md b/工程分析/需求分析-2026-05-20-11-07-27.md new file mode 100644 index 0000000..c5c7107 --- /dev/null +++ b/工程分析/需求分析-2026-05-20-11-07-27.md @@ -0,0 +1,57 @@ +# 需求分析:取消最佳位姿并撰写软著材料 + +开始时间:2026-05-20-11-07-27 + +## 原始需求摘要 + +用户说明 `head-ct-demo-pose-data.json` 只是软著/专利材料撰写时需要使用,并非产品中的最佳位姿,需要取消“最佳位姿”。同时要求使用 `※撰写Agent.md` 中的流程撰写本项目软著材料,包括软著说明书、登记表、代码汇总、系统使用视频,并全部放入 `新撰写软著文档/`。软著撰写相关内容不需要放到 Gitea。 + +## 业务目标 + +- 产品中不再默认添加或优先加载“最佳位姿”。 +- 已保存/导出的 `head-ct-demo-pose-data.json` 仅作为软著材料素材,不影响运行时默认位姿。 +- 按模板生成软著申报材料,并集中放入 `新撰写软著文档/`。 +- 软著材料不进入 Git/Gitea 备份提交。 + +## 输入与输出 + +- 输入: + - `※撰写Agent.md` + - `参考软著构建模板/` + - 当前项目源码、README、工程分析文档、系统界面功能。 + - `head-ct-demo-pose-data.json` +- 输出: + - 取消“最佳位姿”的代码修正。 + - `新撰写软著文档/1. 软著说明书.md` + - `新撰写软著文档/2. 软著登记表.md` + - `新撰写软著文档/3. 代码汇总.md` + - 对应 `.docx` 可编辑文件(若环境支持)。 + - `新撰写软著文档/系统使用视频/` 下的视频脚本/分镜材料。 + - `新撰写软著文档/功能验证与素材清单.md` + +## 影响范围 + +- 代码: + - `WebSite/server.ts` + - `WebSite/src/components/ReverseWorkspace.tsx` +- 文档: + - `新撰写软著文档/` + - 本次工程分析文档与经验记录。 + +## 关键约束 + +- 软著撰写相关所有内容不纳入 Gitea 提交。 +- 不把 `head-ct-demo-pose-data.json` 当作运行时最佳位姿。 +- 登记表中不确定的著作权人、申请人、联系人、日期等字段写“待确认”,不臆造。 +- 说明书面向用户和审查人员,不写接口、路由、state、payload 等开发黑话。 + +## 风险点 + +- 当前环境可能没有 Pandoc,生成 docx 可能需要用 Python/LibreOffice 替代;若仍不可用,需要明确说明。 +- 系统使用视频如无法实际录屏,应至少输出可执行的视频脚本、分镜和素材清单。 +- 上次 Gitea 推送曾出现网络不可达,本次代码提交推送可能仍失败。 + +## 默认假设 + +- `新撰写软著文档/` 可作为本地交付目录,不需要 Git 追踪。 +- 取消“最佳位姿”只移除运行时默认和位姿列表项,不删除用户本地用于软著的 `head-ct-demo-pose-data.json` 文件。