From 833d43d7d15cb3554d429603f5c8d637a8146454 Mon Sep 17 00:00:00 2001 From: X1627315083 <1627315083@qq.com> Date: Tue, 13 Jan 2026 14:07:51 +0800 Subject: [PATCH 01/17] =?UTF-8?q?detail=E9=A1=B5=E9=9D=A2sketch=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=95=9C=E5=83=8F=E3=80=81detail=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=90=88=E6=88=90=E7=94=B1=E5=89=8D=E7=AB=AF=E6=9D=A5=E5=81=9A?= =?UTF-8?q?=EF=BC=8C=E4=BD=86=E6=98=AF=E6=96=B0=E5=A2=9Esketch=E8=BF=98?= =?UTF-8?q?=E6=98=AF=E8=A6=81=E8=BF=87=E6=8E=A5=E5=8F=A3=EF=BC=8Csketch?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=86=E8=8A=82=E4=BD=8D=E7=BD=AE=E5=8F=98?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 260 ++++++++ package.json | 1 + src/component/Detail/DesignDetail.vue | 232 +++++-- src/component/Detail/addDetails.vue | 98 --- src/component/Detail/canvas/index.vue | 89 ++- .../Detail/detailLeft/colorBox/index.vue | 61 +- src/component/Detail/detailLeft/index.vue | 8 +- .../Detail/detailLeft/module/currentList.vue | 1 - .../Detail/detailLeft/module/uploadList.vue | 1 - .../detailLeft/module/uploadSegmentation.vue | 1 - .../Detail/detailRight/editPrintElement.vue | 128 +++- .../overallSetting/RepeatSetting.vue | 124 ++++ .../overallSetting/tools/AngleTool.vue | 122 ++++ .../overallSetting/tools/MySelect.vue | 66 ++ .../overallSetting/tools/OffsetTool.vue | 190 ++++++ .../overallSetting/tools/Slider.vue | 160 +++++ src/component/Detail/model/index.vue | 83 ++- src/component/Detail/model/modelNav.vue | 11 +- src/component/Detail/model/modelPosition.vue | 625 +++++++++--------- src/component/home/design/collection/more.vue | 20 +- src/component/modules/generalMiniCanvas.vue | 12 +- src/store/Detail/designDetail.ts | 35 +- src/tool/util.js | 57 +- 23 files changed, 1799 insertions(+), 586 deletions(-) delete mode 100644 src/component/Detail/addDetails.vue create mode 100644 src/component/Detail/detailRight/overallSetting/RepeatSetting.vue create mode 100644 src/component/Detail/detailRight/overallSetting/tools/AngleTool.vue create mode 100644 src/component/Detail/detailRight/overallSetting/tools/MySelect.vue create mode 100644 src/component/Detail/detailRight/overallSetting/tools/OffsetTool.vue create mode 100644 src/component/Detail/detailRight/overallSetting/tools/Slider.vue diff --git a/package-lock.json b/package-lock.json index 0e42a09e..c319c9a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,7 @@ "vue-draggable-plus": "^0.6.0", "vue-i18n": "^9.6.1", "vue-router": "^4.0.3", + "vue3-moveable": "^0.28.0", "vuedraggable": "^4.1.0", "vuex": "^4.0.0", "x-sender": "^1.1.6" @@ -232,6 +233,15 @@ "node": ">=6.9.0" } }, + "node_modules/@cfcs/core": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/@cfcs/core/-/core-0.0.6.tgz", + "integrity": "sha512-FxfJMwoLB8MEMConeXUCqtMGqxdtePQxRBOiGip9ULcYYam3WfCgoY6xdnMaSkYvRvmosp5iuG+TiPofm65+Pw==", + "license": "MIT", + "dependencies": { + "@egjs/component": "^3.0.2" + } + }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", @@ -240,6 +250,39 @@ "node": ">=10" } }, + "node_modules/@daybrush/utils": { + "version": "1.13.0", + "resolved": "https://registry.npmmirror.com/@daybrush/utils/-/utils-1.13.0.tgz", + "integrity": "sha512-ALK12C6SQNNHw1enXK+UO8bdyQ+jaWNQ1Af7Z3FNxeAwjYhQT7do+TRE4RASAJ3ObaS2+TJ7TXR3oz2Gzbw0PQ==", + "license": "MIT" + }, + "node_modules/@egjs/agent": { + "version": "2.4.4", + "resolved": "https://registry.npmmirror.com/@egjs/agent/-/agent-2.4.4.tgz", + "integrity": "sha512-cvAPSlUILhBBOakn2krdPnOGv5hAZq92f1YHxYcfu0p7uarix2C6Ia3AVizpS1SGRZGiEkIS5E+IVTLg1I2Iog==", + "license": "MIT" + }, + "node_modules/@egjs/children-differ": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@egjs/children-differ/-/children-differ-1.0.1.tgz", + "integrity": "sha512-DRvyqMf+CPCOzAopQKHtW+X8iN6Hy6SFol+/7zCUiE5y4P/OB8JP8FtU4NxtZwtafvSL4faD5KoQYPj3JHzPFQ==", + "license": "MIT", + "dependencies": { + "@egjs/list-differ": "^1.0.0" + } + }, + "node_modules/@egjs/component": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@egjs/component/-/component-3.0.5.tgz", + "integrity": "sha512-cLcGizTrrUNA2EYE3MBmEDt2tQv1joVP1Q3oDisZ5nw0MZDx2kcgEXM+/kZpfa/PAkFvYVhRUZwytIQWoN3V/w==", + "license": "MIT" + }, + "node_modules/@egjs/list-differ": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@egjs/list-differ/-/list-differ-1.0.1.tgz", + "integrity": "sha512-OTFTDQcWS+1ZREOdCWuk5hCBgYO4OsD30lXcOCyVOAjXMhgL5rBRDnt/otb6Nz8CzU0L/igdcaQBDLWc4t9gvg==", + "license": "MIT" + }, "node_modules/@element-plus/icons-vue": { "version": "2.3.1", "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", @@ -1224,6 +1267,34 @@ "win32" ] }, + "node_modules/@scena/dragscroll": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@scena/dragscroll/-/dragscroll-1.4.0.tgz", + "integrity": "sha512-3O8daaZD9VXA9CP3dra6xcgt/qrm0mg0xJCwiX6druCteQ9FFsXffkF8PrqxY4Z4VJ58fFKEa0RlKqbsi/XnRA==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.6.0", + "@scena/event-emitter": "^1.0.2" + } + }, + "node_modules/@scena/event-emitter": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@scena/event-emitter/-/event-emitter-1.0.5.tgz", + "integrity": "sha512-AzY4OTb0+7ynefmWFQ6hxDdk0CySAq/D4efljfhtRHCOP7MBF9zUfhKG3TJiroVjASqVgkRJFdenS8ArZo6Olg==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.1.1" + } + }, + "node_modules/@scena/matrix": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@scena/matrix/-/matrix-1.1.1.tgz", + "integrity": "sha512-JVKBhN0tm2Srl+Yt+Ywqu0oLgLcdemDQlD1OxmN9jaCTwaFPZ7tY8n6dhVgMEaR9qcR7r+kAlMXnSfNyYdE+Vg==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.4.0" + } + }, "node_modules/@simonwep/pickr": { "version": "1.8.2", "resolved": "https://registry.npmmirror.com/@simonwep/pickr/-/pickr-1.8.2.tgz", @@ -2904,6 +2975,52 @@ "node": ">= 0.10" } }, + "node_modules/croact": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/croact/-/croact-1.0.4.tgz", + "integrity": "sha512-9GhvyzTY/IVUrMQ2iz/mzgZ8+NcjczmIo/t4FkC1CU0CEcau6v6VsEih4jkTa4ZmRgYTF0qXEZLObCzdDFplpw==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.13.0", + "@egjs/list-differ": "^1.0.0" + } + }, + "node_modules/croact-css-styled": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/croact-css-styled/-/croact-css-styled-1.1.9.tgz", + "integrity": "sha512-G7yvRiVJ3Eoj0ov2h2xR4312hpOzATay2dGS9clK8yJQothjH1sBXIyvOeRP5wBKD9mPcKcoUXPCPsl0tQog4w==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.13.0", + "css-styled": "~1.0.8", + "framework-utils": "^1.1.0" + } + }, + "node_modules/croact-moveable": { + "version": "0.9.0", + "resolved": "https://registry.npmmirror.com/croact-moveable/-/croact-moveable-0.9.0.tgz", + "integrity": "sha512-fc3bieV6CdqqZFtzsSLi9KmvUMFW3oakUfhPCls1BxKjOfUfn8rktteGED2341A/Qghy8tI3Hm6SdocIc68IKg==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.13.0", + "@egjs/agent": "^2.2.1", + "@egjs/children-differ": "^1.0.1", + "@egjs/list-differ": "^1.0.0", + "@scena/dragscroll": "^1.4.0", + "@scena/event-emitter": "^1.0.5", + "@scena/matrix": "^1.1.1", + "croact-css-styled": "^1.1.9", + "css-to-mat": "^1.1.1", + "framework-utils": "^1.1.0", + "gesto": "^1.19.3", + "overlap-area": "^1.1.0", + "react-css-styled": "^1.1.9", + "react-moveable": "~0.56.0" + }, + "peerDependencies": { + "croact": "^1.0.4" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3014,6 +3131,25 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/css-styled": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/css-styled/-/css-styled-1.0.8.tgz", + "integrity": "sha512-tCpP7kLRI8dI95rCh3Syl7I+v7PP+2JYOzWkl0bUEoSbJM+u8ITbutjlQVf0NC2/g4ULROJPi16sfwDIO8/84g==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.13.0" + } + }, + "node_modules/css-to-mat": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/css-to-mat/-/css-to-mat-1.1.1.tgz", + "integrity": "sha512-kvpxFYZb27jRd2vium35G7q5XZ2WJ9rWjDUMNT36M3Hc41qCrLXFM5iEKMGXcrPsKfXEN+8l/riB4QzwwwiEyQ==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.13.0", + "@scena/matrix": "^1.0.0" + } + }, "node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", @@ -4354,6 +4490,12 @@ "node": ">=0.10.0" } }, + "node_modules/framework-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/framework-utils/-/framework-utils-1.1.0.tgz", + "integrity": "sha512-KAfqli5PwpFJ8o3psRNs8svpMGyCSAe8nmGcjQ0zZBWN2H6dZDnq+ABp3N3hdUmFeMrLtjOCTXD4yplUJIWceg==", + "license": "MIT" + }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", @@ -4485,6 +4627,16 @@ "node": ">=10" } }, + "node_modules/gesto": { + "version": "1.19.4", + "resolved": "https://registry.npmmirror.com/gesto/-/gesto-1.19.4.tgz", + "integrity": "sha512-hfr/0dWwh0Bnbb88s3QVJd1ZRJeOWcgHPPwmiH6NnafDYvhTsxg+SLYu+q/oPNh9JS3V+nlr6fNs8kvPAtcRDQ==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.13.0", + "@scena/event-emitter": "^1.0.2" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -5695,6 +5847,24 @@ "setimmediate": "^1.0.5" } }, + "node_modules/keycode": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/keycode/-/keycode-2.2.1.tgz", + "integrity": "sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==", + "license": "MIT" + }, + "node_modules/keycon": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/keycon/-/keycon-1.4.0.tgz", + "integrity": "sha512-p1NAIxiRMH3jYfTeXRs2uWbVJ1WpEjpi8ktzUyBJsX7/wn2qu2VRXktneBLNtKNxJmlUYxRi9gOJt1DuthXR7A==", + "license": "MIT", + "dependencies": { + "@cfcs/core": "^0.0.6", + "@daybrush/utils": "^1.7.1", + "@scena/event-emitter": "^1.0.2", + "keycode": "^2.2.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", @@ -6212,6 +6382,19 @@ "pathe": "^2.0.1" } }, + "node_modules/moveable": { + "version": "0.53.0", + "resolved": "https://registry.npmmirror.com/moveable/-/moveable-0.53.0.tgz", + "integrity": "sha512-71jS9zIoQzMhnNvduhg4tUEdm23+fO/40FN7muVMbZvVwbTku2MIxxLhnU4qFvxI4oVxn75l79SbtgjuA+s7Pw==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.13.0", + "@scena/event-emitter": "^1.0.5", + "croact": "^1.0.4", + "croact-moveable": "~0.9.0", + "react-moveable": "~0.56.0" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", @@ -6650,6 +6833,15 @@ "node": ">= 0.8.0" } }, + "node_modules/overlap-area": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/overlap-area/-/overlap-area-1.1.0.tgz", + "integrity": "sha512-3dlJgJCaVeXH0/eZjYVJvQiLVVrPO4U1ZGqlATtx6QGO3b5eNM6+JgUKa7oStBTdYuGTk7gVoABCW6Tp+dhRdw==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.7.1" + } + }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz", @@ -7037,6 +7229,46 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react-css-styled": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/react-css-styled/-/react-css-styled-1.1.9.tgz", + "integrity": "sha512-M7fJZ3IWFaIHcZEkoFOnkjdiUFmwd8d+gTh2bpqMOcnxy/0Gsykw4dsL4QBiKsxcGow6tETUa4NAUcmJF+/nfw==", + "license": "MIT", + "dependencies": { + "css-styled": "~1.0.8", + "framework-utils": "^1.1.0" + } + }, + "node_modules/react-moveable": { + "version": "0.56.0", + "resolved": "https://registry.npmmirror.com/react-moveable/-/react-moveable-0.56.0.tgz", + "integrity": "sha512-FmJNmIOsOA36mdxbrc/huiE4wuXSRlmon/o+/OrfNhSiYYYL0AV5oObtPluEhb2Yr/7EfYWBHTxF5aWAvjg1SA==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.13.0", + "@egjs/agent": "^2.2.1", + "@egjs/children-differ": "^1.0.1", + "@egjs/list-differ": "^1.0.0", + "@scena/dragscroll": "^1.4.0", + "@scena/event-emitter": "^1.0.5", + "@scena/matrix": "^1.1.1", + "css-to-mat": "^1.1.1", + "framework-utils": "^1.1.0", + "gesto": "^1.19.3", + "overlap-area": "^1.1.0", + "react-css-styled": "^1.1.9", + "react-selecto": "^1.25.0" + } + }, + "node_modules/react-selecto": { + "version": "1.26.3", + "resolved": "https://registry.npmmirror.com/react-selecto/-/react-selecto-1.26.3.tgz", + "integrity": "sha512-Ubik7kWSnZyQEBNro+1k38hZaI1tJarE+5aD/qsqCOA1uUBSjgKVBy3EWRzGIbdmVex7DcxznFZLec/6KZNvwQ==", + "license": "MIT", + "dependencies": { + "selecto": "~1.26.3" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", @@ -7507,6 +7739,24 @@ "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", "dev": true }, + "node_modules/selecto": { + "version": "1.26.3", + "resolved": "https://registry.npmmirror.com/selecto/-/selecto-1.26.3.tgz", + "integrity": "sha512-gZHgqMy5uyB6/2YDjv3Qqaf7bd2hTDOpPdxXlrez4R3/L0GiEWDCFaUfrflomgqdb3SxHF2IXY0Jw0EamZi7cw==", + "license": "MIT", + "dependencies": { + "@daybrush/utils": "^1.13.0", + "@egjs/children-differ": "^1.0.1", + "@scena/dragscroll": "^1.4.0", + "@scena/event-emitter": "^1.0.5", + "css-styled": "^1.0.8", + "css-to-mat": "^1.1.1", + "framework-utils": "^1.1.0", + "gesto": "^1.19.4", + "keycon": "^1.2.0", + "overlap-area": "^1.1.0" + } + }, "node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", @@ -9765,6 +10015,16 @@ "vue": "^3.0.0" } }, + "node_modules/vue3-moveable": { + "version": "0.28.0", + "resolved": "https://registry.npmmirror.com/vue3-moveable/-/vue3-moveable-0.28.0.tgz", + "integrity": "sha512-vplQO0XkxVEtXMDh2/lZE+c5kMycGXAfYFMvbwFKi8UVYzVk8MTgVHr4fxO9Z+4i4Rb+U/IEIgkhHRMAbx8FJg==", + "license": "MIT", + "dependencies": { + "framework-utils": "^1.1.0", + "moveable": "~0.53.0" + } + }, "node_modules/vuedraggable": { "version": "4.1.0", "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz", diff --git a/package.json b/package.json index 962ae9e0..d83dfe55 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "vue-draggable-plus": "^0.6.0", "vue-i18n": "^9.6.1", "vue-router": "^4.0.3", + "vue3-moveable": "^0.28.0", "vuedraggable": "^4.1.0", "vuex": "^4.0.0", "x-sender": "^1.1.6" diff --git a/src/component/Detail/DesignDetail.vue b/src/component/Detail/DesignDetail.vue index 4b63b4d4..99ccda39 100644 --- a/src/component/Detail/DesignDetail.vue +++ b/src/component/Detail/DesignDetail.vue @@ -50,7 +50,7 @@
- +
@@ -61,7 +61,6 @@ {{$t('DesignPrintOperation.Preview')}}
-
- +
+
-
@@ -130,14 +128,13 @@ import canvasBox from './canvas/index.vue' import { ExclamationCircleOutlined } from '@ant-design/icons-vue'; import { Https } from "@/tool/https"; import { Modal,message } from 'ant-design-vue'; -import {getUploadUrl,isMoible,setGradual} from '@/tool/util' +import {getUploadUrl,segmentImage,setGradual,rgbToHsv,rgbaToHex} from '@/tool/util' import { useStore } from "vuex"; import { openGuide,driverObj__ } from "@/tool/guide"; import { useI18n } from 'vue-i18n' -import addDetails from '@/component/Detail/addDetails.vue' export default defineComponent({ components:{ - detailLeft,model,detailRight,canvasBox,addDetails + detailLeft,model,detailRight,canvasBox }, emits:['destroy'], setup(props,{emit}) { @@ -148,7 +145,6 @@ export default defineComponent({ canvasBox, detailRight, detailLeft:null as any, - addDetails:null as any, }) const userDetail = computed(()=>{ return store.state.UserHabit.userDetail @@ -157,10 +153,12 @@ export default defineComponent({ selectObject:computed(()=>store.state.Workspace.probjects) as any,//选择的项目 designDetail:computed(()=>store.state.DesignDetail.designDetail), currentDetailType:computed(()=>store.state.DesignDetail.currentDetailType), + frontBack:computed(()=>store.state.DesignDetail.frontBack), selectDetail:computed(()=>store.state.DesignDetail.selectDetail), designDetailShow:false, loadingShow:false, oppositeRevocationShow:-1, + imgDomIndex:-1, revocationShow:-1, isEditPattern:{ value:'' as any, @@ -174,8 +172,13 @@ export default defineComponent({ }, positionKey:0, isUndividedLayerWithSinglePrint:false, + detailLeftColorKey:0, }) - + watch(()=>detailData.selectDetail,(newValue,oldValue)=>{ + detailData.imgDomIndex = detailData.frontBack.front.findIndex((item:any)=>item.id == newValue.id) + if(newValue?.undividedLayer)newValue.undividedLayer_ = newValue.undividedLayer + // privewDetail(oldValue) + },{immediate: true}) provide('getCanvasIfEdit',detailData.getCanvasIfEdit) provide('singleOveral',detailData.singleOveral) @@ -320,13 +323,15 @@ export default defineComponent({ const setCurrentDetail = (str:string)=>{ store.commit('DesignDetail/setCurrentDetailType',str) } - const setClothes = async (list:any)=>{ + const setClothes = async (list:any,str:string)=>{ let clothesList:any = [] await nextTick() + if(detailData.isEditPattern.value == 'editSketch')await detailDom.canvasBox.submitBase64Data().then((rv)=>{ + detailData.selectDetail.sketchString = rv + }) for(let i = 0;i{ let workspace = store.state.Workspace.probjects - let clothes:any = await setClothes(detailData.designDetail.clothes) + let clothes:any = await setClothes(detailData.designDetail.clothes,'sub') let data = { designItemId:detailData.designDetail.designItemId, designSingleItemDTOList:clothes, @@ -466,9 +474,41 @@ export default defineComponent({ detailData.loadingShow = false }); } - const previwe = ()=>{ - let data = getSubmitData('preview') - store.dispatch('DesignDetail/setSubmit',data) + const previwe = async ()=>{ + if((detailData.currentDetailType == 'sketch' && !detailData.isEditPattern.value) || detailData.isEditPattern.value == 'editSketch'){ + let data = getSubmitData('preview') + store.dispatch('DesignDetail/setSubmit',data) + }else{ + //走画布合成图片并且直接分割 + if(detailData.isEditPattern.value !== 'canvasEditor'){ + if(detailDom.detailRight?.privewDetail)await (detailDom.detailRight as any).privewDetail() + let otherData = await updateOtherLayers('single') + await detailDom.canvasBox.updateOtherLayers(otherData) + } + await detailDom.canvasBox.privewDetail() + let img = new Image() + img.onload = ()=>{ + let partialDesign = detailData.selectDetail.partialDesign.partialDesignBase64 || detailData.selectDetail.partialDesign.partialDesignPath + let size = { + width:img.width, + height:img.height, + } + segmentImage(detailData.selectDetail.maskUrl,partialDesign,size).then(async (rv)=>{ + let front = detailData.frontBack.front[detailData.imgDomIndex] + let back = detailData.frontBack.back[detailData.imgDomIndex] + if(!front?.oldImageUrl)front.oldImageUrl = front.imageUrl + if(!front?.oldMaskUrl)front.oldMaskUrl = front.maskUrl + if(!back?.oldImageUrl)back.oldImageUrl = back.imageUrl + if(!front?.oldMaskUrl)store.commit('DesignDetail/updataDetailItem',{maskUrl:front.oldMaskUrl}) + + front.imageUrl = rv.targetFrontUrl + back.imageUrl = rv.targetBackUrl + detailData.selectDetail.undividedLayerWithSinglePrint = partialDesign + store.commit('DesignDetail/canvasPreviewUpdata',{type:detailData.isEditPattern.value?'all':detailData.currentDetailType,callBack:setRevocation}) + }) + } + img.src = detailData.selectDetail.path + } } const modelOnLoad = ()=>{ if(!detailData.isUndividedLayerWithSinglePrint)return @@ -480,31 +520,132 @@ export default defineComponent({ const detailEdit = async (str:any)=>{ if(str){ if(detailData.isEditPattern.value && detailData.isEditPattern.value == str){ - await detailDom.canvasBox.saveCanvas() + // await detailDom.canvasBox.saveCanvas() + await (detailDom.canvasBox as any).privewDetail() + if(detailData.isEditPattern.value == 'canvasEditor')await uploadElement() detailData.isEditPattern.value = '' }else{ - if(detailData.isEditPattern.value){ - detailDom.canvasBox.editFront(str) - } + // if(detailData.isEditPattern.value && (str == 'canvasEditor' || str == 'redGreenExample')){ + // detailDom.canvasBox.editFront(str) + // } + detailDom.canvasBox.editFront(str) + let otherData = await updateOtherLayers('single') + await detailDom.canvasBox.updateOtherLayers(otherData) detailData.isEditPattern.value = str } }else{ detailData.isEditPattern.value = '' } } + const getColorName = (color:any)=>{ + let rgb:any = [color.r, color.g, color.b]; + let hsv = rgbToHsv(rgb); + let data = [{ + h: hsv[0], + s: hsv[1], + v: hsv[2], + }] + return new Promise((resolve, reject) => { + Https.axiosPost(Https.httpUrls.getRgbByHsvBatch, data) + .then((rv) => { + if (rv) { + resolve(rv[0]) + } + }) + .catch((res) => { + resolve({name:'--',tcx:'--'}) + }); + }) + } + const updateOtherLayers = async (str:any='all')=>{//更新到画布图层 + let otherData:any = {} + if(detailDom.detailRight?.privewDetail)await (detailDom.detailRight as any).privewDetail() + if(str == 'all'){ + otherData = { + color: detailData.selectDetail.newDetail?.color.r?detailData.selectDetail.newDetail?.color:detailData.selectDetail.color, + printObject: detailData.selectDetail.newDetail?.print?.length>0?{prints:detailData.selectDetail.newDetail?.print}:detailData.selectDetail.printObject || null, + trims: detailData.selectDetail.newDetail?.element?.length>0?detailData.selectDetail.newDetail?.element:detailData.selectDetail.trims || null, + } + }else if(str == 'single'){ + otherData = { + color: detailData.selectDetail.color, + printObject: detailData.selectDetail.printObject || null, + trims: detailData.selectDetail.trims || null, + } + if(detailData.currentDetailType == 'color'){ + let color = detailData.selectDetail.newDetail?.color + console.log(color) + // let colorData:any = await getColorName(color?.rgba) + if(detailData.selectDetail.newDetail?.color?.rgba?.r){ + color.rgba = {r:color.r,g:color.g,b:color.b,a:color.a} + otherData.color = color + } + } + if(detailData.currentDetailType == 'print'){ + otherData.printObject = detailData.selectDetail.newDetail?.print?.length>0?{prints:detailData.selectDetail.newDetail?.print}:detailData.selectDetail.printObject || null + } + if(detailData.currentDetailType == 'element'){ + otherData.trims = detailData.selectDetail.newDetail?.element?.length>0?detailData.selectDetail.newDetail?.element:detailData.selectDetail.trims || null + } + } + console.log(otherData,'=======',detailData.selectDetail) + return otherData + } + const uploadElement = async ()=>{//取出画布数据更新到detail + if(detailData.isEditPattern.value == 'canvasEditor'){ + // await detailDom.canvasBox.saveCanvas() + const allInfo = await (detailDom.canvasBox as any).getCanvasElement() + console.log(allInfo,'allInfo') + if(allInfo.trims?.length > 0){ + // detailData.selectDetail.trims.prints = allInfo.trims + let value = { + data:allInfo.trims, + str:'element' + } + store.commit('DesignDetail/setNewDetail',value) + } + if(allInfo.prints?.length > 0){ + // detailData.selectDetail.printObject.prints = allInfo.prints + let value = { + data:allInfo.prints, + str:'print' + } + store.commit('DesignDetail/setNewDetail',value) + } + if(allInfo.color?.color?.rgba){ + let canvasColor = allInfo.color.color + let colorData:any = await getColorName(allInfo.color.color?.rgba) + let value:any = { + data:{ + hsv:{ + h:colorData.h, + s:colorData.s, + v:colorData.v, + }, + name:colorData.name, + tcx:colorData.tcx, + rgba:canvasColor.rgba, + hex:rgbaToHex([canvasColor.rgba.r,canvasColor.rgba.g,canvasColor.rgba.b]), + }, + str:'color' + } + if(canvasColor.gradient){ + value.data.gradient = canvasColor.gradient + } + store.commit('DesignDetail/setNewDetail',value) + if(allInfo.color.color.gradient)detailData.selectDetail.color.gradient = allInfo.color.color.gradient + if(detailData.currentDetailType == 'color'){ + detailData.detailLeftColorKey++ + } + } + } + } const canvasReload = async ()=>{ if(detailData.isEditPattern.value){ await detailDom.canvasBox.saveCanvas() } detailData.canvasKey += 1 } - let time = null as any - const handleResize = ()=>{ - clearTimeout(time) - time = setTimeout(()=>{ - store.commit('DesignDetail/setDesignDetail',detailData.designDetail) - },1000) - } const sketchSysToLibrary = ()=>{//系统sketch添加到library更新library coverRevocation() detailDom.detailLeft.sketchSysToLibrary() @@ -516,11 +657,6 @@ export default defineComponent({ sessionStorage.setItem('revocation', JSON.stringify(revocation)); sessionStorage.setItem('oppositeRevocation',JSON.stringify([])); } - - const addDetail = () =>{ - let addDetails:any = detailDom.addDetails - addDetails.init(detailData.selectDetail,'') - } const setSloganData = (data:any)=>{ detailData.selectDetail.sketchString = data if(detailData.currentDetailType == 'sketch' && detailData.selectDetail?.newDetail?.sketch){ @@ -528,14 +664,12 @@ export default defineComponent({ } } onMounted(()=>{ - window.addEventListener('resize', handleResize); }) onBeforeUnmount(()=>{ sessionStorage.removeItem('oppositeRevocation') sessionStorage.removeItem('revocation') store.commit('DesignDetail/clearDesignDetail') - window.removeEventListener('resize', handleResize); }) return{ @@ -553,8 +687,8 @@ export default defineComponent({ canvasReload, modelOnLoad, sketchSysToLibrary, - addDetail, setSloganData, + updateOtherLayers,//更新到画布图层 再canvasInit中执行 } }, @@ -680,6 +814,24 @@ export default defineComponent({ flex: 1; flex-direction: column; overflow: hidden; + &.canvas{ + opacity: 0; + position: absolute; + flex: auto; + width: 35vw; + height: 80vh; + pointer-events: none; + transform: translate(100vw,100vh); + } + &.active{ + position: relative; + opacity: 1; + flex: 1; + width: auto; + height: auto; + pointer-events: auto; + transform: translate(0,0); + } } } .btn{ diff --git a/src/component/Detail/addDetails.vue b/src/component/Detail/addDetails.vue deleted file mode 100644 index 47544254..00000000 --- a/src/component/Detail/addDetails.vue +++ /dev/null @@ -1,98 +0,0 @@ - - - \ No newline at end of file diff --git a/src/component/Detail/canvas/index.vue b/src/component/Detail/canvas/index.vue index 0f6216c7..2d59df2c 100644 --- a/src/component/Detail/canvas/index.vue +++ b/src/component/Detail/canvas/index.vue @@ -6,16 +6,15 @@
-
+
-->
-
+
+ +
- -
-
    + + +
    +
    • @@ -82,12 +102,15 @@
    -
    + +
    +
    +
@@ -106,8 +129,13 @@ import { defineComponent,computed,ref,onMounted,nextTick,watch,toRefs, reactive, // import setDesignItem from '@/component/Detail/setDesignItem2.vue' import { useStore } from "vuex"; import { getMousePosition } from "@/tool/mdEvent"; +import { sketchToMask } from "@/tool/util"; +import pingpu from '@/component/Canvas/OverallCanvas/index.vue' +import RepeatSetting from "./overallSetting/RepeatSetting.vue"; +import { useI18n } from 'vue-i18n' export default defineComponent({ components:{ + pingpu,RepeatSetting }, props: { type: { @@ -116,6 +144,7 @@ export default defineComponent({ } }, setup(props,{emit}) { + const { t } = useI18n() const store = useStore(); const editPrintElementDom = reactive({ imgDom:null as any, @@ -126,6 +155,15 @@ export default defineComponent({ currentDetailType:computed(()=>store.state.DesignDetail.currentDetailType), currentPrintElement:computed(()=>store.state.DesignDetail.currentPrintElement), systemDesignerPercentage:0, + overallDetail:{ + url: '', + offsetX: 0, // px + offsetY: 0, // px + angle: 0, // 角度 + scale: 100, // % + gapX: 0, // px + gapY: 0, // px + }, printStyleList:{ print:{ single:[], @@ -215,6 +253,7 @@ export default defineComponent({ path:data.url, priority:editPrintElementData.printZIndex, scale, + globalCompositeOperation:'', } getItemPosition(item) setItemPosition() @@ -227,6 +266,7 @@ export default defineComponent({ let scale,location let style = item.pattern.style let sketchWH = editPrintElementData.sketchWH.scale + let overallDetail = {} if(item.ifSingle){ scale = [style.width.replace(/px/g,'')/(editPrintElementData.sketchWH.width),(style.height.replace(/px/g,'')/(editPrintElementData.sketchWH.height))] location = [style.left.replace(/px/g,'')*sketchWH[0],style.top.replace(/px/g,'')*sketchWH[1]] @@ -237,6 +277,14 @@ export default defineComponent({ scale =[ editPrintElementData.systemDesignerPercentage/100, editPrintElementData.systemDesignerPercentage/100] // scale = [item.pattern.style.width/item.pattern.style.height,item.pattern.style.height/item.pattern.style.width] // location = [item.pattern.style.left,item.pattern.style.top] + overallDetail = { + offsetX: editPrintElementData.overallDetail.offsetX, // px + offsetY: editPrintElementData.overallDetail.offsetY, // px + angle: editPrintElementData.overallDetail.angle, // 角度 + scale: editPrintElementData.overallDetail.scale, // % + gapX: editPrintElementData.overallDetail.gapX, // px + gapY: editPrintElementData.overallDetail.gapY, // px + } } let value ={ angle : item.pattern.transform.rotateZ, @@ -249,6 +297,9 @@ export default defineComponent({ path:item.path, minIOPath:item.minIOPath, ifSingle:!!item.ifSingle, + globalCompositeOperation:'', + object:null, + // ...overallDetail, } return value } @@ -316,6 +367,15 @@ export default defineComponent({ editPrintElementData.printStyleList[props.type].single.push(item) }else{ editPrintElementData.printStyleList[props.type].overall = [] + editPrintElementData.overallDetail = { + url: item.path, + offsetX: 0, // px + offsetY: 0, // px + angle: 0, // 角度 + scale: 100, // % + gapX: 0, // px + gapY: 0, // px + } editPrintElementData.printStyleList[props.type].overall.push(item) } @@ -337,9 +397,9 @@ export default defineComponent({ if(!editPrintElementData.selectDetail.printObject.prints)return let state = true // editPrintElementData.stateOverallSingle = 'single' - let arr:any = editPrintElementData.selectDetail.printObject.prints + let arr:any = editPrintElementData.selectDetail.newDetail?.print || editPrintElementData.selectDetail.printObject.prints if(props.type == 'element'){ - arr = editPrintElementData.selectDetail.trims.prints + arr = editPrintElementData.selectDetail.newDetail?.element || editPrintElementData.selectDetail.trims.prints } if(editPrintElementData.selectDetail.newDetail?.[editPrintElementData.currentDetailType]){ arr = editPrintElementData.selectDetail.newDetail[editPrintElementData.currentDetailType] @@ -384,8 +444,28 @@ export default defineComponent({ single:[], overall:[], } + if(!editPrintElementData.selectDetail.sketchMask){ + sketchToMask(newVal).then((res:any)=>{ + editPrintElementData.selectDetail.sketchMask = res + }) + } setPosition() },{immediate: true,}) + watch(()=>editPrintElementData.stateOverallSingle,(newVal)=>{ + if(newVal == 'overall'){ + let overallPrint = editPrintElementData.printStyleList[props.type][editPrintElementData.stateOverallSingle]?.[0] + if(!overallPrint?.path)return + editPrintElementData.overallDetail = { + url: overallPrint.path, + offsetX: overallPrint.offsetX || 0, // px + offsetY: overallPrint.offsetY || 0, // px + angle: overallPrint.angle || 0, // 角度 + scale: overallPrint.scale || 100, // % + gapX: overallPrint.gapX || 0, // px + gapY: overallPrint.gapY || 0, // px + } + } + }) //设置移动 const itemMoveMousedown = (index:number,event:any)=>{ if (event.target.tagName === 'IMG' || event.target.nodeName === 'IMG')return @@ -738,6 +818,20 @@ export default defineComponent({ collItemSize.prentWidth = (collItemSize.padding + remValue) * elArr.length + 'px' moveItem() } + const inputFillAngle = (angle:any)=>{ + editPrintElementData.overallDetail.angle = angle + } + const inputFillOffset = (offset:any)=>{ + editPrintElementData.overallDetail.offsetX = offset.left + editPrintElementData.overallDetail.offsetY = offset.top + } + const inputFillScale = (scale:any)=>{ + editPrintElementData.overallDetail.scale = scale + } + const inputFill_Gap = (x:any,y:any)=>{ + editPrintElementData.overallDetail.gapX = x + editPrintElementData.overallDetail.gapY = y + } onMounted(()=>{ if(props.type == 'element'){ editPrintElementData.stateOverallSingle = 'single' @@ -747,6 +841,7 @@ export default defineComponent({ previewDetailPrintData() }) return{ + t, getMousePosition, ...toRefs(editPrintElementDom), ...toRefs(editPrintElementData), @@ -760,6 +855,10 @@ export default defineComponent({ clearOverall, designMousedown, navDelete, + inputFillAngle, + inputFillOffset, + inputFillScale, + inputFill_Gap, } }, directives:{ @@ -983,7 +1082,13 @@ export default defineComponent({ // height: 100%; max-width: 100%; // width: 100%; - + &.designOpenrtion_sketchMask{ + position: absolute; + z-index: 3; + top: 0; + left: 0; + pointer-events: none; + } } .designOpenrtion_sketch_mask{ z-index: 2; @@ -1013,8 +1118,13 @@ export default defineComponent({ } } } + .designOpenrtion_pingpu{ + width: 100%; + height: 100%; + z-index: 2; + } .designOpenrtion_btn{ - z-index: 3; + z-index: 99; >div{ width: 100%; height: 100%; diff --git a/src/component/Detail/detailRight/overallSetting/RepeatSetting.vue b/src/component/Detail/detailRight/overallSetting/RepeatSetting.vue new file mode 100644 index 00000000..b2f4f3c3 --- /dev/null +++ b/src/component/Detail/detailRight/overallSetting/RepeatSetting.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/component/Detail/detailRight/overallSetting/tools/AngleTool.vue b/src/component/Detail/detailRight/overallSetting/tools/AngleTool.vue new file mode 100644 index 00000000..c024a38e --- /dev/null +++ b/src/component/Detail/detailRight/overallSetting/tools/AngleTool.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/src/component/Detail/detailRight/overallSetting/tools/MySelect.vue b/src/component/Detail/detailRight/overallSetting/tools/MySelect.vue new file mode 100644 index 00000000..146a7d8d --- /dev/null +++ b/src/component/Detail/detailRight/overallSetting/tools/MySelect.vue @@ -0,0 +1,66 @@ + + + diff --git a/src/component/Detail/detailRight/overallSetting/tools/OffsetTool.vue b/src/component/Detail/detailRight/overallSetting/tools/OffsetTool.vue new file mode 100644 index 00000000..00288da3 --- /dev/null +++ b/src/component/Detail/detailRight/overallSetting/tools/OffsetTool.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/src/component/Detail/detailRight/overallSetting/tools/Slider.vue b/src/component/Detail/detailRight/overallSetting/tools/Slider.vue new file mode 100644 index 00000000..d3de2145 --- /dev/null +++ b/src/component/Detail/detailRight/overallSetting/tools/Slider.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/src/component/Detail/model/index.vue b/src/component/Detail/model/index.vue index 79cf2097..585d1ec5 100644 --- a/src/component/Detail/model/index.vue +++ b/src/component/Detail/model/index.vue @@ -4,9 +4,9 @@
- +
-
+
@@ -14,7 +14,7 @@ - + @@ -51,7 +51,7 @@ export default defineComponent({ components:{ position,modelNav }, - emits:['detailEdit','canvasReload','addSketch','revocation','oppositeRevocation','modelOnLoad','sketchSysToLibrary','addDetail'], + emits:['detailEdit','canvasReload','addSketch','revocation','oppositeRevocation','modelOnLoad','sketchSysToLibrary'], setup(props,{emit}) { const {t} = useI18n() const store = useStore(); @@ -68,36 +68,40 @@ export default defineComponent({ const getDetailListDom = reactive({ libraryList:null as any, position:null as any, + modelindexRight:null as any, + modelNav:null as any, }) const getSubmitData = (value:any,boolean)=>{ return getDetailListDom.position.getSubmitData(value,boolean) } const showDesignImgDetail = (str:any)=>{ - new Promise((resolve, reject) => { - if( - getDetailListData.isEditPattern.value&& - detailData?.getCanvasIfEdit?.fun&&detailData?.getCanvasIfEdit?.fun() > 0 - ){ - Modal.confirm({ - title: t('collectionModal.jsContent2'), - icon: createVNode(ExclamationCircleOutlined), - okText: 'Yes', - cancelText: 'No', - mask:false, - centered:true, - onOk() { - resolve(true) - emit('detailEdit',str) - }, - onCancel(){ - resolve(false) - } - }); - }else{ - resolve(true) - emit('detailEdit',str) - } - }) + emit('detailEdit',str) + + // new Promise((resolve, reject) => { + // if( + // getDetailListData.isEditPattern.value&& + // detailData?.getCanvasIfEdit?.fun&&detailData?.getCanvasIfEdit?.fun() > 0 + // ){ + // Modal.confirm({ + // title: t('collectionModal.jsContent2'), + // icon: createVNode(ExclamationCircleOutlined), + // okText: 'Yes', + // cancelText: 'No', + // mask:false, + // centered:true, + // onOk() { + // resolve(true) + // emit('detailEdit',str) + // }, + // onCancel(){ + // resolve(false) + // } + // }); + // }else{ + // resolve(true) + // emit('detailEdit',str) + // } + // }) } const deleteItem = ()=>{ setRevocation() @@ -117,22 +121,29 @@ export default defineComponent({ } let time = null as any - const handleResize = ()=>{ + const handleResize = ()=>{ clearTimeout(time) time = setTimeout(()=>{ store.commit('DesignDetail/setDesignDetail',getDetailListData.designDetail) - getDetailListDom.position.updataPosition() - - },1000) + getDetailListDom.position?.updataPosition?.() + getDetailListDom.modelNav?.setItemPosition?.() + getDetailListDom.position?.updateRect?.() + },500) } const setBack = ()=>{ - emit('detailEdit') + showDesignImgDetail(getDetailListData.isEditPattern.value) } + let observers = null as any onMounted(()=>{ - window.addEventListener('resize', handleResize); + observers = new ResizeObserver(entries => { + for (let entry of entries) { + handleResize() + } + }); + observers.observe(getDetailListDom.modelindexRight); }) onBeforeUnmount(()=>{ - window.removeEventListener('resize', handleResize); + observers.disconnect(); }) return{ ...toRefs(detailData), diff --git a/src/component/Detail/model/modelNav.vue b/src/component/Detail/model/modelNav.vue index 0b94e180..67398f72 100644 --- a/src/component/Detail/model/modelNav.vue +++ b/src/component/Detail/model/modelNav.vue @@ -268,17 +268,8 @@ export default defineComponent({ let allPostition = store.state.Workspace.workspaceAllPosition return allPostition.find(item => item.value === type)?.name } - let observers = null as any - onMounted(()=>{ - observers = new ResizeObserver(entries => { - for (let entry of entries) { - setItemPosition() - } - }); - observers.observe(detailData.modelNavBox); - }) + onBeforeUnmount(()=>{ - observers.disconnect(); }) return{ ...toRefs(detailData), diff --git a/src/component/Detail/model/modelPosition.vue b/src/component/Detail/model/modelPosition.vue index 4153bae7..05b9a1d9 100644 --- a/src/component/Detail/model/modelPosition.vue +++ b/src/component/Detail/model/modelPosition.vue @@ -1,21 +1,17 @@ + + + + diff --git a/src/component/Canvas/CanvasEditor/components/SelectMenuPanel/RepeatSetting.vue b/src/component/Canvas/CanvasEditor/components/SelectMenuPanel/RepeatSetting.vue index dfd96563..e8ad87ca 100644 --- a/src/component/Canvas/CanvasEditor/components/SelectMenuPanel/RepeatSetting.vue +++ b/src/component/Canvas/CanvasEditor/components/SelectMenuPanel/RepeatSetting.vue @@ -1,14 +1,15 @@