2026-05-24-16-28-58 修正可见构件导出与高精度映射

This commit is contained in:
2026-05-24 16:42:37 +08:00
parent 3bedf204c8
commit d9572e6966
9 changed files with 246 additions and 22 deletions

View File

@@ -2171,7 +2171,9 @@ export function VoxelizationMappingView({
const maxSlice = Math.max(totalSlices - 1, 0);
const safeSlice = clamp(slice, 0, maxSlice);
const stlFiles = project?.stlFiles ?? [];
const visibleModuleCount = stlFiles.filter((fileName) => moduleStyles[fileName]?.visible !== false).length;
const visibleStlFiles = stlFiles.filter((fileName) => moduleStyles[fileName]?.visible !== false);
const visibleStlFileSignature = visibleStlFiles.join('|');
const visibleModuleCount = visibleStlFiles.length;
const isLibraryVariant = variant === 'library';
const activeOverlayPlacement = overlayPlacement ?? (isLibraryVariant ? 'side' : 'bottom');
@@ -2206,16 +2208,16 @@ export function VoxelizationMappingView({
}, [project?.id, project?.dicomCount, safeSlice, displayMode]);
useEffect(() => {
if (!project || !stlFiles.length) {
if (!project || !visibleStlFiles.length) {
setModelPreviews({});
setOverlayStatus('当前项目没有 STL 构件');
setOverlayStatus(stlFiles.length ? '当前没有可见 STL 构件' : '当前项目没有 STL 构件');
return;
}
let disposed = false;
setOverlayStatus('正在载入 STL 构件层级...');
Promise.allSettled(stlFiles.map((fileName) => (
getCachedModelPreview(project.id, fileName, Math.max(detailLimit, 200000))
setOverlayStatus('正在载入可见 STL 构件层级...');
Promise.allSettled(visibleStlFiles.map((fileName) => (
getCachedModelPreview(project.id, fileName, Math.max(detailLimit, 500000))
.then((payload) => ({ fileName, payload }))
))).then((results) => {
if (disposed) return;
@@ -2232,7 +2234,7 @@ export function VoxelizationMappingView({
return () => {
disposed = true;
};
}, [project?.id, stlFiles.join('|'), detailLimit]);
}, [project?.id, stlFiles.length, visibleStlFileSignature, detailLimit]);
useEffect(() => {
const canvas = baseCanvasRef.current;
@@ -2251,7 +2253,7 @@ export function VoxelizationMappingView({
const stats = drawVoxelOverlayLayer(
canvas,
dicomPreview,
stlFiles,
visibleStlFiles,
modelPreviews,
moduleStyles,
modelPose,
@@ -2264,7 +2266,7 @@ export function VoxelizationMappingView({
return () => window.cancelAnimationFrame(frame);
}, [
dicomPreview,
stlFiles.join('|'),
visibleStlFileSignature,
modelPreviews,
JSON.stringify(moduleStyles),
modelPose.rotateX,
@@ -2638,6 +2640,7 @@ export default function ReverseWorkspace({
pose: modelPose,
segmentationScope: segmentationExportScope,
segmentationExportMode,
moduleStyles,
});
window.setTimeout(() => setExporting(false), 900);
setShowExportMenu(false);
@@ -2947,7 +2950,10 @@ export default function ReverseWorkspace({
setPoseValueDrafts(formatPoseDraftValues(restoredPose));
const nextStyles: Record<string, ModuleStyle> = {};
(item.stlFiles ?? []).forEach((fileName, index) => {
nextStyles[fileName] = makeDefaultModuleStyle(index, latestResult?.moduleStyles?.[fileName] ?? item.moduleStyles?.[fileName]);
nextStyles[fileName] = makeDefaultModuleStyle(index, {
...(latestResult?.moduleStyles?.[fileName] ?? {}),
...(item.moduleStyles?.[fileName] ?? {}),
});
});
setModuleStyles(nextStyles);
setSavedPoses(nextPoses);