Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite
This commit is contained in:
@@ -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));
|
||||||
|
|||||||
@@ -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,
|
||||||
});
|
});
|
||||||
|
|||||||
28
src/component/Canvas/utils/TaskQueue.js
Normal file
28
src/component/Canvas/utils/TaskQueue.js
Normal 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 = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user