feat : 显示选区逻辑完成
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
import { fabric } from "fabric-with-all";
|
||||
import initAligningGuidelines, { initCenteringGuidelines } from "../utils/helperLine";
|
||||
import initAligningGuidelines, {
|
||||
initCenteringGuidelines,
|
||||
} from "../utils/helperLine";
|
||||
import { ThumbnailManager } from "./ThumbnailManager";
|
||||
import { ExportManager } from "./ExportManager";
|
||||
import {
|
||||
@@ -14,7 +16,12 @@ import { CanvasEventManager } from "./events/CanvasEventManager";
|
||||
import CanvasConfig from "../config/canvasConfig";
|
||||
import { RedGreenModeManager } from "./RedGreenModeManager";
|
||||
import { EraserStateManager } from "./EraserStateManager";
|
||||
import { deepClone, generateId, optimizeCanvasRendering } from "../utils/helper";
|
||||
import {
|
||||
deepClone,
|
||||
findObjectById,
|
||||
generateId,
|
||||
optimizeCanvasRendering,
|
||||
} from "../utils/helper";
|
||||
import { ChangeFixedImageCommand } from "../commands/ObjectLayerCommands";
|
||||
import { isFunction } from "lodash-es";
|
||||
import {
|
||||
@@ -150,7 +157,10 @@ export class CanvasManager {
|
||||
return false;
|
||||
};
|
||||
|
||||
this.eraserStateManager = new EraserStateManager(this.canvas, this.layerManager);
|
||||
this.eraserStateManager = new EraserStateManager(
|
||||
this.canvas,
|
||||
this.layerManager
|
||||
);
|
||||
|
||||
// 监听擦除开始事件
|
||||
this.canvas.on("erasing:start", () => {
|
||||
@@ -171,12 +181,17 @@ export class CanvasManager {
|
||||
}
|
||||
|
||||
// 更新交互性
|
||||
command && (await this.layerManager?.updateLayersObjectsInteractivity?.());
|
||||
command &&
|
||||
(await this.layerManager?.updateLayersObjectsInteractivity?.());
|
||||
|
||||
this.thumbnailManager?.generateLayerThumbnail(this.layerManager?.activeLayerId?.value);
|
||||
this.thumbnailManager?.generateLayerThumbnail(
|
||||
this.layerManager?.activeLayerId?.value
|
||||
);
|
||||
|
||||
// 固定图层 的擦除也需要重新生成缩略图 要判断 当前固定图层是否锁定
|
||||
const fixedLayer = this.layers?.value?.find((layer) => layer.isFixed && !layer.locked);
|
||||
const fixedLayer = this.layers?.value?.find(
|
||||
(layer) => layer.isFixed && !layer.locked
|
||||
);
|
||||
// 如果有固定图层且未锁定,则生成缩略图
|
||||
fixedLayer &&
|
||||
this.isFixedErasable &&
|
||||
@@ -366,7 +381,9 @@ export class CanvasManager {
|
||||
// 设置固定图层的可擦除状态
|
||||
layer.locked = flag;
|
||||
// 更新画布对象的erasable属性
|
||||
const fabricObject = this.canvas.getObjects().find((obj) => obj.id === layer.id);
|
||||
const fabricObject = this.canvas
|
||||
.getObjects()
|
||||
.find((obj) => obj.id === layer.id);
|
||||
if (fabricObject) {
|
||||
fabricObject.erasable = flag;
|
||||
fabricObject.set("erasable", flag);
|
||||
@@ -478,7 +495,9 @@ export class CanvasManager {
|
||||
const deltaY = backgroundObject.top - backgroundOldTop;
|
||||
|
||||
// 将相同的偏移量应用到所有其他对象上
|
||||
const otherObjects = visibleObjects.filter((obj) => obj !== backgroundObject);
|
||||
const otherObjects = visibleObjects.filter(
|
||||
(obj) => obj !== backgroundObject
|
||||
);
|
||||
|
||||
otherObjects.forEach((obj) => {
|
||||
obj.set({
|
||||
@@ -496,12 +515,29 @@ export class CanvasManager {
|
||||
// 如果图层有遮罩,更新遮罩位置
|
||||
layer.clippingMask.left += deltaX;
|
||||
layer.clippingMask.top += deltaY;
|
||||
|
||||
if (layer.selectObject) {
|
||||
// 如果有选区 则选区位置也要更新
|
||||
layer.selectObject.left = layer.clippingMask.left;
|
||||
layer.selectObject.top = layer.clippingMask.top;
|
||||
const { object } = findObjectById(
|
||||
this.canvas,
|
||||
layer.selectObject?.id
|
||||
);
|
||||
object?.set({
|
||||
left: layer.clippingMask.left,
|
||||
top: layer.clippingMask.top,
|
||||
});
|
||||
object?.setCoords();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (isMaskLayer) {
|
||||
requestAnimationFrame(() => {
|
||||
this.layerManager?.updateLayersObjectsInteractivity?.();
|
||||
setTimeout(() => {
|
||||
this.layerManager?.updateLayersObjectsInteractivity?.(false, {
|
||||
isMoveing: true,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -598,7 +634,8 @@ export class CanvasManager {
|
||||
if (!backgroundLayerObject) return;
|
||||
|
||||
const bgWidth = backgroundLayerObject.width * backgroundLayerObject.scaleX;
|
||||
const bgHeight = backgroundLayerObject.height * backgroundLayerObject.scaleY;
|
||||
const bgHeight =
|
||||
backgroundLayerObject.height * backgroundLayerObject.scaleY;
|
||||
const left = backgroundLayerObject.left;
|
||||
const top = backgroundLayerObject.top;
|
||||
|
||||
@@ -659,7 +696,9 @@ export class CanvasManager {
|
||||
return obj.isBackground || obj.id === backgroundLayerId;
|
||||
});
|
||||
if (!backgroundLayerByBgLayer) {
|
||||
console.warn("CanvasManager.js = >getBackgroundLayer 方法没有找到背景层");
|
||||
console.warn(
|
||||
"CanvasManager.js = >getBackgroundLayer 方法没有找到背景层"
|
||||
);
|
||||
}
|
||||
|
||||
return backgroundLayerByBgLayer;
|
||||
@@ -669,7 +708,8 @@ export class CanvasManager {
|
||||
* @param {Object} backgroundLayerObject 背景层对象
|
||||
*/
|
||||
updateMaskPosition(backgroundLayerObject) {
|
||||
if (!backgroundLayerObject || !this.maskLayer || !this.canvas.clipPath) return;
|
||||
if (!backgroundLayerObject || !this.maskLayer || !this.canvas.clipPath)
|
||||
return;
|
||||
|
||||
const left = backgroundLayerObject.left;
|
||||
const top = backgroundLayerObject.top;
|
||||
@@ -734,7 +774,8 @@ export class CanvasManager {
|
||||
...options,
|
||||
});
|
||||
|
||||
command.undoable = options.undoable !== undefined ? options.undoable : false; // 默认不可撤销 undoable = true 为可撤销
|
||||
command.undoable =
|
||||
options.undoable !== undefined ? options.undoable : false; // 默认不可撤销 undoable = true 为可撤销
|
||||
|
||||
const result = (await command?.execute?.()) || {
|
||||
success: false,
|
||||
@@ -784,7 +825,9 @@ export class CanvasManager {
|
||||
...options,
|
||||
// 如果没有明确指定,则根据当前模式自动设置
|
||||
restoreOpacityInRedGreen:
|
||||
options.restoreOpacityInRedGreen !== undefined ? options.restoreOpacityInRedGreen : true, // 默认在红绿图模式下恢复透明度
|
||||
options.restoreOpacityInRedGreen !== undefined
|
||||
? options.restoreOpacityInRedGreen
|
||||
: true, // 默认在红绿图模式下恢复透明度
|
||||
};
|
||||
|
||||
// 如果在红绿图模式下且没有指定具体的图层,自动包含所有普通图层
|
||||
@@ -798,7 +841,9 @@ export class CanvasManager {
|
||||
// 获取所有非背景、非固定的普通图层ID
|
||||
const normalLayerIds =
|
||||
this.layers?.value
|
||||
?.filter((layer) => !layer.isBackground && !layer.isFixed && layer.visible)
|
||||
?.filter(
|
||||
(layer) => !layer.isBackground && !layer.isFixed && layer.visible
|
||||
)
|
||||
?.map((layer) => layer.id) || [];
|
||||
|
||||
if (normalLayerIds.length > 0) {
|
||||
@@ -911,7 +956,9 @@ export class CanvasManager {
|
||||
this.canvas.discardActiveObject();
|
||||
this.canvas.renderAll();
|
||||
|
||||
const simplifyLayersData = simplifyLayers(JSON.parse(JSON.stringify(this.layers.value)));
|
||||
const simplifyLayersData = simplifyLayers(
|
||||
JSON.parse(JSON.stringify(this.layers.value))
|
||||
);
|
||||
console.log("获取画布JSON数据...", simplifyLayersData);
|
||||
return JSON.stringify({
|
||||
canvas: this.canvas.toJSON([
|
||||
@@ -927,6 +974,7 @@ export class CanvasManager {
|
||||
"eraser",
|
||||
"eraserable",
|
||||
"erasable",
|
||||
"customType",
|
||||
]),
|
||||
layers: simplifyLayersData, // 简化图层数据
|
||||
// layers: JSON.stringify(JSON.parse(JSON.stringify(this.layers.value))), // 全数据
|
||||
@@ -1033,7 +1081,8 @@ export class CanvasManager {
|
||||
// 使用LayerSort工具重新排列画布对象(如果可用)
|
||||
await this?.layerManager?.layerSort?.rearrangeObjects();
|
||||
|
||||
this.layerManager.activeLayerId.value = this.layers.value[0].children?.length
|
||||
this.layerManager.activeLayerId.value = this.layers.value[0]
|
||||
.children?.length
|
||||
? this.layers.value[0].children[0].id
|
||||
: this.layers.value[0]?.id || parsedJson?.activeLayerId || null;
|
||||
|
||||
@@ -1046,7 +1095,9 @@ export class CanvasManager {
|
||||
await calllBack?.();
|
||||
|
||||
// 确保所有对象的交互性正确设置
|
||||
await this.layerManager?.updateLayersObjectsInteractivity?.(false);
|
||||
await this.layerManager?.updateLayersObjectsInteractivity?.(
|
||||
false
|
||||
);
|
||||
console.log(this.layerManager.layers.value);
|
||||
|
||||
// 更新所有缩略图
|
||||
@@ -1203,7 +1254,9 @@ export class CanvasManager {
|
||||
if (!this.layers || !this.layers.value) return [];
|
||||
|
||||
// 查找所有非背景、非固定的普通图层
|
||||
const normalLayers = this.layers.value.filter((layer) => !layer.isBackground && !layer.isFixed);
|
||||
const normalLayers = this.layers.value.filter(
|
||||
(layer) => !layer.isBackground && !layer.isFixed
|
||||
);
|
||||
|
||||
// 收集所有普通图层中的对象
|
||||
const objects = [];
|
||||
@@ -1240,9 +1293,15 @@ export class CanvasManager {
|
||||
|
||||
// 比较尺寸(允许5%的误差)
|
||||
const sizeMatch =
|
||||
Math.abs(obj.width * obj.scaleX - fixedLayerObject.width * fixedLayerObject.scaleX) <
|
||||
Math.abs(
|
||||
obj.width * obj.scaleX -
|
||||
fixedLayerObject.width * fixedLayerObject.scaleX
|
||||
) <
|
||||
fixedLayerObject.width * fixedLayerObject.scaleX * 0.05 &&
|
||||
Math.abs(obj.height * obj.scaleY - fixedLayerObject.height * fixedLayerObject.scaleY) <
|
||||
Math.abs(
|
||||
obj.height * obj.scaleY -
|
||||
fixedLayerObject.height * fixedLayerObject.scaleY
|
||||
) <
|
||||
fixedLayerObject.height * fixedLayerObject.scaleY * 0.05;
|
||||
|
||||
// 比较位置(允许一定的偏差)
|
||||
|
||||
Reference in New Issue
Block a user