From d863376b41b91f623928355fd64ffc3b8a7e7756 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E9=B9=8F?= <2916022834@qq.com> Date: Thu, 8 Jan 2026 16:37:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=B0=E8=8A=B1=E5=9B=BE=E5=B1=82=E7=A6=81?= =?UTF-8?q?=E7=94=A8=E7=94=BB=E7=AC=94=E7=AD=89=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/component/Canvas/CanvasEditor/index.vue | 14 ++++------ .../CanvasEditor/managers/ToolManager.js | 27 +++++++++++++++++-- src/component/Canvas/canvasExample.vue | 18 ++++++------- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/component/Canvas/CanvasEditor/index.vue b/src/component/Canvas/CanvasEditor/index.vue index 94f03083..92e7ab71 100644 --- a/src/component/Canvas/CanvasEditor/index.vue +++ b/src/component/Canvas/CanvasEditor/index.vue @@ -153,7 +153,7 @@ const canvasManagerLoaded = ref(false); // 画布是否加载完成 // 红绿图模式状态 const isRedGreenMode = ref(false); -const isShowLayerPanel = ref(true); // 是否显示图层面板 +const isShowLayerPanel = ref(false); // 是否显示图层面板 provide("isShowLayerPanel", isShowLayerPanel); // 提供红绿图模式状态给子组件 @@ -546,13 +546,9 @@ watchEffect(() => { }); onBeforeUnmount(async () => { - // if (import.meta.hot) { - // // 热更新 ? - // console.log("onBeforeUnmount 开发环境热更新不卸载组件..."); - // return; // 开发环境下不卸载组件 - // } - const extraInfo = await canvasManager.exportExtraInfo(); - emit("before-unmount-export-extra-info", extraInfo); + observer.unobserve(canvasContainerRef.value); +// const extraInfo = await canvasManager.exportExtraInfo(); +// emit("before-unmount-export-extra-info", extraInfo); console.log("onBeforeUnmount 组件卸载,清理资源..."); canvasManager?.dispose?.(); @@ -576,7 +572,6 @@ onBeforeUnmount(async () => { // 移除window resize事件监听 // window.removeEventListener("resize", handleWindowResize); - observer.unobserve(canvasContainerRef.value); }); // 窗口大小变化处理函数 @@ -584,6 +579,7 @@ function handleWindowResize() { console.log(132); // 使用requestAnimationFrame来防止频繁更新 setTimeout(() => { + if(!canvasManager) return; // 更新画布大小并自动居中所有元素 updateCanvasSize(); diff --git a/src/component/Canvas/CanvasEditor/managers/ToolManager.js b/src/component/Canvas/CanvasEditor/managers/ToolManager.js index 263e0260..34af2de5 100644 --- a/src/component/Canvas/CanvasEditor/managers/ToolManager.js +++ b/src/component/Canvas/CanvasEditor/managers/ToolManager.js @@ -376,8 +376,8 @@ export class ToolManager { // 设置工具特定的状态 const tool = this.tools[toolId]; if (tool && typeof tool.setup === "function") { - console.log(`画布切换工具:${tool.name}(${toolId})`) - this.canvas.toolId = toolId; + console.log(`画布切换工具:${tool.name}(${toolId})`) + this.canvas.toolId = toolId; tool.setup(); } @@ -458,11 +458,31 @@ export class ToolManager { } + /** + * 检查当前工具是否禁止操作当前选中的对象 + * @param {Boolean} isBrushTool 是否为画笔工具 + * @returns {Boolean} 是否可以切换 + */ + checkToolCanOperateSelectedObject(isBrushTool = false) { + const layer = this.layerManager?.getActiveLayer(); + const isSpecialLayer = !!layer?.specialType; + if (isSpecialLayer) { + if(isBrushTool){ + this._disableBrushIndicator(); + } + this.canvas.defaultCursor = "not-allowed"; + } + console.log("===========",isSpecialLayer, this.canvas.defaultCursor); + return isSpecialLayer; + } + + /** * 设置画笔工具 */ setupBrushTool() { if (!this.canvas) return; + if (this.checkToolCanOperateSelectedObject(true)) return; this.canvas.isDrawingMode = true; this.canvas.selection = false; @@ -506,6 +526,8 @@ export class ToolManager { */ setupEraserTool() { if (!this.canvas) return; + if (this.checkToolCanOperateSelectedObject(true)) return; + this.canvas.isDrawingMode = true; this.canvas.selection = false; @@ -654,6 +676,7 @@ export class ToolManager { */ setupLiquifyTool() { if (!this.canvas || !this.layerManager) return; + if (this.checkToolCanOperateSelectedObject(true)) return; this.canvas.isDrawingMode = false; this.canvas.selection = false; diff --git a/src/component/Canvas/canvasExample.vue b/src/component/Canvas/canvasExample.vue index 5132e2b9..28416ca2 100644 --- a/src/component/Canvas/canvasExample.vue +++ b/src/component/Canvas/canvasExample.vue @@ -295,15 +295,15 @@ const otherData = { 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: [250, 780], - scale: [0.3, 0.4], - angle: 0, - }, + // { + // ifSingle: false, + // level2Type: "Pattern", + // designType: "Library", + // path: "/src/assets/images/canvas/yinhua1.jpg", + // location: [250, 780], + // scale: [0.3, 0.4], + // angle: 0, + // }, { ifSingle: true, level2Type: "Pattern",