import { esc, external, section, table, tier, thumbnail } from "./ui.js"; const methodTiers = { scan: "S1", marker: "S2", rgbd: "S3", mvkp: "S4", device: "-", synth: "SY", manual2d: "-", pseudo: "S5", }; export function methodsView(context) { return `

标注方法

${context.data.meta.methods .map((method) => { const datasets = context.data.datasets.filter( (d) => d.method === method.id, ); return `

${esc(method.name)}

${tier(methodTiers[method.id], context.meta)}
    ${method.steps.map((s) => `
  1. ${esc(s)}
  2. `).join("")}
可信度
${esc(method.trust)}
常见问题
${esc(method.issues)}
SOMA路线
${esc(method.route)}
`; }) .join("")}
`; } export function somaView(context) { return `

SOMA转换

原始标注、拓扑映射、SOMA原生拟合与训练监督分别记录。EgoRenderer的辅助拟合不参与渲染。

  1. 原始标注扫描、MANO、SMPL-X、MHR、关键点
  2. 拓扑与关节对应SOMAHandLayer后端或显式对应表
  3. 原生参数拟合Identity、pose与逐帧残差
  4. 训练监督按真值来源区分shape、pose与弱监督
${context.data.meta.routes.map((route) => ``).join("")}
${section("监督边界", ``)} ${section("参考", ``)}
`; } export function samplesView(context) { const datasets = context.data.datasets .slice() .sort((a, b) => a.name.localeCompare(b.name)); const count = Object.values(context.previews).reduce( (total, list) => total + list.length, 0, ); const withPreview = datasets.filter((d) => context.previews[d.id]?.length); return `

样例

${count} 组 · ${withPreview.length} 个数据集
${withPreview.map((dataset) => `${thumbnail(dataset, context)}

${esc(dataset.name)}

${context.previews[dataset.id].length} 组${context.videos[dataset.id]?.length ? ` · ${context.videos[dataset.id].length} 段视频` : ""}
`).join("")}
素材覆盖与抽样

${esc(context.sampling.strategy)} ${esc(context.sampling.dimensions_note)} ${esc(context.sampling.scope)}

${table( ["数据集", "展示 / 素材池", "主分类", "视频", "官方图"], datasets.map((d) => { const sample = context.sampling.datasets?.[d.id]; return `${esc(d.name)}${sample ? `${sample.selected} / ${sample.pool}` : "未取得"}${esc(sample?.primary_dimension || "—")}${context.videos[d.id]?.length || 0}${context.figures[d.id]?.figures?.length || 0}`; }), )}
`; }