@@ -344,7 +339,7 @@ export default defineComponent({
token: getCookie('token'),
upload: {
projectId: computed(() => store.state.Workspace.probjects.id),
- type: 'first' // first首帧 last尾帧
+ type: null // first首帧 last尾帧
},
waitList: [],
likeList: computed(() => {
@@ -362,7 +357,6 @@ export default defineComponent({
}
}),
isGenerate: false, //判断是否正在进行generate
- remGenerate: false,
removeGenerate: false,
generateTime: null as any,
poseList: [],
@@ -431,7 +425,7 @@ export default defineComponent({
}
// 处理首帧选择
- data.fileList.forEach((listItem: any) => (listItem.isChecked = false))
+ showFirstFrameList.value.forEach((listItem: any) => (listItem.isChecked = false))
data.currentList.forEach((listItem: any) => (listItem.isChecked = false))
item.isChecked = true
data.selectImg = item
@@ -516,7 +510,12 @@ export default defineComponent({
}, 200)
}
const getgenerate = async () => {
- if (!data.selectImg.minioUrl) return message.info(t('ProductImg.jsContent2'))
+ if (videoType.value === 3 && !data.lastSelectImg.minioUrl) {
+ message.info(t('poseTransfer.NeedLastFrame'))
+ return
+ }
+ if (!data.selectImg.minioUrl) return message.info(t('poseTransfer.NeedFirstFrame'))
+ debugger
if (data.isGenerate) return
await new Promise((res, reject) => {
Modal.confirm({
@@ -536,8 +535,6 @@ export default defineComponent({
})
data.isGenerate = true
- // data.remGenerateTime = setTimeout(()=>{
- // },10000)
let value = {
poseId: data.selectPose,
@@ -561,7 +558,6 @@ export default defineComponent({
}
Https.axiosPost(Https.httpUrls.poseTransform, value)
.then(rv => {
- data.remGenerate = true
data.noLikeList.unshift({
taskId: rv.taskId,
parentId: data.selectImg.parentId
@@ -570,8 +566,6 @@ export default defineComponent({
})
.catch((res: any) => {
data.isGenerate = false
- clearInterval(data.remGenerateTime)
- data.remGenerate = false
if (res.errCode === 2) {
Modal.confirm({
title: res.errMsg,
@@ -594,7 +588,7 @@ export default defineComponent({
data.waitList = list
let state = true
data.generateTime = setInterval(() => {
- if (!data.isGenerate || !data.remGenerate) return
+ if (!data.isGenerate) return
if (!state) return
state = false
Https.axiosPost(Https.httpUrls.poseTransformResult, list)
@@ -612,8 +606,6 @@ export default defineComponent({
data.noLikeList[index] = element
list = ''
clearInterval(data.generateTime)
- clearInterval(data.remGenerateTime)
- data.remGenerate = false
data.isGenerate = false
// if(list?.filter)list = list?.filter((item:any) => item !== element.taskId);
store.dispatch('getCredits')
@@ -624,8 +616,6 @@ export default defineComponent({
message.info(t('ProductImg.jsContent3'))
data.noLikeList.splice(index, 1)
clearInterval(data.generateTime)
- clearInterval(data.remGenerateTime)
- data.remGenerate = false
data.isGenerate = false
store.dispatch('getCredits')
}
@@ -636,16 +626,13 @@ export default defineComponent({
let index = data.noLikeList.findIndex((obj: any) => obj.taskId === list)
data.noLikeList.splice(index, 1)
clearInterval(data.generateTime)
- clearInterval(data.remGenerateTime)
data.isGenerate = false
- data.remGenerate = false
})
}, 10000)
}
const setRemoveGenerate = () => {
//取消操作
data.isGenerate = false
- data.remGenerate = false
clearInterval(data.generateTime)
if (data.waitList) {
// let str = data.waitList.map((obj:any) => obj.taskId).join(',');
@@ -691,7 +678,7 @@ export default defineComponent({
if (!isLt2M) {
message.info(useI18n().t('MoodboardUpload.jsContent4'))
}
- if (!data?.upload?.projectId && !isSelectObject) {
+ if (!route?.query?.id && !isSelectObject) {
isSelectObject = true
await createProbject()
}
@@ -705,26 +692,28 @@ export default defineComponent({
if (res.errCode == 0) {
file.imgUrl = res.data.url
file.id = res.data.id
- file.frameType = 'first'
data.currentList.forEach((listItem: any) => (listItem.isChecked = false))
- // data.fileList.forEach((listItem:any)=>{
- // if(listItem.id == file.id){
- // listItem.isChecked = true
- // }else{
- // listItem.isChecked = false
- // }
- // })
file.type = 'ProductElement'
- // if(props.productimgMenu.value == 'Relight'){
- // file.type = "ToProductImage"
- // }
- data.selectImg = res.data
- // data.fileList.filter((v: any) => v.status === "done");
+ if (videoType.value === 3) {
+ file.frameType = 'first'
+ }
let storeData = {
str: 'add',
list: [file]
}
store.commit('setUploadElement', storeData)
+ // 上传成功后,设置选中状态
+ file.isChecked = true
+ // 取消 showFirstFrameList 中其他项的选中状态
+ showFirstFrameList.value.forEach((listItem: any) => {
+ if (listItem.id !== file.id) {
+ listItem.isChecked = false
+ }
+ })
+ data.selectImg = res.data
+ if (res.data.url || res.data.imgUrl) {
+ data.selectImg.minioUrl = getMinioUrl(res.data.url || res.data.imgUrl)
+ }
} else {
bor = false
}
@@ -816,34 +805,62 @@ export default defineComponent({
.then(rv => {
if (str == 'like') {
item.newLike = true
- let value = {
+ // 从 noLikeList 中查找索引并删除
+ const noLikeIndex = store.state.HomeStoreModule.poseTransfer.list.findIndex(
+ (v: any) => v.id === item.id
+ )
+ if (noLikeIndex !== -1) {
+ let deleteValue = {
+ list: [],
+ str: 'splice',
+ index: noLikeIndex
+ }
+ store.commit('setPoseTransfer', deleteValue)
+ }
+ // 添加到 likedList
+ let addValue = {
likedList: [
{
...item,
- sort: rv.sort,
- parentId: rv.parentId
+ sort: rv?.sort ?? item.sort,
+ parentId: rv?.parentId ?? item.parentId
}
],
str: 'add',
index: -1
}
- store.commit('setPoseTransfer', value)
- data.noLikeList.splice(index, 1)
+ store.commit('setPoseTransfer', addValue)
} else {
- let value = {
- likedList: [
+ item.newLike = false
+ // 从 likedList 中查找索引并删除
+ const likedIndex =
+ store.state.HomeStoreModule.poseTransfer.likedList.findIndex(
+ (v: any) => v.id === item.id
+ )
+ if (likedIndex !== -1) {
+ let deleteValue = {
+ likedList: [],
+ str: 'splice',
+ index: likedIndex
+ }
+ store.commit('setPoseTransfer', deleteValue)
+ }
+ // 添加到 noLikeList
+ let addValue = {
+ list: [
{
...item
}
],
- str: 'splice',
- index: index
+ str: 'add',
+ index: -1
}
- data.noLikeList.push(item)
- store.commit('setPoseTransfer', value)
+ store.commit('setPoseTransfer', addValue)
}
})
- .catch(res => {})
+ .catch(res => {
+ console.error('likeFile error:', res)
+ })
}
const selectPose = (item: any) => {
data.poseList.forEach((listItem: any) => (listItem.isChecked = false))
@@ -873,8 +890,16 @@ export default defineComponent({
{ params: value }
).then(rv => {
if (isLastFrame) {
+ // 如果删除的是当前选中的尾帧,清空选中状态
+ if (data.lastSelectImg?.id === item.id) {
+ data.lastSelectImg = {}
+ }
store.commit('setPoseTransferLastFrameList')
- }else{
+ } else {
+ // 如果删除的是当前选中的首帧,清空选中状态
+ if (data.selectImg?.id === item.id) {
+ data.selectImg = {}
+ }
let storeData = {
str: 'delete',
index
@@ -883,28 +908,50 @@ export default defineComponent({
}
})
}
+
+ const videoType = ref(2)
+ const showMotion = computed(() => videoType.value === 1)
+ const options = ref([
+ { vlaue: 2, label: t('poseTransfer.FirstFrame') },
+ { value: 3, label: t('poseTransfer.FirstAndLastFrames') },
+ { value: 1, label: t('poseTransfer.FirstFrameAndSkeleton') }
+ ])
+
+ const firstFrameList = ref([])
+ const lastFrameList = ref([])
+ const showFirstFrameList = computed(() => {
+ if(props.isDesignPage) return data.fileList
+ return videoType.value === 3 ? firstFrameList.value : data.fileList
+ })
watch(
() => store.state.HomeStoreModule.uploadElement.length,
(newVal, oldVal) => {
- if (props.isDesignPage) return
+ if (props.isDesignPage || (!route.query?.id && !route.query?.history)) return
data.fileList = store.state.HomeStoreModule.uploadElement.filter(
+ item => !item.frameType
+ )
+
+ firstFrameList.value = store.state.HomeStoreModule.uploadElement.filter(
item => item.frameType === 'first'
)
+
lastFrameList.value = store.state.HomeStoreModule.uploadElement.filter(
item => item.frameType === 'last'
)
-
- data.fileList.forEach((listItem: any) => {
+ // 更新 showFirstFrameList 中项的选中状态
+ showFirstFrameList.value.forEach((listItem: any) => {
if (listItem.id == data.selectImg.id) {
listItem.isChecked = true
} else {
listItem.isChecked = false
}
})
+ },
+ {
+ immediate: true
}
)
- // 全局维护尾帧上传列表,保持与主上传一致
- const lastFrameList = ref([])
+
watch(
() => store.state.HomeStoreModule.lastFrameList,
val => {
@@ -917,6 +964,31 @@ export default defineComponent({
{ immediate: true }
)
+ // 首帧图片的type 切换为首尾帧时type=first,其他情况type为null
+ watch(
+ () => videoType.value,
+ newVal => {
+ if (newVal === 3) {
+ data.upload.type = 'first'
+ } else {
+ delete data.upload.type
+ }
+ // 当 videoType 改变时,检查 selectImg 是否在当前 showFirstFrameList 中
+ // 如果不在,清空选中状态或选择列表中的第一项
+ const currentList = showFirstFrameList.value
+ if (data.selectImg?.id) {
+ const exists = currentList.some((item: any) => item.id === data.selectImg.id)
+ if (!exists) {
+ // 如果当前选中的项不在新列表中,清空选中状态
+ data.selectImg = {}
+ // 取消所有项的选中状态
+ currentList.forEach((item: any) => (item.isChecked = false))
+ }
+ }
+ },
+ { immediate: true }
+ )
+
watch(
() => data.noLikeList.length,
(newVal, oldVal) => {
@@ -925,7 +997,6 @@ export default defineComponent({
let taskIdList = list.filter((item: any) => !item.videoUrl)[0]
if (taskIdList?.length > 0) {
data.isGenerate = true
- data.remGenerate = true
setGenerate(taskIdList[0].taskId)
}
})
@@ -933,19 +1004,9 @@ export default defineComponent({
{ immediate: true }
)
- const videoType = ref(2)
- const showMotion = computed(() => videoType.value === 1)
- const options = ref([
- { vlaue: 2, label: t('poseTransfer.FirstFrame') },
- { value: 3, label: t('poseTransfer.FirstAndLastFrames') },
- { value: 1, label: t('poseTransfer.FirstFrameAndSkeleton') }
- ])
-
onBeforeUnmount(() => {
clearInterval(data.generateTime)
- clearInterval(data.remGenerateTime)
data.isGenerate = false
- data.remGenerate = false
})
return {
@@ -953,6 +1014,8 @@ export default defineComponent({
...toRefs(dataDom),
...toRefs(data),
lastFrameList,
+ firstFrameList,
+ showFirstFrameList,
openSetData,
selectImgItem,
setSize,
diff --git a/src/lang/cn.ts b/src/lang/cn.ts
index f574f91f..d3d0c1d3 100644
--- a/src/lang/cn.ts
+++ b/src/lang/cn.ts
@@ -295,6 +295,8 @@ export default {
GeneratedVideo: '生成的视频',
hint: '将这张图像转化为一张逼真、达到工作室水准的照片。在生活中真实存在的人',
jsContent1: '生成视频预计需要三分钟,请问是否继续',
+ NeedFirstFrame:'请选择首帧图片',
+ NeedLastFrame:'请选择尾帧图片',
SingleGarment:
'专业产品摄影:服装展示于隐形模特上,模特不可见。完整保留设计细节——所有图案、颜色、质地及细节特征。', // 单品样衣
SingleChildTryOn:
diff --git a/src/lang/en.ts b/src/lang/en.ts
index bda82e84..5a8fe478 100644
--- a/src/lang/en.ts
+++ b/src/lang/en.ts
@@ -305,6 +305,8 @@ export default {
GeneratedVideo: 'Generated Video',
hint: 'Transform this image into a realistic, studio-quality photograph. To the real photo real people',
jsContent1: 'Video generation will take approximately 3 minutes. Continue?',
+ NeedFirstFrame: 'Please select the first frame image',
+ NeedLastFrame: 'Please select the last frame image',
SingleGarment:
'Professional product photo: garment on invisible mannequin, no model visible. Preserve exact design - all patterns, colors, textures, details.', // 单品样衣
SingleChildTryOn:
@@ -332,7 +334,8 @@ export default {
firstAndLastFramePlaceholder1: '[Camera Movement]',
firstAndLastFrameText2: 'to follow the motion, under',
firstAndLastFramePlaceholder2: '[Light]',
- firstAndLastFrameText3: ', maintaining full consistency of model identity, styling, and outfit across all frames.',
+ firstAndLastFrameText3:
+ ', maintaining full consistency of model identity, styling, and outfit across all frames.',
firstFrameText1: 'Set the',
firstFramePlaceholder1: '[Scene]',
firstFrameText2: ', where the model',
diff --git a/src/views/HomeMain.vue b/src/views/HomeMain.vue
index 4f25e4e2..0cda79c7 100644
--- a/src/views/HomeMain.vue
+++ b/src/views/HomeMain.vue
@@ -523,7 +523,7 @@ export default defineComponent({
bathGenerationList: ['poseTransfer', 'SERIES_DESIGN', 'toProduct', 'relight'],
showHistory: false,
isNewProject: false,
- cachedRoutes:computed(()=>store.state.Workspace.cachedRoutes),//
+ cachedRoutes: computed(() => store.state.Workspace.cachedRoutes) //
})
let userDetail = computed(() => {
return store.state.UserHabit.userDetail
@@ -578,7 +578,7 @@ export default defineComponent({
nextTick(async () => {
const key = Object.keys(query)?.[0]
if (key) {
- if (query.id) {
+ if (query.id && !query.tools) {
homeMainData.openType = 'history'
homeMainData.openTypeChild = query.id
} else {
@@ -1030,7 +1030,7 @@ export default defineComponent({
if (currentProjectActive.value) return
if (currentProjectPath.value) {
router.push(currentProjectPath.value)
- // router.back()
+ // router.back()
}
}
diff --git a/src/views/HomeView/history.vue b/src/views/HomeView/history.vue
index 9cecb1af..b8a601e3 100644
--- a/src/views/HomeView/history.vue
+++ b/src/views/HomeView/history.vue
@@ -466,6 +466,8 @@ export default defineComponent({
// this.$router.push({ name: 'homePage', params: { id: record.id, type: 'History' } })
// this.store.commit('setChooseIsDesign', num)
// router.push(`/home/tools?tools=toProduct&id=${childItem.id}`)
+
+ this.store.state.Workspace.cachedRoutes = [];
this.store.commit('setProjectPath','')
if (record.process == 'SERIES_DESIGN' || record.process == 'SINGLE_DESIGN') {
this.$router.push(`/home/history/${record?.id}`)