Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite

This commit is contained in:
X1627315083
2026-01-19 14:44:47 +08:00
3 changed files with 129 additions and 144 deletions

View File

@@ -137,7 +137,6 @@
<button @click="onAdd">添加</button> <button @click="onAdd">添加</button>
<div class="box"> <div class="box">
<pingpu <pingpu
:list="list"
ref="pingpuRef" ref="pingpuRef"
:width="600" :width="600"
:height="900" :height="900"
@@ -161,58 +160,7 @@
const convertDotNotationToBracket = (str) => const convertDotNotationToBracket = (str) =>
str.replace(/(?:^|\.)(\d+)(?=\.|$)/g, "[#$1]").replace(/\[#/g, "["); str.replace(/(?:^|\.)(\d+)(?=\.|$)/g, "[#$1]").replace(/\[#/g, "[");
const activeToken = ref("1"); const activeToken = ref("1");
const list = ref([ const list = ref([]);
{
token: "1",
ifSingle: false,
level2Type: "Pattern",
designType: "Library",
path: "/src/assets/images/canvas/yinhua1.jpg",
location: [0, 0],
scale: [1, 1],
angle: 0,
name: "Print1",
priority: 1,
object: {
top: 0,
left: 0,
scaleX: 1,
scaleY: 1,
opacity: 1,
angle: 0,
flipX: false,
flipY: false,
blendMode: "multiply",
gapX: 10,
gapY: 20,
},
},
{
token: "2",
ifSingle: false,
level2Type: "Pattern",
designType: "Library",
path: "/src/assets/images/canvas/yinhua1.jpg",
location: [0, 0],
scale: [2, 2],
angle: -45,
name: "Print2",
priority: 1,
object: {
top: 450,
left: 300,
scaleX: 0.5,
scaleY: 0.5,
opacity: 1,
angle: 0,
flipX: false,
flipY: false,
blendMode: "multiply",
gapX: 0,
gapY: 0,
},
},
]);
// 深拷贝 // 深拷贝
const deepCopy = (obj) => JSON.parse(JSON.stringify(obj)); const deepCopy = (obj) => JSON.parse(JSON.stringify(obj));
const oldList = ref(deepCopy(list.value)); const oldList = ref(deepCopy(list.value));

View File

@@ -3,8 +3,11 @@
</template> </template>
<script setup> <script setup>
import TaskQueue from "../utils/TaskQueue.js";
import { fabric } from "fabric-with-all"; import { fabric } from "fabric-with-all";
import { ref, watch, onMounted } from "vue"; import { ref, watch, onMounted, nextTick } from "vue";
// 任务队列
const taskQueue = new TaskQueue();
const KEYS = { const KEYS = {
FILL_X: "location[0]", FILL_X: "location[0]",
FILL_Y: "location[1]", FILL_Y: "location[1]",
@@ -32,45 +35,36 @@
}; };
const emit = defineEmits(["change-canvas", "init-canvas"]); const emit = defineEmits(["change-canvas", "init-canvas"]);
const props = defineProps({ const props = defineProps({
list: { type: Array, default: () => [] }, // list: { type: Array, default: () => [] },
width: { type: Number, required: true }, width: { type: Number, required: true },
height: { type: Number, required: true }, height: { type: Number, required: true },
}); });
const list = ref([]);
const el = ref(null); const el = ref(null);
const canvasRef = ref(null); const canvasRef = ref(null);
const observer = ref(null); const observer = ref(null);
var canvas = null; var canvas = null;
onMounted(async () => { onMounted(async () => {
initCanvas(); initCanvas();
// await setCanvasData(); // taskQueue.addTask(async () => await setCanvasData());
let throttleTimeout = null; emit("init-canvas", list.value);
let lastRunTime = 0; let throttleDelay = 100;
let trailingTimeout = null; let trailingTimeout = null;
observer.value = new ResizeObserver((entries) => { observer.value = new ResizeObserver((entries) => {
const now = Date.now();
const throttleDelay = 100;
if (!throttleTimeout) {
updateCanvasSize();
lastRunTime = now;
throttleTimeout = setTimeout(() => {
throttleTimeout = null;
}, throttleDelay);
} else {
clearTimeout(trailingTimeout); clearTimeout(trailingTimeout);
trailingTimeout = setTimeout(() => { trailingTimeout = setTimeout(() => {
updateCanvasSize(); console.log("OverallCanvas: resize");
lastRunTime = Date.now(); taskQueue.addTask(async () => await updateCanvasSize());
}, throttleDelay); }, throttleDelay);
}
}); });
observer.value.observe(el.value); observer.value.observe(el.value);
emit("init-canvas", props.list);
}); });
onBeforeUnmount(() => { onBeforeUnmount(() => {
observer.value.disconnect(); observer.value.disconnect();
unbindEvent(); unbindEvent();
}); });
const initCanvas = () => { const initCanvas = () => {
console.log("OverallCanvas: initCanvas");
canvas = new fabric.Canvas(canvasRef.value, { canvas = new fabric.Canvas(canvasRef.value, {
selection: false, selection: false,
preserveObjectStacking: true, preserveObjectStacking: true,
@@ -80,7 +74,7 @@
bindEvent(); bindEvent();
}; };
const updateCanvasSize = async () => { const updateCanvasSize = async () => {
console.log('========','updataCanvasSize') console.log("OverallCanvas: updateCanvasSize");
canvas.setWidth(el.value.offsetWidth); canvas.setWidth(el.value.offsetWidth);
canvas.setHeight(el.value.offsetHeight); canvas.setHeight(el.value.offsetHeight);
await setCanvasData(); await setCanvasData();
@@ -99,7 +93,7 @@
}; };
// 处理对象修改事件 // 处理对象修改事件
const onObjectModified = (e) => { const onObjectModified = (e) => {
console.log(e); console.log("OverallCanvas: onObjectModified", e);
const object = e.target; const object = e.target;
const action = e.action; const action = e.action;
const list = []; const list = [];
@@ -175,8 +169,9 @@
}; };
const setCanvasData = async () => { const setCanvasData = async () => {
canvas.clear(); canvas.clear();
for (let i = 0; i < props.list.length; i++) { console.log("OverallCanvas: setCanvasData", list.value);
let item = props.list[i]; for (let i = 0; i < list.value.length; i++) {
let item = list.value[i];
await addObject(item); await addObject(item);
} }
canvas.renderAll(); canvas.renderAll();
@@ -195,7 +190,6 @@
left: item.object.left / (props.width / canvas.width), left: item.object.left / (props.width / canvas.width),
onDelete: (v) => onDeleteItem(v), onDelete: (v) => onDeleteItem(v),
}); });
console.log("==========", props)
canvas.add(rect); canvas.add(rect);
}; };
const setFill = async (item) => { const setFill = async (item) => {
@@ -232,21 +226,28 @@
}); });
return pattern; return pattern;
}; };
const updataList = async (list) => { const updataList = async (list_) => {
console.log(list); const cd = async (list_) => {
console.log("OverallCanvas: updataList", list_);
const objects = canvas.getObjects(); const objects = canvas.getObjects();
for (let i = 0; i < list.length; i++) { for (let i = 0; i < list_.length; i++) {
let item = list[i]; let item = list_[i];
let object = objects.find((o) => o.token === item.token); let object = objects.find((o) => o.token === item.token);
if (item.action === ACTIONS.UPDATE) { if (item.action === ACTIONS.UPDATE) {
if (!object) continue; if (!object) continue;
let value = item.value; let value = item.value;
switch (item.key) { switch (item.key) {
case KEYS.O_TOP: case KEYS.O_TOP:
object.set("top", value / (props.height / canvas.height)); object.set(
"top",
value / (props.height / canvas.height)
);
break; break;
case KEYS.O_LEFT: case KEYS.O_LEFT:
object.set("left", value / (props.width / canvas.width)); object.set(
"left",
value / (props.width / canvas.width)
);
break; break;
case KEYS.O_OPACITY: case KEYS.O_OPACITY:
object.set("opacity", value); object.set("opacity", value);
@@ -277,7 +278,7 @@
case KEYS.FILL_GAPX: case KEYS.FILL_GAPX:
case KEYS.FILL_GAPY: case KEYS.FILL_GAPY:
let pattern = await setFill( let pattern = await setFill(
props.list.find((v) => v.token === item.token) list.value.find((v) => v.token === item.token)
); );
object.set("fill", pattern); object.set("fill", pattern);
break; break;
@@ -287,19 +288,27 @@
} else if (item.action === ACTIONS.SORT) { } else if (item.action === ACTIONS.SORT) {
let tokens = item.tokens; let tokens = item.tokens;
canvas.clear(); canvas.clear();
const list_ = [];
for (let j = 0; j < tokens.length; j++) { for (let j = 0; j < tokens.length; j++) {
let item_ = list.value.find((v) => v.token === tokens[j]);
if (item_) list_.push(item_);
let object = objects.find((o) => o.token === tokens[j]); let object = objects.find((o) => o.token === tokens[j]);
if (object) canvas.add(object); if (object) canvas.add(object);
} }
list.value = list_;
canvas.renderAll(); canvas.renderAll();
} else if (item.action === ACTIONS.DELETE) { } else if (item.action === ACTIONS.DELETE) {
list.value = list.value.filter((v) => v.token !== item.token);
if (object) canvas.remove(object); if (object) canvas.remove(object);
} else if (item.action === ACTIONS.ADD) { } else if (item.action === ACTIONS.ADD) {
list.value.push(item.data);
await addObject(item.data); await addObject(item.data);
} }
} }
canvas.renderAll(); canvas.renderAll();
}; };
taskQueue.addTask(async () => await cd(list_));
};
defineExpose({ defineExpose({
updataList, updataList,
}); });

View File

@@ -0,0 +1,28 @@
export default class TaskQueue {
constructor() {
this.tasks = [];
this.running = false;
}
// 添加任务
addTask(task) {
this.tasks.push(task);
// 执行任务
this.executeTasks();
}
// 执行任务
async executeTasks() {
if (this.running) {
return;
}
this.running = true;
for (const task of this.tasks) {
await task();
}
this.running = false;
this.clearTasks();
}
// 清空任务队列
clearTasks() {
this.tasks = [];
}
}