From 074c336ca8f749a8f53db9e5f902ef42cbb01117 Mon Sep 17 00:00:00 2001 From: bighuixiang <472705331@qq.com> Date: Thu, 17 Jul 2025 14:58:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=9B=BE=E5=B1=82=E4=B8=8B=E6=89=80=E6=9C=89=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BC=98=E5=8C=96=E5=9B=BE?= =?UTF-8?q?=E5=B1=82=E4=BA=A4=E4=BA=92=E6=80=A7=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/LayersPanel/LayersPanel.vue | 2 + .../CanvasEditor/managers/LayerManager.js | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/component/Canvas/CanvasEditor/components/LayersPanel/LayersPanel.vue b/src/component/Canvas/CanvasEditor/components/LayersPanel/LayersPanel.vue index 69a3dcf0..c7040c4c 100644 --- a/src/component/Canvas/CanvasEditor/components/LayersPanel/LayersPanel.vue +++ b/src/component/Canvas/CanvasEditor/components/LayersPanel/LayersPanel.vue @@ -590,6 +590,8 @@ function handleLayerClick(layer, event) { // 否则直接设置当前图层为活动图层 setActiveLayer(layer.id); layerManager?.updateLayersObjectsInteractivity(); + // 选中画布中的图层对象 + layerManager?.selectLayerObjects(layer.id); } } lastSelectedIndex.value = sortableRootLayers.value.findIndex((l) => l.id === layer.id); diff --git a/src/component/Canvas/CanvasEditor/managers/LayerManager.js b/src/component/Canvas/CanvasEditor/managers/LayerManager.js index 583abb11..750f75b9 100644 --- a/src/component/Canvas/CanvasEditor/managers/LayerManager.js +++ b/src/component/Canvas/CanvasEditor/managers/LayerManager.js @@ -1028,6 +1028,49 @@ export class LayerManager { } } + /** + * 选择图层下的所有对象 + * @param {string} layerId 图层ID + * @returns {fabric.ActiveSelection|null} 返回活动选择组或null + */ + async selectLayerObjects(layerId) { + // 查找图层 + const { layer } = findLayerRecursively(this.layers.value, layerId); + if (!layer) { + console.error(`图层 ${layerId} 不存在`); + return; + } + // 获取图层下的所有对象 + const objects = + layer.fabricObjects + ?.map((obj) => { + const { object } = findObjectById(this.canvas, obj.id); + return object; + }) + ?.filter(Boolean) || []; + if (objects.length === 0) { + console.warn(`图层 ${layerId} 没有对象可供选择`); + return; + } + // 切换到选择模式 + this?.toolManager?.setTool(OperationType.SELECT); + // 创建一个新的活动选择组 + const activeSelection = new fabric.ActiveSelection(objects, { + canvas: this.canvas, + preserveObjectStacking: true, // 保留对象堆叠顺序 + }); + // 设置活动选择组的属性 + this.canvas.setActiveObject(activeSelection); + // 渲染画布 + this.canvas.renderAll(); + // 设置活动选择组的坐标 + activeSelection.setCoords(); + // 更新对象交互性 + this.updateLayersObjectsInteractivity(); + // 返回活动选择组 + return activeSelection; + } + /** * 切换图层可见性 * @param {string} layerId 图层ID