Files
aida_front/src/component/home/tools/deReconstruction/index.vue

317 lines
9.0 KiB
Vue
Raw Normal View History

2025-04-01 15:25:15 +08:00
<template>
<div class="deReconstruction">
<div class="selectSektch itemBox">
2025-06-26 15:41:08 +08:00
<!-- <div class="type">
2025-04-16 10:43:54 +08:00
<a-select
v-model:value="segmentationType"
show-search
:allowClear="false"
style="width: 100%"
placeholder="Please select"
:options="[{value:'product',label:'product'},{value:'sketch',label:'sketch'}]"
></a-select>
2025-06-26 15:41:08 +08:00
</div> -->
<selectList @selectImgItem="selectImgItem" :deReconstructionList="segmentationTypeList" :isSegmentation="true" upLoadHttpsUrl="/api/element/imageSegmentation" level1Type="Sketchboard" :randomId="false" type="sketch" :catecoryList="sketchCatecoryList">
<template v-slot:selectSex>
<div class="generalModel_state" style="margin-left: auto">
<div class="generalModel_state_item smail" style="margin-right: 0">
<a-select
ref="select"
v-model:value="sex"
:options="sexList"
size="large"
:fieldNames="{ label: 'name', value: 'value' }"
style="width:10rem"
@change="sexChange"
>
<template #suffixIcon
><span
class="icon iconfont icon-xiala"
style="color: #000"
></span
></template>
</a-select>
</div>
</div>
</template>
</selectList>
2025-04-01 15:25:15 +08:00
</div>
<div class="canvas itemBox">
2025-06-26 15:41:08 +08:00
<canvasBox @setGenerateImg="setGenerateImg" @setCanvasJSON="setCanvasJSON" ref="canvasBox"></canvasBox>
2025-06-18 13:36:11 +08:00
<!-- <canvasUpload :config="ceditorConfig" clothingImageUrl="https://www.minio-api.aida.com.hk/aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20250608%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250608T161025Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=a4374c0954d11c2490ef3b86a1924cf6d423ed8ac56023b3c3ccabcdf0672620"></canvasUpload> -->
2025-04-01 15:25:15 +08:00
</div>
<div class="finished itemBox">
<div class="btnTop">
2025-06-26 15:41:08 +08:00
<div class="gallery_btn" @click="getCanvasImg">{{ $t('DeReconstruction.GenerateLineDrawing') }}</div>
2025-06-18 13:36:11 +08:00
<div v-show="!generateImg?.[0]?.isLike && generateImg" class="icon iconfont icon-jushoucang icon_like" @click="generateLike('like')"></div>
2025-04-01 15:25:15 +08:00
<div v-show="generateImg?.[0]?.isLike" class="icon iconfont icon-jushoucanggift" @click="generateLike('noLike')"></div>
</div>
<div class="content">
<img v-if="generateImg?.[0]?.url" :src="generateImg?.[0]?.url" alt="">
<sketchCategory v-if="generateImg?.[0]?.url" v-model:disignTypeList="sketchCatecoryList" :item="generateImg[0]" :isSpread="false"></sketchCategory>
</div>
<div class="btnBottom" @click="getCanvasData">
2025-06-26 15:41:08 +08:00
<div class="gallery_btn">{{ $t('DeReconstruction.Download') }}</div>
2025-04-01 15:25:15 +08:00
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent,computed,ref,provide,nextTick,createVNode,toRefs, reactive, inject} from 'vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { Https } from "@/tool/https";
import { useStore } from "vuex";
import { useI18n } from 'vue-i18n'
import selectList from '@/component/DetailCopy/detailLeft/module/selectList.vue'
import sketchCategory from "@/component/HomePage/sketchCategory.vue";
import canvasBox from "./canvas/index.vue";
2025-06-09 10:25:54 +08:00
import canvasUpload from "@/component/Canvas/CanvasEditor/index.vue";
// import defaultModel from '@/assets/images/homePage/defaultModel.png'
2025-04-01 15:25:15 +08:00
export default defineComponent({
components:{
2025-06-09 10:25:54 +08:00
selectList,sketchCategory,canvasBox,canvasUpload
2025-04-01 15:25:15 +08:00
},
props:{
},
emits:[],
setup(props,{emit}) {
const store = useStore();
const data = reactive({
sketchCatecoryList:computed(()=>{
return store.state.Workspace.probjects.positionList
}),
2025-04-16 10:43:54 +08:00
segmentationType:'product',
2025-06-23 09:27:29 +08:00
segmentationTypeList:[{value:'product',name:'product'},{value:'sketch',name:'sketch'}],
2025-04-01 15:25:15 +08:00
generateImg:computed(()=>store.state.HomeStoreModule.deReconstruction) as any,
2025-06-09 10:25:54 +08:00
ceditorConfig:{
width: 800,
height: 600,
backgroundColor: "#f8f8f8",
},
defaultModel:'',
2025-04-01 15:25:15 +08:00
})
const setIsShowMark:any = inject('setIsShowMark')
const dataDom = reactive({
canvasBox:null as any,
})
const selectImgItem = (data:any)=>{
2025-06-26 15:41:08 +08:00
console.log(data)
// getSegmentation(data)
getSegmentation(data)
2025-04-16 10:43:54 +08:00
}
const canvasAddImg = (list:any)=>{
list.segmentedImages.forEach((url:any) => {
list.imgUrl = url
2025-06-26 15:41:08 +08:00
dataDom.canvasBox.addImage({url})
2025-04-16 10:43:54 +08:00
});
}
const getSegmentation = (value:any)=>{
2025-06-26 15:41:08 +08:00
let segmentationType = ''
if(value.designType == "Library"){
segmentationType = 'sketch'
}else{
segmentationType = value.categoryValue
}
2025-04-16 10:43:54 +08:00
let param = new FormData();
param.append('id',value.id)
param.append('file','')
2025-06-26 15:41:08 +08:00
param.append('type',segmentationType)
let sourceType = value.designType || 'Upload'
param.append('sourceType',sourceType)
2025-04-16 10:43:54 +08:00
let config:any = {headers:{'Content-Type':'multipart/form-data','Accept':'*/*' }}
Https.axiosPost(Https.httpUrls.imageSegmentation,param,config)
.then((rv:any) => {
// console.log(rv);
canvasAddImg(rv[0])
}
).catch(rv=>{
})
2025-04-01 15:25:15 +08:00
}
const openSetData = ()=>{
dataDom.canvasBox.openSetData()
}
const getCanvasImg = ()=>{
dataDom.canvasBox.getData()
}
const setGenerateImg = (base64:any)=>{
let value = {
"collagePicture": base64,
"gender": store.state.Workspace.probjects.sex,
"projectId": store.state.Workspace.probjects.id
}
setIsShowMark(true)
Https.axiosPost(Https.httpUrls.genSketchRecon,value).then((rv)=>{
if(rv){
data.sketchCatecoryList.forEach((item:any)=>{
if(item.value == rv.category){
rv.categoryValue = item.value
rv.category = item.name
}
})
rv.isLike = false
let value = {
list: [rv],
str:'add',
index:-1,
}
store.commit('setDeReconstruction',value)
setIsShowMark(false)
}
})
2025-06-26 15:41:08 +08:00
2025-04-01 15:25:15 +08:00
}
const generateLike = (str:string)=>{
if(data.generateImg[0].id == -1)return
if(str == 'like'){
let value={
"gender": store.state.Workspace.probjects.sex,
"generateDetailId": data.generateImg[0].id,
"level1Type": "Sketchboard",
"level2Type": data.generateImg[0].categoryValue,
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone
}
Https.axiosPost(Https.httpUrls.generateLike,value).then((rv)=>{
if(rv){
data.generateImg[0].isLike = true
}
})
}else{
let value = {
"generateDetailId": data.generateImg[0].id,
timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone
}
Https.axiosGet(Https.httpUrls.generateDislike, {params:value}).then(
(rv) => {
data.generateImg[0].isLike = false
}
).catch(res=>{
});
}
}
2025-06-26 15:41:08 +08:00
const setCanvasJSON = (canvasJSON)=>{
if(!canvasJSON)return
let blob = new Blob([canvasJSON], { type: "application/json" });
let formData = new FormData();
formData.append("file", blob, "data.json");
formData.append("module", "deReconstruction");
formData.append("projectId", store.state.Workspace.probjects.id)
let config = {
headers: { "Content-Type": "multipart/form-data", Accept: "*/*" },
};
Https.axiosPost(Https.httpUrls.exportSave, formData, config).then(
(rv) => {
console.log(rv)
}
);
}
2025-04-01 15:25:15 +08:00
const setCanvas = (str:string)=>{
dataDom.canvasBox.setCanvas(str)
}
const getCanvasData = ()=>{
let data = dataDom.canvasBox.getCanvasData()
return data
}
return{
...toRefs(dataDom),
...toRefs(data),
selectImgItem,
openSetData,
getCanvasImg,
setGenerateImg,
generateLike,
getCanvasData,
setCanvas,
2025-06-26 15:41:08 +08:00
setCanvasJSON,
2025-04-01 15:25:15 +08:00
}
},
provide() {
return {
}
},
})
</script>
<style lang="less" scoped>
.deReconstruction{
width: 100%;
height: 100%;
position: relative;
display: flex;
> .itemBox{
margin-right: 2rem;
padding: 2rem;
background: #f7f8fa;
border-radius: 3rem;
// flex: 1;
&.selectSektch{
width: 37rem;
2025-06-23 09:27:29 +08:00
display:flex;
flex-direction: column;
2025-04-01 15:25:15 +08:00
flex-shrink: 0;
2025-04-16 10:43:54 +08:00
> .type{
display: flex;
justify-content: space-between;
> :deep(.ant-select){
margin: 1rem 0;
.ant-select-selector{
border-radius: 2rem;
}
}
>label{
display: flex;
align-items: center;
>div{
font-size: 2rem;
margin-left: 1rem;
}
}
}
2025-04-01 15:25:15 +08:00
}
&.canvas{
flex: 1;
2025-06-09 10:25:54 +08:00
position: relative;
2025-04-01 15:25:15 +08:00
}
&.finished{
2025-06-18 13:36:11 +08:00
width: 45rem;
// width: 58rem;
2025-04-01 15:25:15 +08:00
display: flex;
2025-06-26 15:41:08 +08:00
height: 100%;
overflow: hidden;
2025-04-01 15:25:15 +08:00
flex-direction: column;
> .btnTop{
display: flex;
justify-content: space-between;
> .icon{
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
font-size: 2rem;
width: 6rem;
height: 6rem;
border: 1px solid;
border-radius: 50%;
}
}
> .content{
flex: 1;
// overflow: hidden;
2025-06-26 15:41:08 +08:00
margin: 2rem 0;
2025-04-01 15:25:15 +08:00
position: relative;
2025-06-26 15:41:08 +08:00
overflow: hidden;
2025-04-01 15:25:15 +08:00
> img{
width: 100%;
height: 100%;
object-fit: contain;
}
}
> .btnBottom{
text-align: right;
}
}
}
> .itemBox:last-child{
margin-right: 0;
}
}
</style>