Files
aida_front/src/component/Canvas/test.vue

201 lines
4.1 KiB
Vue
Raw Normal View History

2024-11-22 09:20:25 +08:00
<template>
2026-01-07 13:02:08 +08:00
<div class="test">
2026-01-09 14:40:18 +08:00
<div class="control" v-for="(item, index) in list" :key="index">
<div>
<span>偏移X</span>
<input type="number" v-model="item.location[0]" />
2026-01-07 13:02:08 +08:00
</div>
2026-01-09 14:40:18 +08:00
<div>
<span>偏移Y</span>
<input type="number" v-model="item.location[1]" />
</div>
<div>
<span>角度</span>
<input type="number" v-model="item.angle" />
</div>
<div>
<span>缩放</span>
<input type="number" v-model="item.scale" />
</div>
<div>
<span>水平间距</span>
<input type="number" v-model="item.object.gapX" />
</div>
<div>
<span>垂直间距</span>
<input type="number" v-model="item.object.gapY" />
</div>
<hr />
<div>
<span>缩放X</span>
<input type="number" v-model="item.object.scaleX" step="0.1" />
</div>
<div>
<span>缩放Y</span>
<input type="number" v-model="item.object.scaleY" step="0.1" />
</div>
<div>
<span>X</span>
<input type="number" v-model="item.object.left" />
</div>
<div>
<span>Y</span>
<input type="number" v-model="item.object.top" />
</div>
<div>
<span>透明度</span>
<input
type="range"
v-model="item.object.opacity"
step="0.1"
min="0"
max="1"
/>
2026-01-07 13:02:08 +08:00
</div>
2024-12-11 16:26:36 +08:00
</div>
2026-01-09 14:40:18 +08:00
<div class="box">
<pingpu :list="list" ref="pingpuRef" />
</div>
2026-01-07 13:02:08 +08:00
</div>
2024-11-22 09:20:25 +08:00
</template>
2026-01-07 13:02:08 +08:00
<script lang="ts" setup>
2026-01-09 14:40:18 +08:00
import { ref, onMounted, watch } from "vue";
2026-01-07 13:02:08 +08:00
import pingpu from "./pingpu.vue";
2026-01-09 14:40:18 +08:00
const convertDotNotationToBracket = (str) =>
str.replace(/(?:^|\.)(\d+)(?=\.|$)/g, "[#$1]").replace(/\[#/g, "[");
2026-01-08 17:04:37 +08:00
2026-01-09 14:40:18 +08:00
const list = ref([
{
id: "1",
ifSingle: false,
level2Type: "Pattern",
designType: "Library",
path: "/src/assets/images/canvas/yinhua1.jpg",
location: [0, 0],
scale: [1, 1],
angle: 0,
name: "Print2",
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,
},
2026-01-08 17:04:37 +08:00
},
{
2026-01-09 14:40:18 +08:00
id: "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: 150,
left: 250,
scaleX: 0.5,
scaleY: 0.5,
opacity: 1,
angle: 45,
flipX: false,
flipY: false,
blendMode: "multiply",
gapX: 0,
gapY: 0,
},
2026-01-08 17:04:37 +08:00
},
]);
2026-01-09 14:40:18 +08:00
// 深拷贝
const deepCopy = (obj) => JSON.parse(JSON.stringify(obj));
const oldList = ref(deepCopy(list.value));
const pingpuRef = ref(null);
watch(
() => list.value,
() => updateList(),
{ deep: true }
);
const updateList = () => {
const changeList = [];
oldList.value.forEach((oldItem) => {
const newItem = list.value.find((v) => v.id === oldItem.id);
if (newItem) {
const arr = findDiffProps(oldItem, newItem);
arr.forEach((item) => {
changeList.push({
...item,
id: oldItem.id,
action: "update-item",
key: convertDotNotationToBracket(item.key),
});
});
} else {
changeList.push({
id: oldItem.id,
action: "delete-item",
});
}
});
oldList.value = deepCopy(list.value);
console.log(changeList);
if (changeList.length) {
pingpuRef.value.updataList(changeList);
}
};
// 递归查找不同的属性
const findDiffProps = (obj1, obj2, diffProps = [], path = "") => {
for (const key in obj1) {
if (typeof obj1[key] === "object") {
findDiffProps(obj1[key], obj2[key], diffProps, `${path}${key}.`);
} else if (obj1[key] !== obj2[key]) {
diffProps.push({
key: `${path}${key}`,
oldValue: obj1[key],
newValue: obj2[key],
});
}
}
return diffProps;
};
2024-11-22 09:20:25 +08:00
</script>
<style lang='less' scoped>
2026-01-07 13:02:08 +08:00
.test {
2026-01-09 14:40:18 +08:00
> .control {
display: inline-block;
border: 1px solid #000;
padding: 10px;
margin: 10px;
border-radius: 10px;
> div {
display: flex;
align-items: center;
margin-bottom: 5px;
> span {
width: 80px;
}
> input {
padding-left: 10px;
border-radius: 5px;
2026-01-07 13:02:08 +08:00
}
}
2026-01-09 14:40:18 +08:00
}
> .box {
width: 400px;
height: 500px;
overflow: hidden;
border: 1px solid #000;
2026-01-07 13:02:08 +08:00
}
}
2024-11-22 09:20:25 +08:00
</style>