2025-04-01 15:25:15 +08:00
|
|
|
<template>
|
|
|
|
|
<div class="patternMaking3D">
|
|
|
|
|
<div class="selectModel">
|
2025-04-16 10:43:54 +08:00
|
|
|
<div class="heard selectList">
|
|
|
|
|
<div :class="{active:libraryOrModel == 'model'}" @click="setLibraryOrModel('model')">Clothing</div>
|
|
|
|
|
<div :class="{active:libraryOrModel == 'print'}" @click="setLibraryOrModel('print')">Print</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="list" v-show="libraryOrModel == 'model'" v-if="maskShow">
|
2025-04-01 15:25:15 +08:00
|
|
|
<div v-for="item in modelList" class="modelItem" :class="{active:item.id == selectModel.id}" @click="setSelectModel(item)">
|
|
|
|
|
<img :src="item.url" alt="">
|
|
|
|
|
</div>
|
|
|
|
|
<div v-show="!isNoData" class="material_content_list_loding">
|
|
|
|
|
<span class="page_loading" v-show="!isShowLoading" v-observe></span>
|
|
|
|
|
<span v-show="isShowLoading">
|
|
|
|
|
<a-spin size="large" />
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2025-04-16 10:43:54 +08:00
|
|
|
<div class="list printList" v-show="libraryOrModel == 'print'">
|
|
|
|
|
<div v-for="item in printList" class="modelItem" :class="{active:item.id == selectModel.id}" @click="setMaterial(item)">
|
|
|
|
|
<img :src="item.url || item.imgUrl" alt="">
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
|
|
|
|
<div class="model" v-show="selectModel.id != -1">
|
|
|
|
|
<div class="heard">
|
|
|
|
|
<div class="text">Technical sketch</div>
|
|
|
|
|
<div class="switch">
|
|
|
|
|
front
|
2025-04-09 16:10:44 +08:00
|
|
|
<a-switch v-model:checked="isFront" />
|
|
|
|
|
back
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="modelBox">
|
|
|
|
|
<div v-show="!imgOrThree" class="img">
|
2025-04-09 16:10:44 +08:00
|
|
|
<img v-show="!isFront" :src="selectModel.threeDLayoutList?.[0]?.url" alt="">
|
|
|
|
|
<img v-show="isFront" :src="selectModel.threeDLayoutList?.[1]?.url" alt="">
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
2025-04-09 14:09:19 +08:00
|
|
|
<threeBox v-if="imgOrThree" ref="threeBox"></threeBox>
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
|
|
|
|
<div class="gallery_btn" v-show="!imgOrThree" @click="setImgOrThree(true)">3D view</div>
|
|
|
|
|
<div class="gallery_btn" v-show="imgOrThree" @click="setImgOrThree(false)">Img view</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="flatPatterm" v-show="selectModel.id != -1">
|
|
|
|
|
<div class="heard">Flat pattern</div>
|
|
|
|
|
<div class="modelBox">
|
|
|
|
|
<div class="img">
|
|
|
|
|
<img :src="selectModel.threeDPatternLayoutUrl" alt="">
|
2025-04-30 14:01:52 +08:00
|
|
|
<div class="btn">
|
|
|
|
|
<i class="fi fi-bs-expand-arrows-alt" @click.stop="openScaleImage()"></i>
|
|
|
|
|
</div>
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="gallery_btn" @click="openDown()">Download</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="download">
|
|
|
|
|
<download ref="download"></download>
|
|
|
|
|
</div>
|
2025-04-30 14:01:52 +08:00
|
|
|
<scaleImage ref="scaleImage"></scaleImage>
|
2025-04-01 15:25:15 +08:00
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
<script lang="ts">
|
2025-04-16 10:43:54 +08:00
|
|
|
import { defineComponent,computed,ref,provide,nextTick,createVNode,toRefs, reactive, watch} from 'vue'
|
2025-04-01 15:25:15 +08:00
|
|
|
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
|
|
|
|
|
import { Https } from "@/tool/https";
|
|
|
|
|
import { useStore } from "vuex";
|
|
|
|
|
import { useI18n } from 'vue-i18n'
|
|
|
|
|
import threeBox from "./three.vue"
|
|
|
|
|
import download from "./download.vue"
|
2025-04-30 14:01:52 +08:00
|
|
|
import scaleImage from "@/component/HomePage/scaleImage.vue";
|
2025-04-01 15:25:15 +08:00
|
|
|
export default defineComponent({
|
|
|
|
|
components:{
|
2025-04-30 14:01:52 +08:00
|
|
|
threeBox,download,scaleImage
|
2025-04-01 15:25:15 +08:00
|
|
|
},
|
|
|
|
|
props:{
|
|
|
|
|
},
|
|
|
|
|
emits:[],
|
|
|
|
|
setup(props,{emit}) {
|
|
|
|
|
const store = useStore();
|
|
|
|
|
const data = reactive({
|
|
|
|
|
selectModel:{
|
|
|
|
|
id:-1,
|
|
|
|
|
} as any,
|
2025-04-16 10:43:54 +08:00
|
|
|
// printCatecoryList:computed(()=>{
|
|
|
|
|
// return store.state.UserHabit.printType
|
|
|
|
|
// }),
|
|
|
|
|
selectObject:computed(()=>store.state.Workspace.probjects),//选择的项目
|
2025-04-01 15:25:15 +08:00
|
|
|
modelList:[] as any,
|
2025-04-16 10:43:54 +08:00
|
|
|
printList:computed(()=>store.state.UploadFilesModule.allBoardData.printboardFiles),
|
2025-04-01 15:25:15 +08:00
|
|
|
isShowMark:false,
|
|
|
|
|
isNoData:false,
|
|
|
|
|
isShowLoading:false,
|
|
|
|
|
currentPage:1,
|
|
|
|
|
pageSize:10,
|
|
|
|
|
imgOrThree:false,
|
|
|
|
|
isFront:false,
|
2025-04-09 14:09:19 +08:00
|
|
|
maskShow:false,
|
2025-04-16 10:43:54 +08:00
|
|
|
libraryOrModel:'model'
|
|
|
|
|
})
|
|
|
|
|
watch(()=>data.selectObject.sex,(newVal)=>{
|
|
|
|
|
data.modelList = []
|
|
|
|
|
data.currentPage = 0,
|
|
|
|
|
data.isNoData = false
|
|
|
|
|
data.isShowMark = false
|
2025-04-01 15:25:15 +08:00
|
|
|
})
|
|
|
|
|
const setSelectModel = (item:any)=>{
|
|
|
|
|
data.isShowMark = true
|
|
|
|
|
const value = {
|
2025-04-30 14:01:52 +08:00
|
|
|
threeDSimpleId:item.threeDSimpleId,
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
Https.axiosPost(Https.httpUrls.getLayoutDetail,{},{params:value}).then((res:any)=>{
|
|
|
|
|
data.selectModel = res
|
|
|
|
|
data.selectModel.id = item.id
|
|
|
|
|
data.isShowMark = false
|
|
|
|
|
data.imgOrThree = false
|
|
|
|
|
// if(data.imgOrThree){
|
|
|
|
|
// dataDom.threeBox.openSetData()
|
|
|
|
|
// }
|
2025-04-23 16:20:53 +08:00
|
|
|
let stateData = {
|
|
|
|
|
threeDsimpleId:item.id
|
|
|
|
|
}
|
|
|
|
|
store.commit('setPatternMaking3D',stateData)
|
2025-04-01 15:25:15 +08:00
|
|
|
}).catch((err:any)=>{
|
|
|
|
|
data.isShowMark = false
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
const dataDom = reactive({
|
|
|
|
|
threeBox:null as any,
|
|
|
|
|
download:null as any,
|
2025-04-30 14:01:52 +08:00
|
|
|
scaleImage:null as any,
|
2025-04-01 15:25:15 +08:00
|
|
|
})
|
|
|
|
|
const openSetData = ()=>{
|
|
|
|
|
nextTick(()=>{
|
2025-04-23 16:20:53 +08:00
|
|
|
let id = store.state.HomeStoreModule.patternMaking3D.threeDsimpleId
|
2025-04-30 14:01:52 +08:00
|
|
|
if(id && data.selectModel.id == -1)setSelectModel({threeDSimpleId:id})
|
2025-04-01 15:25:15 +08:00
|
|
|
})
|
2025-04-09 14:09:19 +08:00
|
|
|
setTimeout(()=>{
|
|
|
|
|
data.maskShow = true
|
|
|
|
|
},500)
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
const getModelList = ()=>{
|
|
|
|
|
if(data.isShowMark && !data.isNoData)return
|
|
|
|
|
let value = {
|
|
|
|
|
page: data.currentPage,
|
|
|
|
|
size:data.pageSize,
|
2025-04-16 10:43:54 +08:00
|
|
|
sex:data.selectObject.sex,
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
data.isShowLoading = true
|
|
|
|
|
Https.axiosPost(Https.httpUrls.threeDPage,value).then(
|
|
|
|
|
(rv: any) => {
|
|
|
|
|
if(rv.content.length == 0)data.isNoData = true
|
|
|
|
|
data.modelList.push(...rv.content)
|
2025-04-16 10:43:54 +08:00
|
|
|
data.isShowLoading = false
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
).catch((res)=>{
|
|
|
|
|
data.isNoData = true
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
const setImgOrThree = (boolean:boolean)=>{
|
|
|
|
|
data.imgOrThree = boolean
|
|
|
|
|
if(boolean){
|
|
|
|
|
nextTick(()=>{
|
|
|
|
|
dataDom.threeBox.openSetData(data.selectModel)
|
|
|
|
|
// dataDom.threeBox.openSetData(data.selectModel.threeDPatternLayoutUrl)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const downList = ()=>{
|
|
|
|
|
let value = {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
Https.axiosGet(Https.httpUrls.threeDPage,value).then(
|
|
|
|
|
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
const openDown = ()=>{
|
|
|
|
|
dataDom.download.openDown(data.selectModel.id)
|
|
|
|
|
}
|
2025-04-16 10:43:54 +08:00
|
|
|
const setLibraryOrModel = (str:any)=>{
|
|
|
|
|
if(str == 'print' && data.selectModel.id == -1)return
|
|
|
|
|
data.libraryOrModel = str
|
|
|
|
|
}
|
|
|
|
|
const setMaterial = (item:any)=>{
|
2025-04-23 16:20:53 +08:00
|
|
|
dataDom.threeBox.addMaterial(item)
|
2025-04-16 10:43:54 +08:00
|
|
|
}
|
2025-04-30 14:01:52 +08:00
|
|
|
const openScaleImage = ()=>{
|
|
|
|
|
let scaleImage:any = dataDom.scaleImage
|
|
|
|
|
scaleImage.isLike = false
|
|
|
|
|
scaleImage.init([{imgUrl:data.selectModel.threeDPatternLayoutUrl}],0)
|
|
|
|
|
}
|
2025-04-01 15:25:15 +08:00
|
|
|
return{
|
|
|
|
|
...toRefs(dataDom),
|
|
|
|
|
...toRefs(data),
|
|
|
|
|
setSelectModel,
|
|
|
|
|
openSetData,
|
|
|
|
|
getModelList,
|
|
|
|
|
setImgOrThree,
|
|
|
|
|
openDown,
|
2025-04-16 10:43:54 +08:00
|
|
|
setLibraryOrModel,
|
|
|
|
|
setMaterial,
|
2025-04-30 14:01:52 +08:00
|
|
|
openScaleImage
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
directives:{
|
|
|
|
|
observe:{
|
|
|
|
|
mounted (el,binding) {
|
|
|
|
|
// console.log(binding.instance);
|
|
|
|
|
let this_:any = binding.instance
|
|
|
|
|
this_.isShowMark = false
|
|
|
|
|
this_.isNoData = false
|
|
|
|
|
let parentDom = el.parentNode
|
|
|
|
|
this_.getModelList()
|
|
|
|
|
new IntersectionObserver(
|
|
|
|
|
(entries, observer) => {
|
|
|
|
|
// 如果不是相交,则直接返回
|
|
|
|
|
// console.log(entries[0]);
|
|
|
|
|
if (!entries[0].intersectionRatio) return;
|
|
|
|
|
this_.currentPage += 1
|
|
|
|
|
this_.getModelList()
|
|
|
|
|
},
|
|
|
|
|
).observe(el);
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
provide() {
|
|
|
|
|
return {
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
</script>
|
|
|
|
|
<style lang="less" scoped>
|
|
|
|
|
.patternMaking3D{
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
position: relative;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
display: flex;
|
|
|
|
|
font-size: 1.4rem;
|
|
|
|
|
> .selectModel,> .model,>.flatPatterm{
|
|
|
|
|
padding: 3rem 2rem;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
> .heard{
|
|
|
|
|
font-size: 2rem;
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
width: 100%;
|
2025-04-16 10:43:54 +08:00
|
|
|
&.selectList{
|
|
|
|
|
justify-content: flex-start;
|
|
|
|
|
> div{
|
|
|
|
|
position: relative;
|
|
|
|
|
margin-right: 2rem;
|
|
|
|
|
margin-bottom: 2rem;
|
|
|
|
|
}
|
|
|
|
|
> div::before{
|
|
|
|
|
position: absolute;
|
|
|
|
|
content: "";
|
|
|
|
|
display: block;
|
|
|
|
|
background: #000;
|
|
|
|
|
height: calc(.4rem*1.2);
|
|
|
|
|
left: 50%;
|
|
|
|
|
transform: translateX(-50%);
|
|
|
|
|
bottom: -.5rem;
|
|
|
|
|
width: 0px;
|
|
|
|
|
transition: 0.3s all;
|
|
|
|
|
}
|
|
|
|
|
> .active {
|
|
|
|
|
color: #000;
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
}
|
|
|
|
|
> .active::before {
|
|
|
|
|
width: 100%;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-04-01 15:25:15 +08:00
|
|
|
> .switch{
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
> .selectModel{
|
2025-05-20 16:47:27 +08:00
|
|
|
width: 40%;
|
|
|
|
|
// width: 70rem;
|
2025-04-01 15:25:15 +08:00
|
|
|
flex-shrink: 0;
|
|
|
|
|
height: 100%;
|
|
|
|
|
background: #f7f8fa;
|
|
|
|
|
border-radius: 3rem;
|
|
|
|
|
> .list{
|
|
|
|
|
flex: 1;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-wrap: wrap;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
align-content: flex-start;
|
2025-04-16 10:43:54 +08:00
|
|
|
&.printList{
|
|
|
|
|
> .modelItem{
|
|
|
|
|
aspect-ratio: 1 / 1;
|
|
|
|
|
>img{
|
|
|
|
|
padding: 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-04-01 15:25:15 +08:00
|
|
|
> .modelItem{
|
|
|
|
|
width: calc(100% / 4 - 1rem);
|
|
|
|
|
margin: .5rem;
|
|
|
|
|
aspect-ratio: 1 / 1.2;
|
2025-04-09 14:09:19 +08:00
|
|
|
// height: 10rem;
|
2025-04-01 15:25:15 +08:00
|
|
|
border-radius: 2rem;
|
|
|
|
|
border: 2px solid #D4D4D4;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
> img{
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
2025-04-16 10:43:54 +08:00
|
|
|
object-fit: contain;
|
|
|
|
|
padding: 1rem;
|
|
|
|
|
|
2025-04-01 15:25:15 +08:00
|
|
|
}
|
|
|
|
|
&.active{
|
|
|
|
|
border: 2px solid #000;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
> .model ,> .flatPatterm{
|
|
|
|
|
flex: 1;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
align-items: center;
|
|
|
|
|
> .modelBox{
|
|
|
|
|
width: 100%;
|
2025-04-09 16:10:44 +08:00
|
|
|
// height: 20rem;
|
|
|
|
|
// height: 75rem;
|
|
|
|
|
flex: 1;
|
2025-04-16 10:43:54 +08:00
|
|
|
padding: 1rem 0;
|
2025-04-09 16:10:44 +08:00
|
|
|
overflow: hidden;
|
2025-04-01 15:25:15 +08:00
|
|
|
margin: auto;
|
|
|
|
|
>.img{
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
2025-04-30 14:01:52 +08:00
|
|
|
position: relative;
|
|
|
|
|
> .btn{
|
|
|
|
|
position: absolute;
|
|
|
|
|
right: 2rem;
|
|
|
|
|
top: 2rem;
|
|
|
|
|
> i{
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-04-01 15:25:15 +08:00
|
|
|
img{
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
object-fit: contain;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.material_content_list_loding{
|
|
|
|
|
text-align: center;
|
|
|
|
|
height: 50px;
|
|
|
|
|
width: 100%;
|
|
|
|
|
.page_loading{
|
|
|
|
|
display: block;
|
|
|
|
|
width: 50px;
|
|
|
|
|
height: 50px;
|
|
|
|
|
margin: 0 auto;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.download{
|
|
|
|
|
width: 0;
|
|
|
|
|
height: 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|