diff --git a/src/components/image-editor/ImageCanvasGenerationDialogModel.ts b/src/components/image-editor/ImageCanvasGenerationDialogModel.ts index 3004ae7f5..0b01bc6d6 100644 --- a/src/components/image-editor/ImageCanvasGenerationDialogModel.ts +++ b/src/components/image-editor/ImageCanvasGenerationDialogModel.ts @@ -2265,7 +2265,8 @@ export function replaceProjectAssetPickerReferences( ...resetFailedGenerationDialog(dialog), generationReferences: appendLimitedImageReferences( // 单槽对话框(图生 3D)里素材库选择是替换:留着画布点选的那张只会把这次选择挤掉。 - usesSingleImageReferenceSlot(dialog) + // 但确认时一个都没选就不算「替换」,否则空确认会把画布点选/上传的那张直接清掉。 + usesSingleImageReferenceSlot(dialog) && references.length > 0 ? [] : (dialog.generationReferences ?? []).filter( (reference) => !isProjectAssetPickerReference(reference), diff --git a/src/components/image-editor/projectAssetReferencePickerModel.test.ts b/src/components/image-editor/projectAssetReferencePickerModel.test.ts index f6e643276..1ee72811d 100644 --- a/src/components/image-editor/projectAssetReferencePickerModel.test.ts +++ b/src/components/image-editor/projectAssetReferencePickerModel.test.ts @@ -272,6 +272,30 @@ describe('参考图弹窗素材筛选与快照', () => { expect(next).toMatchObject({ status: 'idle', composerOpen: true }); }); + it('keeps the 3D image-to-model source when the picker is confirmed empty', () => { + const dialog = { + mode: 'model3d-image-to-model', + prompt: '', + status: 'failed', + errorMessage: '失败', + composerOpen: false, + generationReferences: [ + { + id: 'canvas-layer-1', + label: '画布点选', + src: 'https://example.test/canvas.png', + mediaType: 'image', + }, + ], + } satisfies GenerateDialogState; + + const next = replaceProjectAssetPickerReferences(dialog, []); + + expect( + next?.generationReferences?.map((reference) => reference.id), + ).toEqual(['canvas-layer-1']); + }); + it('leaves dialogs outside the reference-composer modes untouched', () => { const dialog = { mode: 'video',