云生成

This commit is contained in:
X1627315083
2025-04-23 09:39:24 +08:00
parent b776f6a0c5
commit 42dfa3c032
22 changed files with 604 additions and 144 deletions

View File

@@ -384,12 +384,12 @@ export default defineComponent({
<style lang="less" scoped>
.molepositon{
width: 30rem;
height: 65rem;
height: 66rem;
// height: 80rem;
display: flex;
flex-direction: column;
// margin: auto 0;
padding-top: 3rem;
// padding-top: 3rem;
position: relative;
display: none;
&.active{
@@ -409,9 +409,9 @@ export default defineComponent({
z-index: 2;
position: relative;
width: 100%;
height: 100%;
object-fit: contain;
object-fit: contain;
height: auto;
// height: 100%;
// object-fit: contain;
}
>div{
position: absolute;
@@ -422,8 +422,10 @@ export default defineComponent({
height: 100%;
img{
// width: 100%;
// height: 100%;
width: 100%;
height: 100%;
height: auto;
float: left;
user-select:none;
-webkit-user-drag: none;

View File

@@ -255,6 +255,8 @@ export default defineComponent({
},
roborSend (){
this.clearTimer()
console.log(this.workspace)
return
if(!this.chatCentent){
message.info(this.t('RobotAssist.jsContent1'));
return

View File

@@ -24,7 +24,7 @@
</div>
</template>
<script lang="ts">
import { defineComponent,computed,onMounted,nextTick,onBeforeMount,toRefs, reactive,watch} from 'vue'
import { defineComponent,computed,onMounted,nextTick,onBeforeUnmount,toRefs, reactive,watch} from 'vue'
// import setDesignItem from '@/component/Detail/setDesignItem2.vue'
import { useStore } from "vuex";
import {useRoute} from 'vue-router'
@@ -253,7 +253,7 @@ export default defineComponent({
getHistory()
}
})
onBeforeMount(()=>{
onBeforeUnmount(()=>{
// data.selectObject = null
// store.commit('createProbject')
})

View File

@@ -18,15 +18,14 @@
<div class="generalModel_closeIcon" @click.stop="cancelDsign()">
<svg width="46" height="46" viewBox="0 0 46 46" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="23" cy="23" r="23" fill="white" fill-opacity="0.3"/>
<rect x="32.5063" y="12" width="3" height="29" rx="1.5" transform="rotate(45 32.5063 12)" fill="white"/>
<rect x="34.6274" y="32.5059" width="3" height="29" rx="1.5" transform="rotate(135 34.6274 32.5059)" fill="white"/>
<rect x="32.5063" y="12" width="3" height="29" rx="1.5" transform="rotate(45 32.5063 12)" fill="#000"/>
<rect x="34.6274" y="32.5059" width="3" height="29" rx="1.5" transform="rotate(135 34.6274 32.5059)" fill="#000"/>
</svg>
</div>
</div>
<div class="modal_title_text">
<div>Cloud generation task</div>
</div>
{{ cloudList }}
<div class="allUserPoeration_center admin_page">
<div class="admin_state_item">
<span>Build type <span>*</span></span>
@@ -34,34 +33,76 @@
v-model:value="buildType"
show-search
allowClear
style="width: 220px"
style="width: 200px"
placeholder="Please select"
:options="cloudList"
@change="changeBuildType"
></a-select>
</div>
<div class="admin_state_item" >
<span>Image upload</span>
<input
v-model="percentOff"
placeholder="Please enter percentOff"
type="text"
style="width: 220px"
/>
</div>
<div class="admin_state_item" >
<span>Number of images</span>
<span>Number of images <span>*</span></span>
<input
v-model="numberOfImages"
:disabled="buildType =='relight' || buildType == 'poseTransfer'"
placeholder="Please enter number"
type="text"
style="width: 220px"
style="width: 200px"
/>
</div>
<div class="admin_state_item" style="width: 100%;">
<span style="margin: 0;">Generation time19min</span>
<!-- toProductimg -->
<div v-show="buildType == 'toProductImage'" class="admin_state_item ">
<span>{{$t('ProductImg.Similarity')}}</span>
<div class="sliderAndImput" style="width: 200px">
<a-slider class="system_silder"
v-model:value="similarity"
:tooltipVisible="false"
:step="5"
>
</a-slider>
<input type="number" readonly v-model="similarity">
</div>
</div>
<div v-show="buildType == 'relight'" class="admin_state_item ">
<span>{{$t('ProductImg.RelightDirection')}}</span>
<a-select style="width: 200px" v-model:value="relightDirection" :options="relightDirectionList"></a-select>
</div>
<div v-show="buildType == 'relight'" class="admin_state_item ">
<span>{{$t('ProductImg.Highlight')}}</span>
<div class="sliderAndImput" style="width: 200px">
<a-slider class="system_silder"
v-model:value="brightenValue"
:tooltipVisible="false"
:max="3"
:min="1"
:step="0.1"
>
</a-slider>
<input type="number" readonly v-model="brightenValue">
</div>
</div>
<div v-show="buildType == 'toProductImage' || buildType == 'relight'" class="admin_state_item">
<span>Keyword</span>
<input
v-model="generateText"
:placeholder="$t('Generate.inputContent1')"
type="text"
style="width: 200px"
/>
</div>
<div class="selectImgList generalScroll" v-mousewheel v-show="exhibitionImgList.length>0">
<div v-for="item in exhibitionImgList" class="item">
<img :src="item.designOutfitUrl||item.url" alt="">
</div>
</div>
<!-- <div class="admin_state_item" style="width: 100%;">
<span style="margin: 0;">Generation time19min</span>
</div> -->
<div class="admin_state_item" style="width: 100%;">
<span style="margin: 0;">Cost credit500</span>
<span style="margin: 0;">Cost credit{{credits * numberOfImages}}</span>
</div>
</div>
<div class="allUserPoeration_btn admin_page">
@@ -79,12 +120,15 @@
</div>
</template>
<script>
import { defineComponent, ref, reactive, watch, onMounted, nextTick, toRefs } from "vue";
import { defineComponent, computed, reactive, watch, onMounted, nextTick, toRefs } from "vue";
import { Https } from "@/tool/https";
import { Modal, message } from "ant-design-vue";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
import { formatTime,isEmail } from "@/tool/util";
import dayjs, { Dayjs } from 'dayjs';
import { useStore } from "vuex";
import { useI18n } from "vue-i18n";
import {getMinioUrl} from '@/tool/util'
const md5 = require("md5");
export default defineComponent({
components: {
@@ -95,41 +139,154 @@ export default defineComponent({
default:[]
}
},
emits: ['searchHistoryList'],
emits: ['getContentList'],
setup(props,{emit}) {
const store = useStore();
let operations = reactive({
operationsModal:false,
loadingShow:false,
})
let operationsData = reactive({
buildType:'',
commissionRate:'',
numberOfImages:'',
credits:0,
exhibitionImgList:[],//选择的图片
selectObject:computed(()=>store.state.Workspace.probjects),//选择的项目
//toProduct
generateText:'',//输入的内容
similarity:30,
brightenValue:1,//亮度
relightDirection:'Right Light',//打光方向
relightDirectionList:[
{
value:'Right Light',
label:useI18n().t('ProductImg.RightLight')
},{
value:'Left Light',
label:useI18n().t('ProductImg.LeftLight')
},{
value:'Top Light',
label:useI18n().t('ProductImg.TopLight')
},{
value:'Bottom Light',
label:useI18n().t('ProductImg.BottomLight')
}
]
})
let init = ()=>{
operations.operationsModal = true
}
const changeBuildType = ()=>{
if(operationsData.buildType == 'design'){
operationsData.exhibitionImgList = []
}else if(operationsData.buildType == 'toProductImage'){
operationsData.exhibitionImgList = store.state.UploadFilesModule.modularData.design.likeData
}else if(operationsData.buildType == 'relight'){
operationsData.exhibitionImgList = store.state.UploadFilesModule.modularData.toProduct
operationsData.numberOfImages = operationsData.exhibitionImgList.length
}else if(operationsData.buildType == 'poseTransfer'){
operationsData.exhibitionImgList = store.state.UploadFilesModule.modularData.toProduct
operationsData.numberOfImages = operationsData.exhibitionImgList.length
}
props.cloudList.forEach((item)=>{
if(item.value == operationsData.buildType){
operationsData.credits = item.consumption
}
})
}
let getPorductImg = ()=>{
let modularData = store.state.UploadFilesModule.modularData
let list = []
if(operationsData.buildType == 'toProductImage' || operationsData.buildType == 'relight'){
let productOrRelight = []
if(operationsData.buildType == 'toProductImage')productOrRelight = modularData.design.likeData
if(operationsData.buildType == 'relight')productOrRelight = modularData.toProduct
productOrRelight.forEach((item)=>{
if(!item.id)return
let obj = {
"createTime": "",
"elementId": 0,
"elementType": "",
"id": 0,
"isLike": 0,
"taskId": "",
"toProductImageRecordId": 0,
"url": "",
}
obj.elementId = item.designOutfitId
obj.elementType = 'DesignOutfit'
if(operationsData.buildType == 'relight'){
obj.elementId = item.id
obj.elementType = 'ToProductImage'
}
list.push(obj)
})
}
return list
}
const getImageStrength = () => {
let imageStrength = operationsData.similarity == 100? 95 :operationsData.similarity
return imageStrength;
};
const getPoseTransformData = ()=>{
let list = []
let toProduct = store.state.UploadFilesModule.modularData.toProduct
toProduct.forEach((item)=>{
let obj = {
poseId:1,
productImage:getMinioUrl(item.url)
}
list.push(obj)
})
return list
}
let setAddData = ()=>{
return {
"percentOff": operationsData.percentOff,
"commissionRate": operationsData.commissionRate,
"buildType": operationsData.buildType,
nums: operationsData.numberOfImages,
projectId: operationsData.selectObject.id,
//productimg
toProductImage:{
prompt:operationsData.generateText,//输入的内容
toProductImageVOList:getPorductImg(),//选择的图片
projectId: operationsData.selectObject.id,
direction:operationsData.relightDirection,//打光方向
brightenValue:operationsData.brightenValue,
imageStrength:(100 - getImageStrength())/100,
},
//poseTransform
poseTransform:getPoseTransformData(),
private: operationsData.selectObject.id,
ToProductImageDTO: operationsData.selectObject.id,
}
}
let cancelDsign = ()=>{
operationsData.percentOff=''
operationsData.commissionRate=''
operationsData.buildType=''
operationsData.numberOfImages=''
operations.operationsModal = false
}
let setOk = ()=>{
let data
data = setAddData()
Https.axiosPost(Https.httpUrls.createCoupon, data).then(
console.log(data)
if(operationsData.buildType == 'toProductImage' || operationsData.buildType == 'relight'){
if(data.toProductImage.toProductImageVOList.length == 0)return message.warning('Please select the image')
}else if(operationsData.buildType == 'poseTransfer'){
if(data.poseTransform.length == 0)return message.warning('Please enter the number of images')
}
if(!data.buildType || !data.nums)return message.warning('Please check the input box marked with *')
operations.loadingShow = true
Https.axiosPost(Https.httpUrls.designCloud, data).then(
(rv) => {
if (rv) {
operations.loadingShow = false
cancelDsign()
emit('searchHistoryList')
emit('getContentList')
}
}).catch((error) => {
operations.loadingShow = false
})
}
return {
@@ -140,6 +297,7 @@ export default defineComponent({
focus,
blur,
setOk,
changeBuildType,
};
},
data() {
@@ -150,10 +308,39 @@ export default defineComponent({
methods: {
},
directives:{
mousewheel:{
mounted (el) {
el.addEventListener('mouseenter', (e)=> {
if(el.scrollWidth > el.clientWidth){
el.parentElement.style.overflowY = 'hidden';
}
});
// 鼠标移出事件
el.addEventListener('mouseleave', ()=> {
el.parentElement.style.overflowY = 'auto';
});
el.addEventListener('wheel',(e)=>{
let num = 0
if(e.deltaY > 0){
num = 25
}else{
num = -25
}
el.scrollBy(num, 0);
},{ passive: true })
}
},
},
});
</script>
<style lang="less" scoped>
:deep(.ant-modal-mask){
background: rgba(0, 0, 0, 0.2);
}
:deep(.createCloud_modal){
.ant-modal-body{
display: flex;
flex-direction: column;
@@ -183,6 +370,27 @@ export default defineComponent({
flex-direction: row;
flex-wrap: wrap;
align-content: flex-start;
padding: 0 2rem;
> .selectImgList{
width: 100%;
display: flex;
overflow-x: auto;
align-items: center;
flex-wrap: nowrap;
height: 20rem;
margin: 2rem 0;
> .item{
height: 100%;
margin-right: 1rem;
&:last-child{
margin-right: 0;
}
> img{
height: 100%;
}
}
//
}
> .admin_state_item{
width: auto;
// width: 100%;
@@ -201,6 +409,22 @@ export default defineComponent({
> input{
border-radius: 1.6rem;
}
>.sliderAndImput{
display: flex;
align-items: center;
flex: 1;
:deep(> .ant-slider){
// border-radius: 1.6rem;
flex: 1;
}
> input{
border-radius: 1.6rem;
width: 4rem;
margin-left: 1rem;
height: 100%;
border-radius: 1rem;
}
}
}
}
}

View File

@@ -22,26 +22,27 @@
<tr v-for="(row, index) in contentList" :key="index">
<td v-for="header in cloudTiltleList" :key="header.value">
<span v-show="header.value != 'operation'">
{{ row[header.value] }}
{{header?.fun?header.fun(row[header.value]) : row[header.value]}}
</span>
<span v-show="header.value == 'operation'" @click="downloadIamge(row)" style="cursor: pointer;">
download
<span v-show="header.value == 'operation'" @click="detailIamge(row)" style="cursor: pointer;">
Check
</span>
</td>
</tr>
</div>
<a-pagination style="text-align: center;" v-model:current="currentPage" :total="total" show-less-items />
</div>
{{ generateList }}
<createCloud ref="createCloud" :cloudList="generateList[workflowType]"></createCloud>
<createCloud ref="createCloud" :cloudList="generateList[workflowType]" @getContentList="submitGetContentList"></createCloud>
</div>
</template>
<script lang="ts">
import { defineComponent,computed,ref,provide,nextTick,createVNode,toRefs, reactive} from 'vue'
import { defineComponent,computed,ref,onMounted,nextTick,createVNode,toRefs, reactive, onBeforeUnmount} from 'vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { Https } from "@/tool/https";
import { useStore } from "vuex";
import { useI18n } from 'vue-i18n'
import createCloud from "./createCloud.vue";
import { da } from 'element-plus/es/locale';
export default defineComponent({
components:{
createCloud,
@@ -53,39 +54,56 @@ export default defineComponent({
required:true
}
},
emits:[],
emits:['retrieve'],
setup(props,{emit}) {
const store = useStore();
const data = reactive({
pageType:'list',
pageSize:10,
currentPage:1,
total:0,
selectObject:computed(()=>store.state.Workspace.probjects),//选择的项目
generateList:{
seriesDesign:[
{
name:'1',
value:100,
}
label:'Design',
value:'design',
consumption:0,
},{
label:'To Product Image',
value:'toProductImage',
consumption:5,
},{
label:'Relight',
value:'relight',
consumption:5,
},{
label:'Transfer Pose',
value:'poseTransfer',
consumption:10,
},
],
singleProductDesign:[
{
name:'1',
label:'1BuildTyped',
value:100,
}
],
printDesign:[
{
name:'1',
label:'1',
value:100,
}
],
productDrawingDesign:[
{
name:'1',
label:'1',
value:100,
}
],
printingDesign3D:[
{
name:'1',
label:'1',
value:100,
}
],
@@ -96,39 +114,109 @@ export default defineComponent({
name:'File name',
value:'name',
},{
name:'File size',
value:'size',
name:'Build Type',
value:'buildType',
},{
name:'UPloaded by',
value:'upLoadedBy',
name:'Generate quantity',
value:'nums',
},{
name:'Task time',
value:'taskTime',
value:'updateTime',
fun:(value:any)=>{
if(!value)return
return value.split('T')[0] + ' ' + value.split('T')[1].split('.')[0]
}
},{
name:'Schedule',
value:'process',
fun:(value:any)=>{
if(value == '100.00%'){
return 'Completed'
}else{
return value
}
}
},{
name:'Operation',
value:'operation',
},
] as any,
contentList:[
{ name: '张三', size: 28, upLoadedBy: '1', taskTime: '123' },
{ name: '李四', size: 32, upLoadedBy: '2', taskTime: '321' },
{ name: '王五', size: 25, upLoadedBy: '3', taskTime: '222' }
] as any,
isGetContentList:false as any,
})
const dataDom = reactive({
createCloud,
})
const createClound = ()=>{
data.isGetContentList = false
dataDom.createCloud.init()
}
const downloadIamge = (item:any)=>{
const detailIamge = (item:any)=>{
//去除里面的T2025-04-17T13:45:43
if(item.process == '100.00%' || item.status == 1){
let value = {
taskId:item.taskId,
page:1,
size:10,
buildType:item.buildType,
}
Https.axiosPost(Https.httpUrls.getDesignCloudResult,value).then((rv)=>{
console.log(rv)
if(rv.design && rv.design.length > 0){
store.commit('addDesignCollectionList',rv.design)
emit('retrieve','design')
}else if(rv.toProductImage && rv.toProductImage.length > 0){
store.commit('setCloudList',{str:'toProduct',list:rv.toProductImage})
emit('retrieve','toProduct')
}else if(rv.relight && rv.relight.length > 0){
store.commit('setCloudList',{str:'relight',list:rv.relight})
emit('retrieve','relight')
}else if(rv.poseTransfer && rv.poseTransfer.length > 0){
store.commit('setCloudList',{str:'poseTransfer',list:rv.poseTransfer})
emit('retrieve','poseTransfer')
}
data.isGetContentList = false
})
}
}
const getContentList = ()=>{
if(data.isGetContentList){
let value = {
page:data.currentPage,
size:data.pageSize,
projectId: data.selectObject.id,
}
Https.axiosPost(Https.httpUrls.cloudPage,value).then((rv)=>{
data.contentList = rv.content
data.total = rv.total
let arr = rv.content
let result = arr.some((item:any) => (item.process !== '100.00%' && item.status !== 1));
if(!result)data.isGetContentList = false
setTimeout(()=>{
getContentList()
},1500)
})
}
}
const submitGetContentList = ()=>{
data.isGetContentList = true
getContentList()
}
onBeforeUnmount(()=>{
data.isGetContentList = false
})
onMounted(()=>{
data.isGetContentList = true
getContentList()
})
return{
...toRefs(dataDom),
...toRefs(data),
createClound,
downloadIamge,
detailIamge,
getContentList,
submitGetContentList,
}
},
provide() {
@@ -187,6 +275,8 @@ export default defineComponent({
flex: 1;
overflow: hidden;
padding-top: 2.5rem;
display: flex;
flex-direction: column;
> .content tr , > .title{
display: flex;
justify-content: space-between;
@@ -202,12 +292,16 @@ export default defineComponent({
text-align: center;
}
}
.content > tr{
> td{
text-align: center;
width: calc(100% / 4);
line-height: 4.6rem;
font-size: 2.2rem;
.content{
flex: 1;
overflow: hidden;
> tr{
> td{
text-align: center;
width: calc(100% / 4);
line-height: 4.6rem;
font-size: 2.2rem;
}
}
}
}

View File

@@ -376,7 +376,7 @@ export default defineComponent({
}
let getDesignTime = null as any;
const setSystemDesigner = (time:any)=>{
console.log(123)
clearTimeout(collItemSize.collTime)
collItemSize.collTime = setTimeout(()=>{
nextTick(()=>{
@@ -420,6 +420,7 @@ export default defineComponent({
userLikeSortId:item.designItemId
});
})
console.log(posiitonData.value.generateElList)
}
@@ -521,7 +522,6 @@ export default defineComponent({
width = (collItemDom.value.offsetWidth - 30) / 3 * collItemSize.scale[0]
height = (collItemDom.value.offsetWidth - 30) / 3 * collItemSize.scale[1]
}
let moveIndex = Math.round(x / (width + 10)) + Math.round(y / (height + 10)) * num;
moveIndex = elList.length - 1 - moveIndex
moveIndex = moveIndex < 0 ? 0 : moveIndex;
@@ -532,6 +532,7 @@ export default defineComponent({
}else{
posiitonData.value.generateSelectIndex = moveIndex;
}
console.log(elList)
let currentSort = item.sort;
for(let i = 0;i < elList.length;i++){
if(currentSort < moveIndex){
@@ -1180,7 +1181,7 @@ export default defineComponent({
Https.axiosPost(Https.httpUrls.designDislike, data)
.then((rv: any) => {
if (rv) {
this.store.commit("addDesignCollectionList", design);
this.store.commit("addDesignCollectionList", [design]);
this.store.commit(
"deleteLikeDesignCollectionList",
index
@@ -1385,7 +1386,9 @@ export default defineComponent({
this.designNewCollection()
}
nextTick(()=>{
if(this.designCollectionList.length > 0)this.recycleDomHidden = true
this.setSystemDesigner(100)
this.setDesignItemStyle()
})
},
//销毁图片详情

View File

@@ -98,7 +98,9 @@ export default defineComponent({
})
}
},{immediate:true})
watch(()=>data.selectObject.sex,(newVal)=>{
getModel()
})
const dataDom = reactive({
habitSetStyle:null as any,
edit:null as any,

View File

@@ -1,5 +1,30 @@
<template>
<div class="three">
<div class="parameter">
<label>
<span>X:</span>
<a-slider class="system_silder"
v-model:value="repeat.x"
:tooltipVisible="false"
@change="changeRepeat"
:max="2"
:step="0.001"
:min="0.002"
>
</a-slider>
</label>
<label>
<span>Y:</span>
<a-slider class="system_silder"
v-model:value="repeat.y"
:tooltipVisible="false"
@change="changeRepeat"
:max="2"
:step="0.01"
>
</a-slider>
</label>
</div>
<div class="model" ref="threeDom">
</div>
@@ -13,7 +38,7 @@
</div>
</template>
<script lang="ts">
import { defineComponent,computed,shallowRef,provide,nextTick,onMounted,toRefs, reactive} from 'vue'
import { defineComponent,computed,shallowRef,provide,nextTick,onMounted,toRefs, reactive, onBeforeUnmount} from 'vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { Https } from "@/tool/https";
import { useStore } from "vuex";
@@ -46,14 +71,23 @@ export default defineComponent({
renderer:shallowRef() as any,//渲染器
pointLight:shallowRef() as any,//光
controls:shallowRef() as any,//监听鼠标、键盘事件
textureLoader:shallowRef() as any,//材质
load:{
state:false,
progress:0 as any,
}
},
repeat:{
x:1,
y:1,
},
animationId:null as any,
})
const dataDom = reactive({
threeDom:null as any,
})
const dataTime = reactive({
updataRepeat:null as any
})
const init = ()=>{
data.scene = new THREE.Scene();
data.group = new THREE.Group()
@@ -190,8 +224,8 @@ export default defineComponent({
data.controls.enableDamping = true;
let animate = function () {
requestAnimationFrame(animate);
let animate = ()=>{
data.animationId = requestAnimationFrame(animate);
// data.renderer.render(data.scene, data.camera);
// model.rotation.x += 0.01; //旋转物体
var vector = data.camera.position.clone()
@@ -204,6 +238,7 @@ export default defineComponent({
};
animate();
}
const setModel = async (url:any)=>{
clearModel()
await addModel(url)
@@ -215,6 +250,7 @@ export default defineComponent({
let textureLoader = new THREE.TextureLoader()
textureLoader.load(url, // 图片放在public/textures目录下
(texture:any) => {
data.textureLoader = texture
// 3. 配置纹理参数
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;
@@ -229,11 +265,11 @@ export default defineComponent({
const box = new THREE.Box3().setFromObject(child);
const modelWidth = box.getSize(new THREE.Vector3()).x;
const modelHeight = box.getSize(new THREE.Vector3()).y;
const repeatX = modelWidth / textureWidth;
const repeatY = modelHeight / textureHeight;
data.repeat.x = 2 - modelWidth / textureWidth;
data.repeat.y = 2 - modelHeight / textureHeight;
// texture.repeat.set(1, 1); // 纹理重复次数
texture.repeat.set(repeatX, repeatY); // 纹理重复次数
texture.repeat.set(2 - data.repeat.x, 2 - data.repeat.y); // 纹理重复次数
const newMaterial = new THREE.MeshStandardMaterial({
map: texture, // 基础颜色贴图
roughness: 0.7, // 表面粗糙度 (0-1)
@@ -258,6 +294,8 @@ export default defineComponent({
console.error('纹理加载失败:', error);
data.load.state = false
});
})
}
const addModel = async (url:any)=>{
@@ -340,13 +378,43 @@ export default defineComponent({
await setModel(modeUrl)
data.load.state = false
}
const changeRepeat = (e:any)=>{
clearTimeout(dataTime.updataRepeat)
dataTime.updataRepeat = setTimeout(()=>{
data.textureLoader.repeat.set(2 - data.repeat.x,2 - data.repeat.y); // 纹理重复次数
},1000)
}
onMounted(()=>{
})
onBeforeUnmount(()=>{
if(data.animationId){
cancelAnimationFrame(data.animationId);
data.animationId = null;
}
data.scene.traverse((child:any) => {
if (child.material) {
child.material.dispose();
}
if (child.geometry) {
child.geometry.dispose();
}
child = null;
});
data.renderer.forceContextLoss();
data.renderer.dispose();
data.scene.clear();
data.scene = null;
data.camera = null;
data.controls = null;
data.renderer.domElement = null;
data.renderer = null;
})
return{
...toRefs(dataDom),
...toRefs(data),
openSetData,
addMaterial,
changeRepeat,
}
},
provide() {
@@ -362,6 +430,22 @@ export default defineComponent({
position: relative;
flex: 1;
overflow: hidden;
> .parameter{
display: flex;
> label{
display: flex;
align-items: center;
flex: 1;
padding-right: 2rem;
// &:not(:last-child){
// margin-right: 3rem;
// }
> span{
font-size: 2rem;
margin-right: 1rem;
}
}
}
> .model{
width: 100%;
height: 100%;

View File

@@ -169,6 +169,18 @@ export default defineComponent({
if(data.poseList.length == 0){
getPoseList()
}
setCloudImg()
}
const setCloudImg = ()=>{
let arr = store.state.UploadFilesModule.cloudList
let list = JSON.parse(JSON.stringify(arr.poseTransfer)) || []
console.log(list)
list.forEach((item:any)=>{
item.url = item.firstFrameUrl
data.noLikeList.unshift(item)
})
store.commit('clearCloudList','poseTransfer')
}
const gifPlay = (e:any,item:any)=>{
e.target.src = item.gif//使用gif图片
@@ -329,7 +341,7 @@ export default defineComponent({
}
const likeSetBtn = (id:any,str:string)=>{
data.likeList.forEach((item:any,index:any)=>{
if(item.id == id){
if(item.id == id && id){
if(str == 'zoom'){
showViewVideo({url:item.videoUrl})
}else if(str == 'like'){
@@ -340,16 +352,21 @@ export default defineComponent({
}
const noLikeSetBtn = (id:any,str:string)=>{
data.noLikeList.forEach((item:any,index:any)=>{
if(item.id == id){
if(str == 'zoom'){
showViewVideo({url:item.videoUrl})
}else if(str == 'like'){
likeFile(item,'like',index)
if(str == 'delete'){
data.noLikeList = data.noLikeList.filter((v:any) => v.id != id);
}else{
data.noLikeList.forEach((item:any,index:any)=>{
if(item.id == id && id){
if(str == 'zoom'){
showViewVideo({url:item.videoUrl})
}else if(str == 'like'){
likeFile(item,'like',index)
}
}
}
})
})
}
}
let likeFile = (item:any,str:any,index:any) =>{
let url

View File

@@ -169,7 +169,7 @@
</div>
</div> -->
<div class="content">
<generalDrag ref="generalDragLeft" @setBtn="selectSetBtn" :isLike="true" :list="likeList[productimgMenu.value]"></generalDrag>
<generalDrag ref="generalDragLeft" @setBtn="selectSetBtn" :isDelete="false" :isLike="true" :list="likeList[productimgMenu.value]"></generalDrag>
</div>
<!-- </div> -->
@@ -340,6 +340,21 @@ export default defineComponent({
userlikeGroupId = selectDesignList.value.userlikeGroupId
// getLikeProductImage(selectDesignList.value.userlikeGroupId)
productImgDom.generalDragLeft.setItemPosition()
setCloudImg()
}
const setCloudImg = ()=>{
let arr = store.state.UploadFilesModule.cloudList
if(props.productimgMenu.value == 'ToProductImage'){
let list = JSON.parse(JSON.stringify(arr.toProduct)) || []
productImgData.generateList.unshift(...list)
store.commit('clearCloudList','ToProductImage')
}else if(props.productimgMenu.value == 'Relight'){
let list = JSON.parse(JSON.stringify(arr.relight)) || []
productImgData.generateList.unshift(...list)
store.commit('clearCloudList','relight')
}
}
let setproduct = (value:any)=>{
// props.productimgMenu = value
@@ -684,7 +699,6 @@ export default defineComponent({
}
const setLikeZoom = (item:any,str:string,index:number,list:List) =>{
console.log(str)
if(str == 'zoom'){
setScaleImage(list,index,true)
}else{
@@ -701,13 +715,19 @@ export default defineComponent({
})
}
const generateSetBtn = (id:any,str:string)=>{
productImgData.generateList.forEach((item:any,index:number)=>{
if(item.id == id){
let selectStr = ''
str == 'zoom'?selectStr = 'zoom':selectStr ='like'
setLikeZoom(item,selectStr,index,productImgData.generateList)
}
})
console.log(str)
if(str == 'delete'){
productImgData.generateList = productImgData.generateList.filter((v:any) => v.id != id);
}else{
productImgData.generateList.forEach((item:any,index:number)=>{
if(item.id == id){
let selectStr = ''
str == 'zoom'?selectStr = 'zoom':selectStr ='like'
setLikeZoom(item,selectStr,index,productImgData.generateList)
}
})
}
}
const setItemPosition = ()=>{
productImgDom.generalDragLeft.setItemPosition()

View File

@@ -7,7 +7,7 @@
<printingDesign3D v-show="selectKey_ != 'yun'" v-if="selectObject.id && workflowType == 'printingDesign3D'" ref="printingDesign3D" :selectKey_="selectKey_" :workflowType="workflowType" :httpWorkflowType="httpWorkflowType"></printingDesign3D>
<printDesign v-show="selectKey_ != 'yun'" v-if="selectObject.id && workflowType == 'printDesign'" ref="printDesign" :selectKey_="selectKey_" :workflowType="workflowType" :httpWorkflowType="httpWorkflowType"></printDesign>
<div class="public">
<cloudUploading v-show="selectKey_ == 'yun'" v-if="selectObject.id" :workflowType="workflowType" ref="cloudUploading"></cloudUploading>
<cloudUploading v-show="selectKey_ == 'yun'" v-if="selectObject.id" :workflowType="workflowType" ref="cloudUploading" @retrieve="(value:any)=>$emit('retrieve',value)"></cloudUploading>
</div>
</div>
</template>
@@ -40,7 +40,7 @@ export default defineComponent({
workflowType:String,
httpWorkflowType:String,
},
emit:['projectComplete'],
emit:['projectComplete','retrieve'],
setup(props,{emit}) {
const store = useStore();
const data = reactive({
@@ -60,7 +60,6 @@ export default defineComponent({
})
//处理design数据
const setDesignData = (str:any)=>{
console.log(dataDom,str)
// if (str in dataDom) {
if(str == 'workspace' || str == '')return
return new Promise(async (resolve,reject)=>{
@@ -154,36 +153,8 @@ export default defineComponent({
})
}
const setModule = (value:any)=>{//选中设置数据
// setStoreData(value)//设置数据或者清除数据
if(dataDom[data.selectObject.type]?.open)dataDom[data.selectObject.type].open(value.str,value.button)
}
const setStoreData = async (data:any)=>{
let {value,select} = data
let allBoardData = ['sketchBoard','moodBoard','printBoard','colorBoard']
if (select) {
await setDesignData(value)
if(allBoardData.indexOf(value) != -1){
store.commit('setAllBoardData',value)
}else{
let data = {
data:'',
type:value
}
store.commit('setModularData',data)
}
}else{
if(allBoardData.indexOf(value) != -1){
store.commit('clearAllBoardData',value)
}else{
let data = {
data:null,
type:value
}
store.commit('setModularData',data)
}
}
}
const unfold = ()=>{
dataDom[data.selectObject.type].unfold()
}

View File

@@ -1,7 +1,7 @@
<template>
<div class="workflowBox">
<div class="workflow" v-show="isUpdataPorject || selectObject.id">
<navList @setSelectKey="setSelectKey" @unfold="unfold" @goHome="goHome" :navListData="navListData" :selectKey="selectKey"></navList>
<navList ref="navList" @setSelectKey="setSelectKey" @unfold="unfold" @goHome="goHome" :navListData="navListData" :selectKey="selectKey"></navList>
<div class="contentBox" :style="[{overflow:selectKey == 'canvas'?'hidden':''}]">
<div class="homeContent" ref="parent">
<navListBox
@@ -26,7 +26,7 @@
</div>
<div class="text" @click="setBack()"><i class="fi fi-bs-down-left-and-up-right-to-center"></i></div>
</div>
<content ref="content" :selectKey_="selectKey_" @projectComplete="setBack()" :workflowType="workflowType" :httpWorkflowType="httpWorkflowType"></content>
<content ref="content" @retrieve="retrieve" :selectKey_="selectKey_" @projectComplete="setBack()" :workflowType="workflowType" :httpWorkflowType="httpWorkflowType"></content>
</div>
</div>
</div>
@@ -101,7 +101,8 @@ export default defineComponent({
})
const dataDom = reactive({
parent:null as any,
content:null as any
content:null as any,
navList:null as any
})
const setBack = ()=>{
data.selectKey = ''
@@ -168,6 +169,10 @@ export default defineComponent({
const unfold = ()=>{
dataDom.content.unfold()
}
const retrieve = (str:any)=>{
console.log(str)
dataDom.navList.uploadSelectKey(str)
}
return{
...toRefs(dataDom),
...toRefs(data),
@@ -176,6 +181,7 @@ export default defineComponent({
setSelectKey,
unfold,
goHome,
retrieve,
}
},

View File

@@ -12,16 +12,16 @@
<i class="fi fi-sr-home"></i>
<span v-show="isUnfold">Home</span>
</div>
<div class="navList" :class="{active:selectKey == 'workspace'}" @click="setNav('workspace', $event)">
<div class="navList" :class="{active:selectKey == 'workspace'}" @click="setNav('workspace', $event.target)">
<i class="fi fi-rr-settings-sliders"></i>
<span v-show="isUnfold">Settings</span>
</div>
<div class="border"></div>
<div class="navList list" :class="{active:selectKey == item.value,exist:navListData.some((navListItem:any) => navListItem.value === item.value)}" v-for="item in navList" :key="item.value" @click="setNav(item.value, $event)">
<div class="navList list" :class="[selectKey == item.value?'active':'',navListData.some((navListItem:any) => navListItem.value === item.value)?'exist':'',item.value]" v-for="item in navList" :key="item.value" @click="setNav(item.value, $event.target)">
<i :class="item.icon"></i>
<span v-show="isUnfold">{{ item.name }}</span>
</div>
<div class="navList list exist" style="margin-top: auto;" @click="setNav('yun', $event)">
<div class="navList list exist" style="margin-top: auto;" @click="setNav('yun', $event.target)">
<i class="fi fi-rr-cloud-upload-alt"></i>
<span v-show="isUnfold">云生成</span>
</div>
@@ -53,10 +53,10 @@ export default defineComponent({
const dataDom = reactive({
})
const setNav = (str:any,event:any)=>{
const setNav = (str:any,target:any)=>{
let data = {
str:str == props.selectKey?'':str,
dom:event.target,
dom:target,
posiiton:'nav',
}
@@ -85,6 +85,10 @@ export default defineComponent({
store.commit('createProbject')
emit("goHome");
}
const uploadSelectKey = (str:any)=>{
let dom = document.querySelector(`.homeNav .${str}`)
setNav(str,dom)
}
return{
...toRefs(dataDom),
...toRefs(data),
@@ -92,6 +96,7 @@ export default defineComponent({
setUnfold,
goHome,
projectList,
uploadSelectKey,
}
},

View File

@@ -71,7 +71,7 @@
</div>
</template>
<script lang="ts">
import { defineComponent,computed,watch,nextTick,onBeforeMount,toRefs, reactive, onMounted, inject} from 'vue'
import { defineComponent,computed,watch,nextTick,onBeforeUnmount,toRefs, reactive, onMounted, inject} from 'vue'
// import setDesignItem from '@/component/Detail/setDesignItem2.vue'
import { useStore } from "vuex";
import { useI18n } from 'vue-i18n'

View File

@@ -251,6 +251,7 @@ export default defineComponent({
publishData.subPublishDate.openSource = publishData.selectPermissions.isSecondaryCreation?1:0
let tagDTO = textareaChange()
publishData.subPublishDate.tagsDTO = tagDTO
publishData.subPublishDate.projectId = store.state.Workspace.probjects.id
param.append('data',JSON.stringify(publishData.subPublishDate))
let config:any = {headers:{'Content-Type':'multipart/form-data','Accept':'*/*' }}
// let data = publishData.subPublishDate

View File

@@ -27,7 +27,7 @@
<div class="zoom" v-if="item.url" @click.stop="()=>$emit('setBtn',item.id,'zoom')">
<i class="fi fi-bs-expand-arrows-alt"></i>
</div>
<div class="delete" v-if="item.url" @click.stop="()=>$emit('setBtn',item.id,'zoom')">
<div class="delete" v-if="item.url && isDelete" @click.stop="()=>$emit('setBtn',item.id,'delete')">
<i class="fi fi-rr-trash icon_delete"></i>
</div>
</div>
@@ -50,6 +50,7 @@ export default defineComponent({
isVideo:{type:Boolean,default:false},
showMark:{type:Boolean,default:false},
isLike:{type:Boolean,default:false},
isDelete:{type:Boolean,default:true},
},
emits:['setBtn','setSort'],
setup(props,{emit}) {