diff --git a/src/component/Canvas/CanvasEditor/commands/FillRepeatCommand.js b/src/component/Canvas/CanvasEditor/commands/FillRepeatCommand.js index dc82f0e2..3c97e52b 100644 --- a/src/component/Canvas/CanvasEditor/commands/FillRepeatCommand.js +++ b/src/component/Canvas/CanvasEditor/commands/FillRepeatCommand.js @@ -109,12 +109,19 @@ export class FillRepeatCommand extends Command { const fdObject = this.canvasManager.getFixedLayerObject(); const bgObject = this.canvasManager.getBackgroundLayerObject(); const tObject = fdObject || bgObject; + const tWidth = tObject.width; + const tHeight = tObject.height; + // const offsetX = object.fill?.hasOwnProperty("offsetX") ? object.fill.offsetX : tObject.width / 2; // const offsetY = object.fill?.hasOwnProperty("offsetY") ? object.fill.offsetY : tObject.height / 2; - const patternTransform = object.fill?.hasOwnProperty("patternTransform") ? object.fill.patternTransform : createPatternTransform(0.3, 0); + const scaleX_ = tWidth / img.width / 5; + const scaleY_ = tHeight / img.height / 5; + const scale_ = tWidth > tHeight ? scaleX_ : scaleY_; + + const patternTransform = object.fill?.hasOwnProperty("patternTransform") ? object.fill.patternTransform : createPatternTransform(scale_, 0); const scale = getTransformScaleAngle(patternTransform).scale; - const offsetX = tObject.width / 2 - img.width * scale / 2; - const offsetY = tObject.height / 2 - img.height * scale / 2; + const offsetX = tWidth / 2 - img.width * scale / 2; + const offsetY = tHeight / 2 - img.height * scale / 2; const pattern = new fabric.Pattern({ source: img, repeat: this.fillRepeat, @@ -146,10 +153,10 @@ export class FillRepeatCommand extends Command { let scaleX = tObject.scaleX || 1; let scaleY = tObject.scaleY || 1; rect.set({ - width: tObject.width, - height: tObject.height, - top: tObject.top - tObject.height * scaleY / 2, - left: tObject.left - tObject.width * scaleX / 2, + width: tWidth, + height: tHeight, + top: tObject.top - tHeight * scaleY / 2, + left: tObject.left - tWidth * scaleX / 2, scaleX, scaleY, }); @@ -192,7 +199,7 @@ export class FillRepeatCommand extends Command { // 复制原对象的属性 copyObjectProperties(object) { - return{ + return { id: object.id, layerId: object.layerId, layerName: object.layerName, diff --git a/src/component/Canvas/CanvasEditor/commands/LayerCommands.js b/src/component/Canvas/CanvasEditor/commands/LayerCommands.js index 88f9afb1..9c79d9ce 100644 --- a/src/component/Canvas/CanvasEditor/commands/LayerCommands.js +++ b/src/component/Canvas/CanvasEditor/commands/LayerCommands.js @@ -283,7 +283,7 @@ export class PasteLayerCommand extends Command { if(this.newLayer.isPrintTrims){ this.layers.value.forEach((layer) => { if (layer.isPrintTrimsGroup) { - layer.children.push(this.newLayer); + layer.children.unshift(this.newLayer); } }) }else if (this.insertIndex !== undefined && this.insertIndex !== null) { diff --git a/src/component/Canvas/CanvasEditor/components/SelectMenuPanel/index.vue b/src/component/Canvas/CanvasEditor/components/SelectMenuPanel/index.vue index 447bd6b7..26a16fa2 100644 --- a/src/component/Canvas/CanvasEditor/components/SelectMenuPanel/index.vue +++ b/src/component/Canvas/CanvasEditor/components/SelectMenuPanel/index.vue @@ -126,8 +126,8 @@ :options="selectOptions" @change="(e) => changeFillRepeat(e, v)" :disabled=" - v.layer?.metadata?.level2Type === - 'Embroidery' + v.layer?.metadata?.sourceData?.type === + 'trims' " /> diff --git a/src/component/Canvas/CanvasEditor/index.vue b/src/component/Canvas/CanvasEditor/index.vue index d1b21f2c..53f4455b 100644 --- a/src/component/Canvas/CanvasEditor/index.vue +++ b/src/component/Canvas/CanvasEditor/index.vue @@ -991,7 +991,7 @@ defineExpose({ }, updateOtherLayers: async (otherData) => { await new Promise((resolve) => optimizeCanvasRendering(canvasManager.canvas, resolve)); - await canvasManager?.createOtherLayers?.(otherData, true); + await canvasManager?.createOtherLayers?.(otherData); layerManager.activeLayerId.value = "" layerManager?.sortLayers(); await layerManager?.updateLayersObjectsInteractivity?.(true); diff --git a/src/component/Canvas/CanvasEditor/managers/CanvasManager.js b/src/component/Canvas/CanvasEditor/managers/CanvasManager.js index 75c547dd..b7583264 100644 --- a/src/component/Canvas/CanvasEditor/managers/CanvasManager.js +++ b/src/component/Canvas/CanvasEditor/managers/CanvasManager.js @@ -1160,7 +1160,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') const flScaleY = fixedLayerObj.scaleY const prints = []; const trims = []; - objects.forEach((v) => { + objects.forEach((v, i) => { const label = glayer.children.find((v_) => (v_.id === v.layerId || v_.id === v.id)); const sourceData = label?.metadata?.sourceData; if(!sourceData) return; @@ -1174,7 +1174,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') scale: [0, 0], angle: v.angle, name: sourceData.name, - priority: sourceData.priority, + priority: i + 1, object:{ top: 0, left: 0, @@ -1240,8 +1240,8 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') } }) // prints.sort((a, b) => a.ifSingle ? 1 : -1); - prints.forEach((v, i) => v.priority = i + 1); - trims.forEach((v, i) => v.priority = i + 1); + // prints.forEach((v, i) => v.priority = i + 1); + // trims.forEach((v, i) => v.priority = i + 1); return {prints, trims}; } @@ -1507,7 +1507,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') * 创建其他图层:印花、颜色、元素... * @param {Object} otherData - 其他图层数据 */ - async createOtherLayers(otherData, isUpdate = false) { + async createOtherLayers(otherData) { if (!otherData) return console.warn("otherData 为空不需要添加"); this.canvas.loading.value = true; let resolve = ()=>{}; @@ -1515,17 +1515,8 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') const otherData_ = JSON.parse(JSON.stringify(otherData)); console.log("==========创建其他图层", otherData_); - const updateColor = !!otherData_.color; - const updateSpecialGroup = !!otherData_.printObject || !!otherData_.trims; // 删除颜色图层和特殊组图层 - const ids = []; - if(isUpdate){ - updateColor && ids.push(SpecialLayerId.COLOR) - updateSpecialGroup && ids.push(SpecialLayerId.SPECIAL_GROUP) - }else{ - ids.push(SpecialLayerId.COLOR) - ids.push(SpecialLayerId.SPECIAL_GROUP) - } + const ids = [SpecialLayerId.COLOR, SpecialLayerId.SPECIAL_GROUP]; this.layers.value = this.layers.value.filter((layer) => { if(ids.includes(layer.id)){ ids.push(...layer.children?.map((child) => child.id)); @@ -1533,11 +1524,15 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') } return true; }) - this.canvas.getObjects().forEach((v) => ids.includes(v.id) && this.canvas.remove(v)) + this.canvas.getObjects().forEach((v) => { + if(ids.includes(v.id) || ids.includes(v.layerId)){ + this.canvas.remove(v) + } + }) // 创建颜色图层 - otherData_.color && await this.createColorLayer(otherData_.color); + await this.createColorLayer(otherData_.color); const printTrimsLayers = [];// 印花和元素图层 const singleLayers = [];// 平铺图层 @@ -1555,7 +1550,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') trims.type = "trims"; printTrimsLayers.unshift({...trims}); }) - if(isUpdate ? updateSpecialGroup : true){ + if(printTrimsLayers.length || singleLayers.length){ await this.createPrintTrimsLayers(printTrimsLayers, singleLayers); } await this.changeCanvas(); @@ -1686,7 +1681,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') let opacity = 1 let flipX = false; let flipY = false; - let blendMode = BlendMode.MULTIPLY; + let blendMode = BlendMode.NORMAL; // if(item.type === "trims") blendMode = BlendMode.NORMAL;// 元素正常 if(item.object){ opacity = item.object.opacity @@ -1712,7 +1707,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') hasBorders: true, isPrintTrims: true, }); - this.canvas.add(image); + // this.canvas.add(image); let layer = createLayer({ id: id, name: name, @@ -1723,7 +1718,8 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') isPrintTrims: true, blendMode: blendMode, fabricObjects: [image.toObject(["id", "layerId", "layerName"])], - metadata: {sourceData: item, level2Type: item.level2Type}, + metadata: {sourceData: item}, + object: image, }) children.push(layer); }; @@ -1808,7 +1804,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') }, isPrintTrims: true, }); - this.canvas.add(rect); + // this.canvas.add(rect); let layer = createLayer({ id: id, name: name, @@ -1820,6 +1816,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') blendMode: blendMode, fabricObjects: [rect.toObject(["id", "layerId", "layerName"])], metadata: {sourceData: item}, + object: rect, }) children.push(layer); }; @@ -1836,6 +1833,13 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer') // children.push(layer); // } if(children.length === 0) return; + // 印花元素排序 + if(new Set(children.map(v => v.metadata.sourceData.priority)).size === children.length){ + children.sort((a, b) => b.metadata.sourceData.priority - a.metadata.sourceData.priority); + } + children.forEach(layer => { + this.canvas.add(layer.object); + }); const groupRect = new fabric.Rect({}); await this.setObjecCliptInfo(groupRect); // 插入组图层 diff --git a/src/component/Canvas/canvasExample.vue b/src/component/Canvas/canvasExample.vue index 19efe42a..7a961666 100644 --- a/src/component/Canvas/canvasExample.vue +++ b/src/component/Canvas/canvasExample.vue @@ -337,46 +337,49 @@ color: { rgba: { r: 255, g: 0, b: 0, a: 1 } }, printObject: { prints: [ - // { - // ifSingle: false, - // level2Type: "Pattern", - // designType: "Library", - // path: "/src/assets/images/canvas/yinhua1.jpg", - // location: [800, 600], - // scale: [1, 1], - // angle: 0, - // object: { - // top: 300, - // left: 400, - // scaleX: 0.5, - // scaleY: 0.5, - // opacity: 1, - // angle: 0, - // flipX: false, - // flipY: false, - // blendMode: "multiply", - // gapX: 0, - // gapY: 0, - // }, - // }, - // { - // ifSingle: true, - // level2Type: "Pattern", - // designType: "Library", - // path: "/src/assets/images/canvas/yinhua1.jpg", - // location: [550, 650], - // scale: [0.15, 0.2], - // angle: 0, - // }, + { + ifSingle: false, + level2Type: "Pattern", + designType: "Library", + path: "/src/assets/images/canvas/yinhua1.jpg", + location: [800, 600], + scale: [1, 1], + angle: 0, + priority: 1, + object: { + top: 300, + left: 400, + scaleX: 0.5, + scaleY: 0.5, + opacity: 1, + angle: 0, + flipX: false, + flipY: false, + // blendMode: "multiply", + gapX: 0, + gapY: 0, + }, + }, { ifSingle: true, level2Type: "Pattern", designType: "Library", path: "/src/assets/images/canvas/yinhua1.jpg", - location: [700, 400], - scale: [0.1, 0.133], + location: [550, 650], + scale: [0.15, 0.2], angle: 0, + priority: 2, }, + // { + // ifSingle: true, + // level2Type: "Pattern", + // designType: "Library", + // path: "/src/assets/images/canvas/yinhua1.jpg", + // location: [700, 400], + // scale: [0.1, 0.133], + // angle: 0, + // priority: 3, + // }, ], }, }); diff --git a/src/component/Detail/detailRight/editPrintElement.vue b/src/component/Detail/detailRight/editPrintElement.vue index 21472da3..c55f9219 100644 --- a/src/component/Detail/detailRight/editPrintElement.vue +++ b/src/component/Detail/detailRight/editPrintElement.vue @@ -89,8 +89,8 @@ - - + +