This commit is contained in:
李志鹏
2026-01-21 15:05:12 +08:00
parent d31a809fa8
commit 0feade1f5b
4 changed files with 29 additions and 4 deletions

View File

@@ -22,6 +22,7 @@ const props = defineProps({
default: true, // 是否显示图层面板 default: true, // 是否显示图层面板
}, },
isBackgroundChangeable: Boolean, isBackgroundChangeable: Boolean,
isChangeCanvasSize: Boolean,
}); });
const emit = defineEmits([ const emit = defineEmits([
@@ -284,6 +285,7 @@ onMounted(() => {
<div class="setting-group"> <div class="setting-group">
<span class="setting-label">{{ $t("Canvas.width") }}</span> <span class="setting-label">{{ $t("Canvas.width") }}</span>
<a-input-number <a-input-number
:disabled="!isChangeCanvasSize"
:value="canvasWidth?.toFixed(2)" :value="canvasWidth?.toFixed(2)"
class="setting-input" class="setting-input"
:min="1" :min="1"
@@ -300,6 +302,7 @@ onMounted(() => {
<div class="setting-group"> <div class="setting-group">
<span class="setting-label">{{ $t("Canvas.height") }}</span> <span class="setting-label">{{ $t("Canvas.height") }}</span>
<a-input-number <a-input-number
:disabled="!isChangeCanvasSize"
:value="canvasHeight?.toFixed(2)" :value="canvasHeight?.toFixed(2)"
class="setting-input" class="setting-input"
:min="1" :min="1"

View File

@@ -75,6 +75,10 @@ const props = defineProps({
type: Object, type: Object,
default: () => CanvasConfig, // 默认配置 default: () => CanvasConfig, // 默认配置
}, },
isChangeCanvasSize: {
type: Boolean,
default: true, // 是否允许修改画布大小
},
showLayersPanel: { showLayersPanel: {
type: Boolean, type: Boolean,
default: true, // 是否显示图层面板 default: true, // 是否显示图层面板
@@ -1190,7 +1194,7 @@ defineExpose({
:brushSize="brushSize" :brushSize="brushSize"
:enabledRedGreenMode="enabledRedGreenMode" :enabledRedGreenMode="enabledRedGreenMode"
:showLayersPanel="showLayersPanel" :showLayersPanel="showLayersPanel"
:isBackgroundChangeable="isBackgroundChangeable" :isChangeCanvasSize="props.isChangeCanvasSize"
@update:canvasWidth="canvasWidth = $event" @update:canvasWidth="canvasWidth = $event"
@update:canvasHeight="canvasHeight = $event" @update:canvasHeight="canvasHeight = $event"
@update:canvasColor="canvasColor = $event" @update:canvasColor="canvasColor = $event"

View File

@@ -1312,6 +1312,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
canvasColor: this.canvasColor.value, canvasColor: this.canvasColor.value,
activeLayerId: this.layerManager?.activeLayerId?.value, activeLayerId: this.layerManager?.activeLayerId?.value,
}; };
this.FixJsonIdLoss(data);
console.log("获取画布JSON数据...", data); console.log("获取画布JSON数据...", data);
return JSON.stringify(data); return JSON.stringify(data);
} catch (error) { } catch (error) {
@@ -1319,7 +1320,6 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
throw new Error("获取画布JSON失败"); throw new Error("获取画布JSON失败");
} }
} }
loadJSON(json, calllBack) { loadJSON(json, calllBack) {
// 确保传入的json是字符串格式 // 确保传入的json是字符串格式
@@ -1332,10 +1332,11 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
try { try {
const parsedJson = JSON.parse(json); const parsedJson = JSON.parse(json);
console.log("加载画布JSON数据:", parsedJson); console.log("加载画布JSON数据:", parsedJson);
this.FixJsonIdLoss(parsedJson);
this.canvasWidth.value = parsedJson.canvasWidth || this.width; this.canvasWidth.value = parsedJson.canvasWidth || this.width;
this.canvasHeight.value = parsedJson.canvasHeight || this.height; this.canvasHeight.value = parsedJson.canvasHeight || this.height;
this.canvasColor.value = parsedJson.canvasColor || this.backgroundColor; this.canvasColor.value = parsedJson.canvasColor || this.backgroundColor;
// eslint-disable-next-line no-async-promise-executor // eslint-disable-next-line no-async-promise-executor
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
const tempLayers = parsedJson?.layers || []; const tempLayers = parsedJson?.layers || [];
@@ -1398,7 +1399,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
// 重置画布数据 // 重置画布数据
await this.setCanvasSize(this.canvas.width, this.canvas.height); await this.setCanvasSize(this.canvas.width, this.canvas.height);
await this.centerBackgroundLayer(this.canvas.width, this.canvas.height); await this.centerBackgroundLayer(this.canvas.width, this.canvas.height);
// await this.resetCanvasSizeByFixedLayer(); await this.resetCanvasSizeByFixedLayer();
// 重新构建对象关系 // 重新构建对象关系
// restoreObjectLayerAssociations(this.layers.value, this.canvas.getObjects()); // restoreObjectLayerAssociations(this.layers.value, this.canvas.getObjects());
// 验证图层关联关系 - 稳定后可以注释 // 验证图层关联关系 - 稳定后可以注释
@@ -1449,6 +1450,22 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
throw new Error("解析JSON失败请检查输入格式: " + error.message); throw new Error("解析JSON失败请检查输入格式: " + error.message);
} }
} }
/** 修复JSON数据中的ID丢失问题 */
FixJsonIdLoss(json){
const layers = json?.layers || [];
const objects = json?.canvas?.objects || [];
layers.forEach((layer) => {
if(!layer.fabricObjects?.length && !layer.fabricObject){
const obj = objects?.find((o) => o.layerId === layer.id);
if(!obj) return;
layer.fabricObjects = [{
id: obj.id,
type: obj.type,
}]
}
})
}
/** /**
* 创建其他图层:印花、颜色、元素... * 创建其他图层:印花、颜色、元素...

View File

@@ -18,6 +18,7 @@
:clothing-image-opts="{ :clothing-image-opts="{
imageMode:'contains', imageMode:'contains',
}" }"
:isChangeCanvasSize="false"
:hideCanvas="hideCanvas || !isEditPattern" :hideCanvas="hideCanvas || !isEditPattern"
ref="editCanvas"> ref="editCanvas">
</editCanvas> </editCanvas>